Compare commits

..

18 Commits
1.3.0 ... 1.2.3

Author SHA1 Message Date
Karl Burtram
8439cde610 Bump SQL Tools to 1.5.0-alpha.52 2018-10-31 20:38:22 -07:00
Anthony Dresser
2080c525a7 Auto Scale Axis (#3070)
* fix input to chart that was causes scales to not auto size

* formatting

* formatting

* added comments
2018-10-31 20:33:09 -07:00
Aditya Bist
db2d380b6c Agent/edit job logic (#3023)
* lumped stepdata with jobdata in job dialog

* fix bug with empty steps

* added clumped and update steps and schedules from job dialog

* edit data sends one call instead of multiple

* cleaned code
2018-10-31 20:32:59 -07:00
Alan Ren
a06f80bdb1 fix for issue 3065 (#3067)
* fix for 3065

* remove the parameter, no need to save connection
2018-10-31 20:32:51 -07:00
Karl Burtram
1f76c85b1b Remove SQL Import dashboard tab (#3064) 2018-10-31 20:32:37 -07:00
Karl Burtram
cffc18d5ea Revert "Revert "Add a command line interface for connecting to a SQL Server (#3047)""
This reverts commit a747b6a500.
2018-10-31 20:32:17 -07:00
Karl Burtram
a747b6a500 Revert "Add a command line interface for connecting to a SQL Server (#3047)"
This reverts commit 7f66087d8c.
2018-10-31 14:39:46 -07:00
Aditya Bist
711b7bf622 fixed null ref (#3061) 2018-10-31 14:25:39 -07:00
Alan Ren
9b0757de9c a few ux improvements (#3057)
* style update

* checkbox styler

* casing update
2018-10-31 14:25:26 -07:00
Alan Ren
b9a0744a83 fix for issue 2719 (#3060) 2018-10-31 14:25:14 -07:00
Karl Burtram
c69915ca58 Bump SQL Tools to 1.5.0-alpha.51 2018-10-31 13:17:20 -07:00
Karl Burtram
a16835918a Fix build break in previous Query Plan commit 2018-10-31 13:04:32 -07:00
David Shiflet
f9e27d7112 Add a command line interface for connecting to a SQL Server (#3047)
* Add switches for server, database, user, integrated auth

* Refactor into new commandline service

* Open query editor when passed server on command line

* Add tests
2018-10-31 10:14:36 -07:00
Ryan
c072ba9c5c Add query plan theme support (#2991) (#3031)
Add monaco-editor and monaco-editor-hover to output otherwise backgrounds collide.
2018-10-31 10:14:26 -07:00
Alan Ren
807fb2ed8a fix missing footer for backup dialog (#3056)
@MattIrv  Thanks for helping out
2018-10-31 09:46:14 -07:00
Ruturaj Gujar
daf347b728 Fixed some typos and grammatical errors (#3027) 2018-10-31 09:46:06 -07:00
Karl Burtram
e76222db7a Change 'None' to 'Do not save' in Connection Dialog (#3051) 2018-10-30 10:46:24 -07:00
Karl Burtram
f676090901 Bump Azure Data Studio to 1.2.3 2018-10-30 10:28:29 -07:00
51 changed files with 254 additions and 527 deletions

View File

@@ -2,7 +2,7 @@
"name": "agent", "name": "agent",
"displayName": "SQL Server Agent", "displayName": "SQL Server Agent",
"description": "Manage and troubleshoot SQL Server Agent jobs", "description": "Manage and troubleshoot SQL Server Agent jobs",
"version": "0.35.0", "version": "0.34.0",
"publisher": "Microsoft", "publisher": "Microsoft",
"preview": true, "preview": true,
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt", "license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",

View File

@@ -35,7 +35,7 @@ export class OperatorDialog extends AgentDialog<OperatorData> {
private static readonly PagerSundayCheckBoxLabel: string = localize('createOperator.PagerSundayCheckBox', 'Sunday'); private static readonly PagerSundayCheckBoxLabel: string = localize('createOperator.PagerSundayCheckBox', 'Sunday');
private static readonly WorkdayBeginLabel: string = localize('createOperator.workdayBegin', 'Workday begin'); private static readonly WorkdayBeginLabel: string = localize('createOperator.workdayBegin', 'Workday begin');
private static readonly WorkdayEndLabel: string = localize('createOperator.workdayEnd', 'Workday end'); private static readonly WorkdayEndLabel: string = localize('createOperator.workdayEnd', 'Workday end');
private static readonly PagerDutyScheduleLabel: string = localize('createOperator.PagerDutySchedule', 'Pager on duty schedule'); private static readonly PagerDutyScheduleLabel: string = localize('createOperator.PagerDutySchedule', 'Pager on duty schdule');
// Notifications tab strings // Notifications tab strings
private static readonly AlertsTableLabel: string = localize('createOperator.AlertListHeading', 'Alert list'); private static readonly AlertsTableLabel: string = localize('createOperator.AlertListHeading', 'Alert list');

View File

@@ -2,7 +2,7 @@
"name": "import", "name": "import",
"displayName": "SQL Server Import", "displayName": "SQL Server Import",
"description": "SQL Server Import for Azure Data Studio supports importing CSV or JSON files into SQL Server.", "description": "SQL Server Import for Azure Data Studio supports importing CSV or JSON files into SQL Server.",
"version": "0.4.0", "version": "0.3.0",
"publisher": "Microsoft", "publisher": "Microsoft",
"preview": true, "preview": true,
"engines": { "engines": {

View File

@@ -345,7 +345,7 @@
"specialValueType": null, "specialValueType": null,
"isIdentity": false, "isIdentity": false,
"name": "asynchronousProcessing", "name": "asynchronousProcessing",
"displayName": "Asynchronous processing", "displayName": "Asynchronous processing enabled",
"description": "When true, enables usage of the Asynchronous functionality in the .Net Framework Data Provider", "description": "When true, enables usage of the Asynchronous functionality in the .Net Framework Data Provider",
"groupName": "Initialization", "groupName": "Initialization",
"valueType": "boolean", "valueType": "boolean",
@@ -387,7 +387,7 @@
"specialValueType": null, "specialValueType": null,
"isIdentity": false, "isIdentity": false,
"name": "columnEncryptionSetting", "name": "columnEncryptionSetting",
"displayName": "Column encryption", "displayName": "Column encryption setting",
"description": "Default column encryption setting for all the commands on the connection", "description": "Default column encryption setting for all the commands on the connection",
"groupName": "Security", "groupName": "Security",
"valueType": "category", "valueType": "category",

View File

@@ -42,18 +42,18 @@
"Create a new Table": { "Create a new Table": {
"prefix": "sqlCreateTable", "prefix": "sqlCreateTable",
"body": [ "body": [
"-- Create a new table called '[${1:TableName}]' in schema '[${2:dbo}]'", "-- Create a new table called '[${1:TableName}]' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"-- Drop the table if it already exists", "-- Drop the table if it already exists",
"IF OBJECT_ID('[${2:dbo}].[${1:TableName}]', 'U') IS NOT NULL", "IF OBJECT_ID('[${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]', 'U') IS NOT NULL",
"DROP TABLE [${2:dbo}].[${1:TableName}]", "DROP TABLE [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]",
"GO", "GO",
"-- Create the table in the specified schema", "-- Create the table in the specified database and schema",
"CREATE TABLE [${2:dbo}].[${1:TableName}]", "CREATE TABLE [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]",
"(", "(",
"\t[${3:Id}] INT NOT NULL PRIMARY KEY, -- Primary Key column", "\t[${4:ColumnName}]Id INT NOT NULL PRIMARY KEY, -- Primary Key column",
"\t[${4:ColumnName2}] ${5:NVARCHAR(50)} NOT NULL,", "\t[${5:ColumnName1}] [NVARCHAR](50) NOT NULL,",
"\t[${6:ColumnName3}] ${7:NVARCHAR(50)} NOT NULL", "\t[${6:ColumnName2}] [NVARCHAR](50) NOT NULL",
"\t$0-- Specify more columns here", "\t-- Specify more columns here",
");", ");",
"GO" "GO"
], ],
@@ -64,10 +64,10 @@
"Drop a Table": { "Drop a Table": {
"prefix": "sqlDropTable", "prefix": "sqlDropTable",
"body": [ "body": [
"-- Drop a table called '${1:TableName}' in schema '${2:dbo}'", "-- Drop a table called '${3:TableName}' in schema '${2:SchemaName}' in Database '${1:DatabaseName}'",
"-- Drop the table if it already exists", "-- Drop the table if it already exists",
"IF OBJECT_ID('[${2:dbo}].[${1:TableName}]', 'U') IS NOT NULL", "IF OBJECT_ID('[${1:DatabaseName}].[${2:SchemaName}].[${3:TableName}]', 'U') IS NOT NULL",
"DROP TABLE [${2:dbo}].[${1:TableName}]", "DROP TABLE [${1:DatabaseName}].[${2:SchemaName}].[${3:TableName}]",
"GO" "GO"
], ],
"description": "Drop a Table" "description": "Drop a Table"
@@ -76,9 +76,9 @@
"Add a new column to a Table": { "Add a new column to a Table": {
"prefix": "sqlAddColumn", "prefix": "sqlAddColumn",
"body": [ "body": [
"-- Add a new column '[${1:NewColumnName}]' to table '[${2:TableName}]' in schema '[${3:dbo}]'", "-- Add a new column '[${1:NewColumnName}]' to table '[${2:TableName}]' in schema '[${3:SchemaName}]' in database '[${4:DatabaseName}]'",
"ALTER TABLE [${3:dbo}].[${2:TableName}]", "ALTER TABLE [${4:DatabaseName}].[${3:SchemaName}].[${2:TableName}]",
"\tADD [${1:NewColumnName}] /*new_column_name*/ ${4:int} /*new_column_datatype*/ ${5:NULL} /*new_column_nullability*/", "\tADD [${1:NewColumnName}] /*new_column_name*/ ${5:int} /*new_column_datatype*/ ${6:NULL} /*new_column_nullability*/",
"GO" "GO"
], ],
"description": "Add a new column to a Table" "description": "Add a new column to a Table"
@@ -87,8 +87,8 @@
"Drop a column from a Table": { "Drop a column from a Table": {
"prefix": "sqlDropColumn", "prefix": "sqlDropColumn",
"body": [ "body": [
"-- Drop '[${1:ColumnName}]' from table '[${2:TableName}]' in schema '[${3:dbo}]'", "-- Drop '[${1:ColumnName}]' from table '[${2:TableName}]' in schema '[${3:SchemaName}]' in database '[${4:DatabaseName}]'",
"ALTER TABLE [${3:dbo}].[${2:TableName}]", "ALTER TABLE [${4:DatabaseName}].[${3:SchemaName}].[${2:TableName}]",
"\tDROP COLUMN [${1:ColumnName}]", "\tDROP COLUMN [${1:ColumnName}]",
"GO" "GO"
], ],
@@ -98,9 +98,9 @@
"Select rows from a Table or a View": { "Select rows from a Table or a View": {
"prefix": "sqlSelect", "prefix": "sqlSelect",
"body": [ "body": [
"-- Select rows from a Table or View '[${1:TableOrViewName}]' in schema '[${2:dbo}]'", "-- Select rows from a Table or View '[${1:TableOrViewName}]' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"SELECT * FROM [${2:dbo}].[${1:TableOrViewName}]", "SELECT * FROM [${3:DatabaseName}].[${2:SchemaName}].[${1:TableOrViewName}]",
"WHERE ${3:/* add search conditions here */}", "WHERE ${4:/* add search conditions here */}",
"GO" "GO"
], ],
"description": "Select rows from a Table or a View" "description": "Select rows from a Table or a View"
@@ -109,17 +109,17 @@
"Insert rows into a Table": { "Insert rows into a Table": {
"prefix": "sqlInsertRows", "prefix": "sqlInsertRows",
"body": [ "body": [
"-- Insert rows into table '${1:TableName}' in schema '[${2:dbo}]'", "-- Insert rows into table '${1:TableName}' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"INSERT INTO [${2:dbo}].[${1:TableName}]", "INSERT INTO [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]",
"( -- Columns to insert data into", "( -- Columns to insert data into",
" ${3:[ColumnName1], [ColumnName2], [ColumnName3]}", " ${4:[ColumnName1], [ColumnName2], [ColumnName3]}",
")", ")",
"VALUES", "VALUES",
"( -- First row: values for the columns in the list above", "( -- First row: values for the columns in the list above",
" ${4:ColumnValue1, ColumnValue2, ColumnValue3}", " ${5:ColumnValue1, ColumnValue2, ColumnValue3}",
"),", "),",
"( -- Second row: values for the columns in the list above", "( -- Second row: values for the columns in the list above",
" ${5:ColumnValue1, ColumnValue2, ColumnValue3}", " ${6:ColumnValue1, ColumnValue2, ColumnValue3}",
")", ")",
"-- Add more rows here", "-- Add more rows here",
"GO" "GO"
@@ -130,9 +130,9 @@
"Delete rows from a Table": { "Delete rows from a Table": {
"prefix": "sqlDeleteRows", "prefix": "sqlDeleteRows",
"body": [ "body": [
"-- Delete rows from table '[${1:TableName}]' in schema '[${2:dbo}]'", "-- Delete rows from table '[${1:TableName}]' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"DELETE FROM [${2:dbo}].[${1:TableName}]", "DELETE FROM [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]",
"WHERE ${3:/* add search conditions here */}", "WHERE ${4:/* add search conditions here */}",
"GO" "GO"
], ],
"description": "Delete rows from a Table" "description": "Delete rows from a Table"
@@ -141,13 +141,13 @@
"Update rows in a Table": { "Update rows in a Table": {
"prefix": "sqlUpdateRows", "prefix": "sqlUpdateRows",
"body": [ "body": [
"-- Update rows in table '[${1:TableName}]' in schema '[${2:dbo}]'", "-- Update rows in table '[${1:TableName}]' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"UPDATE [${2:dbo}].[${1:TableName}]", "UPDATE [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}]",
"SET", "SET",
"\t[${3:ColumnName1}] = ${4:ColumnValue1},", "\t[${4:ColumnName1}] = ${5:ColumnValue1},",
"\t[${5:ColumnName2}] = ${6:ColumnValue2}", "\t[${6:ColumnName2}] = ${7:ColumnValue2}",
"\t-- Add more columns and values here", "\t-- Add more columns and values here",
"WHERE ${7:/* add search conditions here */}", "WHERE ${8:/* add search conditions here */}",
"GO" "GO"
], ],
"description": "Update rows in a Table" "description": "Update rows in a Table"
@@ -156,27 +156,27 @@
"Create a stored procedure": { "Create a stored procedure": {
"prefix": "sqlCreateStoredProc", "prefix": "sqlCreateStoredProc",
"body": [ "body": [
"-- Create a new stored procedure called '${1:StoredProcedureName}' in schema '${2:dbo}'", "-- Create a new stored procedure called '${1:StoredProcedureName}' in schema '${2:SchemaName}'",
"-- Drop the stored procedure if it already exists", "-- Drop the stored procedure if it already exists",
"IF EXISTS (", "IF EXISTS (",
"SELECT *", "SELECT *",
"\tFROM INFORMATION_SCHEMA.ROUTINES", "\tFROM INFORMATION_SCHEMA.ROUTINES",
"WHERE SPECIFIC_SCHEMA = N'${2:dbo}'", "WHERE SPECIFIC_SCHEMA = N'${2:SchemaName}'",
"\tAND SPECIFIC_NAME = N'${1:StoredProcedureName}'", "\tAND SPECIFIC_NAME = N'${1:StoredProcedureName}'",
")", ")",
"DROP PROCEDURE ${2:dbo}.${1:StoredProcedureName}", "DROP PROCEDURE ${2:SchemaName}.${1:StoredProcedureName}",
"GO", "GO",
"-- Create the stored procedure in the specified schema", "-- Create the stored procedure in the specified schema",
"CREATE PROCEDURE ${2:dbo}.${1:StoredProcedureName}", "CREATE PROCEDURE ${2:SchemaName}.${1:StoredProcedureName}",
"\t$3@param1 /*parameter name*/ $4int /*datatype_for_param1*/ = 0, /*default_value_for_param1*/", "\t$3@param1 /*parameter name*/ int /*datatype_for_param1*/ = 0, /*default_value_for_param1*/",
"\t$5@param2 /*parameter name*/ $6int /*datatype_for_param1*/ = 0 /*default_value_for_param2*/", "\t$4@param2 /*parameter name*/ int /*datatype_for_param1*/ = 0 /*default_value_for_param2*/",
"-- add more stored procedure parameters here", "-- add more stored procedure parameters here",
"AS", "AS",
"\t-- body of the stored procedure", "\t-- body of the stored procedure",
"\tSELECT @param1, @param2", "\tSELECT @param1, @param2",
"GO", "GO",
"-- example to execute the stored procedure we just created", "-- example to execute the stored procedure we just created",
"EXECUTE ${2:dbo}.${1:StoredProcedureName} 1 /*value_for_param1*/, 2 /*value_for_param2*/", "EXECUTE ${2:SchemaName}.${1:StoredProcedureName} 1 /*value_for_param1*/, 2 /*value_for_param2*/",
"GO" "GO"
], ],
"description": "Create a stored procedure" "description": "Create a stored procedure"
@@ -185,14 +185,14 @@
"Drop a stored procedure": { "Drop a stored procedure": {
"prefix": "sqlDropStoredProc", "prefix": "sqlDropStoredProc",
"body": [ "body": [
"-- Drop the stored procedure called '${1:StoredProcedureName}' in schema '${2:dbo}'", "-- Drop the stored procedure called '${1:StoredProcedureName}' in schema '${2:SchemaName}'",
"IF EXISTS (", "IF EXISTS (",
"SELECT *", "SELECT *",
"\tFROM INFORMATION_SCHEMA.ROUTINES", "\tFROM INFORMATION_SCHEMA.ROUTINES",
"WHERE SPECIFIC_SCHEMA = N'${2:dbo}'", "WHERE SPECIFIC_SCHEMA = N'${2:SchemaName}'",
"\tAND SPECIFIC_NAME = N'${1:StoredProcedureName}'", "\tAND SPECIFIC_NAME = N'${1:StoredProcedureName}'",
")", ")",
"DROP PROCEDURE ${2:dbo}.${1:StoredProcedureName}", "DROP PROCEDURE ${2:SchemaName}.${1:StoredProcedureName}",
"GO" "GO"
], ],
"description": "Drop a stored procedure" "description": "Drop a stored procedure"
@@ -241,7 +241,7 @@
"Declare a cursor": { "Declare a cursor": {
"prefix": "sqlCursor", "prefix": "sqlCursor",
"body": [ "body": [
"-- Declare a cursor for a Table or a View '${1:TableOrViewName}' in schema '${2:dbo}'", "-- Declare a cursor for a Table or a View '${1:TableOrViewName}' in schema '${2:SchemaName}'",
"DECLARE @ColumnName1 NVARCHAR(50), @ColumnName2 NVARCHAR(50)", "DECLARE @ColumnName1 NVARCHAR(50), @ColumnName2 NVARCHAR(50)",
"", "",
"DECLARE db_cursor CURSOR FOR", "DECLARE db_cursor CURSOR FOR",
@@ -304,8 +304,8 @@
"prefix": "sqlCreateIndex", "prefix": "sqlCreateIndex",
"body": [ "body": [
"-- Create a nonclustered index with or without a unique constraint", "-- Create a nonclustered index with or without a unique constraint",
"-- Or create a clustered index on table '[${1:TableName}]' in schema '[${2:dbo}]' in database '[${3:DatabaseName}]'", "-- Or create a clustered index on table '[${1:TableName}]' in schema '[${2:SchemaName}]' in database '[${3:DatabaseName}]'",
"CREATE ${5:/*UNIQUE or CLUSTERED*/} INDEX IX_${4:IndexName} ON [${3:DatabaseName}].[${2:dbo}].[${1:TableName}] ([${6:ColumnName1}] DESC /*Change sort order as needed*/", "CREATE ${5:/*UNIQUE or CLUSTERED*/} INDEX IX_${4:IndexName} ON [${3:DatabaseName}].[${2:SchemaName}].[${1:TableName}] ([${6:ColumnName1}] DESC /*Change sort order as needed*/",
"GO" "GO"
], ],
"description": "Create a new Index" "description": "Create a new Index"
@@ -319,13 +319,13 @@
"IF OBJECT_ID('tempDB..#${1:TableName}', 'U') IS NOT NULL", "IF OBJECT_ID('tempDB..#${1:TableName}', 'U') IS NOT NULL",
"DROP TABLE #${1:TableName}", "DROP TABLE #${1:TableName}",
"GO", "GO",
"-- Create the temporary table from a physical table called '${4:TableName}' in schema '${3:dbo}' in database '${2:DatabaseName}'", "-- Create the temporary table from a physical table called '${4:TableName}' in schema '${3:SchemaName}' in database '${2:DatabaseName}'",
"SELECT *", "SELECT *",
"INTO #${1:TableName}", "INTO #${1:TableName}",
"FROM [${2:DatabaseName}].[${3:[dbo}].[${4:TableName}]", "FROM [${2:DatabaseName}].[${3:[SchemaName}].[${4:TableName}]",
"WHERE ${5:/* add search conditions here */}" "WHERE ${5:/* add search conditions here */}"
], ],
"description": "Create a new Temporary Table" "description": "Create a new Temporary Table"
} },
} }

View File

@@ -12,7 +12,6 @@ import { CreateSessionData } from '../data/createSessionData';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
export class CreateSessionDialog { export class CreateSessionDialog {
private readonly _providerType: string;
// Top level // Top level
private readonly DialogTitle: string = localize('createSessionDialog.newSession', 'New Session'); private readonly DialogTitle: string = localize('createSessionDialog.newSession', 'New Session');
@@ -31,17 +30,13 @@ export class CreateSessionDialog {
public readonly onSuccess: vscode.Event<CreateSessionData> = this._onSuccess.event; public readonly onSuccess: vscode.Event<CreateSessionData> = this._onSuccess.event;
constructor(ownerUri: string, providerType: string, templates: Array<sqlops.ProfilerSessionTemplate>) { constructor(ownerUri: string, templates: Array<sqlops.ProfilerSessionTemplate>) {
if (typeof (templates) === 'undefined' || templates === null) { if (typeof (templates) === 'undefined' || templates === null) {
throw new Error(localize('createSessionDialog.templatesInvalid', "Invalid templates list, cannot open dialog")); throw new Error(localize('createSessionDialog.templatesInvalid', "Invalid templates list, cannot open dialog"));
} }
if (typeof (ownerUri) === 'undefined' || ownerUri === null) { if (typeof (ownerUri) === 'undefined' || ownerUri === null) {
throw new Error(localize('createSessionDialog.dialogOwnerInvalid', "Invalid dialog owner, cannot open dialog")); throw new Error(localize('createSessionDialog.dialogOwnerInvalid', "Invalid dialog owner, cannot open dialog"));
} }
if (typeof (providerType) === 'undefined' || providerType === null) {
throw new Error(localize('createSessionDialog.invalidProviderType', "Invalid provider type, cannot open dialog"));
}
this._providerType = providerType;
this.model = new CreateSessionData(ownerUri, templates); this.model = new CreateSessionData(ownerUri, templates);
} }
@@ -102,7 +97,8 @@ export class CreateSessionDialog {
} }
private async execute(): Promise<void> { private async execute(): Promise<void> {
let profilerService = sqlops.dataprotocol.getProvider<sqlops.ProfilerProvider>(this._providerType, sqlops.DataProviderType.ProfilerProvider); let currentConnection = await sqlops.connection.getCurrentConnection();
let profilerService = sqlops.dataprotocol.getProvider<sqlops.ProfilerProvider>(currentConnection.providerName, sqlops.DataProviderType.ProfilerProvider);
let name = this.sessionNameBox.value; let name = this.sessionNameBox.value;
let selected = this.templatesBox.value.toString(); let selected = this.templatesBox.value.toString();

View File

@@ -29,8 +29,8 @@ export class MainController {
} }
public activate(): void { public activate(): void {
vscode.commands.registerCommand('profiler.openCreateSessionDialog', (ownerUri: string, providerType: string, templates: Array<sqlops.ProfilerSessionTemplate>) => { vscode.commands.registerCommand('profiler.openCreateSessionDialog', (ownerUri: string, templates: Array<sqlops.ProfilerSessionTemplate>) => {
let dialog = new CreateSessionDialog(ownerUri, providerType, templates); let dialog = new CreateSessionDialog(ownerUri, templates);
dialog.showDialog(); dialog.showDialog();
}); });
} }

View File

@@ -2,7 +2,7 @@
"name": "profiler", "name": "profiler",
"displayName": "SQL Server Profiler", "displayName": "SQL Server Profiler",
"description": "SQL Server Profiler for Azure Data Studio", "description": "SQL Server Profiler for Azure Data Studio",
"version": "0.3.0", "version": "0.2.0",
"publisher": "Microsoft", "publisher": "Microsoft",
"preview": true, "preview": true,
"license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt", "license": "https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/LICENSE.txt",
@@ -26,6 +26,7 @@
"Microsoft.mssql" "Microsoft.mssql"
], ],
"contributes": { "contributes": {
"commands": [ "commands": [
{ {
"command": "profiler.newProfiler", "command": "profiler.newProfiler",
@@ -48,15 +49,6 @@
"category": "Profiler" "category": "Profiler"
} }
], ],
"menus": {
"objectExplorer/item/context": [
{
"command": "profiler.newProfiler",
"when": "connectionProvider == MSSQL && nodeType && nodeType == Server",
"group": "profiler"
}
]
},
"outputChannels": [ "outputChannels": [
"sqlprofiler" "sqlprofiler"
] ]
@@ -67,4 +59,4 @@
"devDependencies": { "devDependencies": {
"vscode": "1.0.1" "vscode": "1.0.1"
} }
} }

View File

@@ -67,8 +67,7 @@
"panel.background": "#212121", "panel.background": "#212121",
"panel.border": "#515151", "panel.border": "#515151",
"panelTitle.activeForeground": "#ffffff", "panelTitle.activeForeground": "#ffffff",
"panelTitle.inactiveForeground": "#888888", "panelTitle.inactiveForeground": "#888888"
"panelTitle.activeBorder": "#026dc8"
}, },
"tokenColors": [ "tokenColors": [
{ {

View File

@@ -77,8 +77,7 @@
"panel.background": "#ffffff", "panel.background": "#ffffff",
"panel.border": "#c8c8c8", "panel.border": "#c8c8c8",
"panelTitle.activeForeground": "#212121", "panelTitle.activeForeground": "#212121",
"panelTitle.inactiveForeground": "#757575", "panelTitle.inactiveForeground": "#757575"
"panelTitle.activeBorder": "#026dc8"
}, },
"tokenColors": [ "tokenColors": [
{ {

View File

@@ -1,6 +1,6 @@
{ {
"name": "azuredatastudio", "name": "azuredatastudio",
"version": "1.2.4", "version": "1.2.3",
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee", "distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
"author": { "author": {
"name": "Microsoft Corporation" "name": "Microsoft Corporation"

View File

@@ -611,7 +611,7 @@
</body></file> </body></file>
<file original="src/sql/parts/connection/common/connectionActions" source-language="en" datatype="plaintext"><body> <file original="src/sql/parts/connection/common/connectionActions" source-language="en" datatype="plaintext"><body>
<trans-unit id="ClearRecentlyUsedLabel"> <trans-unit id="ClearRecentlyUsedLabel">
<source xml:lang="en">Clear List</source> <source xml:lang="en">Clear Recent Connections List</source>
</trans-unit> </trans-unit>
<trans-unit id="ClearedRecentConnections"> <trans-unit id="ClearedRecentConnections">
<source xml:lang="en">Recent connections list cleared</source> <source xml:lang="en">Recent connections list cleared</source>
@@ -1039,10 +1039,10 @@
<source xml:lang="en">Connection</source> <source xml:lang="en">Connection</source>
</trans-unit> </trans-unit>
<trans-unit id="recentConnectionTitle"> <trans-unit id="recentConnectionTitle">
<source xml:lang="en">Recent Connections</source> <source xml:lang="en">Recent connections</source>
</trans-unit> </trans-unit>
<trans-unit id="savedConnectionTitle"> <trans-unit id="savedConnectionTitle">
<source xml:lang="en">Saved Connections</source> <source xml:lang="en">Saved connections</source>
</trans-unit> </trans-unit>
<trans-unit id="connectType"> <trans-unit id="connectType">
<source xml:lang="en">Connection type</source> <source xml:lang="en">Connection type</source>
@@ -1644,7 +1644,7 @@
</body></file> </body></file>
<file original="src/sql/parts/connection/connectionDialog/advancedPropertiesController" source-language="en" datatype="plaintext"><body> <file original="src/sql/parts/connection/connectionDialog/advancedPropertiesController" source-language="en" datatype="plaintext"><body>
<trans-unit id="connectionAdvancedProperties"> <trans-unit id="connectionAdvancedProperties">
<source xml:lang="en">Advanced Properties</source> <source xml:lang="en">Advanced properties</source>
</trans-unit> </trans-unit>
<trans-unit id="advancedProperties.discard"> <trans-unit id="advancedProperties.discard">
<source xml:lang="en">Discard</source> <source xml:lang="en">Discard</source>

View File

@@ -56,7 +56,6 @@
.modal .modal-title { .modal .modal-title {
font-size: 15px; font-size: 15px;
font-weight: 600;
} }
.modal .modal-title-icon { .modal .modal-title-icon {
@@ -148,7 +147,7 @@
} }
.modal .footer-button { .modal .footer-button {
margin-left: 5px; margin-right: 5px;
} }
.modal .right-footer .footer-button:last-of-type { .modal .right-footer .footer-button:last-of-type {

View File

@@ -20,34 +20,11 @@
} }
.optionsDialog-options-groups { .optionsDialog-options-groups {
margin-top: 10px; padding: 15px;
flex: 1 1; height: calc(100% - 150px);
overflow-y: auto; overflow-y: auto;
} }
.optionsDialog-options-groups {
margin: 10px 0px;
flex: 1 1;
overflow-y: auto;
}
.vs .optionsDialog-options-groups {
box-shadow: 0 1px 4px 1px rgba(220, 220, 220, 0.71);
}
.vs-dark .optionsDialog-options-groups {
box-shadow: 0 4px 5px 0px rgba(0, 0, 0, 0.71);
}
.optionsDialog-options-groups .split-view-view .header {
padding-left: 28px !important;
background-position-x: 8px !important;
}
.optionsDialog-options-groups .split-view-view .body {
padding-left: 5px !important;
}
.backButtonIcon { .backButtonIcon {
content: url('back.svg'); content: url('back.svg');
width: 20px; width: 20px;
@@ -56,42 +33,21 @@
cursor: pointer; cursor: pointer;
} }
.hc-black .backButtonIcon, .vs-dark.monaco-shell .backButtonIcon {
.vs-dark .backButtonIcon {
content: url('back_inverse.svg'); content: url('back_inverse.svg');
} }
.optionsDialog-description { .optionsDialog-description {
height: 90px; padding: 15px;
margin: 15px; overflow-y: auto;
overflow-y: auto;
}
.optionsDialog-description .modal-title {
background-repeat: no-repeat;
background-position: 2px center;
padding-left: 25px;
background-size: 16px;
}
.vs .optionsDialog-description .modal-title {
background-image: url('info_notification.svg')
}
.vs-dark .optionsDialog-description .modal-title,
.hc-black .optionsDialog-description .modal-title {
background-image: url('info_notification_inverse.svg')
} }
.optionsDialog-options { .optionsDialog-options {
height: 100%; height: calc(100% - 30px);
display: flex;
flex-direction: column;
} }
.optionsDialog-description-content { .optionsDialog-description-content {
padding-top: 10px; padding: 10px;
padding-left: 25px;
} }
.optionsDialog-table{ .optionsDialog-table{

View File

@@ -125,7 +125,7 @@ export class OptionsDialog extends Modal {
}); });
let builder = new Builder(this._body); let builder = new Builder(this._body);
builder.div({}, (dividerContainer) => { builder.div({ class: 'Connection-divider' }, (dividerContainer) => {
this._dividerBuilder = dividerContainer; this._dividerBuilder = dividerContainer;
}); });

View File

@@ -46,9 +46,9 @@ panel {
} }
.tabbedPanel .tabList .tab .tabLabel { .tabbedPanel .tabList .tab .tabLabel {
font-size: 14px; text-transform: uppercase;
font-size: 13px;
padding-bottom: 4px; padding-bottom: 4px;
font-weight: 600;
} }
.tabbedPanel.vertical .tabList .tab .tabLabel { .tabbedPanel.vertical .tabList .tab .tabLabel {

View File

@@ -36,6 +36,7 @@ export interface IPanelTab {
interface IInternalPanelTab extends IPanelTab { interface IInternalPanelTab extends IPanelTab {
header: HTMLElement; header: HTMLElement;
label: HTMLElement; label: HTMLElement;
dispose(): void;
} }
const defaultOptions: IPanelOptions = { const defaultOptions: IPanelOptions = {
@@ -142,6 +143,8 @@ export class TabbedPanel extends Disposable implements IThemable {
this.tabList.appendChild(tabHeaderElement); this.tabList.appendChild(tabHeaderElement);
tab.header = tabHeaderElement; tab.header = tabHeaderElement;
tab.label = tabLabel; tab.label = tabLabel;
tab.dispose = () => { };
this._register(tab);
} }
public showTab(id: PanelTabIdentifier): void { public showTab(id: PanelTabIdentifier): void {

View File

@@ -19,7 +19,6 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => {
.tabbedPanel > .title .tabList .tab .tabLabel.active { .tabbedPanel > .title .tabList .tab .tabLabel.active {
color: ${titleActive}; color: ${titleActive};
border-bottom-color: ${titleActiveBorder}; border-bottom-color: ${titleActiveBorder};
border-bottom-width: 2px;
} }
.tabbedPanel > .title .tabList .tab-header.active { .tabbedPanel > .title .tabList .tab-header.active {

View File

@@ -3,14 +3,11 @@
* Licensed under the Source EULA. See License.txt in the project root for license information. * Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { IDisposableDataProvider } from 'sql/base/browser/ui/table/interfaces';
export interface IObservableCollection<T> { export interface IObservableCollection<T> {
getLength(): number; getLength(): number;
at(index: number): T; at(index: number): T;
getRange(start: number, end: number): T[]; getRange(start: number, end: number): T[];
setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void; setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void;
dispose(): void;
} }
export interface IGridDataRow { export interface IGridDataRow {
@@ -27,27 +24,24 @@ class LoadCancellationToken {
} }
class DataWindow<TData> { class DataWindow<TData> {
private _dataSourceLength: number;
private _data: TData[]; private _data: TData[];
private _length: number = 0; private _length: number = 0;
private _offsetFromDataSource: number = -1; private _offsetFromDataSource: number = -1;
private loadFunction: (offset: number, count: number) => Thenable<TData[]>;
private lastLoadCancellationToken: LoadCancellationToken; private lastLoadCancellationToken: LoadCancellationToken;
private loadCompleteCallback: (start: number, end: number) => void;
private placeholderItemGenerator: (index: number) => TData;
constructor( constructor(dataSourceLength: number,
private loadFunction: (offset: number, count: number) => Thenable<TData[]>, loadFunction: (offset: number, count: number) => Thenable<TData[]>,
private placeholderItemGenerator: (index: number) => TData, placeholderItemGenerator: (index: number) => TData,
private loadCompleteCallback: (start: number, end: number) => void loadCompleteCallback: (start: number, end: number) => void) {
) { this._dataSourceLength = dataSourceLength;
} this.loadFunction = loadFunction;
this.placeholderItemGenerator = placeholderItemGenerator;
dispose() { this.loadCompleteCallback = loadCompleteCallback;
this._data = undefined;
this.loadFunction = undefined;
this.placeholderItemGenerator = undefined;
this.loadCompleteCallback = undefined;
if (this.lastLoadCancellationToken) {
this.lastLoadCancellationToken.isCancelled = true;
}
} }
getStartIndex(): number { getStartIndex(): number {
@@ -82,9 +76,10 @@ class DataWindow<TData> {
return; return;
} }
this.lastLoadCancellationToken = new LoadCancellationToken(); let cancellationToken = new LoadCancellationToken();
this.lastLoadCancellationToken = cancellationToken;
this.loadFunction(offset, length).then(data => { this.loadFunction(offset, length).then(data => {
if (!this.lastLoadCancellationToken.isCancelled) { if (!cancellationToken.isCancelled) {
this._data = data; this._data = data;
this.loadCompleteCallback(this._offsetFromDataSource, this._offsetFromDataSource + this._length); this.loadCompleteCallback(this._offsetFromDataSource, this._offsetFromDataSource + this._length);
} }
@@ -102,12 +97,10 @@ export class VirtualizedCollection<TData> implements IObservableCollection<TData
private collectionChangedCallback: (change: CollectionChange, startIndex: number, count: number) => void; private collectionChangedCallback: (change: CollectionChange, startIndex: number, count: number) => void;
constructor( constructor(windowSize: number,
windowSize: number,
length: number, length: number,
loadFn: (offset: number, count: number) => Thenable<TData[]>, loadFn: (offset: number, count: number) => Thenable<TData[]>,
private _placeHolderGenerator: (index: number) => TData private _placeHolderGenerator: (index: number) => TData) {
) {
this._windowSize = windowSize; this._windowSize = windowSize;
this._length = length; this._length = length;
@@ -117,15 +110,9 @@ export class VirtualizedCollection<TData> implements IObservableCollection<TData
} }
}; };
this._bufferWindowBefore = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); this._bufferWindowBefore = new DataWindow(length, loadFn, _placeHolderGenerator, loadCompleteCallback);
this._window = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); this._window = new DataWindow(length, loadFn, _placeHolderGenerator, loadCompleteCallback);
this._bufferWindowAfter = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); this._bufferWindowAfter = new DataWindow(length, loadFn, _placeHolderGenerator, loadCompleteCallback);
}
dispose() {
this._bufferWindowAfter.dispose();
this._bufferWindowBefore.dispose();
this._window.dispose();
} }
setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void { setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void {
@@ -210,7 +197,7 @@ export class VirtualizedCollection<TData> implements IObservableCollection<TData
} }
} }
export class AsyncDataProvider<TData extends IGridDataRow> implements IDisposableDataProvider<TData> { export class AsyncDataProvider<TData extends IGridDataRow> implements Slick.DataProvider<TData> {
constructor(private dataRows: IObservableCollection<TData>) { } constructor(private dataRows: IObservableCollection<TData>) { }
@@ -225,8 +212,4 @@ export class AsyncDataProvider<TData extends IGridDataRow> implements IDisposabl
public getRange(start: number, end: number): TData[] { public getRange(start: number, end: number): TData[] {
return !this.dataRows ? undefined : this.dataRows.getRange(start, end); return !this.dataRows ? undefined : this.dataRows.getRange(start, end);
} }
dispose() {
this.dataRows.dispose();
}
} }

View File

@@ -1,31 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IListStyles } from 'vs/base/browser/ui/list/listWidget';
import { Color } from 'vs/base/common/color';
export interface IDisposableDataProvider<T> extends Slick.DataProvider<T> {
dispose(): void;
}
export interface ITableMouseEvent {
anchor: HTMLElement | { x: number, y: number };
cell?: { row: number, cell: number };
}
export interface ITableStyles extends IListStyles {
tableHeaderBackground?: Color;
tableHeaderForeground?: Color;
}
export interface ITableSorter<T> {
sort(args: Slick.OnSortEventArgs<T>);
}
export interface ITableConfiguration<T> {
dataProvider?: IDisposableDataProvider<T> | Array<T>;
columns?: Slick.Column<T>[];
sorter?: ITableSorter<T>;
}

View File

@@ -5,18 +5,28 @@
import 'vs/css!./media/table'; import 'vs/css!./media/table';
import { TableDataView } from './tableDataView'; import { TableDataView } from './tableDataView';
import { IDisposableDataProvider, ITableSorter, ITableMouseEvent, ITableConfiguration, ITableStyles } from 'sql/base/browser/ui/table/interfaces';
import { IThemable } from 'vs/platform/theme/common/styler'; import { IThemable } from 'vs/platform/theme/common/styler';
import { IListStyles } from 'vs/base/browser/ui/list/listWidget';
import * as DOM from 'vs/base/browser/dom'; import * as DOM from 'vs/base/browser/dom';
import { Color } from 'vs/base/common/color';
import { mixin } from 'vs/base/common/objects'; import { mixin } from 'vs/base/common/objects';
import { IDisposable } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Orientation } from 'vs/base/browser/ui/splitview/splitview'; import { Orientation } from 'vs/base/browser/ui/splitview/splitview';
import { Widget } from 'vs/base/browser/ui/widget'; import { Widget } from 'vs/base/browser/ui/widget';
import { isArray, isBoolean } from 'vs/base/common/types'; import { isArray, isBoolean } from 'vs/base/common/types';
import { Event, Emitter } from 'vs/base/common/event'; import { Event, Emitter } from 'vs/base/common/event';
import { range } from 'vs/base/common/arrays'; import { range } from 'vs/base/common/arrays';
import { $ } from 'vs/base/browser/builder';
export interface ITableMouseEvent {
anchor: HTMLElement | { x: number, y: number };
cell?: { row: number, cell: number };
}
export interface ITableStyles extends IListStyles {
tableHeaderBackground?: Color;
tableHeaderForeground?: Color;
}
function getDefaultOptions<T>(): Slick.GridOptions<T> { function getDefaultOptions<T>(): Slick.GridOptions<T> {
return <Slick.GridOptions<T>>{ return <Slick.GridOptions<T>>{
@@ -25,13 +35,23 @@ function getDefaultOptions<T>(): Slick.GridOptions<T> {
}; };
} }
export interface ITableSorter<T> {
sort(args: Slick.OnSortEventArgs<T>);
}
export interface ITableConfiguration<T> {
dataProvider?: Slick.DataProvider<T> | Array<T>;
columns?: Slick.Column<T>[];
sorter?: ITableSorter<T>;
}
export class Table<T extends Slick.SlickData> extends Widget implements IThemable, IDisposable { export class Table<T extends Slick.SlickData> extends Widget implements IThemable, IDisposable {
private styleElement: HTMLStyleElement; private styleElement: HTMLStyleElement;
private idPrefix: string; private idPrefix: string;
private _grid: Slick.Grid<T>; private _grid: Slick.Grid<T>;
private _columns: Slick.Column<T>[]; private _columns: Slick.Column<T>[];
private _data: IDisposableDataProvider<T>; private _data: Slick.DataProvider<T>;
private _sorter: ITableSorter<T>; private _sorter: ITableSorter<T>;
private _autoscroll: boolean; private _autoscroll: boolean;
@@ -40,6 +60,8 @@ export class Table<T extends Slick.SlickData> extends Widget implements IThemabl
private _classChangeTimeout: number; private _classChangeTimeout: number;
private _disposables: IDisposable[] = [];
private _onContextMenu = new Emitter<ITableMouseEvent>(); private _onContextMenu = new Emitter<ITableMouseEvent>();
public readonly onContextMenu: Event<ITableMouseEvent> = this._onContextMenu.event; public readonly onContextMenu: Event<ITableMouseEvent> = this._onContextMenu.event;
@@ -54,8 +76,6 @@ export class Table<T extends Slick.SlickData> extends Widget implements IThemabl
this._data = configuration.dataProvider; this._data = configuration.dataProvider;
} }
this._register(this._data);
if (configuration && configuration.columns) { if (configuration && configuration.columns) {
this._columns = configuration.columns; this._columns = configuration.columns;
} else { } else {
@@ -97,12 +117,6 @@ export class Table<T extends Slick.SlickData> extends Widget implements IThemabl
}); });
} }
this._register({
dispose: () => {
this._grid.destroy();
}
});
this.mapMouseEvent(this._grid.onContextMenu, this._onContextMenu); this.mapMouseEvent(this._grid.onContextMenu, this._onContextMenu);
this.mapMouseEvent(this._grid.onClick, this._onClick); this.mapMouseEvent(this._grid.onClick, this._onClick);
} }
@@ -117,8 +131,7 @@ export class Table<T extends Slick.SlickData> extends Widget implements IThemabl
} }
public dispose() { public dispose() {
$(this._container).dispose(); dispose(this._disposables);
super.dispose();
} }
public invalidateRows(rows: number[], keepEditor: boolean) { public invalidateRows(rows: number[], keepEditor: boolean) {
@@ -153,7 +166,7 @@ export class Table<T extends Slick.SlickData> extends Widget implements IThemabl
this._grid.setData(this._data, true); this._grid.setData(this._data, true);
} }
getData(): IDisposableDataProvider<T> { getData(): Slick.DataProvider<T> {
return this._data; return this._data;
} }

View File

@@ -9,8 +9,6 @@ import { Event, Emitter } from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import * as types from 'vs/base/common/types'; import * as types from 'vs/base/common/types';
import { IDisposableDataProvider } from 'sql/base/browser/ui/table/interfaces';
export interface IFindPosition { export interface IFindPosition {
col: number; col: number;
row: number; row: number;
@@ -22,7 +20,7 @@ function defaultSort<T>(args: Slick.OnSortEventArgs<T>, data: Array<T>): Array<T
return data.sort((a, b) => (a[field] === b[field] ? 0 : (a[field] > b[field] ? 1 : -1)) * sign); return data.sort((a, b) => (a[field] === b[field] ? 0 : (a[field] > b[field] ? 1 : -1)) * sign);
} }
export class TableDataView<T extends Slick.SlickData> implements IDisposableDataProvider<T> { export class TableDataView<T extends Slick.SlickData> implements Slick.DataProvider<T> {
private _data: Array<T>; private _data: Array<T>;
private _findArray: Array<IFindPosition>; private _findArray: Array<IFindPosition>;
private _findObs: Observable<IFindPosition>; private _findObs: Observable<IFindPosition>;
@@ -156,10 +154,4 @@ export class TableDataView<T extends Slick.SlickData> implements IDisposableData
get findCount(): number { get findCount(): number {
return types.isUndefinedOrNull(this._findArray) ? 0 : this._findArray.length; return types.isUndefinedOrNull(this._findArray) ? 0 : this._findArray.length;
} }
dispose() {
this._data = undefined;
this._findArray = undefined;
this._findObs = undefined;
}
} }

View File

@@ -26,7 +26,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService
export class ClearRecentConnectionsAction extends Action { export class ClearRecentConnectionsAction extends Action {
public static ID = 'clearRecentConnectionsAction'; public static ID = 'clearRecentConnectionsAction';
public static LABEL = nls.localize('ClearRecentlyUsedLabel', 'Clear List'); public static LABEL = nls.localize('ClearRecentlyUsedLabel', 'Clear Recent Connections List');
public static ICON = 'search-action clear-search-results'; public static ICON = 'search-action clear-search-results';
private _onRecentConnectionsRemoved = new Emitter<void>(); private _onRecentConnectionsRemoved = new Emitter<void>();
@@ -83,7 +83,7 @@ export class ClearRecentConnectionsAction extends Action {
{ key: nls.localize('connectionAction.no', 'No'), value: false } { key: nls.localize('connectionAction.no', 'No'), value: false }
]; ];
self._quickOpenService.pick(choices.map(x => x.key), { placeHolder: nls.localize('ClearRecentlyUsedLabel', 'Clear List'), ignoreFocusLost: true }).then((choice) => { self._quickOpenService.pick(choices.map(x => x.key), { placeHolder: nls.localize('ClearRecentlyUsedLabel', 'Clear Recent Connections List'), ignoreFocusLost: true }).then((choice) => {
let confirm = choices.find(x => x.key === choice); let confirm = choices.find(x => x.key === choice);
resolve(confirm && confirm.value); resolve(confirm && confirm.value);
}); });

View File

@@ -38,7 +38,7 @@ export class AdvancedPropertiesController {
public get advancedDialog() { public get advancedDialog() {
if (!this._advancedDialog) { if (!this._advancedDialog) {
this._advancedDialog = this._instantiationService.createInstance( this._advancedDialog = this._instantiationService.createInstance(
OptionsDialog, localize('connectionAdvancedProperties', 'Advanced Properties'), TelemetryKeys.ConnectionAdvancedProperties, { hasBackButton: true }); OptionsDialog, localize('connectionAdvancedProperties', 'Advanced properties'), TelemetryKeys.ConnectionAdvancedProperties, { hasBackButton: true });
this._advancedDialog.cancelLabel = localize('advancedProperties.discard', 'Discard'); this._advancedDialog.cancelLabel = localize('advancedProperties.discard', 'Discard');
this._advancedDialog.onCloseEvent(() => this._onCloseAdvancedProperties()); this._advancedDialog.onCloseEvent(() => this._onCloseAdvancedProperties());
this._advancedDialog.onOk(() => this.handleOnOk()); this._advancedDialog.onOk(() => this.handleOnOk());

View File

@@ -37,7 +37,6 @@ import * as styler from 'vs/platform/theme/common/styler';
import * as DOM from 'vs/base/browser/dom'; import * as DOM from 'vs/base/browser/dom';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
export interface OnShowUIResponse { export interface OnShowUIResponse {
selectedProviderType: string; selectedProviderType: string;
@@ -50,7 +49,7 @@ export class ConnectionDialogWidget extends Modal {
private _noRecentConnectionBuilder: Builder; private _noRecentConnectionBuilder: Builder;
private _savedConnectionBuilder: Builder; private _savedConnectionBuilder: Builder;
private _noSavedConnectionBuilder: Builder; private _noSavedConnectionBuilder: Builder;
private _connectionDetailTitle: Builder; private _dividerBuilder: Builder;
private _connectButton: Button; private _connectButton: Button;
private _closeButton: Button; private _closeButton: Button;
private _providerTypeSelectBox: SelectBox; private _providerTypeSelectBox: SelectBox;
@@ -144,7 +143,7 @@ export class ConnectionDialogWidget extends Modal {
this._panel = new TabbedPanel(connectionContainer.getHTMLElement()); this._panel = new TabbedPanel(connectionContainer.getHTMLElement());
this._recentConnectionTabId = this._panel.pushTab({ this._recentConnectionTabId = this._panel.pushTab({
identifier: 'recent_connection', identifier: 'recent_connection',
title: localize('recentConnectionTitle', 'Recent Connections'), title: localize('recentConnectionTitle', 'Recent connections'),
view: { view: {
render: c => { render: c => {
recentConnectionTab.appendTo(c); recentConnectionTab.appendTo(c);
@@ -155,7 +154,7 @@ export class ConnectionDialogWidget extends Modal {
let savedConnectionTabId = this._panel.pushTab({ let savedConnectionTabId = this._panel.pushTab({
identifier: 'saved_connection', identifier: 'saved_connection',
title: localize('savedConnectionTitle', 'Saved Connections'), title: localize('savedConnectionTitle', 'Saved connections'),
view: { view: {
layout: () => { }, layout: () => { },
render: c => { render: c => {
@@ -180,9 +179,8 @@ export class ConnectionDialogWidget extends Modal {
} }
}); });
this._bodyBuilder.div({ class: 'connection-details-title' }, (dividerContainer) => { this._bodyBuilder.div({ class: 'Connection-divider' }, (dividerContainer) => {
this._connectionDetailTitle = dividerContainer; this._dividerBuilder = dividerContainer;
this._connectionDetailTitle.text(localize('connectionDetailsTitle', 'Connection Details'));
}); });
this._bodyBuilder.div({ class: 'connection-type' }, (modelTableContent) => { this._bodyBuilder.div({ class: 'connection-type' }, (modelTableContent) => {
@@ -219,12 +217,10 @@ export class ConnectionDialogWidget extends Modal {
private updateTheme(theme: IColorTheme): void { private updateTheme(theme: IColorTheme): void {
let borderColor = theme.getColor(contrastBorder); let borderColor = theme.getColor(contrastBorder);
let border = borderColor ? borderColor.toString() : null; let border = borderColor ? borderColor.toString() : null;
let backgroundColor = theme.getColor(SIDE_BAR_BACKGROUND); if (this._dividerBuilder) {
if (this._connectionDetailTitle) { this._dividerBuilder.style('border-top-width', border ? '1px' : null);
this._connectionDetailTitle.style('border-width', border ? '1px 0px' : null); this._dividerBuilder.style('border-top-style', border ? 'solid' : null);
this._connectionDetailTitle.style('border-style', border ? 'solid none' : null); this._dividerBuilder.style('border-top-color', border);
this._connectionDetailTitle.style('border-color', border);
this._connectionDetailTitle.style('background-color', backgroundColor ? backgroundColor.toString() : null);
} }
} }
@@ -281,13 +277,17 @@ export class ConnectionDialogWidget extends Modal {
private createRecentConnectionList(): void { private createRecentConnectionList(): void {
this._recentConnectionBuilder.div({ class: 'connection-recent-content' }, (recentConnectionContainer) => { this._recentConnectionBuilder.div({ class: 'connection-recent-content' }, (recentConnectionContainer) => {
let recentHistoryLabel = localize('recentHistory', 'Recent history');
recentConnectionContainer.div({ class: 'recent-titles-container' }, (container) => { recentConnectionContainer.div({ class: 'recent-titles-container' }, (container) => {
container.div({ class: 'connection-history-label' }, (recentTitle) => {
recentTitle.text(recentHistoryLabel);
});
container.div({ class: 'connection-history-actions' }, (actionsContainer) => { container.div({ class: 'connection-history-actions' }, (actionsContainer) => {
this._actionbar = this._register(new ActionBar(actionsContainer.getHTMLElement(), { animated: false })); this._actionbar = this._register(new ActionBar(actionsContainer.getHTMLElement(), { animated: false }));
let clearAction = this._instantiationService.createInstance(ClearRecentConnectionsAction, ClearRecentConnectionsAction.ID, ClearRecentConnectionsAction.LABEL); let clearAction = this._instantiationService.createInstance(ClearRecentConnectionsAction, ClearRecentConnectionsAction.ID, ClearRecentConnectionsAction.LABEL);
clearAction.useConfirmationMessage = true; clearAction.useConfirmationMessage = true;
clearAction.onRecentConnectionsRemoved(() => this.open(false)); clearAction.onRecentConnectionsRemoved(() => this.open(false));
this._actionbar.push(clearAction, { icon: true, label: true }); this._actionbar.push(clearAction, { icon: true, label: false });
}); });
}); });
recentConnectionContainer.div({ class: 'server-explorer-viewlet' }, (divContainer: Builder) => { recentConnectionContainer.div({ class: 'server-explorer-viewlet' }, (divContainer: Builder) => {

View File

@@ -9,35 +9,25 @@
} }
.connection-input { .connection-input {
padding-right:8px;
width: 200px; width: 200px;
padding-bottom: 5px; padding-bottom: 5px;
} }
.connection-dialog { .connection-dialog {
height: 100%; height: calc(100% - 20px);
display: flex;
flex-direction: column;
overflow-x: hidden;
overflow-y: auto;
} }
.connection-dialog .tabbedPanel { .connection-dialog .tabbedPanel {
border-top-color: transparent; border-top-color: transparent;
flex: 1 1; height: calc(100% - 350px);
display: block;
min-height: 120px; min-height: 120px;
overflow: hidden;
margin: 0px 11px;
}
.connection-dialog .tabBody {
overflow: hidden;
flex: 1 1;
display: flex;
flex-direction: column;
} }
.connection-recent, .connection-saved { .connection-recent, .connection-saved {
margin: 5px; margin: 15px;
flex: 1 1; height: calc(100% - 60px);
overflow-y: auto; overflow-y: auto;
} }
@@ -55,8 +45,6 @@
.recent-titles-container { .recent-titles-container {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin: 5px;
flex: 0 0 auto;
} }
.connection-provider-info { .connection-provider-info {
@@ -65,13 +53,7 @@
} }
.connection-recent-content { .connection-recent-content {
height: 100%; height: calc(100% - 20px);
display: flex;
flex-direction: column;
}
.connection-recent-content .server-explorer-viewlet {
flex: 1 1;
} }
.connection-table-content { .connection-table-content {
@@ -84,9 +66,8 @@
} }
.connection-type { .connection-type {
flex: 0 0 auto; margin: 15px;
overflow: hidden; overflow-y: hidden;
margin: 0px 13px;
} }
.connection-dialog .connection-history-actions .action-label.icon { .connection-dialog .connection-history-actions .action-label.icon {
@@ -95,9 +76,8 @@
line-height: 20px; line-height: 20px;
min-width: 20px; min-width: 20px;
background-size: 16px; background-size: 16px;
background-position: 2px center; background-position: center center;
background-repeat: no-repeat; background-repeat: no-repeat;
padding-left: 25px;
} }
.search-action.clear-search-results { .search-action.clear-search-results {
@@ -107,11 +87,4 @@
.vs-dark .search-action.clear-search-results, .vs-dark .search-action.clear-search-results,
.hc-black .search-action.clear-search-results { .hc-black .search-action.clear-search-results {
background: url('clear-search-results-dark.svg'); background: url('clear-search-results-dark.svg');
}
.connection-details-title {
font-size: 14px;
margin: 5px 0px;
padding: 5px 15px;
font-weight: 600;
} }

View File

@@ -5,5 +5,6 @@
.advanced-button { .advanced-button {
width: 100px; width: 100px;
padding-right:8px;
padding-bottom: 5px; padding-bottom: 5px;
} }

View File

@@ -90,11 +90,9 @@ export class ServerTreeActionProvider extends ContributableActionProvider {
* Return actions for connection elements * Return actions for connection elements
*/ */
public getConnectionActions(tree: ITree, profile: ConnectionProfile): IAction[] { public getConnectionActions(tree: ITree, profile: ConnectionProfile): IAction[] {
let node = new TreeNode(NodeType.Server, '', false, '', '', '', undefined, undefined, undefined, undefined);
return this.getAllActions({ return this.getAllActions({
tree: tree, tree: tree,
profile: profile, profile: profile
treeNode: node
}, (context) => this.getBuiltinConnectionActions(context)); }, (context) => this.getBuiltinConnectionActions(context));
} }
@@ -127,6 +125,10 @@ export class ServerTreeActionProvider extends ContributableActionProvider {
actions.push(this._instantiationService.createInstance(DeleteConnectionAction, DeleteConnectionAction.ID, DeleteConnectionAction.DELETE_CONNECTION_LABEL, context.profile)); actions.push(this._instantiationService.createInstance(DeleteConnectionAction, DeleteConnectionAction.ID, DeleteConnectionAction.DELETE_CONNECTION_LABEL, context.profile));
actions.push(this._instantiationService.createInstance(RefreshAction, RefreshAction.ID, RefreshAction.LABEL, context.tree, context.profile)); actions.push(this._instantiationService.createInstance(RefreshAction, RefreshAction.ID, RefreshAction.LABEL, context.tree, context.profile));
if (process.env['VSCODE_DEV'] && constants.MssqlProviderId === context.profile.providerName) {
actions.push(this._instantiationService.createInstance(OEAction, NewProfilerAction.ID, NewProfilerAction.LABEL));
}
return actions; return actions;
} }

View File

@@ -31,8 +31,8 @@ export class TreeCreationUtils {
return new Tree(treeContainer, { dataSource, renderer, controller, dnd, filter, sorter, accessibilityProvider }, return new Tree(treeContainer, { dataSource, renderer, controller, dnd, filter, sorter, accessibilityProvider },
{ {
indentPixels: 0, indentPixels: 10,
twistiePixels: 0, twistiePixels: 20,
ariaLabel: nls.localize('treeAriaLabel', "Recent Connections") ariaLabel: nls.localize('treeAriaLabel', "Recent Connections")
}); });
} }

View File

@@ -9,7 +9,7 @@ import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiati
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService';
import { IConnectionManagementService, IConnectionDialogService} from 'sql/parts/connection/common/connectionManagement'; import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
import { IObjectExplorerService } from '../../objectExplorer/common/objectExplorerService'; import { IObjectExplorerService } from '../../objectExplorer/common/objectExplorerService';
import { ProfilerInput } from 'sql/parts/profiler/editor/profilerInput'; import { ProfilerInput } from 'sql/parts/profiler/editor/profilerInput';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
@@ -18,10 +18,6 @@ import { IProfilerService } from '../service/interfaces';
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { KeyCode, KeyMod } from 'vs/editor/editor.api'; import { KeyCode, KeyMod } from 'vs/editor/editor.api';
import { ProfilerEditor } from '../editor/profilerEditor'; import { ProfilerEditor } from '../editor/profilerEditor';
import { ObjectExplorerActionsContext } from 'sql/parts/objectExplorer/viewlet/objectExplorerActions';
import { ConnectionProfile } from 'sql/parts/connection/common/connectionProfile';
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
import { mssqlProviderName } from 'sql/parts/connection/common/constants';
// Contribute Global Actions // Contribute Global Actions
const category = nls.localize('profilerCategory', "Profiler"); const category = nls.localize('profilerCategory', "Profiler");
@@ -34,45 +30,15 @@ const newProfilerSchema: IJSONSchema = {
CommandsRegistry.registerCommand({ CommandsRegistry.registerCommand({
id: 'profiler.newProfiler', id: 'profiler.newProfiler',
handler: (accessor: ServicesAccessor, ...args: any[]) => { handler: (accessor: ServicesAccessor) => {
let connectionProfile: ConnectionProfile = undefined;
let instantiationService: IInstantiationService = accessor.get(IInstantiationService);
let editorService: IEditorService = accessor.get(IEditorService); let editorService: IEditorService = accessor.get(IEditorService);
let instantiationService: IInstantiationService = accessor.get(IInstantiationService);
let connectionService: IConnectionManagementService = accessor.get(IConnectionManagementService); let connectionService: IConnectionManagementService = accessor.get(IConnectionManagementService);
let objectExplorerService: IObjectExplorerService = accessor.get(IObjectExplorerService); let objectExplorerService: IObjectExplorerService = accessor.get(IObjectExplorerService);
let connectionDialogService: IConnectionDialogService = accessor.get(IConnectionDialogService);
let capabilitiesService: ICapabilitiesService = accessor.get(ICapabilitiesService);
// If a context is available if invoked from the context menu, we will use the connection profiler of the server node let connectionProfile = TaskUtilities.getCurrentGlobalConnection(objectExplorerService, connectionService, editorService);
if (args && args.length === 1 && args[0] && args[0] instanceof ObjectExplorerActionsContext) { let profilerInput = instantiationService.createInstance(ProfilerInput, connectionProfile);
let context = args[0] as ObjectExplorerActionsContext; return editorService.openEditor(profilerInput, { pinned: true }, ACTIVE_GROUP).then(() => TPromise.as(true));
connectionProfile = ConnectionProfile.fromIConnectionProfile(capabilitiesService, context.connectionProfile);
}
else {
// No context available, we will try to get the current global active connection
connectionProfile = TaskUtilities.getCurrentGlobalConnection(objectExplorerService, connectionService, editorService) as ConnectionProfile;
}
let promise;
if (connectionProfile) {
promise = connectionService.connectIfNotConnected(connectionProfile);
} else {
// if still no luck, we will open the Connection dialog and let user connect to a server
promise = connectionDialogService.openDialogAndWait(connectionService, { connectionType: 1, providers: [mssqlProviderName] }).then((profile) => {
connectionProfile = profile as ConnectionProfile;
});
}
return promise.then(() => {
if (!connectionProfile) {
connectionProfile = TaskUtilities.getCurrentGlobalConnection(objectExplorerService, connectionService, editorService) as ConnectionProfile;
}
if (connectionProfile && connectionProfile.providerName === mssqlProviderName) {
let profilerInput = instantiationService.createInstance(ProfilerInput, connectionProfile);
editorService.openEditor(profilerInput, { pinned: true }, ACTIVE_GROUP).then(() => TPromise.as(true));
}
});
} }
}); });

View File

@@ -91,10 +91,6 @@ export class ProfilerInput extends EditorInput implements IProfilerSession {
}); });
} }
public get providerType(): string {
return this._connection ? this._connection.providerName : undefined;
}
public set viewTemplate(template: IProfilerViewTemplate) { public set viewTemplate(template: IProfilerViewTemplate) {
this._data.clear(); this._data.clear();
this._viewTemplate = template; this._viewTemplate = template;

View File

@@ -228,6 +228,6 @@ export class ProfilerService implements IProfilerService {
} }
public launchCreateSessionDialog(input?: ProfilerInput): Thenable<void> { public launchCreateSessionDialog(input?: ProfilerInput): Thenable<void> {
return this._commandService.executeCommand('profiler.openCreateSessionDialog', input.id, input.providerType, this.getSessionTemplates()); return this._commandService.executeCommand('profiler.openCreateSessionDialog', input.id, this.getSessionTemplates());
} }
} }

View File

@@ -339,7 +339,7 @@ let registryProperties = {
'sql.showConnectionInfoInTitle': { 'sql.showConnectionInfoInTitle': {
'type': 'boolean', 'type': 'boolean',
'description': localize('showConnectionInfoInTitle', "Controls whether to show the connection info for a tab in the title."), 'description': localize('showConnectionInfoInTitle', "Controls whether to show the connection info for a tab in the title."),
'default': true 'default': false
}, },
'mssql.intelliSense.enableIntelliSense': { 'mssql.intelliSense.enableIntelliSense': {
'type': 'boolean', 'type': 'boolean',

View File

@@ -32,6 +32,9 @@ export interface IQueryEditorService {
// Creates new edit data session // Creates new edit data session
newEditDataEditor(schemaName: string, tableName: string, queryString: string): Promise<IConnectableInput>; newEditDataEditor(schemaName: string, tableName: string, queryString: string): Promise<IConnectableInput>;
// Clears any QueryEditor data for the given URI held by this service
onQueryInputClosed(uri: string): void;
/** /**
* Handles updating of SQL files on a save as event. These need special consideration * Handles updating of SQL files on a save as event. These need special consideration
* due to query results and other information being tied to the URI of the file * due to query results and other information being tied to the URI of the file

View File

@@ -116,11 +116,11 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
} }
if (this._configurationService) { if (this._configurationService) {
this._toDispose.push(this._configurationService.onDidChangeConfiguration(e => { this._configurationService.onDidChangeConfiguration(e => {
if (e.affectedKeys.includes('sql.showConnectionInfoInTitle')) { if (e.affectedKeys.includes('sql.showConnectionInfoInTitle')) {
this._onDidChangeLabel.fire(); this._onDidChangeLabel.fire();
} }
})); });
} }
this.onDisconnect(); this.onDisconnect();
@@ -196,17 +196,17 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
// State update funtions // State update funtions
public runQuery(selection: ISelectionData, executePlanOptions?: ExecutionPlanOptions): void { public runQuery(selection: ISelectionData, executePlanOptions?: ExecutionPlanOptions): void {
this._queryModelService.runQuery(this.uri, selection, this, executePlanOptions); this._queryModelService.runQuery(this.uri, selection, this.uri, this, executePlanOptions);
this.showQueryResultsEditor(); this.showQueryResultsEditor();
} }
public runQueryStatement(selection: ISelectionData): void { public runQueryStatement(selection: ISelectionData): void {
this._queryModelService.runQueryStatement(this.uri, selection, this); this._queryModelService.runQueryStatement(this.uri, selection, this.uri, this);
this.showQueryResultsEditor(); this.showQueryResultsEditor();
} }
public runQueryString(text: string): void { public runQueryString(text: string): void {
this._queryModelService.runQueryString(this.uri, text, this); this._queryModelService.runQueryString(this.uri, text, this.uri, this);
this.showQueryResultsEditor(); this.showQueryResultsEditor();
} }
@@ -276,6 +276,7 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
// Clean up functions // Clean up functions
public dispose(): void { public dispose(): void {
this._queryModelService.disposeQuery(this.uri);
this._sql.dispose(); this._sql.dispose();
this._results.dispose(); this._results.dispose();
this._toDispose = dispose(this._toDispose); this._toDispose = dispose(this._toDispose);
@@ -284,7 +285,7 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
} }
public close(): void { public close(): void {
this._queryModelService.disposeQuery(this.uri); this._queryEditorService.onQueryInputClosed(this.uri);
this._connectionManagementService.disconnectEditor(this, true); this._connectionManagementService.disconnectEditor(this, true);
this._sql.close(); this._sql.close();

View File

@@ -215,7 +215,6 @@ export class QueryManagementService implements IQueryManagementService {
}); });
} }
public disposeQuery(ownerUri: string): Thenable<void> { public disposeQuery(ownerUri: string): Thenable<void> {
this._queryRunners.delete(ownerUri);
return this._runAction(ownerUri, (runner) => { return this._runAction(ownerUri, (runner) => {
return runner.disposeQuery(ownerUri); return runner.disposeQuery(ownerUri);
}); });

View File

@@ -29,13 +29,6 @@ export class ResultsViewState {
constructor(@IConfigurationService private configurationService: IConfigurationService) { constructor(@IConfigurationService private configurationService: IConfigurationService) {
} }
dispose() {
this.gridPanelState.dispose();
this.messagePanelState.dispose();
this.chartState.dispose();
this.queryPlanState.dispose();
}
} }
/** /**
@@ -57,11 +50,7 @@ export class QueryResultsInput extends EditorInput {
public readonly onRestoreViewStateEmitter = new Emitter<void>(); public readonly onRestoreViewStateEmitter = new Emitter<void>();
public readonly onSaveViewStateEmitter = new Emitter<void>(); public readonly onSaveViewStateEmitter = new Emitter<void>();
private _state = new ResultsViewState(this.configurationService); public readonly state = new ResultsViewState(this.configurationService);
public get state(): ResultsViewState {
return this._state;
}
constructor(private _uri: string, constructor(private _uri: string,
@IConfigurationService private configurationService: IConfigurationService @IConfigurationService private configurationService: IConfigurationService
@@ -71,12 +60,6 @@ export class QueryResultsInput extends EditorInput {
this._hasBootstrapped = false; this._hasBootstrapped = false;
} }
close() {
this.state.dispose();
this._state = undefined;
super.close();
}
getTypeId(): string { getTypeId(): string {
return QueryResultsInput.ID; return QueryResultsInput.ID;
} }

View File

@@ -33,8 +33,4 @@ export class ChartTab implements IPanelTab {
public dispose() { public dispose() {
this.view.dispose(); this.view.dispose();
} }
public clear() {
this.view.clear();
}
} }

View File

@@ -35,10 +35,6 @@ export class ChartState {
options: IInsightOptions = { options: IInsightOptions = {
type: ChartType.Bar type: ChartType.Bar
}; };
dispose() {
}
} }
declare class Proxy { declare class Proxy {
@@ -138,15 +134,6 @@ export class ChartView extends Disposable implements IPanelView {
this.buildOptions(); this.buildOptions();
} }
public clear() {
}
public dispose() {
dispose(this.optionDisposables);
super.dispose();
}
render(container: HTMLElement): void { render(container: HTMLElement): void {
if (!this.container) { if (!this.container) {
this.container = $('div.chart-parent-container'); this.container = $('div.chart-parent-container');

View File

@@ -7,7 +7,7 @@
import { attachTableStyler } from 'sql/common/theme/styler'; import { attachTableStyler } from 'sql/common/theme/styler';
import QueryRunner from 'sql/parts/query/execution/queryRunner'; import QueryRunner from 'sql/parts/query/execution/queryRunner';
import { VirtualizedCollection, AsyncDataProvider } from 'sql/base/browser/ui/table/asyncDataView'; import { VirtualizedCollection, AsyncDataProvider } from 'sql/base/browser/ui/table/asyncDataView';
import { Table } from 'sql/base/browser/ui/table/table'; import { Table, ITableStyles, ITableMouseEvent } from 'sql/base/browser/ui/table/table';
import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview'; import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scrollableSplitview';
import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin'; import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin';
import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin'; import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin';
@@ -19,7 +19,6 @@ import { escape } from 'sql/base/common/strings';
import { hyperLinkFormatter, textFormatter } from 'sql/parts/grid/services/sharedServices'; import { hyperLinkFormatter, textFormatter } from 'sql/parts/grid/services/sharedServices';
import { CopyKeybind } from 'sql/base/browser/ui/table/plugins/copyKeybind.plugin'; import { CopyKeybind } from 'sql/base/browser/ui/table/plugins/copyKeybind.plugin';
import { AdditionalKeyBindings } from 'sql/base/browser/ui/table/plugins/additionalKeyBindings.plugin'; import { AdditionalKeyBindings } from 'sql/base/browser/ui/table/plugins/additionalKeyBindings.plugin';
import { ITableStyles, ITableMouseEvent } from 'sql/base/browser/ui/table/interfaces';
import * as sqlops from 'sqlops'; import * as sqlops from 'sqlops';
import * as pretty from 'pretty-data'; import * as pretty from 'pretty-data';
@@ -62,10 +61,6 @@ export class GridPanelState {
public tableStates: GridTableState[] = []; public tableStates: GridTableState[] = [];
public scrollPosition: number; public scrollPosition: number;
public collapsed = false; public collapsed = false;
dispose() {
dispose(this.tableStates);
}
} }
export interface IGridTableState { export interface IGridTableState {
@@ -73,14 +68,14 @@ export interface IGridTableState {
maximized: boolean; maximized: boolean;
} }
export class GridTableState extends Disposable { export class GridTableState {
private _maximized: boolean; private _maximized: boolean;
private _onMaximizedChange = this._register(new Emitter<boolean>()); private _onMaximizedChange = new Emitter<boolean>();
public onMaximizedChange: Event<boolean> = this._onMaximizedChange.event; public onMaximizedChange: Event<boolean> = this._onMaximizedChange.event;
private _onCanBeMaximizedChange = this._register(new Emitter<boolean>()); private _onCanBeMaximizedChange = new Emitter<boolean>();
public onCanBeMaximizedChange: Event<boolean> = this._onCanBeMaximizedChange.event; public onCanBeMaximizedChange: Event<boolean> = this._onCanBeMaximizedChange.event;
private _canBeMaximized: boolean; private _canBeMaximized: boolean;
@@ -91,7 +86,6 @@ export class GridTableState extends Disposable {
public activeCell: Slick.Cell; public activeCell: Slick.Cell;
constructor(public readonly resultId: number, public readonly batchId: number) { constructor(public readonly resultId: number, public readonly batchId: number) {
super();
} }
public get canBeMaximized(): boolean { public get canBeMaximized(): boolean {
@@ -223,13 +217,13 @@ export class GridPanel extends ViewletPanel {
} }
let table = this.instantiationService.createInstance(GridTable, this.runner, set); let table = this.instantiationService.createInstance(GridTable, this.runner, set);
table.state = tableState; table.state = tableState;
this.tableDisposable.push(tableState.onMaximizedChange(e => { tableState.onMaximizedChange(e => {
if (e) { if (e) {
this.maximizeTable(table.id); this.maximizeTable(table.id);
} else { } else {
this.minimizeTables(); this.minimizeTables();
} }
})); });
this.tableDisposable.push(attachTableStyler(table, this.themeService)); this.tableDisposable.push(attachTableStyler(table, this.themeService));
tables.push(table); tables.push(table);
@@ -244,17 +238,11 @@ export class GridPanel extends ViewletPanel {
this.tables = this.tables.concat(tables); this.tables = this.tables.concat(tables);
} }
public clear() {
this.reset();
}
private reset() { private reset() {
for (let i = this.splitView.length - 1; i >= 0; i--) { for (let i = this.splitView.length - 1; i >= 0; i--) {
this.splitView.removeView(i); this.splitView.removeView(i);
} }
dispose(this.tables); dispose(this.tables);
dispose(this.tableDisposable);
this.tableDisposable = [];
this.tables = []; this.tables = [];
this.maximizedGrid = undefined; this.maximizedGrid = undefined;
@@ -305,15 +293,6 @@ export class GridPanel extends ViewletPanel {
public get state(): GridPanelState { public get state(): GridPanelState {
return this._state; return this._state;
} }
public dispose() {
dispose(this.queryRunnerDisposables);
dispose(this.tableDisposable);
dispose(this.tables);
this.tableDisposable = undefined;
this.tables = undefined;
super.dispose();
}
} }
class GridTable<T> extends Disposable implements IView { class GridTable<T> extends Disposable implements IView {
@@ -465,9 +444,9 @@ class GridTable<T> extends Disposable implements IView {
private setupState() { private setupState() {
// change actionbar on maximize change // change actionbar on maximize change
this._register(this.state.onMaximizedChange(this.rebuildActionBar, this)); this.state.onMaximizedChange(this.rebuildActionBar, this);
this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this)); this.state.onCanBeMaximizedChange(this.rebuildActionBar, this);
if (this.state.scrollPosition) { if (this.state.scrollPosition) {
// most of the time this won't do anything // most of the time this won't do anything
@@ -677,8 +656,6 @@ class GridTable<T> extends Disposable implements IView {
public dispose() { public dispose() {
$(this.container).destroy(); $(this.container).destroy();
this.table.dispose();
this.actionBar.dispose();
super.dispose(); super.dispose();
} }
} }

View File

@@ -7,7 +7,6 @@
import 'vs/css!./media/messagePanel'; import 'vs/css!./media/messagePanel';
import { IMessagesActionContext, SelectAllMessagesAction, CopyMessagesAction } from './actions'; import { IMessagesActionContext, SelectAllMessagesAction, CopyMessagesAction } from './actions';
import QueryRunner from 'sql/parts/query/execution/queryRunner'; import QueryRunner from 'sql/parts/query/execution/queryRunner';
import { QueryInput } from 'sql/parts/query/common/queryInput';
import { IResultMessage, ISelectionData } from 'sqlops'; import { IResultMessage, ISelectionData } from 'sqlops';
@@ -29,6 +28,8 @@ import { $ } from 'vs/base/browser/builder';
import { isArray, isUndefinedOrNull } from 'vs/base/common/types'; import { isArray, isUndefinedOrNull } from 'vs/base/common/types';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditor } from 'vs/editor/common/editorCommon';
import { QueryInput } from 'sql/parts/query/common/queryInput';
import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { ScrollbarVisibility } from 'vs/base/common/scrollable';
export interface IResultMessageIntern extends IResultMessage { export interface IResultMessageIntern extends IResultMessage {
@@ -70,10 +71,6 @@ export class MessagePanelState {
this.collapsed = !messagesOpenedSettings; this.collapsed = !messagesOpenedSettings;
} }
} }
dispose() {
}
} }
export class MessagePanel extends ViewletPanel { export class MessagePanel extends ViewletPanel {
@@ -105,7 +102,6 @@ export class MessagePanel extends ViewletPanel {
renderer: this.renderer, renderer: this.renderer,
controller: this.controller controller: this.controller
}, { keyboardSupport: false, horizontalScrollMode: ScrollbarVisibility.Auto }); }, { keyboardSupport: false, horizontalScrollMode: ScrollbarVisibility.Auto });
this.disposables.push(this.tree);
this.tree.onDidScroll(e => { this.tree.onDidScroll(e => {
if (this.state) { if (this.state) {
this.state.scrollPosition = this.tree.getScrollPosition(); this.state.scrollPosition = this.tree.getScrollPosition();
@@ -121,7 +117,7 @@ export class MessagePanel extends ViewletPanel {
protected renderBody(container: HTMLElement): void { protected renderBody(container: HTMLElement): void {
this.container.style.width = '100%'; this.container.style.width = '100%';
this.container.style.height = '100%'; this.container.style.height = '100%';
this.disposables.push(attachListStyler(this.tree, this.themeService)); attachListStyler(this.tree, this.themeService);
container.appendChild(this.container); container.appendChild(this.container);
this.tree.setInput(this.model); this.tree.setInput(this.model);
} }
@@ -197,19 +193,9 @@ export class MessagePanel extends ViewletPanel {
} }
this.setExpanded(!this.state.collapsed); this.setExpanded(!this.state.collapsed);
} }
public get state(): MessagePanelState { public get state(): MessagePanelState {
return this._state; return this._state;
} }
public clear() {
this.reset();
}
public dispose() {
dispose(this.queryRunnerDisposables);
super.dispose();
}
} }
class MessageDataSource implements IDataSource { class MessageDataSource implements IDataSource {

View File

@@ -478,11 +478,11 @@ export class QueryEditor extends BaseEditor {
this.setTaskbarContent(); this.setTaskbarContent();
this._toDispose.push(this._configurationService.onDidChangeConfiguration(e => { this._configurationService.onDidChangeConfiguration(e => {
if (e.affectedKeys.includes('workbench.enablePreviewFeatures')) { if (e.affectedKeys.includes('workbench.enablePreviewFeatures')) {
this.setTaskbarContent(); this.setTaskbarContent();
} }
})); });
} }
private setTaskbarContent(): void { private setTaskbarContent(): void {

View File

@@ -90,6 +90,7 @@ export class QueryResultsEditor extends BaseEditor {
public static ID: string = 'workbench.editor.queryResultsEditor'; public static ID: string = 'workbench.editor.queryResultsEditor';
public static AngularSelectorString: string = 'slickgrid-container.slickgridContainer'; public static AngularSelectorString: string = 'slickgrid-container.slickgridContainer';
protected _rawOptions: BareResultsGridInfo; protected _rawOptions: BareResultsGridInfo;
protected _input: QueryResultsInput;
private resultsView: QueryResultsView; private resultsView: QueryResultsView;
private styleSheet = DOM.createStyleSheet(); private styleSheet = DOM.createStyleSheet();
@@ -103,17 +104,17 @@ export class QueryResultsEditor extends BaseEditor {
) { ) {
super(QueryResultsEditor.ID, telemetryService, themeService); super(QueryResultsEditor.ID, telemetryService, themeService);
this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel()); this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel());
this._register(this._configurationService.onDidChangeConfiguration(e => { this._configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('resultsGrid')) { if (e.affectsConfiguration('resultsGrid')) {
this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel()); this._rawOptions = BareResultsGridInfo.createFromRawSettings(this._configurationService.getValue('resultsGrid'), getZoomLevel());
this.applySettings(); this.applySettings();
} }
})); });
this.applySettings(); this.applySettings();
} }
public get input(): QueryResultsInput { public get input(): QueryResultsInput {
return this._input as QueryResultsInput; return this._input;
} }
private applySettings() { private applySettings() {
@@ -132,16 +133,10 @@ export class QueryResultsEditor extends BaseEditor {
this.styleSheet.remove(); this.styleSheet.remove();
parent.appendChild(this.styleSheet); parent.appendChild(this.styleSheet);
if (!this.resultsView) { if (!this.resultsView) {
this.resultsView = this._register(new QueryResultsView(parent, this._instantiationService, this._queryModelService)); this.resultsView = new QueryResultsView(parent, this._instantiationService, this._queryModelService);
} }
} }
dispose() {
this.styleSheet.remove();
this.styleSheet = undefined;
super.dispose();
}
layout(dimension: DOM.Dimension): void { layout(dimension: DOM.Dimension): void {
this.resultsView.layout(dimension); this.resultsView.layout(dimension);
} }
@@ -152,11 +147,6 @@ export class QueryResultsEditor extends BaseEditor {
return TPromise.wrap<void>(null); return TPromise.wrap<void>(null);
} }
clearInput() {
this.resultsView.clearInput();
super.clearInput();
}
public chart(dataId: { batchId: number, resultId: number }) { public chart(dataId: { batchId: number, resultId: number }) {
this.resultsView.chartData(dataId); this.resultsView.chartData(dataId);
} }
@@ -164,4 +154,11 @@ export class QueryResultsEditor extends BaseEditor {
public showQueryPlan(xml: string) { public showQueryPlan(xml: string) {
this.resultsView.showPlan(xml); this.resultsView.showPlan(xml);
} }
public dispose(): void {
super.dispose();
if (this.resultsView) {
this.resultsView.dispose();
}
}
} }

View File

@@ -111,15 +111,6 @@ class ResultsView extends Disposable implements IPanelView {
} }
} }
dispose() {
super.dispose();
}
public clear() {
this.gridPanel.clear();
this.messagePanel.clear();
}
remove(): void { remove(): void {
this.container.remove(); this.container.remove();
} }
@@ -160,10 +151,6 @@ class ResultsTab implements IPanelTab {
public dispose() { public dispose() {
dispose(this.view); dispose(this.view);
} }
public clear() {
this.view.clear();
}
} }
export class QueryResultsView extends Disposable { export class QueryResultsView extends Disposable {
@@ -234,11 +221,8 @@ export class QueryResultsView extends Disposable {
} }
} }
clearInput() { public dispose() {
this._input = undefined; this._panelView.dispose();
this.resultsTab.clear();
this.qpTab.clear();
this.chartTab.clear();
} }
public get input(): QueryResultsInput { public get input(): QueryResultsInput {
@@ -280,8 +264,4 @@ export class QueryResultsView extends Disposable {
this._panelView.removeTab(this.qpTab.identifier); this._panelView.removeTab(this.qpTab.identifier);
} }
} }
public dispose() {
super.dispose();
}
} }

View File

@@ -35,9 +35,9 @@ export interface IQueryModelService {
getConfig(): Promise<{ [key: string]: any }>; getConfig(): Promise<{ [key: string]: any }>;
getShortcuts(): Promise<any>; getShortcuts(): Promise<any>;
getQueryRows(uri: string, rowStart: number, numberOfRows: number, batchId: number, resultId: number): Thenable<ResultSetSubset>; getQueryRows(uri: string, rowStart: number, numberOfRows: number, batchId: number, resultId: number): Thenable<ResultSetSubset>;
runQuery(uri: string, selection: ISelectionData, queryInput: QueryInput, runOptions?: ExecutionPlanOptions): void; runQuery(uri: string, selection: ISelectionData, title: string, queryInput: QueryInput, runOptions?: ExecutionPlanOptions): void;
runQueryStatement(uri: string, selection: ISelectionData, queryInput: QueryInput): void; runQueryStatement(uri: string, selection: ISelectionData, title: string, queryInput: QueryInput): void;
runQueryString(uri: string, selection: string, queryInput: QueryInput); runQueryString(uri: string, selection: string, title: string, queryInput: QueryInput);
cancelQuery(input: QueryRunner | string): void; cancelQuery(input: QueryRunner | string): void;
disposeQuery(uri: string): void; disposeQuery(uri: string): void;
isRunningQuery(uri: string): boolean; isRunningQuery(uri: string): boolean;

View File

@@ -209,28 +209,32 @@ export class QueryModelService implements IQueryModelService {
/** /**
* Run a query for the given URI with the given text selection * Run a query for the given URI with the given text selection
*/ */
public runQuery(uri: string, selection: sqlops.ISelectionData, queryInput: QueryInput, runOptions?: sqlops.ExecutionPlanOptions): void { public runQuery(uri: string, selection: sqlops.ISelectionData,
this.doRunQuery(uri, selection, queryInput, false, runOptions); title: string, queryInput: QueryInput, runOptions?: sqlops.ExecutionPlanOptions): void {
this.doRunQuery(uri, selection, title, queryInput, false, runOptions);
} }
/** /**
* Run the current SQL statement for the given URI * Run the current SQL statement for the given URI
*/ */
public runQueryStatement(uri: string, selection: sqlops.ISelectionData, queryInput: QueryInput): void { public runQueryStatement(uri: string, selection: sqlops.ISelectionData,
this.doRunQuery(uri, selection, queryInput, true); title: string, queryInput: QueryInput): void {
this.doRunQuery(uri, selection, title, queryInput, true);
} }
/** /**
* Run the current SQL statement for the given URI * Run the current SQL statement for the given URI
*/ */
public runQueryString(uri: string, selection: string, queryInput: QueryInput): void { public runQueryString(uri: string, selection: string,
this.doRunQuery(uri, selection, queryInput, true); title: string, queryInput: QueryInput): void {
this.doRunQuery(uri, selection, title, queryInput, true);
} }
/** /**
* Run Query implementation * Run Query implementation
*/ */
private doRunQuery(uri: string, selection: sqlops.ISelectionData | string, queryInput: QueryInput, private doRunQuery(uri: string, selection: sqlops.ISelectionData | string,
title: string, queryInput: QueryInput,
runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): void { runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): void {
// Reuse existing query runner if it exists // Reuse existing query runner if it exists
let queryRunner: QueryRunner; let queryRunner: QueryRunner;
@@ -252,7 +256,7 @@ export class QueryModelService implements IQueryModelService {
} else { } else {
// We do not have a query runner for this editor, so create a new one // We do not have a query runner for this editor, so create a new one
// and map it to the results uri // and map it to the results uri
info = this.initQueryRunner(uri); info = this.initQueryRunner(uri, title);
queryRunner = info.queryRunner; queryRunner = info.queryRunner;
} }
@@ -273,8 +277,8 @@ export class QueryModelService implements IQueryModelService {
} }
} }
private initQueryRunner(uri: string): QueryInfo { private initQueryRunner(uri: string, title: string): QueryInfo {
let queryRunner = this._instantiationService.createInstance(QueryRunner, uri); let queryRunner = this._instantiationService.createInstance(QueryRunner, uri, title);
let info = new QueryInfo(); let info = new QueryInfo();
queryRunner.addListener(QREvents.RESULT_SET, e => { queryRunner.addListener(QREvents.RESULT_SET, e => {
this._fireQueryEvent(uri, 'resultSet', e); this._fireQueryEvent(uri, 'resultSet', e);
@@ -359,10 +363,6 @@ export class QueryModelService implements IQueryModelService {
if (queryRunner) { if (queryRunner) {
queryRunner.disposeQuery(); queryRunner.disposeQuery();
} }
// remove our info map
if (this._queryInfoMap.has(ownerUri)) {
this._queryInfoMap.delete(ownerUri);
}
} }
// EDIT DATA METHODS ///////////////////////////////////////////////////// // EDIT DATA METHODS /////////////////////////////////////////////////////
@@ -386,7 +386,7 @@ export class QueryModelService implements IQueryModelService {
// We do not have a query runner for this editor, so create a new one // We do not have a query runner for this editor, so create a new one
// and map it to the results uri // and map it to the results uri
queryRunner = this._instantiationService.createInstance(QueryRunner, ownerUri); queryRunner = this._instantiationService.createInstance(QueryRunner, ownerUri, ownerUri);
queryRunner.addListener(QREvents.RESULT_SET, resultSet => { queryRunner.addListener(QREvents.RESULT_SET, resultSet => {
this._fireQueryEvent(ownerUri, 'resultSet', resultSet); this._fireQueryEvent(ownerUri, 'resultSet', resultSet);
}); });

View File

@@ -20,7 +20,7 @@ import * as nls from 'vs/nls';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import * as types from 'vs/base/common/types'; import * as types from 'vs/base/common/types';
import { EventEmitter } from 'sql/base/common/eventEmitter'; import { EventEmitter } from 'sql/base/common/eventEmitter';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { IDisposable } from 'vs/base/common/lifecycle';
import { INotificationService } from 'vs/platform/notification/common/notification'; import { INotificationService } from 'vs/platform/notification/common/notification';
import { Emitter, Event } from 'vs/base/common/event'; import { Emitter, Event } from 'vs/base/common/event';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
@@ -62,7 +62,7 @@ export interface IGridMessage extends sqlops.IResultMessage {
* Query Runner class which handles running a query, reports the results to the content manager, * Query Runner class which handles running a query, reports the results to the content manager,
* and handles getting more rows from the service layer and disposing when the content is closed. * and handles getting more rows from the service layer and disposing when the content is closed.
*/ */
export default class QueryRunner extends Disposable { export default class QueryRunner {
// MEMBER VARIABLES //////////////////////////////////////////////////// // MEMBER VARIABLES ////////////////////////////////////////////////////
private _resultLineOffset: number; private _resultLineOffset: number;
private _totalElapsedMilliseconds: number = 0; private _totalElapsedMilliseconds: number = 0;
@@ -76,7 +76,7 @@ export default class QueryRunner extends Disposable {
private _planXml = new Deferred<string>(); private _planXml = new Deferred<string>();
public get planXml(): Thenable<string> { return this._planXml.promise; } public get planXml(): Thenable<string> { return this._planXml.promise; }
private _onMessage = this._register(new Emitter<sqlops.IResultMessage>()); private _onMessage = new Emitter<sqlops.IResultMessage>();
private _debouncedMessage = debounceEvent<sqlops.IResultMessage, sqlops.IResultMessage[]>(this._onMessage.event, (l, e) => { private _debouncedMessage = debounceEvent<sqlops.IResultMessage, sqlops.IResultMessage[]>(this._onMessage.event, (l, e) => {
// on first run // on first run
if (types.isUndefinedOrNull(l)) { if (types.isUndefinedOrNull(l)) {
@@ -88,7 +88,7 @@ export default class QueryRunner extends Disposable {
private _echoedMessages = echo(this._debouncedMessage.event); private _echoedMessages = echo(this._debouncedMessage.event);
public readonly onMessage = this._echoedMessages.event; public readonly onMessage = this._echoedMessages.event;
private _onResultSet = this._register(new Emitter<sqlops.ResultSetSummary>()); private _onResultSet = new Emitter<sqlops.ResultSetSummary>();
private _debouncedResultSet = debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSet.event, (l, e) => { private _debouncedResultSet = debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSet.event, (l, e) => {
// on first run // on first run
if (types.isUndefinedOrNull(l)) { if (types.isUndefinedOrNull(l)) {
@@ -100,16 +100,16 @@ export default class QueryRunner extends Disposable {
private _echoedResultSet = echo(this._debouncedResultSet.event); private _echoedResultSet = echo(this._debouncedResultSet.event);
public readonly onResultSet = this._echoedResultSet.event; public readonly onResultSet = this._echoedResultSet.event;
private _onQueryStart = this._register(new Emitter<void>()); private _onQueryStart = new Emitter<void>();
public readonly onQueryStart: Event<void> = this._onQueryStart.event; public readonly onQueryStart: Event<void> = this._onQueryStart.event;
private _onQueryEnd = this._register(new Emitter<string>()); private _onQueryEnd = new Emitter<string>();
public readonly onQueryEnd: Event<string> = this._onQueryEnd.event; public readonly onQueryEnd: Event<string> = this._onQueryEnd.event;
private _onBatchStart = this._register(new Emitter<sqlops.BatchSummary>()); private _onBatchStart = new Emitter<sqlops.BatchSummary>();
public readonly onBatchStart: Event<sqlops.BatchSummary> = this._onBatchStart.event; public readonly onBatchStart: Event<sqlops.BatchSummary> = this._onBatchStart.event;
private _onBatchEnd = this._register(new Emitter<sqlops.BatchSummary>()); private _onBatchEnd = new Emitter<sqlops.BatchSummary>();
public readonly onBatchEnd: Event<sqlops.BatchSummary> = this._onBatchEnd.event; public readonly onBatchEnd: Event<sqlops.BatchSummary> = this._onBatchEnd.event;
private _queryStartTime: Date; private _queryStartTime: Date;
@@ -124,14 +124,13 @@ export default class QueryRunner extends Disposable {
// CONSTRUCTOR ///////////////////////////////////////////////////////// // CONSTRUCTOR /////////////////////////////////////////////////////////
constructor( constructor(
public uri: string, public uri: string,
public title: string,
@IQueryManagementService private _queryManagementService: IQueryManagementService, @IQueryManagementService private _queryManagementService: IQueryManagementService,
@INotificationService private _notificationService: INotificationService, @INotificationService private _notificationService: INotificationService,
@IWorkspaceConfigurationService private _workspaceConfigurationService: IWorkspaceConfigurationService, @IWorkspaceConfigurationService private _workspaceConfigurationService: IWorkspaceConfigurationService,
@IClipboardService private _clipboardService: IClipboardService, @IClipboardService private _clipboardService: IClipboardService,
@IInstantiationService private instantiationService: IInstantiationService @IInstantiationService private instantiationService: IInstantiationService
) { ) { }
super();
}
get isExecuting(): boolean { get isExecuting(): boolean {
return this._isExecuting; return this._isExecuting;
@@ -505,16 +504,10 @@ export default class QueryRunner extends Disposable {
/** /**
* Disposes the Query from the service client * Disposes the Query from the service client
* @returns A promise that will be rejected if a problem occured
*/ */
public disposeQuery(): void { public disposeQuery(): void {
this._queryManagementService.disposeQuery(this.uri).then(() => { this._queryManagementService.disposeQuery(this.uri);
this.dispose();
});
}
public dispose() {
this._batchSets = undefined;
super.dispose();
} }
get totalElapsedMilliseconds(): number { get totalElapsedMilliseconds(): number {

View File

@@ -152,6 +152,12 @@ export class QueryEditorService implements IQueryEditorService {
}); });
} }
/**
* Clears any QueryEditor data for the given URI held by this service
*/
public onQueryInputClosed(uri: string): void {
}
onSaveAsCompleted(oldResource: URI, newResource: URI): void { onSaveAsCompleted(oldResource: URI, newResource: URI): void {
let oldResourceString: string = oldResource.toString(); let oldResourceString: string = oldResource.toString();

View File

@@ -15,9 +15,6 @@ import { dispose, Disposable } from 'vs/base/common/lifecycle';
export class QueryPlanState { export class QueryPlanState {
xml: string; xml: string;
dispose() {
}
} }
export class QueryPlanTab implements IPanelTab { export class QueryPlanTab implements IPanelTab {
@@ -32,10 +29,6 @@ export class QueryPlanTab implements IPanelTab {
public dispose() { public dispose() {
dispose(this.view); dispose(this.view);
} }
public clear() {
this.view.clear();
}
} }
export class QueryPlanView implements IPanelView { export class QueryPlanView implements IPanelView {
@@ -66,12 +59,6 @@ export class QueryPlanView implements IPanelView {
this.container.style.height = dimension.height + 'px'; this.container.style.height = dimension.height + 'px';
} }
public clear() {
if (this.qp) {
this.qp.xml = undefined;
}
}
public showPlan(xml: string) { public showPlan(xml: string) {
if (this.qp) { if (this.qp) {
this.qp.xml = xml; this.qp.xml = xml;

View File

@@ -14,7 +14,7 @@ import { attachButtonStyler, attachModalDialogStyler } from 'sql/common/theme/st
import { Builder } from 'vs/base/browser/builder'; import { Builder } from 'vs/base/browser/builder';
import Severity from 'vs/base/common/severity'; import Severity from 'vs/base/common/severity';
import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IThemeService } from 'vs/platform/theme/common/themeService';
import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPartService } from 'vs/workbench/services/part/common/partService';
import { Event, Emitter } from 'vs/base/common/event'; import { Event, Emitter } from 'vs/base/common/event';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -76,7 +76,7 @@ export class ErrorMessageDialog extends Modal {
this._copyButton = this.addFooterButton(copyButtonLabel, () => this._clipboardService.writeText(this._messageDetails), 'left'); this._copyButton = this.addFooterButton(copyButtonLabel, () => this._clipboardService.writeText(this._messageDetails), 'left');
this._copyButton.icon = 'icon scriptToClipboard'; this._copyButton.icon = 'icon scriptToClipboard';
this._copyButton.element.title = copyButtonLabel; this._copyButton.element.title = copyButtonLabel;
this._register(attachButtonStyler(this._copyButton, this._themeService, { buttonBackground: SIDE_BAR_BACKGROUND, buttonHoverBackground: SIDE_BAR_BACKGROUND, buttonForeground: SIDE_BAR_FOREGROUND })); this._register(attachButtonStyler(this._copyButton, this._themeService, { buttonBackground: SIDE_BAR_BACKGROUND, buttonHoverBackground: SIDE_BAR_BACKGROUND }));
} }
private createStandardButton(label: string, onSelect: () => void): Button { private createStandardButton(label: string, onSelect: () => void): Button {

View File

@@ -141,8 +141,6 @@ suite('SQL QueryEditor Tests', () => {
connectionManagementService = TypeMoq.Mock.ofType(ConnectionManagementService, TypeMoq.MockBehavior.Loose, memento.object, undefined); connectionManagementService = TypeMoq.Mock.ofType(ConnectionManagementService, TypeMoq.MockBehavior.Loose, memento.object, undefined);
connectionManagementService.callBase = true; connectionManagementService.callBase = true;
connectionManagementService.setup(x => x.isConnected(TypeMoq.It.isAny())).returns(() => false); connectionManagementService.setup(x => x.isConnected(TypeMoq.It.isAny())).returns(() => false);
connectionManagementService.setup(x => x.disconnectEditor(TypeMoq.It.isAny())).returns(() => void 0);
connectionManagementService.setup(x => x.ensureDefaultLanguageFlavor(TypeMoq.It.isAnyString())).returns(() => void 0);
// Create a QueryModelService // Create a QueryModelService
queryModelService = new QueryModelService(instantiationService.object, notificationService.object); queryModelService = new QueryModelService(instantiationService.object, notificationService.object);
@@ -330,9 +328,6 @@ suite('SQL QueryEditor Tests', () => {
queryConnectionService = TypeMoq.Mock.ofType(ConnectionManagementService, TypeMoq.MockBehavior.Loose, memento.object, undefined); queryConnectionService = TypeMoq.Mock.ofType(ConnectionManagementService, TypeMoq.MockBehavior.Loose, memento.object, undefined);
queryConnectionService.callBase = true; queryConnectionService.callBase = true;
queryConnectionService.setup(x => x.disconnectEditor(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => void 0);
queryConnectionService.setup(x => x.ensureDefaultLanguageFlavor(TypeMoq.It.isAnyString())).returns(() => void 0);
// Mock InstantiationService to give us the actions // Mock InstantiationService to give us the actions
queryActionInstantiationService = TypeMoq.Mock.ofType(InstantiationService, TypeMoq.MockBehavior.Loose); queryActionInstantiationService = TypeMoq.Mock.ofType(InstantiationService, TypeMoq.MockBehavior.Loose);
@@ -359,13 +354,12 @@ suite('SQL QueryEditor Tests', () => {
let fileInput = new UntitledEditorInput(URI.parse('testUri'), false, '', '', '', instantiationService.object, undefined, undefined, undefined); let fileInput = new UntitledEditorInput(URI.parse('testUri'), false, '', '', '', instantiationService.object, undefined, undefined, undefined);
queryModelService = TypeMoq.Mock.ofType(QueryModelService, TypeMoq.MockBehavior.Loose, undefined, undefined); queryModelService = TypeMoq.Mock.ofType(QueryModelService, TypeMoq.MockBehavior.Loose, undefined, undefined);
queryModelService.callBase = true; queryModelService.callBase = true;
queryModelService.setup(x => x.disposeQuery(TypeMoq.It.isAny())).returns(() => void 0);
queryInput = new QueryInput( queryInput = new QueryInput(
'', '',
fileInput, fileInput,
undefined, undefined,
undefined, undefined,
connectionManagementService.object, undefined,
queryModelService.object, queryModelService.object,
undefined, undefined,
undefined undefined
@@ -401,7 +395,7 @@ suite('SQL QueryEditor Tests', () => {
test('Test that we attempt to dispose query when the queryInput is disposed', (done) => { test('Test that we attempt to dispose query when the queryInput is disposed', (done) => {
let queryResultsInput = new QueryResultsInput('testUri', configurationService.object); let queryResultsInput = new QueryResultsInput('testUri', configurationService.object);
queryInput['_results'] = queryResultsInput; queryInput['_results'] = queryResultsInput;
queryInput.close(); queryInput.dispose();
queryModelService.verify(x => x.disposeQuery(TypeMoq.It.isAnyString()), TypeMoq.Times.once()); queryModelService.verify(x => x.disposeQuery(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
done(); done();
}); });