mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-04 09:35:38 -05:00
Added multiple location option to package management dialog (#9790)
* Added multiple location option to package management dialog
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
|
||||
import * as azdata from 'azdata';
|
||||
import { ApiWrapper } from '../common/apiWrapper';
|
||||
import * as constants from '../common/constants';
|
||||
import * as nbExtensionApis from '../typings/notebookServices';
|
||||
import * as utils from '../common/utils';
|
||||
|
||||
@@ -23,14 +22,17 @@ export abstract class SqlPackageManageProviderBase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns location title
|
||||
* Returns database names
|
||||
*/
|
||||
public async getLocationTitle(): Promise<string> {
|
||||
public async getLocations(): Promise<nbExtensionApis.IPackageLocation[]> {
|
||||
let connection = await this.getCurrentConnection();
|
||||
if (connection) {
|
||||
return `${connection.serverName} ${connection.databaseName ? connection.databaseName : ''}`;
|
||||
let databases = await this._apiWrapper.listDatabases(connection.connectionId);
|
||||
return databases.map(x => {
|
||||
return { displayName: x, name: x };
|
||||
});
|
||||
}
|
||||
return constants.noConnectionError;
|
||||
return [];
|
||||
}
|
||||
|
||||
protected async getCurrentConnection(): Promise<azdata.connection.ConnectionProfile> {
|
||||
@@ -42,16 +44,16 @@ export abstract class SqlPackageManageProviderBase {
|
||||
* @param packages Packages to install
|
||||
* @param useMinVersion minimum version
|
||||
*/
|
||||
public async installPackages(packages: nbExtensionApis.IPackageDetails[], useMinVersion: boolean): Promise<void> {
|
||||
public async installPackages(packages: nbExtensionApis.IPackageDetails[], useMinVersion: boolean, databaseName: string): Promise<void> {
|
||||
|
||||
if (packages) {
|
||||
await Promise.all(packages.map(x => this.installPackage(x, useMinVersion)));
|
||||
await Promise.all(packages.map(x => this.installPackage(x, useMinVersion, databaseName)));
|
||||
}
|
||||
//TODO: use useMinVersion
|
||||
console.log(useMinVersion);
|
||||
}
|
||||
|
||||
private async installPackage(packageDetail: nbExtensionApis.IPackageDetails, useMinVersion: boolean): Promise<void> {
|
||||
private async installPackage(packageDetail: nbExtensionApis.IPackageDetails, useMinVersion: boolean, databaseName: string): Promise<void> {
|
||||
if (useMinVersion) {
|
||||
let packageOverview = await this.getPackageOverview(packageDetail.name);
|
||||
if (packageOverview && packageOverview.versions) {
|
||||
@@ -60,16 +62,16 @@ export abstract class SqlPackageManageProviderBase {
|
||||
}
|
||||
}
|
||||
|
||||
await this.executeScripts(ScriptMode.Install, packageDetail);
|
||||
await this.executeScripts(ScriptMode.Install, packageDetail, databaseName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uninstalls given packages
|
||||
* @param packages Packages to uninstall
|
||||
*/
|
||||
public async uninstallPackages(packages: nbExtensionApis.IPackageDetails[]): Promise<void> {
|
||||
public async uninstallPackages(packages: nbExtensionApis.IPackageDetails[], databaseName: string): Promise<void> {
|
||||
if (packages) {
|
||||
await Promise.all(packages.map(x => this.executeScripts(ScriptMode.Uninstall, x)));
|
||||
await Promise.all(packages.map(x => this.executeScripts(ScriptMode.Uninstall, x, databaseName)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,8 +90,8 @@ export abstract class SqlPackageManageProviderBase {
|
||||
/**
|
||||
* Returns list of packages
|
||||
*/
|
||||
public async listPackages(): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
let packages = await this.fetchPackages();
|
||||
public async listPackages(databaseName: string): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
let packages = await this.fetchPackages(databaseName);
|
||||
if (packages) {
|
||||
packages = packages.sort((a, b) => this.comparePackages(a, b));
|
||||
} else {
|
||||
@@ -110,6 +112,6 @@ export abstract class SqlPackageManageProviderBase {
|
||||
}
|
||||
|
||||
protected abstract fetchPackage(packageName: string): Promise<nbExtensionApis.IPackageOverview>;
|
||||
protected abstract fetchPackages(): Promise<nbExtensionApis.IPackageDetails[]>;
|
||||
protected abstract executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails): Promise<void>;
|
||||
protected abstract fetchPackages(databaseName: string): Promise<nbExtensionApis.IPackageDetails[]>;
|
||||
protected abstract executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails, databaseName: string): Promise<void>;
|
||||
}
|
||||
@@ -103,15 +103,15 @@ export class PackageManagementService {
|
||||
* Returns python packages installed in SQL server instance
|
||||
* @param connection SQL Connection
|
||||
*/
|
||||
public async getPythonPackages(connection: azdata.connection.ConnectionProfile): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return this._queryRunner.getPythonPackages(connection);
|
||||
public async getPythonPackages(connection: azdata.connection.ConnectionProfile, databaseName: string): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return this._queryRunner.getPythonPackages(connection, databaseName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns python packages installed in SQL server instance
|
||||
* @param connection SQL Connection
|
||||
*/
|
||||
public async getRPackages(connection: azdata.connection.ConnectionProfile): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return this._queryRunner.getRPackages(connection);
|
||||
public async getRPackages(connection: azdata.connection.ConnectionProfile, databaseName: string): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return this._queryRunner.getRPackages(connection, databaseName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,6 @@ export class PackageManager {
|
||||
// Execute the command
|
||||
//
|
||||
this._apiWrapper.executeCommand(constants.managePackagesCommand, {
|
||||
multiLocations: false,
|
||||
defaultLocation: defaultProvider.packageTarget.location,
|
||||
defaultProviderId: defaultProvider.providerId
|
||||
});
|
||||
@@ -116,7 +115,7 @@ export class PackageManager {
|
||||
* Installs dependencies for the extension
|
||||
*/
|
||||
public async installDependencies(): Promise<void> {
|
||||
await utils.executeTasks(this._apiWrapper, constants.installDependenciesMsgTaskName, [
|
||||
await utils.executeTasks(this._apiWrapper, constants.installPackageMngDependenciesMsgTaskName, [
|
||||
this.installRequiredPythonPackages(this._config.requiredSqlPythonPackages),
|
||||
this.installRequiredRPackages()], true);
|
||||
}
|
||||
@@ -130,7 +129,7 @@ export class PackageManager {
|
||||
}
|
||||
|
||||
await utils.createFolder(utils.getRPackagesFolderPath(this._rootFolder));
|
||||
await Promise.all(this._config.requiredSqlPythonPackages.map(x => this.installRPackage(x)));
|
||||
await Promise.all(this._config.requiredSqlRPackages.map(x => this.installRPackage(x)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,7 +150,8 @@ export class PackageManager {
|
||||
let fileContent = '';
|
||||
requiredPackages.forEach(packageDetails => {
|
||||
let hasVersion = ('version' in packageDetails) && !isNullOrUndefined(packageDetails['version']) && packageDetails['version'].length > 0;
|
||||
if (!installedPackages.find(x => x.name === packageDetails['name'] && (!hasVersion || packageDetails['version'] === x.version))) {
|
||||
if (!installedPackages.find(x => x.name === packageDetails['name']
|
||||
&& (!hasVersion || utils.comparePackageVersions(packageDetails['version'] || '', x.version) <= 0))) {
|
||||
let packageNameDetail = hasVersion ? `${packageDetails.name}==${packageDetails.version}` : `${packageDetails.name}`;
|
||||
fileContent = `${fileContent}${packageNameDetail}\n`;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ export class PackageManager {
|
||||
private async getInstalledPipPackages(): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
try {
|
||||
let cmd = `"${this.pythonExecutable}" -m pip list --format=json`;
|
||||
let packagesInfo = await this._processService.executeBufferedCommand(cmd, this._outputChannel);
|
||||
let packagesInfo = await this._processService.executeBufferedCommand(cmd, undefined);
|
||||
let packagesResult: nbExtensionApis.IPackageDetails[] = [];
|
||||
if (packagesInfo) {
|
||||
packagesResult = <nbExtensionApis.IPackageDetails[]>JSON.parse(packagesInfo);
|
||||
|
||||
@@ -9,7 +9,7 @@ import * as nbExtensionApis from '../typings/notebookServices';
|
||||
import { ApiWrapper } from '../common/apiWrapper';
|
||||
import { ProcessService } from '../common/processService';
|
||||
import { Config } from '../configurations/config';
|
||||
import { SqlPackageManageProviderBase, ScriptMode } from './SqlPackageManageProviderBase';
|
||||
import { SqlPackageManageProviderBase, ScriptMode } from './packageManageProviderBase';
|
||||
import { HttpClient } from '../common/httpClient';
|
||||
import * as utils from '../common/utils';
|
||||
import { PackageManagementService } from './packageManagementService';
|
||||
@@ -50,8 +50,8 @@ export class SqlPythonPackageManageProvider extends SqlPackageManageProviderBase
|
||||
/**
|
||||
* Returns list of packages
|
||||
*/
|
||||
protected async fetchPackages(): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return await this._service.getPythonPackages(await this.getCurrentConnection());
|
||||
protected async fetchPackages(databaseName: string): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return await this._service.getPythonPackages(await this.getCurrentConnection(), databaseName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,14 +59,14 @@ export class SqlPythonPackageManageProvider extends SqlPackageManageProviderBase
|
||||
* @param packageDetails Packages to install or uninstall
|
||||
* @param scriptMode can be 'install' or 'uninstall'
|
||||
*/
|
||||
protected async executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails): Promise<void> {
|
||||
protected async executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails, databaseName: string): Promise<void> {
|
||||
let connection = await this.getCurrentConnection();
|
||||
let credentials = await this._apiWrapper.getCredentials(connection.connectionId);
|
||||
|
||||
if (connection) {
|
||||
let port = '1433';
|
||||
let server = connection.serverName;
|
||||
let database = connection.databaseName ? `, database="${connection.databaseName}"` : '';
|
||||
let database = databaseName ? `, database="${databaseName}"` : '';
|
||||
let index = connection.serverName.indexOf(',');
|
||||
if (index > 0) {
|
||||
port = connection.serverName.substring(index + 1);
|
||||
|
||||
@@ -10,7 +10,7 @@ import * as nbExtensionApis from '../typings/notebookServices';
|
||||
import { ApiWrapper } from '../common/apiWrapper';
|
||||
import { ProcessService } from '../common/processService';
|
||||
import { Config } from '../configurations/config';
|
||||
import { SqlPackageManageProviderBase, ScriptMode } from './SqlPackageManageProviderBase';
|
||||
import { SqlPackageManageProviderBase, ScriptMode } from './packageManageProviderBase';
|
||||
import { HttpClient } from '../common/httpClient';
|
||||
import * as constants from '../common/constants';
|
||||
import { PackageManagementService } from './packageManagementService';
|
||||
@@ -54,8 +54,8 @@ export class SqlRPackageManageProvider extends SqlPackageManageProviderBase impl
|
||||
/**
|
||||
* Returns list of packages
|
||||
*/
|
||||
protected async fetchPackages(): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return await this._service.getRPackages(await this.getCurrentConnection());
|
||||
protected async fetchPackages(databaseName: string): Promise<nbExtensionApis.IPackageDetails[]> {
|
||||
return await this._service.getRPackages(await this.getCurrentConnection(), databaseName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,12 +63,12 @@ export class SqlRPackageManageProvider extends SqlPackageManageProviderBase impl
|
||||
* @param packageDetails Packages to install or uninstall
|
||||
* @param scriptMode can be 'install' or 'uninstall'
|
||||
*/
|
||||
protected async executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails): Promise<void> {
|
||||
protected async executeScripts(scriptMode: ScriptMode, packageDetails: nbExtensionApis.IPackageDetails, databaseName: string): Promise<void> {
|
||||
let connection = await this.getCurrentConnection();
|
||||
let credentials = await this._apiWrapper.getCredentials(connection.connectionId);
|
||||
|
||||
if (connection) {
|
||||
let database = connection.databaseName ? `, database="${connection.databaseName}"` : '';
|
||||
let database = databaseName ? `, database="${databaseName}"` : '';
|
||||
let connectionParts = `server="${connection.serverName}", uid="${connection.userName}", pwd="${credentials[azdata.ConnectionOptionSpecialType.password]}"${database}`;
|
||||
let rCommandScript = scriptMode === ScriptMode.Install ? 'sql_install.packages' : 'sql_remove.packages';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user