diff --git a/src/sql/parts/connection/common/connectionManagement.ts b/src/sql/parts/connection/common/connectionManagement.ts index c4bd45aa02..5f4e6561fd 100644 --- a/src/sql/parts/connection/common/connectionManagement.ts +++ b/src/sql/parts/connection/common/connectionManagement.ts @@ -152,10 +152,12 @@ export interface IConnectionManagementService { getAdvancedProperties(): sqlops.ConnectionOption[]; - getConnectionId(connectionProfile: IConnectionProfile): string; + getConnectionUri(connectionProfile: IConnectionProfile): string; getFormattedUri(uri: string, connectionProfile: IConnectionProfile): string; + getConnectionUriFromId(connectionId: string): string; + isConnected(fileUri: string): boolean; /** diff --git a/src/sql/parts/connection/common/connectionManagementService.ts b/src/sql/parts/connection/common/connectionManagementService.ts index b89bf37390..35e8e684f4 100644 --- a/src/sql/parts/connection/common/connectionManagementService.ts +++ b/src/sql/parts/connection/common/connectionManagementService.ts @@ -648,6 +648,15 @@ export class ConnectionManagementService extends Disposable implements IConnecti return this._connectionStatusManager.getActiveConnectionProfiles(); } + public getConnectionUriFromId(connectionId: string): string { + let connection = this.getActiveConnections().find(connection => connection.id === connectionId); + if (connection) { + return this.getConnectionUri(connection); + } else { + return undefined; + } + } + public saveProfileGroup(profile: IConnectionProfileGroup): Promise { TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.AddServerGroup); return new Promise((resolve, reject) => { @@ -704,7 +713,7 @@ export class ConnectionManagementService extends Disposable implements IConnecti return false; } - public getConnectionId(connectionProfile: IConnectionProfile): string { + public getConnectionUri(connectionProfile: IConnectionProfile): string { return this._connectionStatusManager.getOriginalOwnerUri(Utils.generateUri(connectionProfile)); } @@ -716,7 +725,7 @@ export class ConnectionManagementService extends Disposable implements IConnecti */ public getFormattedUri(uri: string, connectionProfile: IConnectionProfile): string { if (this._connectionStatusManager.isDefaultTypeUri(uri)) { - return this.getConnectionId(connectionProfile); + return this.getConnectionUri(connectionProfile); } else { return uri; } diff --git a/src/sql/parts/connection/connectionDialog/connectionController.ts b/src/sql/parts/connection/connectionDialog/connectionController.ts index 373f6b1237..a65e0eb2a2 100644 --- a/src/sql/parts/connection/connectionDialog/connectionController.ts +++ b/src/sql/parts/connection/connectionDialog/connectionController.ts @@ -63,7 +63,7 @@ export class ConnectionController implements IConnectionComponentController { tempProfile.password = password; tempProfile.groupFullName = ''; tempProfile.saveProfile = false; - let uri = this._connectionManagementService.getConnectionId(tempProfile); + let uri = this._connectionManagementService.getConnectionUri(tempProfile); return new Promise((resolve, reject) => { if (this._databaseCache.has(uri)) { let cachedDatabases: string[] = this._databaseCache.get(uri); diff --git a/src/sql/parts/disasterRecovery/backup/common/backupServiceImp.ts b/src/sql/parts/disasterRecovery/backup/common/backupServiceImp.ts index 35591576b7..1966b80dfb 100644 --- a/src/sql/parts/disasterRecovery/backup/common/backupServiceImp.ts +++ b/src/sql/parts/disasterRecovery/backup/common/backupServiceImp.ts @@ -146,7 +146,7 @@ export class BackupUiService implements IBackupUiService { let backupOptions = this.getOptions(this._currentProvider); return new TPromise(() => { - let uri = this._connectionManagementService.getConnectionId(connection) + let uri = this._connectionManagementService.getConnectionUri(connection) + ProviderConnectionInfo.idSeparator + ConnectionUtils.ConnectionUriBackupIdAttributeName + ProviderConnectionInfo.nameValueSeparator diff --git a/src/sql/parts/disasterRecovery/restore/common/restoreServiceImpl.ts b/src/sql/parts/disasterRecovery/restore/common/restoreServiceImpl.ts index 67a83f0365..3154e42316 100644 --- a/src/sql/parts/disasterRecovery/restore/common/restoreServiceImpl.ts +++ b/src/sql/parts/disasterRecovery/restore/common/restoreServiceImpl.ts @@ -293,7 +293,7 @@ export class RestoreDialogController implements IRestoreDialogController { return new TPromise((resolve, reject) => { let result: void; - this._ownerUri = this._connectionService.getConnectionId(connection) + this._ownerUri = this._connectionService.getConnectionUri(connection) + ProviderConnectionInfo.idSeparator + Utils.ConnectionUriRestoreIdAttributeName + ProviderConnectionInfo.nameValueSeparator diff --git a/src/sql/parts/objectExplorer/viewlet/objectExplorerActions.ts b/src/sql/parts/objectExplorer/viewlet/objectExplorerActions.ts index dbfcf883f5..31c593177e 100644 --- a/src/sql/parts/objectExplorer/viewlet/objectExplorerActions.ts +++ b/src/sql/parts/objectExplorer/viewlet/objectExplorerActions.ts @@ -185,7 +185,7 @@ export class OEScriptSelectAction extends ScriptSelectAction { } this._treeSelectionHandler.onTreeActionStateChange(true); var connectionProfile = TreeUpdateUtils.getConnectionProfile(this._objectExplorerTreeNode); - var ownerUri = this._connectionManagementService.getConnectionId(connectionProfile); + var ownerUri = this._connectionManagementService.getConnectionUri(connectionProfile); ownerUri = this._connectionManagementService.getFormattedUri(ownerUri, connectionProfile); var metadata = this._objectExplorerTreeNode.metadata; @@ -255,7 +255,7 @@ export class OEScriptCreateAction extends ScriptCreateAction { this._treeSelectionHandler.onTreeActionStateChange(true); var connectionProfile = TreeUpdateUtils.getConnectionProfile(this._objectExplorerTreeNode); var metadata = (this._objectExplorerTreeNode).metadata; - var ownerUri = this._connectionManagementService.getConnectionId(connectionProfile); + var ownerUri = this._connectionManagementService.getConnectionUri(connectionProfile); ownerUri = this._connectionManagementService.getFormattedUri(ownerUri, connectionProfile); return super.run({ profile: connectionProfile, object: metadata }).then((result) => { @@ -291,7 +291,7 @@ export class OEScriptExecuteAction extends ScriptExecuteAction { this._treeSelectionHandler.onTreeActionStateChange(true); var connectionProfile = TreeUpdateUtils.getConnectionProfile(this._objectExplorerTreeNode); var metadata = (this._objectExplorerTreeNode).metadata; - var ownerUri = this._connectionManagementService.getConnectionId(connectionProfile); + var ownerUri = this._connectionManagementService.getConnectionUri(connectionProfile); ownerUri = this._connectionManagementService.getFormattedUri(ownerUri, connectionProfile); return super.run({ profile: connectionProfile, object: metadata }).then((result) => { @@ -327,7 +327,7 @@ export class OEScriptAlterAction extends ScriptAlterAction { this._treeSelectionHandler.onTreeActionStateChange(true); var connectionProfile = TreeUpdateUtils.getConnectionProfile(this._objectExplorerTreeNode); var metadata = (this._objectExplorerTreeNode).metadata; - var ownerUri = this._connectionManagementService.getConnectionId(connectionProfile); + var ownerUri = this._connectionManagementService.getConnectionUri(connectionProfile); ownerUri = this._connectionManagementService.getFormattedUri(ownerUri, connectionProfile); return super.run({ profile: connectionProfile, object: metadata }).then((result) => { @@ -363,7 +363,7 @@ export class OEScriptDeleteAction extends ScriptDeleteAction { this._treeSelectionHandler.onTreeActionStateChange(true); var connectionProfile = TreeUpdateUtils.getConnectionProfile(this._objectExplorerTreeNode); var metadata = (this._objectExplorerTreeNode).metadata; - var ownerUri = this._connectionManagementService.getConnectionId(connectionProfile); + var ownerUri = this._connectionManagementService.getConnectionUri(connectionProfile); ownerUri = this._connectionManagementService.getFormattedUri(ownerUri, connectionProfile); return super.run({ profile: connectionProfile, object: metadata }).then((result) => { diff --git a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts index c7532a7e44..4b8f9b2fbc 100644 --- a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts +++ b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts @@ -51,14 +51,13 @@ export class MainThreadConnectionManagement implements MainThreadConnectionManag public async $listDatabases(connectionId: string): Promise { let connection = this._connectionManagementService.getActiveConnections().find(profile => profile.id === connectionId); - let connectionUri = this._connectionManagementService.getConnectionId(connection); + let connectionUri = this._connectionManagementService.getConnectionUri(connection); let result = await this._connectionManagementService.listDatabases(connectionUri); return result.databaseNames; } public $getUriForConnection(connectionId: string): Thenable { - let connection = this._connectionManagementService.getActiveConnections().find(profile => profile.id === connectionId); - return Promise.resolve(this._connectionManagementService.getConnectionId(connection)); + return Promise.resolve(this._connectionManagementService.getConnectionUriFromId(connectionId)); } private convertConnection(profile: IConnectionProfile): sqlops.connection.Connection { diff --git a/src/sql/workbench/common/taskUtilities.ts b/src/sql/workbench/common/taskUtilities.ts index 042b32be9e..a86e94ce13 100644 --- a/src/sql/workbench/common/taskUtilities.ts +++ b/src/sql/workbench/common/taskUtilities.ts @@ -108,7 +108,7 @@ export function GetScriptOperationName(operation: ScriptOperation) { export function connectIfNotAlreadyConnected(connectionProfile: IConnectionProfile, connectionService: IConnectionManagementService): Promise { return new Promise((resolve, reject) => { - let connectionID = connectionService.getConnectionId(connectionProfile); + let connectionID = connectionService.getConnectionUri(connectionProfile); let uri: string = connectionService.getFormattedUri(connectionID, connectionProfile); if (!connectionService.isConnected(uri)) { let options: IConnectionCompletionOptions = { diff --git a/src/sqltest/parts/connection/connectionManagementService.test.ts b/src/sqltest/parts/connection/connectionManagementService.test.ts index 3815406417..44070ebb8e 100644 --- a/src/sqltest/parts/connection/connectionManagementService.test.ts +++ b/src/sqltest/parts/connection/connectionManagementService.test.ts @@ -756,8 +756,8 @@ suite('SQL ConnectionManagementService tests', () => { connect(ownerUri, undefined, false, connectionProfileWithoutDb).then(() => { try { // If I get the URI for the connection with or without a database from the connection management service - let actualUriWithDb = connectionManagementService.getConnectionId(connectionProfileWithDb); - let actualUriWithoutDb = connectionManagementService.getConnectionId(connectionProfileWithoutDb); + let actualUriWithDb = connectionManagementService.getConnectionUri(connectionProfileWithDb); + let actualUriWithoutDb = connectionManagementService.getConnectionUri(connectionProfileWithoutDb); // Then the retrieved URIs should match the one on the connection let expectedUri = Utils.generateUri(connectionProfileWithoutDb); @@ -804,4 +804,33 @@ suite('SQL ConnectionManagementService tests', () => { let credentials = connectionManagementService.getActiveConnectionCredentials(profile.id); assert.equal(credentials['password'], profile.options['password']); }); + + test('getConnectionUriFromId returns a URI of an active connection with the given id', () => { + let profile = Object.assign({}, connectionProfile); + profile.options = {password: profile.password}; + profile.id = 'test_id'; + let uri = 'test_initial_uri'; + connectionStatusManager.addConnection(profile, uri); + (connectionManagementService as any)._connectionStatusManager = connectionStatusManager; + + // If I call getConnectionUriFromId on the given connection + let foundUri = connectionManagementService.getConnectionUriFromId(profile.id); + + // Then the returned URI matches the connection's + assert.equal(foundUri, Utils.generateUri(new ConnectionProfile(capabilitiesService, profile))); + }); + + test('getConectionUriFromId returns undefined if the given connection is not active', () => { + let profile = Object.assign({}, connectionProfile); + profile.options = {password: profile.password}; + profile.id = 'test_id'; + connectionStatusManager.addConnection(profile, Utils.generateUri(profile)); + (connectionManagementService as any)._connectionStatusManager = connectionStatusManager; + + // If I call getConnectionUriFromId with a different URI than the connection's + let foundUri = connectionManagementService.getConnectionUriFromId('different_id'); + + // Then undefined is returned + assert.equal(foundUri, undefined); + }); }); \ No newline at end of file diff --git a/src/sqltest/stubs/connectionManagementService.test.ts b/src/sqltest/stubs/connectionManagementService.test.ts index 069bdc7645..40dc0c07cc 100644 --- a/src/sqltest/stubs/connectionManagementService.test.ts +++ b/src/sqltest/stubs/connectionManagementService.test.ts @@ -115,7 +115,7 @@ export class TestConnectionManagementService implements IConnectionManagementSer return []; } - getConnectionId(connectionProfile: ConnectionProfile): string { + getConnectionUri(connectionProfile: ConnectionProfile): string { return undefined; } @@ -123,6 +123,10 @@ export class TestConnectionManagementService implements IConnectionManagementSer return undefined; } + getConnectionUriFromId(connectionId: string): string { + return undefined; + } + isConnected(fileUri: string, connectionProfile?: ConnectionProfile): boolean { return false; }