mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
show error when scripting fails (#20843)
This commit is contained in:
@@ -21,7 +21,8 @@ export class ScriptSelectAction extends Action {
|
|||||||
id: string, label: string,
|
id: string, label: string,
|
||||||
@IQueryEditorService protected _queryEditorService: IQueryEditorService,
|
@IQueryEditorService protected _queryEditorService: IQueryEditorService,
|
||||||
@IConnectionManagementService protected _connectionManagementService: IConnectionManagementService,
|
@IConnectionManagementService protected _connectionManagementService: IConnectionManagementService,
|
||||||
@IScriptingService protected _scriptingService: IScriptingService
|
@IScriptingService protected _scriptingService: IScriptingService,
|
||||||
|
@IErrorMessageService protected _errorMessageService: IErrorMessageService
|
||||||
) {
|
) {
|
||||||
super(id, label);
|
super(id, label);
|
||||||
}
|
}
|
||||||
@@ -32,7 +33,8 @@ export class ScriptSelectAction extends Action {
|
|||||||
actionContext.object!,
|
actionContext.object!,
|
||||||
this._connectionManagementService,
|
this._connectionManagementService,
|
||||||
this._queryEditorService,
|
this._queryEditorService,
|
||||||
this._scriptingService
|
this._scriptingService,
|
||||||
|
this._errorMessageService
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,9 +99,10 @@ export class EditDataAction extends Action {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
id: string, label: string,
|
id: string, label: string,
|
||||||
@IQueryEditorService protected _queryEditorService: IQueryEditorService,
|
@IQueryEditorService private _queryEditorService: IQueryEditorService,
|
||||||
@IConnectionManagementService protected _connectionManagementService: IConnectionManagementService,
|
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||||
@IScriptingService protected _scriptingService: IScriptingService
|
@IScriptingService private _scriptingService: IScriptingService,
|
||||||
|
@IErrorMessageService private _errorMessageService: IErrorMessageService
|
||||||
) {
|
) {
|
||||||
super(id, label);
|
super(id, label);
|
||||||
}
|
}
|
||||||
@@ -110,7 +113,8 @@ export class EditDataAction extends Action {
|
|||||||
actionContext.object!,
|
actionContext.object!,
|
||||||
this._connectionManagementService,
|
this._connectionManagementService,
|
||||||
this._queryEditorService,
|
this._queryEditorService,
|
||||||
this._scriptingService
|
this._scriptingService,
|
||||||
|
this._errorMessageService
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,55 +37,61 @@ const targetDatabaseEngineEditionMap = {
|
|||||||
11: 'SqlServerOnDemandEdition',
|
11: 'SqlServerOnDemandEdition',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ScriptingFailedDialogTitle = nls.localize('scriptingFailed', "Scripting Failed");
|
||||||
|
const SelectScriptNotGeneratedError = nls.localize('selectScriptNotGeneratedError', "Failed to generate select script for the selected object.");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select the top rows from an object
|
* Select the top rows from an object
|
||||||
*/
|
*/
|
||||||
export async function scriptSelect(connectionProfile: IConnectionProfile, metadata: azdata.ObjectMetadata, connectionService: IConnectionManagementService, queryEditorService: IQueryEditorService, scriptingService: IScriptingService): Promise<boolean> {
|
export async function scriptSelect(connectionProfile: IConnectionProfile, metadata: azdata.ObjectMetadata, connectionService: IConnectionManagementService, queryEditorService: IQueryEditorService, scriptingService: IScriptingService, errorMessageService: IErrorMessageService): Promise<void> {
|
||||||
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
try {
|
||||||
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata)!;
|
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
||||||
const result = await scriptingService.script(connectionResult, metadata, ScriptOperation.Select, paramDetails);
|
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata)!;
|
||||||
if (result && result.script) {
|
const result = await scriptingService.script(connectionResult, metadata, ScriptOperation.Select, paramDetails);
|
||||||
const owner = await queryEditorService.newSqlEditor({ initalContent: result.script }, connectionProfile?.providerName);
|
if (result && result.script) {
|
||||||
// Connect our editor to the input connection
|
const owner = await queryEditorService.newSqlEditor({ initalContent: result.script }, connectionProfile?.providerName);
|
||||||
let options: IConnectionCompletionOptions = {
|
// Connect our editor to the input connection
|
||||||
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.executeQuery, input: owner },
|
let options: IConnectionCompletionOptions = {
|
||||||
saveTheConnection: false,
|
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.executeQuery, input: owner },
|
||||||
showDashboard: false,
|
saveTheConnection: false,
|
||||||
showConnectionDialogOnError: true,
|
showDashboard: false,
|
||||||
showFirewallRuleOnError: true
|
showConnectionDialogOnError: true,
|
||||||
};
|
showFirewallRuleOnError: true
|
||||||
const innerConnectionResult = await connectionService.connect(connectionProfile, owner.uri, options);
|
};
|
||||||
|
await connectionService.connect(connectionProfile, owner.uri, options);
|
||||||
return Boolean(innerConnectionResult) && innerConnectionResult.connected;
|
} else {
|
||||||
} else {
|
throw new Error(SelectScriptNotGeneratedError);
|
||||||
let errMsg: string = nls.localize('scriptSelectNotFound', "No script was returned when calling select script on object ");
|
}
|
||||||
throw new Error(errMsg.concat(metadata.metadataTypeName));
|
} catch (err) {
|
||||||
|
errorMessageService.showDialog(Severity.Error, ScriptingFailedDialogTitle, err?.message ?? err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a new Edit Data session
|
* Opens a new Edit Data session
|
||||||
*/
|
*/
|
||||||
export async function scriptEditSelect(connectionProfile: IConnectionProfile, metadata: azdata.ObjectMetadata, connectionService: IConnectionManagementService, queryEditorService: IQueryEditorService, scriptingService: IScriptingService): Promise<boolean> {
|
export async function scriptEditSelect(connectionProfile: IConnectionProfile, metadata: azdata.ObjectMetadata, connectionService: IConnectionManagementService, queryEditorService: IQueryEditorService, scriptingService: IScriptingService, errorMessageService: IErrorMessageService): Promise<void> {
|
||||||
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
try {
|
||||||
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata);
|
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
||||||
const result = await scriptingService.script(connectionResult, metadata, ScriptOperation.Select, paramDetails!);
|
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata);
|
||||||
if (result && result.script) {
|
const result = await scriptingService.script(connectionResult, metadata, ScriptOperation.Select, paramDetails!);
|
||||||
const owner = await queryEditorService.newEditDataEditor(metadata.schema, metadata.name, result.script);
|
if (result && result.script) {
|
||||||
// Connect our editor
|
const owner = await queryEditorService.newEditDataEditor(metadata.schema, metadata.name, result.script);
|
||||||
let options: IConnectionCompletionOptions = {
|
// Connect our editor
|
||||||
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: owner },
|
let options: IConnectionCompletionOptions = {
|
||||||
saveTheConnection: false,
|
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: owner },
|
||||||
showDashboard: false,
|
saveTheConnection: false,
|
||||||
showConnectionDialogOnError: true,
|
showDashboard: false,
|
||||||
showFirewallRuleOnError: true
|
showConnectionDialogOnError: true,
|
||||||
};
|
showFirewallRuleOnError: true
|
||||||
const innerConnectionResult = await connectionService.connect(connectionProfile, owner.uri, options);
|
};
|
||||||
|
await connectionService.connect(connectionProfile, owner.uri, options);
|
||||||
return Boolean(innerConnectionResult) && innerConnectionResult.connected;
|
} else {
|
||||||
} else {
|
throw new Error(SelectScriptNotGeneratedError);
|
||||||
let errMsg: string = nls.localize('scriptSelectNotFound', "No script was returned when calling select script on object ");
|
}
|
||||||
throw new Error(errMsg.concat(metadata.metadataTypeName));
|
}
|
||||||
|
catch (err) {
|
||||||
|
errorMessageService.showDialog(Severity.Error, ScriptingFailedDialogTitle, err?.message ?? err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,45 +124,44 @@ export async function script(connectionProfile: IConnectionProfile, metadata: az
|
|||||||
queryEditorService: IQueryEditorService,
|
queryEditorService: IQueryEditorService,
|
||||||
scriptingService: IScriptingService,
|
scriptingService: IScriptingService,
|
||||||
operation: ScriptOperation,
|
operation: ScriptOperation,
|
||||||
errorMessageService: IErrorMessageService): Promise<boolean> {
|
errorMessageService: IErrorMessageService): Promise<void> {
|
||||||
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
try {
|
||||||
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata)!;
|
const connectionResult = await connectionService.connectIfNotConnected(connectionProfile);
|
||||||
const result = await scriptingService.script(connectionResult, metadata, operation, paramDetails);
|
let paramDetails = getScriptingParamDetails(connectionService, connectionResult, metadata)!;
|
||||||
if (result) {
|
const result = await scriptingService.script(connectionResult, metadata, operation, paramDetails);
|
||||||
let script: string = result.script;
|
if (result) {
|
||||||
|
let script: string = result.script;
|
||||||
if (script) {
|
|
||||||
let description = (metadata.schema && metadata.schema !== '') ? `${metadata.schema}.${metadata.name}` : metadata.name;
|
|
||||||
const owner = await queryEditorService.newSqlEditor({ initalContent: script, description }, connectionProfile.providerName);
|
|
||||||
// Connect our editor to the input connection
|
|
||||||
let options: IConnectionCompletionOptions = {
|
|
||||||
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: owner },
|
|
||||||
saveTheConnection: false,
|
|
||||||
showDashboard: false,
|
|
||||||
showConnectionDialogOnError: true,
|
|
||||||
showFirewallRuleOnError: true
|
|
||||||
};
|
|
||||||
const innerConnectionResult = await connectionService.connect(connectionProfile, owner.uri, options);
|
|
||||||
|
|
||||||
return Boolean(innerConnectionResult) && innerConnectionResult.connected;
|
|
||||||
|
|
||||||
|
if (script) {
|
||||||
|
let description = (metadata.schema && metadata.schema !== '') ? `${metadata.schema}.${metadata.name}` : metadata.name;
|
||||||
|
const owner = await queryEditorService.newSqlEditor({ initalContent: script, description }, connectionProfile.providerName);
|
||||||
|
// Connect our editor to the input connection
|
||||||
|
let options: IConnectionCompletionOptions = {
|
||||||
|
params: { connectionType: ConnectionType.editor, runQueryOnCompletion: RunQueryOnConnectionMode.none, input: owner },
|
||||||
|
saveTheConnection: false,
|
||||||
|
showDashboard: false,
|
||||||
|
showConnectionDialogOnError: true,
|
||||||
|
showFirewallRuleOnError: true
|
||||||
|
};
|
||||||
|
await connectionService.connect(connectionProfile, owner.uri, options);
|
||||||
|
} else {
|
||||||
|
let scriptNotFoundMsg = nls.localize('scriptNotFoundForObject', "No script was returned when scripting as {0} on object {1}",
|
||||||
|
GetScriptOperationName(operation), metadata.metadataTypeName);
|
||||||
|
let messageDetail = '';
|
||||||
|
let operationResult = scriptingService.getOperationFailedResult(result.operationId);
|
||||||
|
if (operationResult && operationResult.hasError && operationResult.errorMessage) {
|
||||||
|
scriptNotFoundMsg = operationResult.errorMessage;
|
||||||
|
messageDetail = operationResult.errorDetails;
|
||||||
|
}
|
||||||
|
if (errorMessageService) {
|
||||||
|
errorMessageService.showDialog(Severity.Error, ScriptingFailedDialogTitle, scriptNotFoundMsg, messageDetail);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let scriptNotFoundMsg = nls.localize('scriptNotFoundForObject', "No script was returned when scripting as {0} on object {1}",
|
throw new Error(nls.localize('scriptNotFound', "No script was returned when scripting as {0}", GetScriptOperationName(operation)));
|
||||||
GetScriptOperationName(operation), metadata.metadataTypeName);
|
|
||||||
let messageDetail = '';
|
|
||||||
let operationResult = scriptingService.getOperationFailedResult(result.operationId);
|
|
||||||
if (operationResult && operationResult.hasError && operationResult.errorMessage) {
|
|
||||||
scriptNotFoundMsg = operationResult.errorMessage;
|
|
||||||
messageDetail = operationResult.errorDetails;
|
|
||||||
}
|
|
||||||
if (errorMessageService) {
|
|
||||||
let title = nls.localize('scriptingFailed', "Scripting Failed");
|
|
||||||
errorMessageService.showDialog(Severity.Error, title, scriptNotFoundMsg, messageDetail);
|
|
||||||
}
|
|
||||||
throw new Error(scriptNotFoundMsg);
|
|
||||||
}
|
}
|
||||||
} else {
|
} catch (err) {
|
||||||
throw new Error(nls.localize('scriptNotFound', "No script was returned when scripting as {0}", GetScriptOperationName(operation)));
|
errorMessageService.showDialog(Severity.Error, ScriptingFailedDialogTitle, err?.message ?? err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,13 +96,14 @@ CommandsRegistry.registerCommand({
|
|||||||
const connectionManagementService = accessor.get(IConnectionManagementService);
|
const connectionManagementService = accessor.get(IConnectionManagementService);
|
||||||
const scriptingService = accessor.get(IScriptingService);
|
const scriptingService = accessor.get(IScriptingService);
|
||||||
const progressService = accessor.get(IProgressService);
|
const progressService = accessor.get(IProgressService);
|
||||||
|
const errorMessageService = accessor.get(IErrorMessageService);
|
||||||
const profile = new ConnectionProfile(capabilitiesService, args.$treeItem.payload);
|
const profile = new ConnectionProfile(capabilitiesService, args.$treeItem.payload);
|
||||||
const baseContext: BaseActionContext = {
|
const baseContext: BaseActionContext = {
|
||||||
profile: profile,
|
profile: profile,
|
||||||
object: oeShimService.getNodeInfoForTreeItem(args.$treeItem)!.metadata
|
object: oeShimService.getNodeInfoForTreeItem(args.$treeItem)!.metadata
|
||||||
};
|
};
|
||||||
const scriptSelectAction = new ScriptSelectAction(ScriptSelectAction.ID, ScriptSelectAction.LABEL,
|
const scriptSelectAction = new ScriptSelectAction(ScriptSelectAction.ID, ScriptSelectAction.LABEL,
|
||||||
queryEditorService, connectionManagementService, scriptingService);
|
queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
await progressService.withProgress({ location: VIEWLET_ID }, async () => await scriptSelectAction.run(baseContext));
|
await progressService.withProgress({ location: VIEWLET_ID }, async () => await scriptSelectAction.run(baseContext));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,13 +168,14 @@ CommandsRegistry.registerCommand({
|
|||||||
const connectionManagementService = accessor.get(IConnectionManagementService);
|
const connectionManagementService = accessor.get(IConnectionManagementService);
|
||||||
const scriptingService = accessor.get(IScriptingService);
|
const scriptingService = accessor.get(IScriptingService);
|
||||||
const progressService = accessor.get(IProgressService);
|
const progressService = accessor.get(IProgressService);
|
||||||
|
const errorMessageService = accessor.get(IErrorMessageService);
|
||||||
const profile = new ConnectionProfile(capabilitiesService, args.$treeItem.payload);
|
const profile = new ConnectionProfile(capabilitiesService, args.$treeItem.payload);
|
||||||
const baseContext: BaseActionContext = {
|
const baseContext: BaseActionContext = {
|
||||||
profile: profile,
|
profile: profile,
|
||||||
object: oeShimService.getNodeInfoForTreeItem(args.$treeItem)!.metadata
|
object: oeShimService.getNodeInfoForTreeItem(args.$treeItem)!.metadata
|
||||||
};
|
};
|
||||||
const editDataAction = new EditDataAction(EditDataAction.ID, EditDataAction.LABEL,
|
const editDataAction = new EditDataAction(EditDataAction.ID, EditDataAction.LABEL,
|
||||||
queryEditorService, connectionManagementService, scriptingService);
|
queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
await progressService.withProgress({ location: VIEWLET_ID }, async () => await editDataAction.run(baseContext));
|
await progressService.withProgress({ location: VIEWLET_ID }, async () => await editDataAction.run(baseContext));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,9 +358,10 @@ export class ExplorerScriptSelectAction extends ScriptSelectAction {
|
|||||||
@IQueryEditorService queryEditorService: IQueryEditorService,
|
@IQueryEditorService queryEditorService: IQueryEditorService,
|
||||||
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
@IConnectionManagementService connectionManagementService: IConnectionManagementService,
|
||||||
@IScriptingService scriptingService: IScriptingService,
|
@IScriptingService scriptingService: IScriptingService,
|
||||||
@IProgressService private readonly progressService: IProgressService
|
@IProgressService private readonly progressService: IProgressService,
|
||||||
|
@IErrorMessageService errorMessageService: IErrorMessageService
|
||||||
) {
|
) {
|
||||||
super(id, label, queryEditorService, connectionManagementService, scriptingService);
|
super(id, label, queryEditorService, connectionManagementService, scriptingService, errorMessageService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async run(actionContext: BaseActionContext): Promise<void> {
|
public override async run(actionContext: BaseActionContext): Promise<void> {
|
||||||
|
|||||||
Reference in New Issue
Block a user