mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-26 17:23:15 -05:00
avoid unnecessary connections in azure view (#20817)
* avoid unnecessary connections in azure view * pr comments
This commit is contained in:
@@ -27,7 +27,7 @@ export const IOEShimService = createDecorator<IOEShimService>(SERVICE_ID);
|
||||
export interface IOEShimService {
|
||||
_serviceBrand: undefined;
|
||||
getChildren(node: ITreeItem, viewId: string): Promise<ITreeItem[]>;
|
||||
disconnectNode(viewId: string, node: ITreeItem): Promise<boolean>;
|
||||
disconnectNode(node: ITreeItem): Promise<boolean>;
|
||||
providerExists(providerId: string): boolean;
|
||||
isNodeConnected(viewId: string, node: ITreeItem): boolean;
|
||||
getNodeInfoForTreeItem(treeItem: ITreeItem): azdata.NodeInfo | undefined;
|
||||
@@ -36,7 +36,6 @@ export interface IOEShimService {
|
||||
export class OEShimService extends Disposable implements IOEShimService {
|
||||
_serviceBrand: undefined;
|
||||
|
||||
private sessionMap = new Map<number, string>();
|
||||
private nodeHandleMap = new Map<number, string>();
|
||||
private nodeInfoMap = new Map<ITreeItem, azdata.NodeInfo>();
|
||||
|
||||
@@ -110,28 +109,12 @@ export class OEShimService extends Disposable implements IOEShimService {
|
||||
return connProfile;
|
||||
}
|
||||
|
||||
public async disconnectNode(viewId: string, node: ITreeItem): Promise<boolean> {
|
||||
// we assume only nodes with payloads can be connected
|
||||
// check to make sure we have an existing connection
|
||||
let key = generateSessionMapKey(viewId, node);
|
||||
let session = this.sessionMap.get(key);
|
||||
if (session) {
|
||||
let closed = (await this.oe.closeSession(node.childProvider!, this.oe.getSession(session)!))!.success;
|
||||
if (closed) {
|
||||
this.sessionMap.delete(key);
|
||||
}
|
||||
public async disconnectNode(node: ITreeItem): Promise<boolean> {
|
||||
if (node.sessionId !== undefined) {
|
||||
const closed = (await this.oe.closeSession(node.childProvider!, this.oe.getSession(node.sessionId)!))!.success;
|
||||
return closed;
|
||||
}
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
|
||||
private async getOrCreateSession(viewId: string, node: ITreeItem): Promise<string> {
|
||||
// verify the map is correct
|
||||
let key = generateSessionMapKey(viewId, node);
|
||||
if (!this.sessionMap.has(key)) {
|
||||
this.sessionMap.set(key, await this.createSession(viewId, node.childProvider!, node));
|
||||
}
|
||||
return this.sessionMap.get(key)!;
|
||||
return false;
|
||||
}
|
||||
|
||||
public async getChildren(node: ITreeItem, viewId: string): Promise<ITreeItem[]> {
|
||||
@@ -140,13 +123,15 @@ export class OEShimService extends Disposable implements IOEShimService {
|
||||
node.payload.authenticationType = this.getDefaultAuthenticationType(this.configurationService); // we need to set auth type here, because it's value is part of the session key
|
||||
}
|
||||
|
||||
const sessionId = await this.getOrCreateSession(viewId, node);
|
||||
if (node.sessionId === undefined) {
|
||||
node.sessionId = await this.createSession(viewId, node.childProvider!, node);
|
||||
}
|
||||
const requestHandle = this.nodeHandleMap.get(generateNodeMapKey(viewId, node)) || node.handle;
|
||||
const treeNode = new TreeNode(undefined!, undefined!, undefined!, undefined!, requestHandle, undefined!); // hack since this entire system is a hack anyways
|
||||
treeNode.connection = new ConnectionProfile(this.capabilities, node.payload);
|
||||
const childrenNodes = await this.oe.refreshTreeNode({
|
||||
success: true,
|
||||
sessionId,
|
||||
sessionId: node.sessionId!,
|
||||
rootNode: undefined!, // hack since this entire system is a hack anyways
|
||||
errorMessage: undefined
|
||||
}, treeNode);
|
||||
@@ -209,7 +194,8 @@ export class OEShimService extends Disposable implements IOEShimService {
|
||||
payload: node.payload || (databaseChanged ? updatedPayload : parentNode.payload),
|
||||
contextValue: node.nodeTypeId,
|
||||
sqlIcon: icon,
|
||||
nodeInfo: nodeInfo
|
||||
nodeInfo: nodeInfo,
|
||||
sessionId: parentNode.sessionId
|
||||
};
|
||||
this.nodeHandleMap.set(generateNodeMapKey(viewId, newTreeItem), nodePath);
|
||||
this.nodeInfoMap.set(newTreeItem, nodeInfo);
|
||||
@@ -221,7 +207,7 @@ export class OEShimService extends Disposable implements IOEShimService {
|
||||
}
|
||||
|
||||
public isNodeConnected(viewId: string, node: ITreeItem): boolean {
|
||||
return this.sessionMap.has(generateSessionMapKey(viewId, node));
|
||||
return node.sessionId !== undefined;
|
||||
}
|
||||
|
||||
public getNodeInfoForTreeItem(treeItem: ITreeItem): azdata.NodeInfo | undefined {
|
||||
@@ -236,10 +222,6 @@ export class OEShimService extends Disposable implements IOEShimService {
|
||||
}
|
||||
}
|
||||
|
||||
function generateSessionMapKey(viewId: string, node: ITreeItem): number {
|
||||
return hash([viewId, node.childProvider, node.payload]);
|
||||
}
|
||||
|
||||
function generateNodeMapKey(viewId: string, node: ITreeItem): number {
|
||||
return hash([viewId, node.handle]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user