Skip to content

Commit

Permalink
Merge 6c23ab3 into 6247dc0
Browse files Browse the repository at this point in the history
  • Loading branch information
Aditya Bist committed Nov 18, 2019
2 parents 6247dc0 + 6c23ab3 commit eb33c4d
Show file tree
Hide file tree
Showing 6 changed files with 257 additions and 47 deletions.
56 changes: 56 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,26 @@
"command": "extension.scriptSelect",
"when": "view == objectExplorer && viewItem =~ /^(Table|View)$/",
"group": "MS_SQL@1"
},
{
"command": "extension.scriptCreate",
"when": "view == objectExplorer && viewItem =~ /^(Table|View|AggregateFunction|PartitionFunction|ScalarValuedFunction|Schema|StoredProcedure|TableValuedFunction|User|UserDefinedTableType)$/",
"group": "MS_SQL@1"
},
{
"command": "extension.scriptDelete",
"when": "view == objectExplorer && viewItem =~ /^(Table|View|AggregateFunction|PartitionFunction|ScalarValuedFunction|Schema|StoredProcedure|TableValuedFunction|User|UserDefinedTableType)$/",
"group": "MS_SQL@1"
},
{
"command": "extension.scriptExecute",
"when": "view == objectExplorer && viewItem =~ /^(StoredProcedure)$/",
"group": "MS_SQL@1"
},
{
"command": "extension.scriptAlter",
"when": "view == objectExplorer && viewItem =~ /^(AggregateFunction|PartitionFunction|ScalarValuedFunction|StoredProcedure|TableValuedFunction|View)$/",
"group": "MS_SQL@1"
}
],
"commandPalette": [
Expand All @@ -258,6 +278,22 @@
"command": "extension.scriptSelect",
"when": "view == objectExplorer && viewItem =~ /^(Table|View)$/"
},
{
"command": "extension.scriptCreate",
"when": "view == objectExplorer && viewItem =~ /^(Table|View|AggregateFunction|PartitionFunction|ScalarValuedFunction|Schema|StoredProcedure|TableValuedFunction|User|UserDefinedTableType)$/"
},
{
"command": "extension.scriptDelete",
"when": "view == objectExplorer && viewItem =~ /^(Table|View|AggregateFunction|PartitionFunction|ScalarValuedFunction|Schema|StoredProcedure|TableValuedFunction|User|UserDefinedTableType)$/"
},
{
"command": "extension.scriptExecute",
"when": "view == objectExplorer && viewItem =~ /^(StoredProcedure)$/"
},
{
"command": "extension.scriptAlter",
"when": "view == objectExplorer && viewItem =~ /^(AggregateFunction|PartitionFunction|ScalarValuedFunction|StoredProcedure|TableValuedFunction|View)$/"
},
{
"command": "extension.disconnectObjectExplorerNode",
"when": "view == objectExplorer && viewItem == Server"
Expand Down Expand Up @@ -362,6 +398,26 @@
"command": "extension.scriptSelect",
"title": "%extension.scriptSelect%",
"category": "MS SQL"
},
{
"command": "extension.scriptCreate",
"title": "%extension.scriptCreate%",
"category": "MS SQL"
},
{
"command": "extension.scriptDelete",
"title": "%extension.scriptDelete%",
"category": "MS SQL"
},
{
"command": "extension.scriptExecute",
"title": "%extension.scriptExecute%",
"group": "MS SQL"
},
{
"command": "extension.scriptAlter",
"title": "%extension.scriptAlter%",
"group": "MS SQL"
}
],
"keybindings": [
Expand Down
4 changes: 4 additions & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
"extension.cancelQuery":"Cancel Query",
"extension.addObjectExplorer":"Add Connection",
"extension.scriptSelect":"Select Top 1000",
"extension.scriptCreate":"Script as Create",
"extension.scriptDelete":"Script as Drop",
"extension.scriptExecute":"Script as Execute",
"extension.scriptAlter":"Script as Alter",
"extension.removeObjectExplorerNode":"Remove",
"extension.refreshObjectExplorerNode":"Refresh",
"extension.connections":"Connections",
Expand Down
4 changes: 4 additions & 0 deletions src/constants/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ export const cmdObjectExplorerNodeSignIn = 'extension.objectExplorerNodeSignIn';
export const cmdConnectObjectExplorerNode = 'extension.connectObjectExplorerNode';
export const cmdOpenObjectExplorerCommand = 'workbench.view.extension.objectExplorer';
export const cmdScriptSelect = 'extension.scriptSelect';
export const cmdScriptCreate = 'extension.scriptCreate';
export const cmdScriptDelete = 'extension.scriptDelete';
export const cmdScriptExecute = 'extension.scriptExecute';
export const cmdScriptAlter = 'extension.scriptAlter';
export const cmdToggleSqlCmd = 'extension.toggleSqlCmd';
export const cmdLoadCompletionExtension = 'mssql.loadCompletionExtension';
export const sqlDbPrefix = '.database.windows.net';
Expand Down
123 changes: 84 additions & 39 deletions src/controllers/mainController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { AccountSignInTreeNode } from '../objectExplorer/accountSignInTreeNode';
import { Deferred } from '../protocol';
import { ConnectTreeNode } from '../objectExplorer/connectTreeNode';
import { ObjectExplorerUtils } from '../objectExplorer/objectExplorerUtils';
import { ScriptOperation } from '../models/contracts/scripting/scriptingRequest';

/**
* The main controller class that initializes the extension
Expand Down Expand Up @@ -138,11 +139,13 @@ export default class MainController implements vscode.Disposable {
this.registerCommand(Constants.cmdToggleSqlCmd);
this._event.on(Constants.cmdToggleSqlCmd, async () => { await self.onToggleSqlCmd(); });

// register the object explorer tree provider
// Register the object explorer tree provider
this._objectExplorerProvider = new ObjectExplorerProvider(this._connectionMgr);
this._context.subscriptions.push(
vscode.window.registerTreeDataProvider('objectExplorer', this._objectExplorerProvider)
);

// Add Object Explorer Node
this.registerCommand(Constants.cmdAddObjectExplorer);
this._event.on(Constants.cmdAddObjectExplorer, async () => {
if (!self._objectExplorerProvider.objectExplorerExists) {
Expand All @@ -151,6 +154,7 @@ export default class MainController implements vscode.Disposable {
await self.createObjectExplorerSession();
});

// Object Explorer New Query
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdObjectExplorerNewQuery, async (treeNodeInfo: TreeNodeInfo) => {
Expand All @@ -165,6 +169,7 @@ export default class MainController implements vscode.Disposable {
await self.onNewQuery(treeNodeInfo);
}));

// Remove Object Explorer Node
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdRemoveObjectExplorerNode, async (treeNodeInfo: TreeNodeInfo) => {
Expand All @@ -174,49 +179,13 @@ export default class MainController implements vscode.Disposable {
return this._objectExplorerProvider.refresh(undefined);
}));

// Refresh Object Explorer Node
this.registerCommand(Constants.cmdRefreshObjectExplorerNode);
this._event.on(Constants.cmdRefreshObjectExplorerNode, () => {
return this._objectExplorerProvider.refreshNode(this._objectExplorerProvider.currentNode);
});

// initiate the scripting service
this._scriptingService = new ScriptingService(this._connectionMgr);
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptSelect, async (node: TreeNodeInfo) => {
let actionPromise = new Promise<boolean>(async (resolve, reject) => {
const nodeUri = ObjectExplorerUtils.getNodeUri(node);
let connectionCreds = Object.assign({}, node.connectionCredentials);
const databaseName = ObjectExplorerUtils.getDatabaseName(node);
// if not connected or different database
if (!this.connectionManager.isConnected(nodeUri) ||
connectionCreds.database !== databaseName) {
// make a new connection
connectionCreds.database = databaseName;
if (!this.connectionManager.isConnecting(nodeUri)) {
const promise = new Deferred<boolean>();
await this.connectionManager.connect(nodeUri, connectionCreds, promise);
await promise;
}
}
const selectStatement = await this._scriptingService.scriptSelect(node, nodeUri);
const editor = await this._untitledSqlDocumentService.newQuery(selectStatement);
let uri = editor.document.uri.toString();
let title = path.basename(editor.document.fileName);
const queryUriPromise = new Deferred<boolean>();
await this.connectionManager.connect(uri, connectionCreds, queryUriPromise);
await queryUriPromise;
this._statusview.languageFlavorChanged(uri, Constants.mssqlProviderName);
this._statusview.sqlCmdModeChanged(uri, false);
const queryPromise = new Deferred<boolean>();
await this._outputContentProvider.runQuery(self._statusview, uri, undefined, title, queryPromise);
await queryPromise;
await this.connectionManager.connectionStore.removeRecentlyUsed(<IConnectionProfile>connectionCreds);
return resolve(true);
});
await actionPromise;
}));

// Sign In into Object Explorer Node
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdObjectExplorerNodeSignIn, async (node: AccountSignInTreeNode) => {
Expand All @@ -229,19 +198,56 @@ export default class MainController implements vscode.Disposable {
return self._objectExplorerProvider.refresh(undefined);
}
}));

// Connect to Object Explorer Node
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdConnectObjectExplorerNode, async (node: ConnectTreeNode) => {
self._objectExplorerProvider.currentNode = node.parentNode;
await self.createObjectExplorerSession(node.parentNode.connectionCredentials);
}));

// Disconnect Object Explorer Node
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdDisconnectObjectExplorerNode, async (node: TreeNodeInfo) => {
await this._objectExplorerProvider.removeObjectExplorerNode(node, true);
return this._objectExplorerProvider.refresh(undefined);
}));

// Initiate the scripting service
this._scriptingService = new ScriptingService(this._connectionMgr);

// Script as Select
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptSelect, async (node: TreeNodeInfo) =>
this.scriptNode(node, ScriptOperation.Select, true)));

// Script as Create
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptCreate, async (node: TreeNodeInfo) =>
this.scriptNode(node, ScriptOperation.Create)));

// Script as Drop
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptDelete, async (node: TreeNodeInfo) =>
this.scriptNode(node, ScriptOperation.Delete)));

// Script as Execute
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptExecute, async (node: TreeNodeInfo) =>
this.scriptNode(node, ScriptOperation.Execute)));

// Script as Alter
this._context.subscriptions.push(
vscode.commands.registerCommand(
Constants.cmdScriptAlter, async (node: TreeNodeInfo) =>
this.scriptNode(node, ScriptOperation.Alter)));

// Add handlers for VS Code generated commands
this._vscodeWrapper.onDidCloseTextDocument(params => this.onDidCloseTextDocument(params));
this._vscodeWrapper.onDidOpenTextDocument(params => this.onDidOpenTextDocument(params));
Expand All @@ -252,6 +258,45 @@ export default class MainController implements vscode.Disposable {
});
}

/**
* Helper to script a node based on the script operation
*/
public async scriptNode(node: TreeNodeInfo, operation: ScriptOperation, executeScript: boolean = false): Promise<void> {
let actionPromise = new Promise<boolean>(async (resolve, reject) => {
const nodeUri = ObjectExplorerUtils.getNodeUri(node);
let connectionCreds = Object.assign({}, node.connectionCredentials);
const databaseName = ObjectExplorerUtils.getDatabaseName(node);
// if not connected or different database
if (!this.connectionManager.isConnected(nodeUri) ||
connectionCreds.database !== databaseName) {
// make a new connection
connectionCreds.database = databaseName;
if (!this.connectionManager.isConnecting(nodeUri)) {
const promise = new Deferred<boolean>();
await this.connectionManager.connect(nodeUri, connectionCreds, promise);
await promise;
}
}
const selectStatement = await this._scriptingService.script(node, nodeUri, operation);
const editor = await this._untitledSqlDocumentService.newQuery(selectStatement);
let uri = editor.document.uri.toString();
let title = path.basename(editor.document.fileName);
const queryUriPromise = new Deferred<boolean>();
await this.connectionManager.connect(uri, connectionCreds, queryUriPromise);
await queryUriPromise;
this._statusview.languageFlavorChanged(uri, Constants.mssqlProviderName);
this._statusview.sqlCmdModeChanged(uri, false);
if (executeScript) {
const queryPromise = new Deferred<boolean>();
await this._outputContentProvider.runQuery(this._statusview, uri, undefined, title, queryPromise);
await queryPromise;
await this.connectionManager.connectionStore.removeRecentlyUsed(<IConnectionProfile>connectionCreds);
}
return resolve(true);
});
await actionPromise;
}

/**
* Returns a flag indicating if the extension is initialized
*/
Expand Down
29 changes: 25 additions & 4 deletions src/scripting/scriptingService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,27 @@ export class ScriptingService {
return scriptingObject;
}

public async scriptSelect(node: TreeNodeInfo, uri: string): Promise<string> {
/**
* Helper to create scripting params
*/
public createScriptingParams(node: TreeNodeInfo, uri: string, operation: ScriptOperation): ScriptingParams {
const scriptingObject = this.getObjectFromNode(node);
let serverInfo = this._connectionManager.getServerInfo(node.connectionCredentials);
let scriptCreateDropOption: string;
switch (operation) {
case (ScriptOperation.Select):
scriptCreateDropOption = 'ScriptSelect';
break;
case (ScriptOperation.Delete):
scriptCreateDropOption = 'ScriptDrop';
break;
case (ScriptOperation.Create):
scriptCreateDropOption = 'ScriptCreate';
default:
scriptCreateDropOption = 'ScriptCreate';
}
let scriptOptions: ScriptOptions = {
scriptCreateDrop: 'ScriptSelect',
scriptCreateDrop: scriptCreateDropOption,
typeOfDataToScript: 'SchemaOnly',
scriptStatistics: 'ScriptStatsNone',
targetDatabaseEngineEdition: serverInfo && serverInfo.engineEditionId ?
Expand All @@ -83,10 +99,15 @@ export class ScriptingService {
connectionDetails: undefined,
ownerURI: uri,
selectScript: undefined,
operation: ScriptOperation.Select
operation: operation
};
return scriptingParams;
}


public async script(node: TreeNodeInfo, uri: string, operation: ScriptOperation): Promise<string> {
let scriptingParams = this.createScriptingParams(node, uri, operation);
const result = await this._client.sendRequest(ScriptingRequest.type, scriptingParams);
return result.script;
}

}

0 comments on commit eb33c4d

Please sign in to comment.