Fix handling of connections in editors (#9682)

* fix handling of connections in editors

* initial tests

* remove test
This commit is contained in:
Anthony Dresser
2020-03-21 14:13:32 -07:00
committed by GitHub
parent a649461409
commit a7dbb68f7d
9 changed files with 52 additions and 41 deletions

View File

@@ -6,7 +6,7 @@
import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResultsInput';
import { EditDataInput } from 'sql/workbench/browser/editData/editDataInput';
import { IConnectableInput } from 'sql/platform/connection/common/connectionManagement';
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
import { IQueryEditorService, INewSqlEditorOptions } from 'sql/workbench/services/queryEditor/common/queryEditorService';
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
@@ -18,6 +18,11 @@ import { EditDataResultsInput } from 'sql/workbench/browser/editData/editDataRes
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
import { UntitledTextEditorModel } from 'vs/workbench/services/untitled/common/untitledTextEditorModel';
import { mixin } from 'vs/base/common/objects';
const defaults: INewSqlEditorOptions = {
open: true
};
/**
* Service wrapper for opening and creating SQL documents as sql editor inputs
@@ -39,36 +44,30 @@ export class QueryEditorService implements IQueryEditorService {
/**
* Creates new untitled document for SQL query and opens in new editor tab
*/
public newSqlEditor(sqlContent?: string, connectionProviderName?: string, isDirty?: boolean, objectName?: string): Promise<IConnectableInput> {
return new Promise<IConnectableInput>(async (resolve, reject) => {
try {
// Create file path and file URI
let filePath = await this.createUntitledSqlFilePath();
let docUri: URI = URI.from({ scheme: Schemas.untitled, path: filePath });
public async newSqlEditor(options: INewSqlEditorOptions = {}): Promise<IConnectableInput> {
options = mixin(options, defaults, false);
// Create file path and file URI
let filePath = await this.createUntitledSqlFilePath();
let docUri: URI = URI.from({ scheme: Schemas.untitled, path: filePath });
// Create a sql document pane with accoutrements
const fileInput = this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: 'sql' }) as UntitledTextEditorInput;
let untitledEditorModel = await fileInput.resolve() as UntitledTextEditorModel;
if (sqlContent) {
untitledEditorModel.textEditorModel.setValue(sqlContent);
if (isDirty === false || (isDirty === undefined && !this._configurationService.getValue<boolean>('sql.promptToSaveGeneratedFiles'))) {
untitledEditorModel.setDirty(false);
}
}
const queryResultsInput: QueryResultsInput = this._instantiationService.createInstance(QueryResultsInput, docUri.toString());
let queryInput = this._instantiationService.createInstance(UntitledQueryEditorInput, objectName, fileInput, queryResultsInput);
this._editorService.openEditor(queryInput, { pinned: true })
.then((editor) => {
resolve(editor.input as UntitledQueryEditorInput);
}, (error) => {
reject(error);
});
} catch (error) {
reject(error);
// Create a sql document pane with accoutrements
const fileInput = this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: 'sql' }) as UntitledTextEditorInput;
let untitledEditorModel = await fileInput.resolve() as UntitledTextEditorModel;
if (options.initalContent) {
untitledEditorModel.textEditorModel.setValue(options.initalContent);
if (options.dirty === false || (options.dirty === undefined && !this._configurationService.getValue<boolean>('sql.promptToSaveGeneratedFiles'))) {
untitledEditorModel.setDirty(false);
}
});
}
const queryResultsInput: QueryResultsInput = this._instantiationService.createInstance(QueryResultsInput, docUri.toString());
let queryInput = this._instantiationService.createInstance(UntitledQueryEditorInput, options.description, fileInput, queryResultsInput);
if (options.open) {
await this._editorService.openEditor(queryInput, { pinned: true });
}
return queryInput;
}
/**

View File

@@ -16,12 +16,25 @@ export interface IQueryEditorOptions extends IEditorOptions {
export const IQueryEditorService = createDecorator<IQueryEditorService>('QueryEditorService');
export interface INewSqlEditorOptions {
initalContent?: string;
/**
* Defaults based on user configuration
*/
dirty?: boolean;
description?: string;
/**
* defaults to true
*/
open?: boolean;
}
export interface IQueryEditorService {
_serviceBrand: undefined;
// Creates new untitled document for SQL queries and opens it in a new editor tab
newSqlEditor(sqlContent?: string, connectionProviderName?: string, isDirty?: boolean, objectName?: string): Promise<IConnectableInput>;
newSqlEditor(options?: INewSqlEditorOptions): Promise<IConnectableInput>;
// Creates new edit data session
newEditDataEditor(schemaName: string, tableName: string, queryString: string): Promise<IConnectableInput>;

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
import { IQueryEditorService, INewSqlEditorOptions } from 'sql/workbench/services/queryEditor/common/queryEditorService';
import { IConnectableInput } from 'sql/platform/connection/common/connectionManagement';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
@@ -17,10 +17,9 @@ export class TestQueryEditorService implements IQueryEditorService {
constructor(
@IInstantiationService private readonly instantiationService: IInstantiationService,
@IEditorService private readonly editorService: IEditorService) {
}
newSqlEditor(sqlContent?: string, connectionProviderName?: string, isDirty?: boolean, objectName?: string): Promise<IConnectableInput> {
newSqlEditor(options?: INewSqlEditorOptions): Promise<IConnectableInput> {
const base = this.editorService.createEditorInput({ forceUntitled: true }) as UntitledTextEditorInput;
return Promise.resolve(this.instantiationService.createInstance(UntitledQueryEditorInput, '', base, new QueryResultsInput(base.resource.toString(true))));
}