From b70f6ad7f252efc333849a9f6463ac4dea9f291c Mon Sep 17 00:00:00 2001 From: Sakshi Sharma <57200045+SakshiS-harma@users.noreply.github.com> Date: Thu, 7 Sep 2023 15:19:39 -0700 Subject: [PATCH 01/23] Add Open file location as an option after an excel file is saved (#24331) * Add Open file location as an option after an excel file is saved * Fix test failure --- .../test/browser/dataResourceDataProvider.test.ts | 3 ++- .../services/query/common/resultSerializer.ts | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/sql/workbench/contrib/notebook/test/browser/dataResourceDataProvider.test.ts b/src/sql/workbench/contrib/notebook/test/browser/dataResourceDataProvider.test.ts index 6625ddf8ba3e..53695ce3941f 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/dataResourceDataProvider.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/dataResourceDataProvider.test.ts @@ -77,7 +77,8 @@ suite('Data Resource Data Provider', function () { contextService, fileDialogService, notificationService, - undefined // IOpenerService + undefined, // IOpenerService + undefined // ICommandService ); instantiationService = TypeMoq.Mock.ofType(InstantiationService, TypeMoq.MockBehavior.Strict); instantiationService.setup(x => x.createInstance(TypeMoq.It.isValue(ResultSerializer))) diff --git a/src/sql/workbench/services/query/common/resultSerializer.ts b/src/sql/workbench/services/query/common/resultSerializer.ts index 2a30b3adb17e..a256d672a01d 100644 --- a/src/sql/workbench/services/query/common/resultSerializer.ts +++ b/src/sql/workbench/services/query/common/resultSerializer.ts @@ -20,6 +20,7 @@ import { IFileDialogService, FileFilter } from 'vs/platform/dialogs/common/dialo import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IQueryEditorConfiguration } from 'sql/platform/query/common/query'; import { Schemas } from 'vs/base/common/network'; +import { ICommandService } from 'vs/platform/commands/common/commands'; let prevSavePath: URI; @@ -58,7 +59,8 @@ export class ResultSerializer { @IWorkspaceContextService private _contextService: IWorkspaceContextService, @IFileDialogService private readonly fileDialogService: IFileDialogService, @INotificationService private _notificationService: INotificationService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @ICommandService private readonly commandService: ICommandService ) { } /** @@ -372,6 +374,12 @@ export class ResultSerializer { run: () => { this.openerService.open(filePath, { openExternal: format === SaveFormat.EXCEL }); } + }, + { + label: nls.localize('openFileLocation', "Open file location"), + run: async () => { + this.commandService.executeCommand('revealFileInOS', filePath); + } }] ); } From 51f84eec53d165289d310daf9926ba26eca69c33 Mon Sep 17 00:00:00 2001 From: Benjin Dubishar Date: Thu, 7 Sep 2023 16:12:51 -0700 Subject: [PATCH 02/23] Organizing code to be easier to follow (#24332) * Organizing code to be easier to follow * Adding back trampled readme changes --- samples/sqlservices/README.md | 11 +- .../src/controllers/mainController.ts | 437 +++++++++--------- samples/sqlservices/tslint.json | 2 +- 3 files changed, 233 insertions(+), 217 deletions(-) diff --git a/samples/sqlservices/README.md b/samples/sqlservices/README.md index 13388b5a3ef6..e7ba09c15470 100644 --- a/samples/sqlservices/README.md +++ b/samples/sqlservices/README.md @@ -11,4 +11,13 @@ This is a sample extension that will show some basic model-backed UI scenarios a - `yarn build` - to build the code - Launch VSCode and open the azuredatastudio's code folder, run the 'Launch azuredatastudio' debug option (to work around the issue. The next step won't work without doing this first) - Launch VSCode and open this folder, run the 'Debug in enlistment'. To debug, [install the `sqlops-debug` extension](https://github.com/Microsoft/azuredatastudio/wiki/Debugging-an-Extension-with-VS-Code) in VS Code. -- Once ADS launches, you should be able to run the sqlservices commands, for example: sqlservices.openDialog +- Launch VSCode and open this folder, run the 'Debug in enlistment' +- Once ADS launches, you should be able to run the sqlservices commands, for example: `sqlservices.openDialog`. + +## Consuming `azdata` typing changes during development +If writing samples for new component model UI components that aren't yet checked into main, change the URL specified in `sqlservices\tasks\buildtasks.js`'s `copytypings` task to point to the branch with the `azdata.proposed.d.ts` changes. Because this task pulls the `azdata.proposed.d.ts` type from this URL, your changes must be pushed to your branch before this will work. It does not use the local files. + +After running `yarn build`, you should see your updated typings in `sqlservices\typings\azdata.proposed.d.ts`. + +> **Important** +> Do not check in changes to this URL to `main`. This is for development only; revert these changes before they are sent out in a PR. diff --git a/samples/sqlservices/src/controllers/mainController.ts b/samples/sqlservices/src/controllers/mainController.ts index 7f9600eec8e6..67a929cf69f8 100644 --- a/samples/sqlservices/src/controllers/mainController.ts +++ b/samples/sqlservices/src/controllers/mainController.ts @@ -53,14 +53,18 @@ export default class MainController implements vscode.Disposable { this.registerSplitPanelModelView(); this.registerModelViewDashboardTab(); + vscode.commands.registerCommand('sqlservices.openEditor', () => { this.openEditor(); }); + vscode.commands.registerCommand('sqlservices.openDialog', () => { this.openDialog(); }); + vscode.commands.registerCommand('sqlservices.openEditorWithWebView', () => { this.openEditorWithWebview(buttonHtml, counterHtml); }); + vscode.commands.registerCommand('sqlservices.openEditorWithWebView2', () => { this.openEditorWithWebview2(); }); + vscode.commands.registerCommand('sqlservices.openWizard', () => { this.openWizard(); }); + vscode.commands.registerCommand('sqlservices.openModelViewDashboard', () => { dashboard.openModelViewDashboard(this.context); }); + vscode.commands.registerCommand('sqlservices.updateObjectExplorerNode', async (context: azdata.ObjectExplorerContext) => { await objectExplorer.updateNode(context); }); + azdata.tasks.registerTask('sqlservices.clickTask', (profile) => { vscode.window.showInformationMessage(`Clicked from profile ${profile.serverName}.${profile.databaseName}`); }); - vscode.commands.registerCommand('sqlservices.openDialog', () => { - this.openDialog(); - }); - vscode.commands.registerCommand('sqlservices.openConnectionDialog', async () => { let connection = await azdata.connection.openConnectionDialog(); if (connection) { @@ -68,34 +72,228 @@ export default class MainController implements vscode.Disposable { } }); - vscode.commands.registerCommand('sqlservices.openEditor', () => { - this.openEditor(); + return Promise.resolve(true); + } + + //#region Primary entrypoints + + private openDialog(): void { + let dialog = azdata.window.createModelViewDialog('Test dialog', '', 'wide'); + + // Dialog button customizations + + dialog.okButton.onClick(() => console.log('ok clicked!')); + dialog.okButton.label = 'ok'; + + dialog.cancelButton.onClick(() => console.log('cancel clicked!')); + dialog.cancelButton.label = 'no'; + + const customButton1 = azdata.window.createButton('Load name'); + customButton1.onClick(() => console.log('button 1 clicked!')); + + const customButton2 = azdata.window.createButton('Load all'); + customButton2.onClick(() => console.log('button 2 clicked!')); + + dialog.customButtons = [customButton1, customButton2]; + + // Dialog tabs + + dialog.content = []; + + const basicUiTab = azdata.window.createTab('Basic UI Controls'); + basicUiTab.registerContent(async (view) => { + await this.getBasicUiTabContent(view, customButton1, customButton2, 400); }); + dialog.content.push(basicUiTab); + + const widgetTab = azdata.window.createTab('Widget'); + widgetTab.content = 'sqlservices'; + dialog.content.push(widgetTab); - vscode.commands.registerCommand('sqlservices.openEditorWithWebView', () => { - this.openEditorWithWebview(buttonHtml, counterHtml); + const treeTab = azdata.window.createTab('Tree'); + treeTab.registerContent(async (view) => { + await this.getTreeTabContent(view); }); + dialog.content.push(treeTab); + + // Open the dialog + + azdata.window.openDialog(dialog); + } - vscode.commands.registerCommand('sqlservices.openEditorWithWebView2', () => { - this.openEditorWithWebview2(); + private openWizard(): void { + let wizard = azdata.window.createWizard('Test wizard'); + let page1 = azdata.window.createWizardPage('First wizard page'); + let page2 = azdata.window.createWizardPage('Second wizard page'); + page2.content = 'sqlservices'; + let customButton1 = azdata.window.createButton('Load name'); + customButton1.onClick(() => console.log('button 1 clicked!')); + let customButton2 = azdata.window.createButton('Load all'); + customButton2.onClick(() => console.log('button 2 clicked!')); + wizard.customButtons = [customButton1, customButton2]; + page1.registerContent(async (view) => { + await this.getBasicUiTabContent(view, customButton1, customButton2, 800); }); - vscode.commands.registerCommand('sqlservices.openWizard', () => { - this.openWizard(); + wizard.registerOperation({ + displayName: 'test task', + description: 'task description', + isCancelable: true, + connection: undefined, + operation: op => { + op.updateStatus(azdata.TaskStatus.InProgress); + op.updateStatus(azdata.TaskStatus.InProgress, 'Task is running'); + setTimeout(() => { + op.updateStatus(azdata.TaskStatus.Succeeded); + }, 5000); + } }); + wizard.pages = [page1, page2]; + wizard.open(); + } - vscode.commands.registerCommand('sqlservices.openModelViewDashboard', () => { - dashboard.openModelViewDashboard(this.context); + private openEditor(): void { + let editor = azdata.workspace.createModelViewEditor('Test Model View'); + editor.registerContent(async view => { + let inputBox = view.modelBuilder.inputBox() + .withValidation(component => component.value !== 'valid') + .component(); + let formModel = view.modelBuilder.formContainer() + .withFormItems([{ + component: inputBox, + title: 'Enter anything but "valid"' + }]).component(); + view.onClosed((params) => { + vscode.window.showInformationMessage('The model view editor is closed.'); + }); + await view.initializeModel(formModel); }); + editor.openEditor(); + } - vscode.commands.registerCommand('sqlservices.updateObjectExplorerNode', async (context: azdata.ObjectExplorerContext) => { - await objectExplorer.updateNode(context); + private openEditorWithWebview(html1: string, html2: string): void { + let editor = azdata.workspace.createModelViewEditor('Editor webview', { retainContextWhenHidden: true }); + editor.registerContent(async view => { + let count = 0; + let webview1 = view.modelBuilder.webView() + .withProps({ + html: html1 + }) + .component(); + let webview2 = view.modelBuilder.webView() + .withProps({ + html: html2 + }) + .component(); + webview1.onMessage((params) => { + count++; + webview2.message = count; + }); + + let editor1 = view.modelBuilder.editor() + .withProps({ + content: 'select * from sys.tables' + }) + .component(); + + let editor2 = view.modelBuilder.editor() + .withProps({ + content: 'print("Hello World !")', + languageMode: 'python' + }) + .component(); + + let flexModel = view.modelBuilder.flexContainer().component(); + flexModel.addItem(editor1, { flex: '1' }); + flexModel.addItem(editor2, { flex: '1' }); + flexModel.setLayout({ + flexFlow: 'column', + alignItems: 'stretch', + height: '100%' + }); + + view.onClosed((params) => { + vscode.window.showInformationMessage('editor1: language: ' + editor1.languageMode + ' Content1: ' + editor1.content); + vscode.window.showInformationMessage('editor2: language: ' + editor2.languageMode + ' Content2: ' + editor2.content); + }); + await view.initializeModel(flexModel); }); + editor.openEditor(); + } - return Promise.resolve(true); + private openEditorWithWebview2(): void { + let editor = azdata.workspace.createModelViewEditor('Editor webview2', { retainContextWhenHidden: true }); + editor.registerContent(async view => { + + let inputBox = view.modelBuilder.inputBox().component(); + let dropdown = view.modelBuilder.dropDown() + .withProps({ + value: 'aa', + values: ['aa', 'bb', 'cc'] + }) + .component(); + let runIcon = path.join(__dirname, '..', 'media', 'start.svg'); + let runButton = view.modelBuilder.button() + .withProps({ + label: 'Run', + iconPath: runIcon, + title: 'Run title' + }).component(); + + let monitorLightPath = vscode.Uri.file(path.join(__dirname, '..', 'media', 'monitor.svg')); + let monitorIcon = { + light: monitorLightPath, + dark: path.join(__dirname, '..', 'media', 'monitor_inverse.svg') + }; + + let monitorButton = view.modelBuilder.button() + .withProps({ + label: 'Monitor', + iconPath: monitorIcon, + title: 'Monitor title' + }).component(); + let toolbarModel = view.modelBuilder.toolbarContainer() + .withToolbarItems([{ + component: inputBox, + title: 'User name:' + }, { + component: dropdown, + title: 'favorite:' + }, { + component: runButton + }, { + component: monitorButton + }]).component(); + + + let webview = view.modelBuilder.webView() + .component(); + + let flexModel = view.modelBuilder.flexContainer().component(); + flexModel.addItem(toolbarModel, { flex: '0' }); + flexModel.addItem(webview, { flex: '1' }); + flexModel.setLayout({ + flexFlow: 'column', + alignItems: 'stretch', + height: '100%' + }); + + let templateValues = { url: 'http://whoisactive.com/docs/' }; + Utils.renderTemplateHtml(path.join(__dirname, '..'), 'templateTab.html', templateValues) + .then(html => { + webview.html = html; + }); + + await view.initializeModel(flexModel); + }); + editor.openEditor(); } - private async getTab3Content(view: azdata.ModelView): Promise { + //#endregion + + //#region Component helpers + + private async getTreeTabContent(view: azdata.ModelView): Promise { let treeData = { label: '1', children: [ @@ -168,8 +366,8 @@ export default class MainController implements vscode.Disposable { await view.initializeModel(formWrapper); } - private async getTabContent(view: azdata.ModelView, customButton1: azdata.window.Button, customButton2: azdata.window.Button, componentWidth: number | string - ): Promise { + + private async getBasicUiTabContent(view: azdata.ModelView, customButton1: azdata.window.Button, customButton2: azdata.window.Button, componentWidth: number | string): Promise { let inputBox = view.modelBuilder.inputBox() .withProps({ multiline: true, @@ -503,201 +701,9 @@ export default class MainController implements vscode.Disposable { await view.initializeModel(formWrapper); } - private openDialog(): void { - let dialog = azdata.window.createModelViewDialog('Test dialog', '', 'wide'); - let tab1 = azdata.window.createTab('Test tab 1'); - - let tab2 = azdata.window.createTab('Test tab 2'); - let tab3 = azdata.window.createTab('Test tab 3'); - tab2.content = 'sqlservices'; - dialog.content = [tab1, tab2, tab3]; - dialog.okButton.onClick(() => console.log('ok clicked!')); - dialog.cancelButton.onClick(() => console.log('cancel clicked!')); - dialog.okButton.label = 'ok'; - dialog.cancelButton.label = 'no'; - let customButton1 = azdata.window.createButton('Load name'); - customButton1.onClick(() => console.log('button 1 clicked!')); - let customButton2 = azdata.window.createButton('Load all'); - customButton2.onClick(() => console.log('button 2 clicked!')); - dialog.customButtons = [customButton1, customButton2]; - tab1.registerContent(async (view) => { - await this.getTabContent(view, customButton1, customButton2, 400); - }); - - tab3.registerContent(async (view) => { - await this.getTab3Content(view); - }); - azdata.window.openDialog(dialog); - } - - private openWizard(): void { - let wizard = azdata.window.createWizard('Test wizard'); - let page1 = azdata.window.createWizardPage('First wizard page'); - let page2 = azdata.window.createWizardPage('Second wizard page'); - page2.content = 'sqlservices'; - let customButton1 = azdata.window.createButton('Load name'); - customButton1.onClick(() => console.log('button 1 clicked!')); - let customButton2 = azdata.window.createButton('Load all'); - customButton2.onClick(() => console.log('button 2 clicked!')); - wizard.customButtons = [customButton1, customButton2]; - page1.registerContent(async (view) => { - await this.getTabContent(view, customButton1, customButton2, 800); - }); - - wizard.registerOperation({ - displayName: 'test task', - description: 'task description', - isCancelable: true, - connection: undefined, - operation: op => { - op.updateStatus(azdata.TaskStatus.InProgress); - op.updateStatus(azdata.TaskStatus.InProgress, 'Task is running'); - setTimeout(() => { - op.updateStatus(azdata.TaskStatus.Succeeded); - }, 5000); - } - }); - wizard.pages = [page1, page2]; - wizard.open(); - } - - private openEditor(): void { - let editor = azdata.workspace.createModelViewEditor('Test Model View'); - editor.registerContent(async view => { - let inputBox = view.modelBuilder.inputBox() - .withValidation(component => component.value !== 'valid') - .component(); - let formModel = view.modelBuilder.formContainer() - .withFormItems([{ - component: inputBox, - title: 'Enter anything but "valid"' - }]).component(); - view.onClosed((params) => { - vscode.window.showInformationMessage('The model view editor is closed.'); - }); - await view.initializeModel(formModel); - }); - editor.openEditor(); - } - - private openEditorWithWebview(html1: string, html2: string): void { - let editor = azdata.workspace.createModelViewEditor('Editor webview', { retainContextWhenHidden: true }); - editor.registerContent(async view => { - let count = 0; - let webview1 = view.modelBuilder.webView() - .withProps({ - html: html1 - }) - .component(); - let webview2 = view.modelBuilder.webView() - .withProps({ - html: html2 - }) - .component(); - webview1.onMessage((params) => { - count++; - webview2.message = count; - }); - - let editor1 = view.modelBuilder.editor() - .withProps({ - content: 'select * from sys.tables' - }) - .component(); - - let editor2 = view.modelBuilder.editor() - .withProps({ - content: 'print("Hello World !")', - languageMode: 'python' - }) - .component(); - - let flexModel = view.modelBuilder.flexContainer().component(); - flexModel.addItem(editor1, { flex: '1' }); - flexModel.addItem(editor2, { flex: '1' }); - flexModel.setLayout({ - flexFlow: 'column', - alignItems: 'stretch', - height: '100%' - }); - - view.onClosed((params) => { - vscode.window.showInformationMessage('editor1: language: ' + editor1.languageMode + ' Content1: ' + editor1.content); - vscode.window.showInformationMessage('editor2: language: ' + editor2.languageMode + ' Content2: ' + editor2.content); - }); - await view.initializeModel(flexModel); - }); - editor.openEditor(); - } - - private openEditorWithWebview2(): void { - let editor = azdata.workspace.createModelViewEditor('Editor webview2', { retainContextWhenHidden: true }); - editor.registerContent(async view => { - - let inputBox = view.modelBuilder.inputBox().component(); - let dropdown = view.modelBuilder.dropDown() - .withProps({ - value: 'aa', - values: ['aa', 'bb', 'cc'] - }) - .component(); - let runIcon = path.join(__dirname, '..', 'media', 'start.svg'); - let runButton = view.modelBuilder.button() - .withProps({ - label: 'Run', - iconPath: runIcon, - title: 'Run title' - }).component(); - - let monitorLightPath = vscode.Uri.file(path.join(__dirname, '..', 'media', 'monitor.svg')); - let monitorIcon = { - light: monitorLightPath, - dark: path.join(__dirname, '..', 'media', 'monitor_inverse.svg') - }; - - let monitorButton = view.modelBuilder.button() - .withProps({ - label: 'Monitor', - iconPath: monitorIcon, - title: 'Monitor title' - }).component(); - let toolbarModel = view.modelBuilder.toolbarContainer() - .withToolbarItems([{ - component: inputBox, - title: 'User name:' - }, { - component: dropdown, - title: 'favorite:' - }, { - component: runButton - }, { - component: monitorButton - }]).component(); - - - let webview = view.modelBuilder.webView() - .component(); - - let flexModel = view.modelBuilder.flexContainer().component(); - flexModel.addItem(toolbarModel, { flex: '0' }); - flexModel.addItem(webview, { flex: '1' }); - flexModel.setLayout({ - flexFlow: 'column', - alignItems: 'stretch', - height: '100%' - }); - - let templateValues = { url: 'http://whoisactive.com/docs/' }; - Utils.renderTemplateHtml(path.join(__dirname, '..'), 'templateTab.html', templateValues) - .then(html => { - webview.html = html; - }); - - await view.initializeModel(flexModel); - }); - editor.openEditor(); - } + //#endregion + //#region Registrations private registerSqlServicesModelView(): void { azdata.ui.registerModelViewProvider('sqlservices', async (view) => { @@ -770,5 +776,6 @@ export default class MainController implements vscode.Disposable { }); } -} + //#endregion +} diff --git a/samples/sqlservices/tslint.json b/samples/sqlservices/tslint.json index a7b0b509258f..7aa09fb34bd6 100644 --- a/samples/sqlservices/tslint.json +++ b/samples/sqlservices/tslint.json @@ -23,7 +23,7 @@ "label-undefined": true, "max-line-length": [ true, - 160 + 200 ], "member-access": false, "member-ordering": false, From 594aabb835c2a4835efc71f232affb5c681eb854 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:31:21 -0700 Subject: [PATCH 03/23] Bump electron from 22.3.14 to 22.3.21 (#24299) * Bump electron from 22.3.14 to 22.3.21 Bumps [electron](https://github.com/electron/electron) from 22.3.14 to 22.3.21. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v22.3.14...v22.3.21) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development ... Signed-off-by: dependabot[bot] * Update distro hash * Bump distro hash * Update distro hash * Update distro hash * Update hash --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Lewis Sanchez --- package.json | 4 ++-- yarn.lock | 20 +++++--------------- 2 files changed, 7 insertions(+), 17 deletions(-) mode change 100755 => 100644 package.json diff --git a/package.json b/package.json old mode 100755 new mode 100644 index 7fcaaf127600..25f36956a8fd --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "azuredatastudio", "version": "1.46.0", - "distro": "ddc1ad96839c9128a60123f438335d3c8b2d3480", + "distro": "7f4613d9a9266732a1d3a616e3d4112495083a71", "author": { "name": "Microsoft Corporation" }, @@ -178,7 +178,7 @@ "cssnano": "^4.1.11", "debounce": "^1.0.0", "deemon": "^1.8.0", - "electron": "22.3.14", + "electron": "22.3.21", "eslint": "8.36.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "^39.3.2", diff --git a/yarn.lock b/yarn.lock index b669ff390c16..781a818bde63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1129,21 +1129,11 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*": - version "4.2.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-4.2.22.tgz#cf488a0f6b4a9c245d09927f4f757ca278b9c8ce" - integrity sha512-LXRap3bb4AjtLZ5NOFc4ssVZrQPTgdPcNm++0SEJuJZaOA+xHkojJNYqy33A5q/94BmG5tA6yaMeD4VdCv5aSA== - -"@types/node@16.x": +"@types/node@*", "@types/node@16.x", "@types/node@^16.11.26": version "16.18.25" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.25.tgz#8863940fefa1234d3fcac7a4b7a48a6c992d67af" integrity sha512-rUDO6s9Q/El1R1I21HG4qw/LstTHCPO/oQNAwI/4b2f9EWvMnqt4d3HJwPMawfZ3UvodB8516Yg+VAq54YM+eA== -"@types/node@^16.11.26": - version "16.11.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.31.tgz#1dad8138efee6808809bb80f9e66bbe3e46c9277" - integrity sha512-wh/d0pcu/Ie2mqTIqh4tjd0mLAB4JWxOjHQtLN20HS7sjMHiV4Afr+90hITTyZcxowwha5wjv32jGEn1zkEFMg== - "@types/plotly.js@^1.44.9": version "1.54.22" resolved "https://registry.yarnpkg.com/@types/plotly.js/-/plotly.js-1.54.22.tgz#001b9cfafc5e0bdf133bc6ab6e30ff0af39e584d" @@ -3668,10 +3658,10 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== -electron@22.3.14: - version "22.3.14" - resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.14.tgz#539fc7d7b6df37483aaa351856a28e43092d550e" - integrity sha512-WxVcLnC4DrkBLN1/BwpxNkGvVq8iq1hM7lae5nvjnSYg/bwVbuo1Cwc80Keft4MIWKlYCXNiKKqs3qCXV4Aiaw== +electron@22.3.21: + version "22.3.21" + resolved "https://registry.yarnpkg.com/electron/-/electron-22.3.21.tgz#a817446cc1e62e9650522fa7eae389f9fc5b5e19" + integrity sha512-9JzWgvehRrqA30M7RvWCwwbyq2EgPUSbCFaqyZGnG0B52m4ayB8H+uFNIKXyWuyFwAEPDpQW5cGwCzXir1HuLA== dependencies: "@electron/get" "^2.0.0" "@types/node" "^16.11.26" From aa006b9da7b648ee7378971b4bd0a2c0ea19dfcf Mon Sep 17 00:00:00 2001 From: Sai Avishkar Sreerama <74571829+ssreerama@users.noreply.github.com> Date: Thu, 7 Sep 2023 21:37:24 -0500 Subject: [PATCH 04/23] Enabling QueryStore options to the database properties (#24255) * Initial commit * updated query capture policy props * all done except, querydiskSpaceSection * disabling capture policy options on off mode but with custom mode enabled * adding query disk usage section with purge button * fg table replace * STS vbump to 4.9.0.34 * typo --- extensions/mssql/config.json | 2 +- extensions/mssql/src/contracts.ts | 10 + extensions/mssql/src/mssql.d.ts | 7 + .../mssql/src/objectManagement/constants.ts | 1 + .../mssql/src/objectManagement/interfaces.ts | 27 + .../objectManagement/localizedConstants.ts | 25 + .../objectManagementService.ts | 9 + .../src/objectManagement/ui/databaseDialog.ts | 472 +++++++++++++++--- extensions/mssql/src/ui/dialogBase.ts | 45 ++ 9 files changed, 535 insertions(+), 63 deletions(-) diff --git a/extensions/mssql/config.json b/extensions/mssql/config.json index 9608df3d9c22..30aa1663c399 100644 --- a/extensions/mssql/config.json +++ b/extensions/mssql/config.json @@ -1,6 +1,6 @@ { "downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/{#version#}/microsoft.sqltools.servicelayer-{#fileName#}", - "version": "4.9.0.32", + "version": "4.9.0.34", "downloadFileNames": { "Windows_86": "win-x86-net7.0.zip", "Windows_64": "win-x64-net7.0.zip", diff --git a/extensions/mssql/src/contracts.ts b/extensions/mssql/src/contracts.ts index c04a1e0ee068..f8774bbf7f87 100644 --- a/extensions/mssql/src/contracts.ts +++ b/extensions/mssql/src/contracts.ts @@ -1699,6 +1699,16 @@ export namespace GetAssociatedFilesRequest { export const type = new RequestType('admin/getassociatedfiles'); } +export namespace PurgeQueryStoreDataRequest { + export const type = new RequestType('objectManagement/purgeQueryStoreData'); +} + +export interface purgeQueryStoreDataRequestParams { + connectionUri: string; + database: string; + objectUrn: string; +} + // ------------------------------- < Object Management > ------------------------------------ // ------------------------------- < Encryption IV/KEY updation Event > ------------------------------------ diff --git a/extensions/mssql/src/mssql.d.ts b/extensions/mssql/src/mssql.d.ts index 4a45981623ca..2a439c894ef9 100644 --- a/extensions/mssql/src/mssql.d.ts +++ b/extensions/mssql/src/mssql.d.ts @@ -1020,6 +1020,13 @@ declare module 'mssql' { * @returns An array of file path strings for each of the associated files. */ getAssociatedFiles(connectionUri: string, primaryFilePath: string): Thenable; + /** + * Clears all query store data from the database + * @param connectionUri The URI of the server connection. + * @param database The target database. + * @param objectUrn SMO Urn of the database to be detached. More information: https://learn.microsoft.com/sql/relational-databases/server-management-objects-smo/overview-smo + */ + purgeQueryStoreData(connectionUri: string, database: string, objectUrn: string): Thenable; } export interface DatabaseFileData { diff --git a/extensions/mssql/src/objectManagement/constants.ts b/extensions/mssql/src/objectManagement/constants.ts index ee73ce8291b8..b423084652ed 100644 --- a/extensions/mssql/src/objectManagement/constants.ts +++ b/extensions/mssql/src/objectManagement/constants.ts @@ -40,6 +40,7 @@ export const DatabaseGeneralPropertiesDocUrl = 'https://learn.microsoft.com/sql/ export const DatabaseOptionsPropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-options-page' export const DropDatabaseDocUrl = 'https://learn.microsoft.com/sql/t-sql/statements/drop-database-transact-sql'; export const DatabaseScopedConfigurationPropertiesDocUrl = 'https://learn.microsoft.com/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql' +export const QueryStorePropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-query-store-page' export const DatabaseFilesPropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-files-page' export const DatabaseFileGroupsPropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-filegroups-page' diff --git a/extensions/mssql/src/objectManagement/interfaces.ts b/extensions/mssql/src/objectManagement/interfaces.ts index 4ee4aa8f0c32..445699ca6cfa 100644 --- a/extensions/mssql/src/objectManagement/interfaces.ts +++ b/extensions/mssql/src/objectManagement/interfaces.ts @@ -458,6 +458,7 @@ export interface Database extends ObjectManagement.SqlObject { isFilesTabSupported?: boolean; files?: DatabaseFile[]; filegroups?: FileGroup[]; + queryStoreOptions?: QueryStoreOptions; } export interface DatabaseViewInfo extends ObjectManagement.ObjectViewInfo { @@ -481,6 +482,32 @@ export interface DatabaseViewInfo extends ObjectManagement.ObjectViewInfo localize('objectManagement.databaseProperties.FilegroupExistsError', "File group '{0}' could not be added to the collection, because it already exists.", name); export const EmptyFilegroupNameError = localize('objectManagement.databaseProperties.emptyFilegroupNameError', "Cannot use empty object names for filegroups."); +export const ActualOperationModeText = localize('objectManagement.databaseProperties.actualOperationModeText', "Operation Mode (Actual)"); +export const RequestedOperationModeText = localize('objectManagement.databaseProperties.requestedOperationModeText', "Operation Mode (Requested)"); +export const DataFlushIntervalInMinutesText = localize('objectManagement.databaseProperties.dataFlushIntervalInMinutesText', "Data Flush Interval (Minutes)"); +export const StatisticsCollectionInterval = localize('objectManagement.databaseProperties.statisticsCollectionInterval', "Statistics Collection Interval"); +export const MaxPlansPerQueryText = localize('objectManagement.databaseProperties.maxPlansPerQueryText', "Max Plans Per Query"); +export const MaxSizeInMbText = localize('objectManagement.databaseProperties.maxSizeInMbText', "Max Size (MB)"); +export const QueryStoreCaptureModeText = localize('objectManagement.databaseProperties.queryStoreCaptureModeText', "Query Store Capture Mode"); +export const SizeBasedCleanupModeText = localize('objectManagement.databaseProperties.sizeBasedCleanupModeText', "Size Based Cleanup Mode"); +export const StateQueryThresholdInDaysText = localize('objectManagement.databaseProperties.stateQueryThresholdInDaysText', "State Query Threshold (Days)"); +export const WaitStatisticsCaptureModeText = localize('objectManagement.databaseProperties.waitStatisticsCaptureModeText', "Wait Statistics Capture Mode"); +export const MonitoringSectionText = localize('objectManagement.databaseProperties.monitoringSectionText', "Monitoring"); +export const QueryStoreRetentionSectionText = localize('objectManagement.databaseProperties.queryStoreRetentionSectionText', "Query Store Retention"); +export const QueryStoreCapturePolicySectionText = localize('objectManagement.databaseProperties.queryStoreCapturePolicySectionText', "Query Store Capture Policy"); +export const QueryStoreCurrentDiskUsageSectionText = localize('objectManagement.databaseProperties.queryStoreCurrentDiskUsageSectionText', "Current Disk Usage"); +export const ExecutionCountText = localize('objectManagement.databaseProperties.executionCountText', "Execution Count"); +export const StaleThresholdText = localize('objectManagement.databaseProperties.staleThresholdText', "Stale Threshold"); +export const TotalCompileCPUTimeInMsText = localize('objectManagement.databaseProperties.totalCompileCPUTimeInMs', "Total Compile CPU Time (ms)"); +export const TotalExecutionCPUTimeInMsText = localize('objectManagement.databaseProperties.totalExecutionCPUTimeInMsText', "Total Execution CPU Time (ms)"); +export const QueryStoreCapturemodeCustomText = localize('objectManagement.databaseProperties.queryStoreCapturemodeCustomText', "Custom"); +export const QueryStoreUsedText = localize('objectManagement.databaseProperties.queryStoreUsedText', "Query Store Used"); +export const QueryStoreAvailableText = localize('objectManagement.databaseProperties.queryStoreAvailableText', "Query Store Available"); +export const PurgeQueryDataButtonText = localize('objectManagement.databaseProperties.purgeQueryDataButtonText', "Purge Query Store Data"); +export const YesText = localize('objectManagement.databaseProperties.yesText', "Yes"); +export const PurgeQueryStoreDataMessage = (databaseName: string) => localize('objectManagement.databaseProperties.purgeQueryStoreDataMessage', "Are you sure you want to purge the Query Store data from '{0}'?", databaseName); // Util functions export function getNodeTypeDisplayName(type: string, inTitle: boolean = false): string { diff --git a/extensions/mssql/src/objectManagement/objectManagementService.ts b/extensions/mssql/src/objectManagement/objectManagementService.ts index 16491a3d88b2..aa1ea7706751 100644 --- a/extensions/mssql/src/objectManagement/objectManagementService.ts +++ b/extensions/mssql/src/objectManagement/objectManagementService.ts @@ -90,6 +90,11 @@ export class ObjectManagementService extends BaseService implements IObjectManag const params: contracts.GetAssociatedFilesRequestParams = { connectionUri, primaryFilePath }; return this.runWithErrorHandling(contracts.GetAssociatedFilesRequest.type, params); } + + async purgeQueryStoreData(connectionUri: string, database: string, objectUrn: string): Promise { + const params: contracts.purgeQueryStoreDataRequestParams = { connectionUri, database, objectUrn }; + return this.runWithErrorHandling(contracts.PurgeQueryStoreDataRequest.type, params); + } } const ServerLevelSecurableTypes: SecurableTypeMetadata[] = [ @@ -277,6 +282,10 @@ export class TestObjectManagementService implements IObjectManagementService { return this.delayAndResolve([]); } + async purgeQueryStoreData(connectionUri: string, database: string, objectUrn: string): Promise { + return this.delayAndResolve([]); + } + private generateSearchResult(objectType: ObjectManagement.NodeType, schema: string | undefined, count: number): ObjectManagement.SearchResultItem[] { let items: ObjectManagement.SearchResultItem[] = []; for (let i = 0; i < count; i++) { diff --git a/extensions/mssql/src/objectManagement/ui/databaseDialog.ts b/extensions/mssql/src/objectManagement/ui/databaseDialog.ts index 7353bde5ee2e..e78bd99d4d98 100644 --- a/extensions/mssql/src/objectManagement/ui/databaseDialog.ts +++ b/extensions/mssql/src/objectManagement/ui/databaseDialog.ts @@ -8,17 +8,23 @@ import { ObjectManagementDialogBase, ObjectManagementDialogOptions } from './obj import { DefaultInputWidth, DefaultTableWidth, DefaultMinTableRowCount, DefaultMaxTableRowCount, getTableHeight, DialogButton } from '../../ui/dialogBase'; import { IObjectManagementService } from 'mssql'; import * as localizedConstants from '../localizedConstants'; -import { CreateDatabaseDocUrl, DatabaseGeneralPropertiesDocUrl, DatabaseFilesPropertiesDocUrl, DatabaseOptionsPropertiesDocUrl, DatabaseScopedConfigurationPropertiesDocUrl, DatabaseFileGroupsPropertiesDocUrl } from '../constants'; +import { CreateDatabaseDocUrl, DatabaseGeneralPropertiesDocUrl, DatabaseFilesPropertiesDocUrl, DatabaseOptionsPropertiesDocUrl, DatabaseScopedConfigurationPropertiesDocUrl, DatabaseFileGroupsPropertiesDocUrl, QueryStorePropertiesDocUrl } from '../constants'; import { Database, DatabaseFile, DatabaseScopedConfigurationsInfo, DatabaseViewInfo, FileGrowthType, FileGroup, FileGroupType } from '../interfaces'; import { convertNumToTwoDecimalStringInMB } from '../utils'; import { isUndefinedOrNull } from '../../types'; import { deepClone } from '../../util/objects'; import { DatabaseFileDialog } from './databaseFileDialog'; +import * as vscode from 'vscode'; const MAXDOP_Max_Limit = 32767; const PAUSED_RESUMABLE_INDEX_Max_Limit = 71582; const DscTableRowLength = 15; +export const tableHeaderCssStylings = { 'border': 'solid 1px #C8C8C8' }; +export const tableRowCssStylings = { 'border': 'solid 1px #C8C8C8' } +// export const tableHeaderCssStylings = { 'border-top': 'solid 1px #C8C8C8', 'border-bottom': 'none', 'border-left': 'none', 'border-right': 'none' }; +// export const tableRowCssStylings = { 'border-top': 'solid 1px #ccc', 'border-bottom': 'none', 'border-left': 'none', 'border-right': 'none' } + export class DatabaseDialog extends ObjectManagementDialogBase { // Database Properties tabs private generalTab: azdata.Tab; @@ -26,6 +32,7 @@ export class DatabaseDialog extends ObjectManagementDialogBase { if (fileType === localizedConstants.RowsDataFileType) { - let data = this.getTableData(FileGroupType.RowsFileGroup); - await this.setTableData(this.rowsFilegroupsTable, data); + // let data = this.getTableData(FileGroupType.RowsFileGroup); + // await this.setTableData(this.rowsFilegroupsTable, data); } else if (fileType === localizedConstants.FilestreamFileType) { let data = this.getTableData(FileGroupType.FileStreamDataFileGroup); @@ -649,13 +696,13 @@ export class DatabaseDialog extends ObjectManagementDialogBase 0) { - isEnabled = false; - } - } + // else if (table === this.rowsFilegroupsTable && this.rowsFilegroupsTable.selectedRows !== undefined && this.rowsFilegroupsTable.selectedRows.length === 1) { + // const selectedRow = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]; + // // Cannot delete a row file if the fileGroup is Primary. + // if (selectedRow.name === 'PRIMARY' && selectedRow.id > 0) { + // isEnabled = false; + // } + // } return isEnabled; } @@ -713,49 +760,62 @@ export class DatabaseDialog extends ObjectManagementDialogBase { const data = this.getTableData(FileGroupType.RowsFileGroup); - this.rowsFilegroupsTable = this.modelView.modelBuilder.table().withProps({ + this.rowsFilegroupsTable = this.modelView.modelBuilder.declarativeTable().withProps({ columns: [{ - type: azdata.ColumnType.text, - value: localizedConstants.NameText, - width: 120 + valueType: azdata.DeclarativeDataType.string, + width: 120, + isReadOnly: false, + displayName: localizedConstants.NameText, + headerCssStyles: tableHeaderCssStylings, + rowCssStyles: tableRowCssStylings }, { - type: azdata.ColumnType.text, - value: localizedConstants.FilesText, - width: 60 + valueType: azdata.DeclarativeDataType.string, + width: 60, + isReadOnly: true, + displayName: localizedConstants.FilesText, + headerCssStyles: tableHeaderCssStylings, + rowCssStyles: tableRowCssStylings }, { - type: azdata.ColumnType.checkBox, - value: localizedConstants.ReadOnlyText, - width: 80 + valueType: azdata.DeclarativeDataType.boolean, + width: 80, + isReadOnly: false, + displayName: localizedConstants.ReadOnlyText, + headerCssStyles: tableHeaderCssStylings, + rowCssStyles: tableRowCssStylings }, { - type: azdata.ColumnType.checkBox, - value: localizedConstants.DefaultText, - width: 80 + valueType: azdata.DeclarativeDataType.boolean, + width: 80, + isReadOnly: false, + displayName: localizedConstants.DefaultText, + headerCssStyles: tableHeaderCssStylings, + rowCssStyles: tableRowCssStylings }, { - type: azdata.ColumnType.checkBox, - value: localizedConstants.AutogrowAllFilesText, - width: 110 + valueType: azdata.DeclarativeDataType.boolean, + isReadOnly: false, + displayName: localizedConstants.AutogrowAllFilesText, + width: 110, + headerCssStyles: tableHeaderCssStylings, + rowCssStyles: tableRowCssStylings }], data: data, height: getTableHeight(data.length, DefaultMinTableRowCount, DefaultMaxTableRowCount), width: DefaultTableWidth, - forceFitColumns: azdata.ColumnSizingMode.DataFit, CSSStyles: { 'margin-left': '10px' } }).component(); - this.rowsFilegroupNameInput = this.getFilegroupNameInput(this.rowsFilegroupsTable, FileGroupType.RowsFileGroup); const addButtonComponent: DialogButton = { buttonAriaLabel: localizedConstants.AddFilegroupText, - buttonHandler: () => this.onAddDatabaseFileGroupsButtonClicked(this.rowsFilegroupsTable) + buttonHandler: () => this.onAddDatabaseFileGroupsButtonClicked1(this.rowsFilegroupsTable) }; const removeButtonComponent: DialogButton = { buttonAriaLabel: localizedConstants.RemoveButton, - buttonHandler: () => this.onRemoveDatabaseFileGroupsButtonClicked(this.rowsFilegroupsTable) + buttonHandler: () => this.onRemoveDatabaseFileGroupsButtonClicked1(this.rowsFilegroupsTable) }; - const rowsFileGroupButtonContainer = this.addButtonsForTable(this.rowsFilegroupsTable, addButtonComponent, removeButtonComponent); + const rowsFileGroupButtonContainer = this.addButtonsForTable1(this.rowsFilegroupsTable, addButtonComponent, removeButtonComponent); this.disposables.push( - this.rowsFilegroupsTable.onCellAction(async (arg: azdata.ICheckboxCellActionEventArgs) => { + this.rowsFilegroupsTable.onDataChanged(async (arg: azdata.ICheckboxCellActionEventArgs) => { let filegroup = this.rowDataFileGroupsTableRows[arg.row]; // Read-Only column if (arg.column === 2) { @@ -771,14 +831,14 @@ export class DatabaseDialog extends ObjectManagementDialogBase { - if (this.rowsFilegroupsTable.selectedRows.length === 1) { - const fileGroup = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]; + if (this.rowsFilegroupsTable.selectedRow === 1) { + const fileGroup = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRow]; await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': fileGroup.id < 0 ? 'visible' : 'hidden' }); this.rowsFilegroupNameInput.value = fileGroup.name; this.onFormFieldChange(); @@ -786,10 +846,7 @@ export class DatabaseDialog extends ObjectManagementDialogBase { + let newData: any[] | undefined; + let newRow: FileGroup = { + id: --this.newFileGroupTemporaryId, + name: '', + type: undefined, + isReadOnly: false, + isDefault: false, + autogrowAllFiles: false + }; + if (table === this.rowsFilegroupsTable) { + newRow.type = FileGroupType.RowsFileGroup; + newRow.isReadOnly = false; + newRow.isDefault = false; + newRow.autogrowAllFiles = false + this.objectInfo.filegroups?.push(newRow); + newData = this.getTableData(FileGroupType.RowsFileGroup); + } + + if (newData !== undefined) { + // Refresh the table with new row data + this.updateFileGroupsOptionsAndTableRows(); + // await this.setTableData(table, newData, DefaultMaxTableRowCount); + + await table.updateProperties({ + data: newData, + height: getTableHeight(newData.length, DefaultMinTableRowCount) + }); + } + } + private async onRemoveDatabaseFileGroupsButtonClicked1(table: azdata.DeclarativeTableComponent): Promise { + if (table === this.rowsFilegroupsTable) { + if (this.rowsFilegroupsTable.selectedRow === 1) { + const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRow]); + this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); + var newData = this.getTableData(FileGroupType.RowsFileGroup); + await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); + } + } + + // Refresh the individual table rows object and table with updated data + this.updateFileGroupsOptionsAndTableRows(); + await table.updateProperties({ + data: newData, + height: getTableHeight(newData.length, DefaultMinTableRowCount) + }); + } + + /** * Prepares the individual table rows for each filegroup type and list of filegroups options * This will be useful to get the selected row data from the table to get the filegroup property details, helps when have duplicate rows added @@ -1000,15 +1107,16 @@ export class DatabaseDialog extends ObjectManagementDialogBase { - if (table === this.rowsFilegroupsTable) { - if (this.rowsFilegroupsTable.selectedRows.length === 1) { - const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]); - this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); - var newData = this.getTableData(FileGroupType.RowsFileGroup); - await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); - } - } - else if (table === this.filestreamFilegroupsTable) { + // if (table === this.rowsFilegroupsTable) { + // if (this.rowsFilegroupsTable.selectedRows.length === 1) { + // const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]); + // this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); + // var newData = this.getTableData(FileGroupType.RowsFileGroup); + // await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); + // } + // } + // else + if (table === this.filestreamFilegroupsTable) { if (this.filestreamFilegroupsTable.selectedRows.length === 1) { const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.filestreamDataFileGroupsTableRows[this.filestreamFilegroupsTable.selectedRows[0]]); this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); @@ -1040,9 +1148,10 @@ export class DatabaseDialog extends ObjectManagementDialogBase { if (table.selectedRows.length === 1) { let fg = null; - if (table === this.rowsFilegroupsTable) { - fg = this.rowDataFileGroupsTableRows[table.selectedRows[0]]; - } else if (table === this.filestreamFilegroupsTable) { + // if (table === this.rowsFilegroupsTable) { + // fg = this.rowDataFileGroupsTableRows[table.selectedRows[0]]; + // } else + if (table === this.filestreamFilegroupsTable) { fg = this.filestreamDataFileGroupsTableRows[table.selectedRows[0]]; } else if (table === this.memoryOptimizedFilegroupsTable) { fg = this.memoryoptimizedFileGroupsTableRows[table.selectedRows[0]]; @@ -1581,6 +1690,245 @@ export class DatabaseDialog extends ObjectManagementDialogBase { }, { + ariaLabel: localizedConstants.ActualOperationModeText, + inputType: 'text', + enabled: false, + value: actualOperationMode + }); + containers.push(this.createLabelInputContainer(localizedConstants.ActualOperationModeText, operationModeActual)); + + // Operation Mode (Requested) + this.requestedOperationMode = this.createDropdown(localizedConstants.RequestedOperationModeText, async (newValue) => { + this.objectInfo.queryStoreOptions.actualMode = newValue as string; + this.areQueryStoreOptionsEnabled = newValue !== this.operationModeOffOption; + await this.toggleQueryStoreOptions(); + }, this.viewInfo.operationModeOptions, String(this.objectInfo.queryStoreOptions.actualMode), true, DefaultInputWidth); + containers.push(this.createLabelInputContainer(localizedConstants.RequestedOperationModeText, this.requestedOperationMode)); + + const generalSection = this.createGroup(localizedConstants.GeneralSectionHeader, containers, true); + this.queryStoreTabSectionsContainer.push(generalSection); + } + + private initializeQueryStoreMonitoringSection(): void { + let containers: azdata.Component[] = []; + // Data Flush Interval (Minutes) + this.dataFlushIntervalInMinutes = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.dataFlushIntervalInMinutes = Number(newValue); + }, { + ariaLabel: localizedConstants.DataFlushIntervalInMinutesText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.dataFlushIntervalInMinutes), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.DataFlushIntervalInMinutesText, this.dataFlushIntervalInMinutes)); + + // Statistics Collection Interval + this.statisticsCollectionInterval = this.createDropdown(localizedConstants.StatisticsCollectionInterval, async (newValue) => { + this.objectInfo.queryStoreOptions.statisticsCollectionInterval = String(newValue); + }, this.viewInfo.statisticsCollectionIntervalOptions, this.objectInfo.queryStoreOptions.statisticsCollectionInterval, this.areQueryStoreOptionsEnabled, DefaultInputWidth); + containers.push(this.createLabelInputContainer(localizedConstants.StatisticsCollectionInterval, this.statisticsCollectionInterval)); + + const monitoringSection = this.createGroup(localizedConstants.MonitoringSectionText, containers, true); + this.queryStoreTabSectionsContainer.push(monitoringSection); + } + + private initializeQueryStoreRetentionSection(): void { + let containers: azdata.Component[] = []; + // Max Plans Per Query + this.maxPlansPerQuery = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.maxPlansPerQuery = Number(newValue); + }, { + ariaLabel: localizedConstants.MaxPlansPerQueryText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.maxPlansPerQuery), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.MaxPlansPerQueryText, this.maxPlansPerQuery)); + + // Max size (MB) + this.maxSizeinMB = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.maxSizeInMB = Number(newValue); + }, { + ariaLabel: localizedConstants.MaxSizeInMbText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.maxSizeInMB), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.MaxSizeInMbText, this.maxSizeinMB)); + + // Query Store Capture Mode + this.queryStoreCaptureMode = this.createDropdown(localizedConstants.QueryStoreCaptureModeText, async (newValue) => { + this.objectInfo.queryStoreOptions.queryStoreCaptureMode = newValue as string; + await this.toggleQueryCapturePolicySection(newValue === localizedConstants.QueryStoreCapturemodeCustomText + && this.requestedOperationMode.value !== this.operationModeOffOption); + }, this.viewInfo.queryStoreCaptureModeOptions, this.objectInfo.queryStoreOptions.queryStoreCaptureMode, this.areQueryStoreOptionsEnabled, DefaultInputWidth); + containers.push(this.createLabelInputContainer(localizedConstants.QueryStoreCaptureModeText, this.queryStoreCaptureMode)); + + // Size Based Cleanup Mode + this.sizeBasedCleanupMode = this.createDropdown(localizedConstants.SizeBasedCleanupModeText, async (newValue) => { + this.objectInfo.queryStoreOptions.sizeBasedCleanupMode = newValue as string; + }, this.viewInfo.sizeBasedCleanupModeOptions, this.objectInfo.queryStoreOptions.sizeBasedCleanupMode, this.areQueryStoreOptionsEnabled, DefaultInputWidth); + containers.push(this.createLabelInputContainer(localizedConstants.SizeBasedCleanupModeText, this.sizeBasedCleanupMode)); + + // State Query Threshold (Days) + this.stateQueryThresholdInDays = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.staleQueryThresholdInDays = Number(newValue); + }, { + ariaLabel: localizedConstants.StateQueryThresholdInDaysText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.staleQueryThresholdInDays), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.StateQueryThresholdInDaysText, this.stateQueryThresholdInDays)); + + // Wait Statistics Capture Mode - supported from 2017 or higher + if (!isUndefinedOrNull(this.objectInfo.queryStoreOptions.waitStatisticsCaptureMode)) { + this.waitStatisticsCaptureMode = this.createCheckbox(localizedConstants.WaitStatisticsCaptureModeText, async (checked) => { + this.objectInfo.queryStoreOptions.waitStatisticsCaptureMode = checked; + }, this.objectInfo.queryStoreOptions.waitStatisticsCaptureMode, this.areQueryStoreOptionsEnabled); + containers.push(this.waitStatisticsCaptureMode); + } + const retentionSection = this.createGroup(localizedConstants.WaitStatisticsCaptureModeText, containers, true); + this.queryStoreTabSectionsContainer.push(retentionSection); + } + + private initializeQueryStoreCapturePolicySection(): void { + let containers: azdata.Component[] = []; + // Execution Count + this.executionCount = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.capturePolicyOptions.executionCount = Number(newValue); + }, { + ariaLabel: localizedConstants.ExecutionCountText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.capturePolicyOptions.executionCount), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.ExecutionCountText, this.executionCount)); + + // Stale Threshold + this.staleThreshold = this.createDropdown(localizedConstants.StaleThresholdText, async (newValue) => { + this.objectInfo.queryStoreOptions.capturePolicyOptions.staleThreshold = newValue as string; + }, this.viewInfo.staleThresholdOptions, this.objectInfo.queryStoreOptions.capturePolicyOptions.staleThreshold, this.areQueryStoreOptionsEnabled, DefaultInputWidth); + containers.push(this.createLabelInputContainer(localizedConstants.StaleThresholdText, this.staleThreshold)); + + // Total Compile CPU Time (ms) + this.totalCompileCPUTimeInMS = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.capturePolicyOptions.totalCompileCPUTimeInMS = Number(newValue); + }, { + ariaLabel: localizedConstants.TotalCompileCPUTimeInMsText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.capturePolicyOptions.totalCompileCPUTimeInMS), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.TotalCompileCPUTimeInMsText, this.totalCompileCPUTimeInMS)); + + // Total Execution CPU Time (ms) + this.totalExecutionCPUTimeInMS = this.createInputBox(async (newValue) => { + this.objectInfo.queryStoreOptions.capturePolicyOptions.totalExecutionCPUTimeInMS = Number(newValue); + }, { + ariaLabel: localizedConstants.TotalExecutionCPUTimeInMsText, + inputType: 'number', + enabled: this.areQueryStoreOptionsEnabled, + value: String(this.objectInfo.queryStoreOptions.capturePolicyOptions.totalExecutionCPUTimeInMS), + min: 0 + }); + containers.push(this.createLabelInputContainer(localizedConstants.TotalExecutionCPUTimeInMsText, this.totalExecutionCPUTimeInMS)); + + const policySection = this.createGroup(localizedConstants.QueryStoreCapturePolicySectionText, containers, true); + this.queryStoreTabSectionsContainer.push(policySection); + } + + private async initializeQueryStoreCurrentDiskStorageSection(): Promise { + let containers: azdata.Component[] = []; + // Database Max size + const databaseName = this.createInputBox(async () => { }, { + ariaLabel: this.objectInfo.name, + inputType: 'text', + enabled: false, + value: localizedConstants.StringValueInMB(String(this.objectInfo.sizeInMb)) + }); + containers.push(this.createLabelInputContainer(this.objectInfo.name, databaseName)); + + // Query Store Used + const queryStoreUsed = this.createInputBox(async () => { }, { + ariaLabel: localizedConstants.QueryStoreUsedText, + inputType: 'text', + enabled: false, + value: localizedConstants.StringValueInMB(String(this.objectInfo.queryStoreOptions.currentStorageSizeInMB)) + }); + containers.push(this.createLabelInputContainer(localizedConstants.QueryStoreUsedText, queryStoreUsed)); + + // Query Store Available + const queryStoreAvailable = this.createInputBox(async () => { }, { + ariaLabel: localizedConstants.QueryStoreAvailableText, + inputType: 'text', + enabled: false, + value: localizedConstants.StringValueInMB(String(this.objectInfo.queryStoreOptions.maxSizeInMB - this.objectInfo.queryStoreOptions.currentStorageSizeInMB)) + }); + containers.push(this.createLabelInputContainer(localizedConstants.QueryStoreAvailableText, queryStoreAvailable)); + + // Prge query data button + this.purgeQueryDataButton = this.createButton(localizedConstants.PurgeQueryDataButtonText, localizedConstants.PurgeQueryDataButtonText, async () => { + await this.purgeQueryStoreDataButtonClick(); + }); + this.purgeQueryDataButton.width = DefaultInputWidth; + await this.purgeQueryDataButton.updateCssStyles({ 'margin': '10px 0px, 0px, 0px' }); + containers.push(this.createLabelInputContainer('', this.purgeQueryDataButton)); + + const diskUsageSection = this.createGroup(localizedConstants.QueryStoreCurrentDiskUsageSectionText, containers, true); + this.queryStoreTabSectionsContainer.push(diskUsageSection); + } + + /** + * Opens confirmation warning for clearing the query store data for the database + */ + private async purgeQueryStoreDataButtonClick(): Promise { + const response = await vscode.window.showWarningMessage(localizedConstants.PurgeQueryStoreDataMessage(this.objectInfo.name), localizedConstants.YesText); + if (response !== localizedConstants.YesText) { + return; + } + + await this.objectManagementService.purgeQueryStoreData(this.options.connectionUri, this.options.database, this.options.objectUrn); + } + + private async toggleQueryStoreOptions(): Promise { + this.dataFlushIntervalInMinutes.enabled + = this.statisticsCollectionInterval.enabled + = this.maxPlansPerQuery.enabled + = this.maxSizeinMB.enabled + = this.queryStoreCaptureMode.enabled + = this.sizeBasedCleanupMode.enabled + = this.stateQueryThresholdInDays.enabled = this.areQueryStoreOptionsEnabled; + if (!isUndefinedOrNull(this.objectInfo.queryStoreOptions.waitStatisticsCaptureMode)) { + this.waitStatisticsCaptureMode.enabled = this.areQueryStoreOptionsEnabled + } + await this.toggleQueryCapturePolicySection(this.areQueryStoreOptionsEnabled); + } + + private async toggleQueryCapturePolicySection(enable: boolean): Promise { + if (!isUndefinedOrNull(this.objectInfo.queryStoreOptions.capturePolicyOptions)) { + this.executionCount.enabled + = this.staleThreshold.enabled + = this.totalCompileCPUTimeInMS.enabled + = this.totalExecutionCPUTimeInMS.enabled = enable; + } + } + //#endregion + private initializeConfigureSLOSection(): azdata.GroupContainer { let containers: azdata.Component[] = []; if (this.viewInfo.azureEditions?.length > 0) { diff --git a/extensions/mssql/src/ui/dialogBase.ts b/extensions/mssql/src/ui/dialogBase.ts index 9372152fb6cf..03630f79f5a3 100644 --- a/extensions/mssql/src/ui/dialogBase.ts +++ b/extensions/mssql/src/ui/dialogBase.ts @@ -328,6 +328,51 @@ export abstract class DialogBase { return this.createButtonContainer(buttonComponents) } + protected addButtonsForTable1(table: azdata.DeclarativeTableComponent, addbutton: DialogButton, removeButton: DialogButton, editButton: DialogButton = undefined): azdata.FlexContainer { + let addButtonComponent: azdata.ButtonComponent; + let editButtonComponent: azdata.ButtonComponent; + let removeButtonComponent: azdata.ButtonComponent; + let buttonComponents: azdata.ButtonComponent[] = []; + const updateButtons = (isRemoveEnabled: boolean = undefined) => { + this.onFormFieldChange(); + const tableSelectedRowsLengthCheck = table.selectedRow === 1 && table.selectedRow < table.data.length; + if (editButton !== undefined) { + editButtonComponent.enabled = tableSelectedRowsLengthCheck; + } + removeButtonComponent.enabled = !!isRemoveEnabled && tableSelectedRowsLengthCheck; + } + addButtonComponent = this.createButton(uiLoc.AddText, addbutton.buttonAriaLabel, async () => { + await addbutton.buttonHandler(addButtonComponent); + updateButtons(); + }); + buttonComponents.push(addButtonComponent); + + if (editButton !== undefined) { + editButtonComponent = this.createButton(uiLoc.EditText, editButton.buttonAriaLabel, async () => { + await editButton.buttonHandler(editButtonComponent); + updateButtons(); + }, false); + buttonComponents.push(editButtonComponent); + } + + removeButtonComponent = this.createButton(uiLoc.RemoveText, removeButton.buttonAriaLabel, async () => { + await removeButton.buttonHandler(removeButtonComponent); + if (table.selectedRow === 1) { + // table.selectedRow = [table.data.length - 1]; + } + updateButtons(); + }, false); + buttonComponents.push(removeButtonComponent); + + this.disposables.push(table.onRowSelected(() => { + const isRemoveButtonEnabled = true; + updateButtons(isRemoveButtonEnabled); + })); + + return this.createButtonContainer(buttonComponents) + } + + protected createDropdown(ariaLabel: string, handler: (newValue: string) => Promise, values: string[], value: string | undefined, enabled: boolean = true, width: number = DefaultInputWidth, editable?: boolean, strictSelection?: boolean): azdata.DropDownComponent { // Automatically add an empty item to the beginning of the list if the current value is not specified. // This is needed when no meaningful default value can be provided. From 22d31afc4a1f0c80f0987141cb21e44a8b3b7638 Mon Sep 17 00:00:00 2001 From: Alex Ma Date: Thu, 7 Sep 2023 21:55:09 -0700 Subject: [PATCH 05/23] Add visible newlines to display value for Edit Data cells (#24334) --- .../contrib/editData/browser/editDataGridPanel.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/sql/workbench/contrib/editData/browser/editDataGridPanel.ts b/src/sql/workbench/contrib/editData/browser/editDataGridPanel.ts index be747ad56bc9..1b791cc6e866 100644 --- a/src/sql/workbench/contrib/editData/browser/editDataGridPanel.ts +++ b/src/sql/workbench/contrib/editData/browser/editDataGridPanel.ts @@ -227,7 +227,7 @@ export class EditDataGridPanel extends GridParentComponent { } else if (Services.DBCellValue.isDBCellValue(value)) { // If a cell is not edited and retrieved direct from the SQL server, it would be in the form of a DBCellValue. - // We use the DBCellValue's displayValue as the text value. + // We use the DBCellValue's cleaned displayValue as the text value. returnVal = this.replaceLinebreaks(value.displayValue); } else if (typeof value === 'string') { @@ -477,7 +477,7 @@ export class EditDataGridPanel extends GridParentComponent { id: columnIndex, name: escape(c.columnName), field: columnIndex, - formatter: this.getColumnFormatter, + formatter: (row, cell, value, columnDef, dataContext) => this.getColumnFormatter(row, cell, value, columnDef, dataContext, self.newlinePattern), isEditable: c.isUpdatable }; })) @@ -710,7 +710,6 @@ export class EditDataGridPanel extends GridParentComponent { let sessionRowId = self.rowIdMappings[self.currentCell.row] !== undefined ? self.rowIdMappings[self.currentCell.row] : self.currentCell.row; - let restoredValue = this.newlinePattern ? self.currentEditCellValue.replace(/\u0000/g, this.newlinePattern) : self.currentEditCellValue; return self.dataService.updateCell(sessionRowId, self.currentCell.column - 1, restoredValue); }).then( @@ -1256,7 +1255,7 @@ export class EditDataGridPanel extends GridParentComponent { /*Formatter for Column*/ - private getColumnFormatter(row: number | undefined, cell: number | undefined, value: any, columnDef: any | undefined, dataContext: any | undefined): string { + private getColumnFormatter(row: number | undefined, cell: number | undefined, value: any, columnDef: any | undefined, dataContext: any | undefined, newlinePattern: string): string { let valueToDisplay = ''; let cellClasses = 'grid-cell-value-container'; /* tslint:disable:no-null-keyword */ @@ -1273,8 +1272,6 @@ export class EditDataGridPanel extends GridParentComponent { // If a cell is not edited and retrieved direct from the SQL server, it would be in the form of a DBCellValue. // We use it's displayValue and remove newlines for display purposes only. valueToDisplay = (value.displayValue + ''); - valueToDisplay = valueToDisplay.replace(/(\r\n|\n|\r)/g, '\u0000'); - valueToDisplay = escape(valueToDisplay.length > 250 ? valueToDisplay.slice(0, 250) + '...' : valueToDisplay); } else if (typeof value === 'string' || (value && value.text)) { // Once a cell has been edited, the cell value will no longer be a DBCellValue until refresh. @@ -1284,8 +1281,9 @@ export class EditDataGridPanel extends GridParentComponent { } else { valueToDisplay = value; } - valueToDisplay = escape(valueToDisplay.length > 250 ? valueToDisplay.slice(0, 250) + '...' : valueToDisplay); + valueToDisplay = newlinePattern ? valueToDisplay.replace(/\u0000/g, newlinePattern) : valueToDisplay; } + valueToDisplay = Services.getCellDisplayValue(valueToDisplay); return '' + valueToDisplay + ''; } } From 80f7049cc5d6249993a66c3b5c7666416530dc7a Mon Sep 17 00:00:00 2001 From: Alex Ma Date: Fri, 8 Sep 2023 01:40:41 -0700 Subject: [PATCH 06/23] [Loc] final XLF update prior to code complete for 9-7-2023 (#24337) --- resources/xlf/en/Microsoft.query-store.xlf | 3 +++ resources/xlf/en/sql.xlf | 3 +++ 2 files changed, 6 insertions(+) diff --git a/resources/xlf/en/Microsoft.query-store.xlf b/resources/xlf/en/Microsoft.query-store.xlf index 35dd9237f148..f47a0cd8ba86 100644 --- a/resources/xlf/en/Microsoft.query-store.xlf +++ b/resources/xlf/en/Microsoft.query-store.xlf @@ -142,6 +142,9 @@ Ok + + Open In New Tab + Overall Resource Consumption diff --git a/resources/xlf/en/sql.xlf b/resources/xlf/en/sql.xlf index c773a367e50b..2337577629e1 100644 --- a/resources/xlf/en/sql.xlf +++ b/resources/xlf/en/sql.xlf @@ -6646,6 +6646,9 @@ Error Message: {1} Open file + + Open file location + CSV (Comma delimited) From a5d3833ffbf862d92e6e9bd7b5ee85c5ff756488 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Fri, 8 Sep 2023 09:30:06 -0700 Subject: [PATCH 07/23] Fixes a typo in headerfilter plugin (#24342) --- src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts b/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts index 10e14da5da5c..b8619b8021d9 100644 --- a/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts +++ b/src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts @@ -265,7 +265,7 @@ export class HeaderFilter extends Disposable { if (!filterItem || filterItem.indexOf('Error:') < 0) { let element = new TableFilterListElement(filterItem, filtered); this._register(element); - this.listData.push(); + this.listData.push(element); } } From 5fdac2054dcfae2e5816aa26472a449b11c32c36 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Fri, 8 Sep 2023 09:34:42 -0700 Subject: [PATCH 08/23] Add support for clearing pooled connections (#24325) --- extensions/mssql/package.json | 4 +++ extensions/mssql/package.nls.json | 3 +- extensions/mssql/src/connection/commands.ts | 19 +++++++++++ .../mssql/src/connection/connectionService.ts | 33 +++++++++++++++++++ extensions/mssql/src/connection/constants.ts | 6 ++++ extensions/mssql/src/contracts.ts | 5 +++ extensions/mssql/src/main.ts | 2 ++ extensions/mssql/src/sqlToolsServer.ts | 2 ++ 8 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 extensions/mssql/src/connection/commands.ts create mode 100644 extensions/mssql/src/connection/connectionService.ts create mode 100644 extensions/mssql/src/connection/constants.ts diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 0c7800505a2f..5ba16ce607dd 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -157,6 +157,10 @@ "dark": "resources/dark/groupBySchemaDisabled_inverse.svg", "light": "resources/light/groupBySchemaDisabled.svg" } + }, + { + "command": "mssql.clearPooledConnections", + "title": "%mssql.connection.clearPooledConnections%" } ], "outputChannels": [ diff --git a/extensions/mssql/package.nls.json b/extensions/mssql/package.nls.json index 01c00ab89174..268ccea7eff2 100644 --- a/extensions/mssql/package.nls.json +++ b/extensions/mssql/package.nls.json @@ -174,9 +174,10 @@ "title.newTable": "New Table", "title.designTable": "Design", "title.changeNotebookConnection": "Change SQL Notebook Connection", + "mssql.connection.clearPooledConnections": "SQL Server: Clear Pooled Connections", "mssql.parallelMessageProcessing": "[Experimental] Whether the requests to the SQL Tools Service should be handled in parallel. This is introduced to discover the issues there might be when handling all requests in parallel. The default value is false. Azure Data Studio is required to be relaunched when the value is changed.", "mssql.enableSqlAuthenticationProvider": "Enables use of the Sql Authentication Provider for 'Active Directory Interactive' authentication mode when user selects 'AzureMFA' authentication. This enables Server-side resource endpoint integration when fetching access tokens. This option is only supported for 'MSAL' Azure Authentication Library. Azure Data Studio is required to be relaunched when the value is changed.", - "mssql.enableConnectionPooling": "Enables connection pooling on MSSQL connections to improve overall performance of Azure Data Studio connectivity. This setting is enabled by default. Azure Data Studio is required to be relaunched when the value is changed.", + "mssql.enableConnectionPooling": "Enables connection pooling on MSSQL connections to improve overall performance of Azure Data Studio connectivity. This setting is enabled by default. Azure Data Studio is required to be relaunched when the value is changed. To clear pooled connections, run the command: 'SQL Server: Clear Pooled Connections'", "mssql.tableDesigner.preloadDatabaseModel": "Whether to preload the database model when the database node in the object explorer is expanded. When enabled, the loading time of table designer can be reduced. Note: You might see higher than normal memory usage if you need to expand a lot of database nodes.", "mssql.tableDesigner.allowDisableAndReenableDdlTriggers": "Whether to allow table designer to disable and re-enable DDL triggers during publish", "mssql.objectExplorer.groupBySchema": "When enabled, the database objects in Object Explorer will be categorized by schema.", diff --git a/extensions/mssql/src/connection/commands.ts b/extensions/mssql/src/connection/commands.ts new file mode 100644 index 000000000000..af53b8578395 --- /dev/null +++ b/extensions/mssql/src/connection/commands.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { AppContext } from '../appContext'; +import * as vscode from 'vscode'; +import * as constants from './constants'; +import { ConnectionService } from './connectionService'; + +export function registerConnectionCommands(appContext: AppContext) { + appContext.extensionContext.subscriptions.push(vscode.commands.registerCommand('mssql.clearPooledConnections', async () => { + await getConnectionService(appContext).clearPooledConnections(); + })); +} + +function getConnectionService(appContext: AppContext): ConnectionService { + return appContext.getService(constants.ConnectionService); +} diff --git a/extensions/mssql/src/connection/connectionService.ts b/extensions/mssql/src/connection/connectionService.ts new file mode 100644 index 000000000000..dbcd24d93006 --- /dev/null +++ b/extensions/mssql/src/connection/connectionService.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as constants from './constants'; +import * as contracts from '../contracts'; + +import { BaseService, ISqlOpsFeature, SqlOpsDataClient } from 'dataprotocol-client'; +import { ClientCapabilities } from 'vscode-languageclient'; +import { AppContext } from '../appContext'; + +export class ConnectionService extends BaseService { + public static asFeature(context: AppContext): ISqlOpsFeature { + return class extends ConnectionService { + constructor(client: SqlOpsDataClient) { + super(context, client); + } + + fillClientCapabilities(_: ClientCapabilities): void { } + initialize(): void { } + }; + } + + private constructor(context: AppContext, client: SqlOpsDataClient) { + super(client); + context.registerService(constants.ConnectionService, this); + } + + async clearPooledConnections(): Promise { + return this.runWithErrorHandling(contracts.ClearPooledConnectionsRequest.type, {}); + } +} diff --git a/extensions/mssql/src/connection/constants.ts b/extensions/mssql/src/connection/constants.ts new file mode 100644 index 000000000000..23202099071d --- /dev/null +++ b/extensions/mssql/src/connection/constants.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const ConnectionService = 'ConnectionService'; diff --git a/extensions/mssql/src/contracts.ts b/extensions/mssql/src/contracts.ts index f8774bbf7f87..c51c65542651 100644 --- a/extensions/mssql/src/contracts.ts +++ b/extensions/mssql/src/contracts.ts @@ -1733,6 +1733,11 @@ export namespace EncryptionKeysChangedNotification { export const type = new NotificationType('connection/encryptionKeysChanged'); } +// ------------------------------- < Clear Pooled Connections Request > --------------------------------------- + +export namespace ClearPooledConnectionsRequest { + export const type = new RequestType('connection/clearpooledconnections'); +} // ------------------------------- < Query Store > ------------------------------------ //#region Query Store diff --git a/extensions/mssql/src/main.ts b/extensions/mssql/src/main.ts index ea105a4ab26c..0101fe793645 100644 --- a/extensions/mssql/src/main.ts +++ b/extensions/mssql/src/main.ts @@ -27,6 +27,7 @@ import { registerTableDesignerCommands } from './tableDesigner/tableDesigner'; import { registerObjectManagementCommands } from './objectManagement/commands'; import { TelemetryActions, TelemetryReporter, TelemetryViews } from './telemetry'; import { noConvertResult, noDocumentFound, unsupportedPlatform } from './localizedConstants'; +import { registerConnectionCommands } from './connection/commands'; const localize = nls.loadMessageBundle(); @@ -156,6 +157,7 @@ export async function activate(context: vscode.ExtensionContext): Promise Date: Fri, 8 Sep 2023 12:00:48 -0500 Subject: [PATCH 09/23] Revert the changes of row fileGroup table which was added accidentally (#24339) --- .../src/objectManagement/ui/databaseDialog.ts | 188 ++++++------------ extensions/mssql/src/ui/dialogBase.ts | 45 ----- 2 files changed, 60 insertions(+), 173 deletions(-) diff --git a/extensions/mssql/src/objectManagement/ui/databaseDialog.ts b/extensions/mssql/src/objectManagement/ui/databaseDialog.ts index e78bd99d4d98..85decf74a3b9 100644 --- a/extensions/mssql/src/objectManagement/ui/databaseDialog.ts +++ b/extensions/mssql/src/objectManagement/ui/databaseDialog.ts @@ -20,11 +20,6 @@ const MAXDOP_Max_Limit = 32767; const PAUSED_RESUMABLE_INDEX_Max_Limit = 71582; const DscTableRowLength = 15; -export const tableHeaderCssStylings = { 'border': 'solid 1px #C8C8C8' }; -export const tableRowCssStylings = { 'border': 'solid 1px #C8C8C8' } -// export const tableHeaderCssStylings = { 'border-top': 'solid 1px #C8C8C8', 'border-bottom': 'none', 'border-left': 'none', 'border-right': 'none' }; -// export const tableRowCssStylings = { 'border-top': 'solid 1px #ccc', 'border-bottom': 'none', 'border-left': 'none', 'border-right': 'none' } - export class DatabaseDialog extends ObjectManagementDialogBase { // Database Properties tabs private generalTab: azdata.Tab; @@ -60,7 +55,7 @@ export class DatabaseDialog extends ObjectManagementDialogBase { if (fileType === localizedConstants.RowsDataFileType) { - // let data = this.getTableData(FileGroupType.RowsFileGroup); - // await this.setTableData(this.rowsFilegroupsTable, data); + let data = this.getTableData(FileGroupType.RowsFileGroup); + await this.setTableData(this.rowsFilegroupsTable, data); } else if (fileType === localizedConstants.FilestreamFileType) { let data = this.getTableData(FileGroupType.FileStreamDataFileGroup); @@ -696,13 +691,13 @@ export class DatabaseDialog extends ObjectManagementDialogBase 0) { - // isEnabled = false; - // } - // } + else if (table === this.rowsFilegroupsTable && this.rowsFilegroupsTable.selectedRows !== undefined && this.rowsFilegroupsTable.selectedRows.length === 1) { + const selectedRow = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]; + // Cannot delete a row file if the fileGroup is Primary. + if (selectedRow.name === 'PRIMARY' && selectedRow.id > 0) { + isEnabled = false; + } + } return isEnabled; } @@ -760,62 +755,49 @@ export class DatabaseDialog extends ObjectManagementDialogBase { const data = this.getTableData(FileGroupType.RowsFileGroup); - this.rowsFilegroupsTable = this.modelView.modelBuilder.declarativeTable().withProps({ + this.rowsFilegroupsTable = this.modelView.modelBuilder.table().withProps({ columns: [{ - valueType: azdata.DeclarativeDataType.string, - width: 120, - isReadOnly: false, - displayName: localizedConstants.NameText, - headerCssStyles: tableHeaderCssStylings, - rowCssStyles: tableRowCssStylings + type: azdata.ColumnType.text, + value: localizedConstants.NameText, + width: 120 }, { - valueType: azdata.DeclarativeDataType.string, - width: 60, - isReadOnly: true, - displayName: localizedConstants.FilesText, - headerCssStyles: tableHeaderCssStylings, - rowCssStyles: tableRowCssStylings + type: azdata.ColumnType.text, + value: localizedConstants.FilesText, + width: 60 }, { - valueType: azdata.DeclarativeDataType.boolean, - width: 80, - isReadOnly: false, - displayName: localizedConstants.ReadOnlyText, - headerCssStyles: tableHeaderCssStylings, - rowCssStyles: tableRowCssStylings + type: azdata.ColumnType.checkBox, + value: localizedConstants.ReadOnlyText, + width: 80 }, { - valueType: azdata.DeclarativeDataType.boolean, - width: 80, - isReadOnly: false, - displayName: localizedConstants.DefaultText, - headerCssStyles: tableHeaderCssStylings, - rowCssStyles: tableRowCssStylings + type: azdata.ColumnType.checkBox, + value: localizedConstants.DefaultText, + width: 80 }, { - valueType: azdata.DeclarativeDataType.boolean, - isReadOnly: false, - displayName: localizedConstants.AutogrowAllFilesText, - width: 110, - headerCssStyles: tableHeaderCssStylings, - rowCssStyles: tableRowCssStylings + type: azdata.ColumnType.checkBox, + value: localizedConstants.AutogrowAllFilesText, + width: 110 }], data: data, height: getTableHeight(data.length, DefaultMinTableRowCount, DefaultMaxTableRowCount), width: DefaultTableWidth, + forceFitColumns: azdata.ColumnSizingMode.DataFit, CSSStyles: { 'margin-left': '10px' } }).component(); + this.rowsFilegroupNameInput = this.getFilegroupNameInput(this.rowsFilegroupsTable, FileGroupType.RowsFileGroup); const addButtonComponent: DialogButton = { buttonAriaLabel: localizedConstants.AddFilegroupText, - buttonHandler: () => this.onAddDatabaseFileGroupsButtonClicked1(this.rowsFilegroupsTable) + buttonHandler: () => this.onAddDatabaseFileGroupsButtonClicked(this.rowsFilegroupsTable) }; const removeButtonComponent: DialogButton = { buttonAriaLabel: localizedConstants.RemoveButton, - buttonHandler: () => this.onRemoveDatabaseFileGroupsButtonClicked1(this.rowsFilegroupsTable) + buttonHandler: () => this.onAddDatabaseFileGroupsButtonClicked(this.rowsFilegroupsTable) }; - const rowsFileGroupButtonContainer = this.addButtonsForTable1(this.rowsFilegroupsTable, addButtonComponent, removeButtonComponent); + const rowsFileGroupButtonContainer = this.addButtonsForTable(this.rowsFilegroupsTable, addButtonComponent, removeButtonComponent); this.disposables.push( - this.rowsFilegroupsTable.onDataChanged(async (arg: azdata.ICheckboxCellActionEventArgs) => { + this.rowsFilegroupsTable.onCellAction(async (arg: azdata.ICheckboxCellActionEventArgs) => { let filegroup = this.rowDataFileGroupsTableRows[arg.row]; // Read-Only column if (arg.column === 2) { @@ -831,14 +813,14 @@ export class DatabaseDialog extends ObjectManagementDialogBase { - if (this.rowsFilegroupsTable.selectedRow === 1) { - const fileGroup = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRow]; + if (this.rowsFilegroupsTable.selectedRows.length === 1) { + const fileGroup = this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]; await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': fileGroup.id < 0 ? 'visible' : 'hidden' }); this.rowsFilegroupNameInput.value = fileGroup.name; this.onFormFieldChange(); @@ -846,7 +828,9 @@ export class DatabaseDialog extends ObjectManagementDialogBase { - let newData: any[] | undefined; - let newRow: FileGroup = { - id: --this.newFileGroupTemporaryId, - name: '', - type: undefined, - isReadOnly: false, - isDefault: false, - autogrowAllFiles: false - }; - if (table === this.rowsFilegroupsTable) { - newRow.type = FileGroupType.RowsFileGroup; - newRow.isReadOnly = false; - newRow.isDefault = false; - newRow.autogrowAllFiles = false - this.objectInfo.filegroups?.push(newRow); - newData = this.getTableData(FileGroupType.RowsFileGroup); - } - - if (newData !== undefined) { - // Refresh the table with new row data - this.updateFileGroupsOptionsAndTableRows(); - // await this.setTableData(table, newData, DefaultMaxTableRowCount); - - await table.updateProperties({ - data: newData, - height: getTableHeight(newData.length, DefaultMinTableRowCount) - }); - } - } - private async onRemoveDatabaseFileGroupsButtonClicked1(table: azdata.DeclarativeTableComponent): Promise { - if (table === this.rowsFilegroupsTable) { - if (this.rowsFilegroupsTable.selectedRow === 1) { - const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRow]); - this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); - var newData = this.getTableData(FileGroupType.RowsFileGroup); - await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); - } - } - - // Refresh the individual table rows object and table with updated data - this.updateFileGroupsOptionsAndTableRows(); - await table.updateProperties({ - data: newData, - height: getTableHeight(newData.length, DefaultMinTableRowCount) - }); - } - - /** * Prepares the individual table rows for each filegroup type and list of filegroups options * This will be useful to get the selected row data from the table to get the filegroup property details, helps when have duplicate rows added @@ -1107,16 +1041,15 @@ export class DatabaseDialog extends ObjectManagementDialogBase { - // if (table === this.rowsFilegroupsTable) { - // if (this.rowsFilegroupsTable.selectedRows.length === 1) { - // const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]); - // this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); - // var newData = this.getTableData(FileGroupType.RowsFileGroup); - // await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); - // } - // } - // else - if (table === this.filestreamFilegroupsTable) { + if (table === this.rowsFilegroupsTable) { + if (this.rowsFilegroupsTable.selectedRows.length === 1) { + const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.rowDataFileGroupsTableRows[this.rowsFilegroupsTable.selectedRows[0]]); + this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); + var newData = this.getTableData(FileGroupType.RowsFileGroup); + await this.rowsFilegroupNameInput.updateCssStyles({ 'visibility': 'hidden' }); + } + } + else if (table === this.filestreamFilegroupsTable) { if (this.filestreamFilegroupsTable.selectedRows.length === 1) { const removeFilegroupIndex = this.objectInfo.filegroups.indexOf(this.filestreamDataFileGroupsTableRows[this.filestreamFilegroupsTable.selectedRows[0]]); this.objectInfo.filegroups?.splice(removeFilegroupIndex, 1); @@ -1148,10 +1081,9 @@ export class DatabaseDialog extends ObjectManagementDialogBase { if (table.selectedRows.length === 1) { let fg = null; - // if (table === this.rowsFilegroupsTable) { - // fg = this.rowDataFileGroupsTableRows[table.selectedRows[0]]; - // } else - if (table === this.filestreamFilegroupsTable) { + if (table === this.rowsFilegroupsTable) { + fg = this.rowDataFileGroupsTableRows[table.selectedRows[0]]; + } else if (table === this.filestreamFilegroupsTable) { fg = this.filestreamDataFileGroupsTableRows[table.selectedRows[0]]; } else if (table === this.memoryOptimizedFilegroupsTable) { fg = this.memoryoptimizedFileGroupsTableRows[table.selectedRows[0]]; diff --git a/extensions/mssql/src/ui/dialogBase.ts b/extensions/mssql/src/ui/dialogBase.ts index 03630f79f5a3..9372152fb6cf 100644 --- a/extensions/mssql/src/ui/dialogBase.ts +++ b/extensions/mssql/src/ui/dialogBase.ts @@ -328,51 +328,6 @@ export abstract class DialogBase { return this.createButtonContainer(buttonComponents) } - protected addButtonsForTable1(table: azdata.DeclarativeTableComponent, addbutton: DialogButton, removeButton: DialogButton, editButton: DialogButton = undefined): azdata.FlexContainer { - let addButtonComponent: azdata.ButtonComponent; - let editButtonComponent: azdata.ButtonComponent; - let removeButtonComponent: azdata.ButtonComponent; - let buttonComponents: azdata.ButtonComponent[] = []; - const updateButtons = (isRemoveEnabled: boolean = undefined) => { - this.onFormFieldChange(); - const tableSelectedRowsLengthCheck = table.selectedRow === 1 && table.selectedRow < table.data.length; - if (editButton !== undefined) { - editButtonComponent.enabled = tableSelectedRowsLengthCheck; - } - removeButtonComponent.enabled = !!isRemoveEnabled && tableSelectedRowsLengthCheck; - } - addButtonComponent = this.createButton(uiLoc.AddText, addbutton.buttonAriaLabel, async () => { - await addbutton.buttonHandler(addButtonComponent); - updateButtons(); - }); - buttonComponents.push(addButtonComponent); - - if (editButton !== undefined) { - editButtonComponent = this.createButton(uiLoc.EditText, editButton.buttonAriaLabel, async () => { - await editButton.buttonHandler(editButtonComponent); - updateButtons(); - }, false); - buttonComponents.push(editButtonComponent); - } - - removeButtonComponent = this.createButton(uiLoc.RemoveText, removeButton.buttonAriaLabel, async () => { - await removeButton.buttonHandler(removeButtonComponent); - if (table.selectedRow === 1) { - // table.selectedRow = [table.data.length - 1]; - } - updateButtons(); - }, false); - buttonComponents.push(removeButtonComponent); - - this.disposables.push(table.onRowSelected(() => { - const isRemoveButtonEnabled = true; - updateButtons(isRemoveButtonEnabled); - })); - - return this.createButtonContainer(buttonComponents) - } - - protected createDropdown(ariaLabel: string, handler: (newValue: string) => Promise, values: string[], value: string | undefined, enabled: boolean = true, width: number = DefaultInputWidth, editable?: boolean, strictSelection?: boolean): azdata.DropDownComponent { // Automatically add an empty item to the beginning of the list if the current value is not specified. // This is needed when no meaningful default value can be provided. From 49021becc23236e98a44c79c000043ebc6d06d95 Mon Sep 17 00:00:00 2001 From: Lewis Sanchez <87730006+lewis-sanchez@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:58:00 -0700 Subject: [PATCH 10/23] Bump STS version to 4.9.0.36 (#24349) --- extensions/mssql/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/mssql/config.json b/extensions/mssql/config.json index 30aa1663c399..0c5174b82c8e 100644 --- a/extensions/mssql/config.json +++ b/extensions/mssql/config.json @@ -1,6 +1,6 @@ { "downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/{#version#}/microsoft.sqltools.servicelayer-{#fileName#}", - "version": "4.9.0.34", + "version": "4.9.0.36", "downloadFileNames": { "Windows_86": "win-x86-net7.0.zip", "Windows_64": "win-x64-net7.0.zip", From 1f98dad498e8c48808c73ce7eed1b43b7e236e06 Mon Sep 17 00:00:00 2001 From: Sakshi Sharma <57200045+SakshiS-harma@users.noreply.github.com> Date: Fri, 8 Sep 2023 14:00:01 -0700 Subject: [PATCH 11/23] Update required indicators in Add Database Reference Dialog (#24346) * Update required indicators appropriately in Add Database Reference Dialog * Add required to the textbox as well --- .../src/dialogs/addDatabaseReferenceDialog.ts | 55 ++++++++++++++++--- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/extensions/sql-database-projects/src/dialogs/addDatabaseReferenceDialog.ts b/extensions/sql-database-projects/src/dialogs/addDatabaseReferenceDialog.ts index f294557abfff..48441967c81c 100644 --- a/extensions/sql-database-projects/src/dialogs/addDatabaseReferenceDialog.ts +++ b/extensions/sql-database-projects/src/dialogs/addDatabaseReferenceDialog.ts @@ -53,6 +53,9 @@ export class AddDatabaseReferenceDialog { private systemDbRefRadioButtonsComponent: azdataType.FormComponent | undefined; private systemDbRefType: SystemDbReferenceType = SystemDbReferenceType.ArtifactReference; public currentReferencedDatabaseType: ReferencedDatabaseType | undefined; + private databaseNameTextboxLabel: azdataType.TextComponent | undefined; + private serverNameTextboxLabel: azdataType.TextComponent | undefined; + private serverVariableTextboxLabel: azdataType.TextComponent | undefined; private toDispose: vscode.Disposable[] = []; private initDialogComplete: Deferred = new Deferred(); @@ -413,7 +416,8 @@ export class AddDatabaseReferenceDialog { private async createProjectDropdown(): Promise { this.projectDropdown = this.view!.modelBuilder.dropDown().withProps({ - ariaLabel: constants.databaseProject + ariaLabel: constants.databaseProject, + required: true }).component(); this.projectDropdown.onValueChanged(() => { @@ -436,7 +440,8 @@ export class AddDatabaseReferenceDialog { private createSystemDatabaseDropdown(): azdataType.FormComponent { this.systemDatabaseDropdown = this.view!.modelBuilder.dropDown().withProps({ values: getSystemDbOptions(this.project), - ariaLabel: constants.databaseNameLabel + ariaLabel: constants.databaseNameLabel, + required: true }).component(); this.systemDatabaseDropdown.onValueChanged(() => { @@ -453,7 +458,8 @@ export class AddDatabaseReferenceDialog { this.dacpacTextbox = this.view!.modelBuilder.inputBox().withProps({ ariaLabel: constants.dacpacText, placeHolder: constants.selectDacpac, - width: '400px' + width: '400px', + required: true }).component(); this.dacpacTextbox.onTextChanged(() => { @@ -553,6 +559,16 @@ export class AddDatabaseReferenceDialog { this.serverNameTextbox!.enabled = false; this.serverVariableTextbox!.enabled = false; + // update required property of the the textbox + this.databaseNameTextbox!.required = false; + this.serverNameTextbox!.required = false; + this.serverVariableTextbox!.required = false; + + // update required indicator + this.databaseNameTextboxLabel!.requiredIndicator = false; + this.serverNameTextboxLabel!.requiredIndicator = false; + this.serverVariableTextboxLabel!.requiredIndicator = false; + // clear values in disabled fields this.databaseNameTextbox!.value = ''; this.databaseVariableTextbox!.value = ''; @@ -564,6 +580,16 @@ export class AddDatabaseReferenceDialog { this.serverNameTextbox!.enabled = false; this.serverVariableTextbox!.enabled = false; + // update required property of the the textbox + this.databaseNameTextbox!.required = true; + this.serverNameTextbox!.required = false; + this.serverVariableTextbox!.required = false; + + // update required indicator + this.databaseNameTextboxLabel!.requiredIndicator = true; + this.serverNameTextboxLabel!.requiredIndicator = false; + this.serverVariableTextboxLabel!.requiredIndicator = false; + // clear values in disabled fields this.databaseVariableTextbox!.value = isSystemDb ? '' : this.databaseVariableTextbox!.value; this.serverNameTextbox!.value = ''; @@ -577,6 +603,16 @@ export class AddDatabaseReferenceDialog { this.serverNameTextbox!.enabled = true; this.serverVariableTextbox!.enabled = true; + // update required property of the the textbox + this.databaseNameTextbox!.required = true; + this.serverNameTextbox!.required = true; + this.serverVariableTextbox!.required = true; + + // update required indicator + this.databaseNameTextboxLabel!.requiredIndicator = true; + this.serverNameTextboxLabel!.requiredIndicator = true; + this.serverVariableTextboxLabel!.requiredIndicator = true; + // add default values in enabled fields this.setDefaultDatabaseValues(); this.serverNameTextbox!.value = constants.otherServer; @@ -617,20 +653,23 @@ export class AddDatabaseReferenceDialog { private createVariableSection(): azdataType.FormComponent { // database name row + this.databaseNameTextboxLabel = this.createLabel(constants.databaseName, true); this.databaseNameTextbox = this.createInputBox(constants.databaseName, true, true); - const databaseNameRow = this.view!.modelBuilder.flexContainer().withItems([this.createLabel(constants.databaseName, true), this.databaseNameTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); + const databaseNameRow = this.view!.modelBuilder.flexContainer().withItems([this.databaseNameTextboxLabel, this.databaseNameTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); // database variable row this.databaseVariableTextbox = this.createInputBox(constants.databaseVariable, false, false); const databaseVariableRow = this.view!.modelBuilder.flexContainer().withItems([this.createLabel(constants.databaseVariable), this.databaseVariableTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); // server name row - this.serverNameTextbox = this.createInputBox(constants.serverName, false, true); - const serverNameRow = this.view!.modelBuilder.flexContainer().withItems([this.createLabel(constants.serverName, true), this.serverNameTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); + this.serverNameTextboxLabel = this.createLabel(constants.serverName, false); + this.serverNameTextbox = this.createInputBox(constants.serverName, false, false); + const serverNameRow = this.view!.modelBuilder.flexContainer().withItems([this.serverNameTextboxLabel, this.serverNameTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); // server variable row - this.serverVariableTextbox = this.createInputBox(constants.serverVariable, false, true); - const serverVariableRow = this.view!.modelBuilder.flexContainer().withItems([this.createLabel(constants.serverVariable, true), this.serverVariableTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); + this.serverVariableTextboxLabel = this.createLabel(constants.serverVariable, false); + this.serverVariableTextbox = this.createInputBox(constants.serverVariable, false, false); + const serverVariableRow = this.view!.modelBuilder.flexContainer().withItems([this.serverVariableTextboxLabel, this.serverVariableTextbox], { flex: '0 0 auto' }).withLayout({ flexFlow: 'row', alignItems: 'center' }).component(); const variableSection = this.view!.modelBuilder.flexContainer().withItems([databaseNameRow, databaseVariableRow, serverNameRow, serverVariableRow]).withLayout({ flexFlow: 'column' }).withProps({ CSSStyles: { 'margin-bottom': '25px' } }).component(); this.setDefaultDatabaseValues(); From ff4758c0487229fb7cdb543af45c08bf83a9e2ae Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Fri, 8 Sep 2023 14:18:08 -0700 Subject: [PATCH 12/23] Remove 'Script As Alter' command and don't show for table nodes (#24352) --- extensions/mssql/package.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 5ba16ce607dd..a5cc983e2447 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -31,10 +31,6 @@ } ], "commands": [ - { - "command": "objectExplorer.scriptAsAlter", - "title": "Script as Alter" - }, { "command": "mssql.exportSqlAsNotebook", "title": "%mssql.exportSqlAsNotebook%" @@ -541,11 +537,6 @@ } ], "objectExplorer/item/context": [ - { - "command": "objectExplorer.scriptAsAlter", - "when": "nodeType == Table", - "group": "0_query@5" - }, { "command": "mssql.designTable", "when": "connectionProvider == MSSQL && nodeType == Table && nodeSubType != LedgerDropped", From faebec998810124af1c021c3137203c9ba9e28e3 Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Fri, 8 Sep 2023 15:15:55 -0700 Subject: [PATCH 13/23] Juno: check in to lego/hb_04604851-bac4-4681-9f74-73de611d6e48_20230908183910058. (#24347) --- .../LCL/de/Microsoft.mssql.xlf.lcl | 135 ++++++++++++++++ .../LCL/de/Microsoft.query-store.xlf.lcl | 21 ++- .../LCL/es/Microsoft.mssql.xlf.lcl | 135 ++++++++++++++++ .../LCL/es/Microsoft.query-store.xlf.lcl | 21 ++- .../LCL/fr/Microsoft.mssql.xlf.lcl | 153 ++++++++++++++++++ .../LCL/fr/Microsoft.query-store.xlf.lcl | 24 +-- .../LCL/fr/Microsoft.sql-migration.xlf.lcl | 9 ++ resources/localization/LCL/fr/sql.xlf.lcl | 48 ++---- .../LCL/it/Microsoft.mssql.xlf.lcl | 135 ++++++++++++++++ .../LCL/it/Microsoft.query-store.xlf.lcl | 21 ++- .../LCL/ja/Microsoft.mssql.xlf.lcl | 153 ++++++++++++++++++ .../LCL/ja/Microsoft.query-store.xlf.lcl | 24 +-- .../LCL/ja/Microsoft.sql-migration.xlf.lcl | 9 ++ resources/localization/LCL/ja/sql.xlf.lcl | 48 ++---- .../LCL/ko/Microsoft.mssql.xlf.lcl | 135 ++++++++++++++++ .../LCL/ko/Microsoft.query-store.xlf.lcl | 21 ++- .../LCL/pt-BR/Microsoft.mssql.xlf.lcl | 153 ++++++++++++++++++ .../LCL/pt-BR/Microsoft.query-store.xlf.lcl | 24 +-- .../LCL/pt-BR/Microsoft.sql-migration.xlf.lcl | 9 ++ resources/localization/LCL/pt-BR/sql.xlf.lcl | 48 ++---- .../LCL/ru/Microsoft.mssql.xlf.lcl | 135 ++++++++++++++++ .../LCL/ru/Microsoft.query-store.xlf.lcl | 21 ++- .../LCL/zh-Hans/Microsoft.mssql.xlf.lcl | 153 ++++++++++++++++++ .../LCL/zh-Hans/Microsoft.query-store.xlf.lcl | 24 +-- .../zh-Hans/Microsoft.sql-migration.xlf.lcl | 9 ++ .../localization/LCL/zh-Hans/sql.xlf.lcl | 48 ++---- .../LCL/zh-Hant/Microsoft.mssql.xlf.lcl | 153 ++++++++++++++++++ .../LCL/zh-Hant/Microsoft.query-store.xlf.lcl | 24 +-- .../zh-Hant/Microsoft.sql-migration.xlf.lcl | 9 ++ .../localization/LCL/zh-Hant/sql.xlf.lcl | 48 ++---- 30 files changed, 1650 insertions(+), 300 deletions(-) diff --git a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl index d2627a5ffcdf..9930ac89e3b9 100644 --- a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,12 @@ + + + + + + @@ -1632,6 +1665,15 @@ + + + + + + + + + @@ -1842,6 +1884,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1947,12 @@ + + + + + + @@ -2049,6 +2115,15 @@ + + + + + + + + + @@ -2184,6 +2259,15 @@ + + + + + + + + + @@ -2319,6 +2403,12 @@ + + + + + + @@ -2337,6 +2427,15 @@ + + + + + + + + + @@ -2445,6 +2544,12 @@ + + + + + + @@ -2538,6 +2643,12 @@ + + + + + + @@ -2667,6 +2778,15 @@ + + + + + + + + + @@ -2763,6 +2883,12 @@ + + + + + + @@ -2880,6 +3006,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl index 8066468eb722..aaf61d19f564 100644 --- a/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl @@ -493,6 +493,12 @@ + + + + + + @@ -664,20 +670,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl index 5be2cc450bf4..076a18a4f2c0 100644 --- a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,12 @@ + + + + + + @@ -1632,6 +1665,15 @@ + + + + + + + + + @@ -1842,6 +1884,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1947,12 @@ + + + + + + @@ -2049,6 +2115,15 @@ + + + + + + + + + @@ -2184,6 +2259,15 @@ + + + + + + + + + @@ -2319,6 +2403,12 @@ + + + + + + @@ -2337,6 +2427,15 @@ + + + + + + + + + @@ -2445,6 +2544,12 @@ + + + + + + @@ -2538,6 +2643,12 @@ + + + + + + @@ -2667,6 +2778,15 @@ + + + + + + + + + @@ -2763,6 +2883,12 @@ + + + + + + @@ -2880,6 +3006,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl index eb6b6ccabcb4..fa3e0f829ea6 100644 --- a/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl @@ -493,6 +493,12 @@ + + + + + + @@ -664,20 +670,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl index 12ee166aa3ce..69815c5d5376 100644 --- a/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,15 @@ + + + + + + + + + @@ -1632,6 +1668,15 @@ + + + + + + + + + @@ -1842,6 +1887,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1950,15 @@ + + + + + + + + + @@ -2049,6 +2121,15 @@ + + + + + + + + + @@ -2184,6 +2265,15 @@ + + + + + + + + + @@ -2319,6 +2409,15 @@ + + + + + + + + + @@ -2337,6 +2436,15 @@ + + + + + + + + + @@ -2445,6 +2553,15 @@ + + + + + + + + + @@ -2538,6 +2655,15 @@ + + + + + + + + + @@ -2667,6 +2793,15 @@ + + + + + + + + + @@ -2763,6 +2898,15 @@ + + + + + + + + + @@ -2880,6 +3024,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/fr/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/fr/Microsoft.query-store.xlf.lcl index 1573252d09b7..9bda4217d36e 100644 --- a/resources/localization/LCL/fr/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/fr/Microsoft.query-store.xlf.lcl @@ -493,6 +493,15 @@ + + + + + + + + + @@ -664,20 +673,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/fr/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/fr/Microsoft.sql-migration.xlf.lcl index 4ea38370c485..2dcd1dcd8944 100644 --- a/resources/localization/LCL/fr/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/fr/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/fr/sql.xlf.lcl b/resources/localization/LCL/fr/sql.xlf.lcl index dfd6c96d74f3..8c263756313e 100644 --- a/resources/localization/LCL/fr/sql.xlf.lcl +++ b/resources/localization/LCL/fr/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl index 242ea7598e9d..ad1eb186e896 100644 --- a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,12 @@ + + + + + + @@ -1632,6 +1665,15 @@ + + + + + + + + + @@ -1842,6 +1884,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1947,12 @@ + + + + + + @@ -2049,6 +2115,15 @@ + + + + + + + + + @@ -2184,6 +2259,15 @@ + + + + + + + + + @@ -2319,6 +2403,12 @@ + + + + + + @@ -2337,6 +2427,15 @@ + + + + + + + + + @@ -2445,6 +2544,12 @@ + + + + + + @@ -2538,6 +2643,12 @@ + + + + + + @@ -2667,6 +2778,15 @@ + + + + + + + + + @@ -2763,6 +2883,12 @@ + + + + + + @@ -2880,6 +3006,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl index 8a017f6a9b35..4b8b9993ab8f 100644 --- a/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl @@ -493,6 +493,12 @@ + + + + + + @@ -664,20 +670,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl index 42f2a8326dfe..dd781c3359fc 100644 --- a/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,15 @@ + + + + + + + + + @@ -1632,6 +1668,15 @@ + + + + + + + + + @@ -1842,6 +1887,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1950,15 @@ + + + + + + + + + @@ -2049,6 +2121,15 @@ + + + + + + + + + @@ -2184,6 +2265,15 @@ + + + + + + + + + @@ -2319,6 +2409,15 @@ + + + + + + + + + @@ -2337,6 +2436,15 @@ + + + + + + + + + @@ -2445,6 +2553,15 @@ + + + + + + + + + @@ -2538,6 +2655,15 @@ + + + + + + + + + @@ -2667,6 +2793,15 @@ + + + + + + + + + @@ -2763,6 +2898,15 @@ + + + + + + + + + @@ -2880,6 +3024,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl index 61ea0c760c34..60f5dfa72fbc 100644 --- a/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl @@ -493,6 +493,15 @@ + + + + + + + + + @@ -664,20 +673,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/ja/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/ja/Microsoft.sql-migration.xlf.lcl index 6e0d641dc9e5..cf10810bbe6f 100644 --- a/resources/localization/LCL/ja/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/ja/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ja/sql.xlf.lcl b/resources/localization/LCL/ja/sql.xlf.lcl index 39566c3431e0..b4459719a7af 100644 --- a/resources/localization/LCL/ja/sql.xlf.lcl +++ b/resources/localization/LCL/ja/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl index 682adfda0025..361934529f2a 100644 --- a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,12 @@ + + + + + + @@ -1632,6 +1665,15 @@ + + + + + + + + + @@ -1842,6 +1884,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1947,12 @@ + + + + + + @@ -2049,6 +2115,15 @@ + + + + + + + + + @@ -2184,6 +2259,15 @@ + + + + + + + + + @@ -2319,6 +2403,12 @@ + + + + + + @@ -2337,6 +2427,15 @@ + + + + + + + + + @@ -2445,6 +2544,12 @@ + + + + + + @@ -2538,6 +2643,12 @@ + + + + + + @@ -2667,6 +2778,15 @@ + + + + + + + + + @@ -2763,6 +2883,12 @@ + + + + + + @@ -2880,6 +3006,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl index 5ec7402a5fe4..46c7d8c30bda 100644 --- a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl @@ -493,6 +493,12 @@ + + + + + + @@ -664,20 +670,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl index 9eb2b999cf66..c180c5b0f24c 100644 --- a/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,15 @@ + + + + + + + + + @@ -1632,6 +1668,15 @@ + + + + + + + + + @@ -1842,6 +1887,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1950,15 @@ + + + + + + + + + @@ -2049,6 +2121,15 @@ + + + + + + + + + @@ -2184,6 +2265,15 @@ + + + + + + + + + @@ -2319,6 +2409,15 @@ + + + + + + + + + @@ -2337,6 +2436,15 @@ + + + + + + + + + @@ -2445,6 +2553,15 @@ + + + + + + + + + @@ -2538,6 +2655,15 @@ + + + + + + + + + @@ -2667,6 +2793,15 @@ + + + + + + + + + @@ -2763,6 +2898,15 @@ + + + + + + + + + @@ -2880,6 +3024,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/pt-BR/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/pt-BR/Microsoft.query-store.xlf.lcl index 0d85cff15516..7e1f8bb8db30 100644 --- a/resources/localization/LCL/pt-BR/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/pt-BR/Microsoft.query-store.xlf.lcl @@ -493,6 +493,15 @@ + + + + + + + + + @@ -664,20 +673,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/pt-BR/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/pt-BR/Microsoft.sql-migration.xlf.lcl index f6e9bc77a359..eaedec8b71ca 100644 --- a/resources/localization/LCL/pt-BR/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/pt-BR/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/pt-BR/sql.xlf.lcl b/resources/localization/LCL/pt-BR/sql.xlf.lcl index d21cf70a8e3b..30bd58d49c22 100644 --- a/resources/localization/LCL/pt-BR/sql.xlf.lcl +++ b/resources/localization/LCL/pt-BR/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl index 12b4c2d2fbe2..fd2a056b02d5 100644 --- a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,12 @@ + + + + + + @@ -1632,6 +1665,15 @@ + + + + + + + + + @@ -1842,6 +1884,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1947,12 @@ + + + + + + @@ -2049,6 +2115,15 @@ + + + + + + + + + @@ -2184,6 +2259,15 @@ + + + + + + + + + @@ -2319,6 +2403,12 @@ + + + + + + @@ -2337,6 +2427,15 @@ + + + + + + + + + @@ -2445,6 +2544,12 @@ + + + + + + @@ -2538,6 +2643,12 @@ + + + + + + @@ -2667,6 +2778,15 @@ + + + + + + + + + @@ -2763,6 +2883,12 @@ + + + + + + @@ -2880,6 +3006,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl index f0f7d5a5cc3d..dbc9afc7346e 100644 --- a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl @@ -493,6 +493,12 @@ + + + + + + @@ -664,20 +670,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl index b3b005c745d8..c44aa78ac6c4 100644 --- a/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,15 @@ + + + + + + + + + @@ -1632,6 +1668,15 @@ + + + + + + + + + @@ -1842,6 +1887,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1950,15 @@ + + + + + + + + + @@ -2049,6 +2121,15 @@ + + + + + + + + + @@ -2184,6 +2265,15 @@ + + + + + + + + + @@ -2319,6 +2409,15 @@ + + + + + + + + + @@ -2337,6 +2436,15 @@ + + + + + + + + + @@ -2445,6 +2553,15 @@ + + + + + + + + + @@ -2538,6 +2655,15 @@ + + + + + + + + + @@ -2667,6 +2793,15 @@ + + + + + + + + + @@ -2763,6 +2898,15 @@ + + + + + + + + + @@ -2880,6 +3024,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hans/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/zh-Hans/Microsoft.query-store.xlf.lcl index f6ddb3f14bf1..40cc7d1144a6 100644 --- a/resources/localization/LCL/zh-Hans/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/Microsoft.query-store.xlf.lcl @@ -493,6 +493,15 @@ + + + + + + + + + @@ -664,20 +673,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/zh-Hans/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/zh-Hans/Microsoft.sql-migration.xlf.lcl index 5dfc44f02e8d..cd7a6d8d3909 100644 --- a/resources/localization/LCL/zh-Hans/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hans/sql.xlf.lcl b/resources/localization/LCL/zh-Hans/sql.xlf.lcl index 1dfa041b6788..e36baf3f63a7 100644 --- a/resources/localization/LCL/zh-Hans/sql.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl index 66f6005dca80..03194e06455a 100644 --- a/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl @@ -1416,6 +1416,15 @@ + + + + + + + + + @@ -1461,6 +1470,15 @@ + + + + + + + + + @@ -1515,6 +1533,15 @@ + + + + + + + + + @@ -1605,6 +1632,15 @@ + + + + + + + + + @@ -1632,6 +1668,15 @@ + + + + + + + + + @@ -1842,6 +1887,24 @@ + + + + + + + + + + + + + + + + + + @@ -1887,6 +1950,15 @@ + + + + + + + + + @@ -2049,6 +2121,15 @@ + + + + + + + + + @@ -2184,6 +2265,15 @@ + + + + + + + + + @@ -2319,6 +2409,15 @@ + + + + + + + + + @@ -2337,6 +2436,15 @@ + + + + + + + + + @@ -2445,6 +2553,15 @@ + + + + + + + + + @@ -2538,6 +2655,15 @@ + + + + + + + + + @@ -2667,6 +2793,15 @@ + + + + + + + + + @@ -2763,6 +2898,15 @@ + + + + + + + + + @@ -2880,6 +3024,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl index 4394734ba15d..2148ed2206ab 100644 --- a/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl @@ -493,6 +493,15 @@ + + + + + + + + + @@ -664,20 +673,11 @@ - - - - - - - - - - + - + - + diff --git a/resources/localization/LCL/zh-Hant/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/zh-Hant/Microsoft.sql-migration.xlf.lcl index 5716e6ff4a83..2fa7605f3716 100644 --- a/resources/localization/LCL/zh-Hant/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hant/sql.xlf.lcl b/resources/localization/LCL/zh-Hant/sql.xlf.lcl index 436130265745..8176bab99591 100644 --- a/resources/localization/LCL/zh-Hant/sql.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - From 29127a003e892178361252108f5539d729714cb0 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra <13396919+cheenamalhotra@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:05:46 -0700 Subject: [PATCH 14/23] Update placeholder text for mssql server name (#24350) --- extensions/mssql/package.nls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/mssql/package.nls.json b/extensions/mssql/package.nls.json index 268ccea7eff2..90e53c83e897 100644 --- a/extensions/mssql/package.nls.json +++ b/extensions/mssql/package.nls.json @@ -84,7 +84,7 @@ "mssql.connectionOptions.connectionName.description": "Custom name of the connection", "mssql.connectionOptions.serverName.displayName": "Server", "mssql.connectionOptions.serverName.description": "Name of the SQL Server instance", - "mssql.connectionOptions.serverName.placeholder": "e.g. tcp:servername,1433", + "mssql.connectionOptions.serverName.placeholder": "e.g. servername,port", "mssql.connectionOptions.databaseName.displayName": "Database", "mssql.connectionOptions.databaseName.description": "The name of the initial catalog or database int the data source", "mssql.connectionOptions.authType.displayName": "Authentication type", From 669d64953de9fc7331e240a2a0d58503e4450b29 Mon Sep 17 00:00:00 2001 From: Alex Ma Date: Fri, 8 Sep 2023 17:44:03 -0700 Subject: [PATCH 15/23] [Loc] update to MSSQL xlf for 9-8-2023 (#24354) --- resources/xlf/en/Microsoft.mssql.xlf | 82 +++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/resources/xlf/en/Microsoft.mssql.xlf b/resources/xlf/en/Microsoft.mssql.xlf index 0931eab5c60d..a5a37b43f6bf 100644 --- a/resources/xlf/en/Microsoft.mssql.xlf +++ b/resources/xlf/en/Microsoft.mssql.xlf @@ -144,6 +144,9 @@ Are you sure you want to drop the {0}: {1}? {0} object type, {1}: object name. + + Are you sure you want to purge the Query Store data from '{0}'? + Associated Database Files @@ -280,12 +283,18 @@ Creating a login with a blank password is a security risk. Are you sure you want to continue? + + Current Disk Usage + Current Service Level Objective Cursor Threshold + + Custom + DB Name @@ -295,6 +304,9 @@ Data + + Data Flush Interval (Minutes) + DataFile '{0}' could not be added to the collection, because it already exists. @@ -435,6 +447,9 @@ Enter new name + + Execution Count + Explicit permissions for selected securable @@ -600,9 +615,15 @@ Max Degree Parallelism + + Max Plans Per Query + Max Size + + Max Size (MB) + Max Text Replication Size @@ -639,6 +660,9 @@ Minimum Server Memory (MB) + + Monitoring + Name @@ -687,6 +711,12 @@ Operating System + + Operation Mode (Actual) + + + Operation Mode (Requested) + Optimize Ad Hoc Workloads @@ -747,6 +777,27 @@ Properties + + Purge Query Store Data + + + Query Store + + + Query Store Available + + + Query Store Capture Mode + + + Query Store Capture Policy + + + Query Store Retention + + + Query Store Used + Query Wait @@ -862,6 +913,9 @@ Size (MB) + + Size Based Cleanup Mode + Space Available @@ -871,9 +925,18 @@ Specify old password + + Stale Threshold + State + + State Query Threshold (Days) + + + Statistics Collection Interval + Status @@ -892,6 +955,12 @@ This command is not supported for object type '{0}'. + + Total Compile CPU Time (ms) + + + Total Execution CPU Time (ms) + Two Digit Year Cutoff @@ -932,6 +1001,9 @@ Version + + Wait Statistics Capture Mode + Windows Authentication @@ -941,6 +1013,9 @@ With Grant + + Yes + application role @@ -1275,7 +1350,7 @@ Enabled - Enables connection pooling on MSSQL connections to improve overall performance of Azure Data Studio connectivity. This setting is enabled by default. Azure Data Studio is required to be relaunched when the value is changed. + Enables connection pooling on MSSQL connections to improve overall performance of Azure Data Studio connectivity. This setting is enabled by default. Azure Data Studio is required to be relaunched when the value is changed. To clear pooled connections, run the command: 'SQL Server: Clear Pooled Connections' Enables or disables Always Encrypted for the connection @@ -1469,6 +1544,9 @@ SQL Login + + SQL Server: Clear Pooled Connections + SQL Server: Disable Group By Schema @@ -1662,7 +1740,7 @@ [Optional] Should Personally Identifiable Information (PII) be logged in the log file. - e.g. tcp:servername,1433 + e.g. servername,port should commas be placed at the beginning of each statement in a list e.g. ', mycolumn2' instead of at the end e.g. 'mycolumn1,' From 0b149cd85bd275825a5f5912074296f50ff92521 Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Fri, 8 Sep 2023 21:27:29 -0700 Subject: [PATCH 16/23] update STS to 4.9.0.37 (#24356) --- extensions/mssql/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/mssql/config.json b/extensions/mssql/config.json index 0c5174b82c8e..71c15670841e 100644 --- a/extensions/mssql/config.json +++ b/extensions/mssql/config.json @@ -1,6 +1,6 @@ { "downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/{#version#}/microsoft.sqltools.servicelayer-{#fileName#}", - "version": "4.9.0.36", + "version": "4.9.0.37", "downloadFileNames": { "Windows_86": "win-x86-net7.0.zip", "Windows_64": "win-x64-net7.0.zip", From 4a9feedbcc8ea575cd094d5dd06cd8f39a49e22f Mon Sep 17 00:00:00 2001 From: Barbara Valdez <34872381+barbaravaldez@users.noreply.github.com> Date: Fri, 8 Sep 2023 23:53:59 -0700 Subject: [PATCH 17/23] Notify user to restart server (#24351) --- .../ui/serverPropertiesDialog.ts | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts b/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts index 74ace5b5c6ce..4ddb5ab16515 100644 --- a/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts +++ b/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts @@ -87,9 +87,13 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { + await this.notifyServerRestart(); + })); } protected override get helpUrl(): string { @@ -364,6 +368,13 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { + if (this.shouldRestartServer) { + await vscode.window.showInformationMessage(localizedConstants.needToRestartServer, { modal: true }); + this.shouldRestartServer = false; + } + } + private initializeProcessorsSection(): void { const isEnabled = this.engineEdition !== azdata.DatabaseEngineEdition.SqlManagedInstance; let nodes: NumaNode[] = this.objectInfo.numaNodes; @@ -491,7 +502,7 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { await this.handleAuthModeChange(); }); this.sqlServerAndWindowsAuthRadioButton = this.createRadioButton(localizedConstants.sqlServerAndWindowsAuthText, radioServerGroupName, this.objectInfo.authenticationMode === ServerLoginMode.Mixed, async () => { await this.handleAuthModeChange(); }); @@ -529,7 +540,7 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { this.objectInfo.dataLocation = newValue; + if (this.objectInfo.dataLocation !== this.originalObjectInfo.dataLocation) { + this.shouldRestartServer = true; + } }, dataLocationInputboxProps); const dataLocationButton = this.createBrowseButton(async () => { const newPath = await this.selectFolder(this.objectInfo.dataLocation); this.dataLocationInput.value = newPath; this.objectInfo.dataLocation = newPath; + if (this.objectInfo.dataLocation !== this.originalObjectInfo.dataLocation) { + this.shouldRestartServer = true; + } }, isEnabled); const dataLocationInputContainer = this.createLabelInputContainer(localizedConstants.dataLocationText, [this.dataLocationInput, dataLocationButton]) this.logLocationInput = this.createInputBox(async (newValue) => { this.objectInfo.logLocation = newValue; + if (this.objectInfo.logLocation !== this.originalObjectInfo.logLocation) { + this.shouldRestartServer = true; + } }, logLocationInputboxProps); const logLocationButton = this.createBrowseButton(async () => { const newPath = await this.selectFolder(this.objectInfo.logLocation); this.logLocationInput.value = newPath; this.objectInfo.logLocation = newPath; + if (this.objectInfo.logLocation !== this.originalObjectInfo.logLocation) { + this.shouldRestartServer = true; + } }, isEnabled); const logLocationInputContainer = this.createLabelInputContainer(localizedConstants.logLocationText, [this.logLocationInput, logLocationButton]) @@ -782,5 +805,4 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase Date: Sat, 9 Sep 2023 01:36:56 -0700 Subject: [PATCH 18/23] Fix some of the issues found in the bug bash (#24348) --- .../ui/serverPropertiesDialog.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts b/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts index 4ddb5ab16515..e803eaa073ac 100644 --- a/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts +++ b/extensions/mssql/src/objectManagement/ui/serverPropertiesDialog.ts @@ -597,8 +597,10 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { const newPath = await this.selectFolder(this.objectInfo.dataLocation); - this.dataLocationInput.value = newPath; - this.objectInfo.dataLocation = newPath; + if (newPath) { + this.dataLocationInput.value = newPath; + this.objectInfo.dataLocation = newPath; + } if (this.objectInfo.dataLocation !== this.originalObjectInfo.dataLocation) { this.shouldRestartServer = true; } @@ -613,8 +615,10 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { const newPath = await this.selectFolder(this.objectInfo.logLocation); - this.logLocationInput.value = newPath; - this.objectInfo.logLocation = newPath; + if (newPath) { + this.logLocationInput.value = newPath; + this.objectInfo.logLocation = newPath; + } if (this.objectInfo.logLocation !== this.originalObjectInfo.logLocation) { this.shouldRestartServer = true; } @@ -626,8 +630,10 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { const newPath = await this.selectFolder(this.objectInfo.backupLocation); - this.backupLocationInput.value = newPath; - this.objectInfo.backupLocation = newPath; + if (newPath) { + this.backupLocationInput.value = newPath; + this.objectInfo.backupLocation = newPath; + } }, isEnabled); const backupLocationInputContainer = this.createLabelInputContainer(localizedConstants.backupLocationText, [this.backupLocationInput, backupLocationButton]) @@ -706,7 +712,7 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase { this.objectInfo.fullTextUpgradeOption = newValue; - }, this.viewInfo.fullTextUpgradeOptions, this.objectInfo.fullTextUpgradeOption); + }, this.viewInfo.fullTextUpgradeOptions, this.objectInfo.fullTextUpgradeOption, !!this.objectInfo.fullTextUpgradeOption); const fullTextUpgradeOptionContainer = this.createLabelInputContainer(localizedConstants.fullTextUpgradeOptionLabel, this.fullTextUpgradeOptionDropdown); this.maxTextReplicationSizeInput = this.createInputBox(async (newValue) => { From 5f45c000da833f13d928af77a6fbdf8c60012a38 Mon Sep 17 00:00:00 2001 From: Christopher Suh Date: Sat, 9 Sep 2023 07:16:05 -0400 Subject: [PATCH 19/23] Fix copy on Linux (#24341) * add return type for copy results from STS * fix test error * change Result type to CopyResultsRequestResult * remove async * bump data protocol client * bump dataprotocol client version * bump version in yarn.lock * add async back --- extensions/azuremonitor/package.json | 2 +- extensions/azuremonitor/yarn.lock | 6 +++--- extensions/datavirtualization/package.json | 2 +- extensions/datavirtualization/yarn.lock | 6 +++--- extensions/import/package.json | 2 +- extensions/import/src/test/utils.test.ts | 2 +- extensions/import/yarn.lock | 6 +++--- extensions/kusto/package.json | 2 +- extensions/kusto/yarn.lock | 6 +++--- extensions/mssql/package.json | 2 +- extensions/mssql/yarn.lock | 6 +++--- extensions/sql-migration/package.json | 2 +- extensions/sql-migration/yarn.lock | 6 +++--- src/sql/azdata.proposed.d.ts | 9 ++++++++- .../workbench/api/browser/mainThreadDataProtocol.ts | 2 +- src/sql/workbench/api/common/extHostDataProtocol.ts | 2 +- src/sql/workbench/api/common/sqlExtHost.protocol.ts | 2 +- .../services/query/common/queryManagement.ts | 6 +++--- .../services/query/common/queryModelService.ts | 8 +++++++- .../workbench/services/query/common/queryRunner.ts | 12 ++++++++---- .../query/test/common/testQueryManagementService.ts | 2 +- 21 files changed, 55 insertions(+), 38 deletions(-) diff --git a/extensions/azuremonitor/package.json b/extensions/azuremonitor/package.json index 5c74a3375788..8638e79032fa 100644 --- a/extensions/azuremonitor/package.json +++ b/extensions/azuremonitor/package.json @@ -209,7 +209,7 @@ "update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-azuremonitor ./syntaxes/azuremonitor.tmLanguage" }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "figures": "^2.0.0", "find-remove": "1.2.1", "@microsoft/ads-service-downloader": "^1.2.1", diff --git a/extensions/azuremonitor/yarn.lock b/extensions/azuremonitor/yarn.lock index 4ef6d1359691..cfd5ca1ee3b8 100644 --- a/extensions/azuremonitor/yarn.lock +++ b/extensions/azuremonitor/yarn.lock @@ -75,9 +75,9 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/datavirtualization/package.json b/extensions/datavirtualization/package.json index d5b961899927..522a8e7fbb43 100644 --- a/extensions/datavirtualization/package.json +++ b/extensions/datavirtualization/package.json @@ -107,7 +107,7 @@ "dependencies": { "@microsoft/ads-extension-telemetry": "^3.0.1", "@microsoft/ads-service-downloader": "^1.2.1", - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "vscode-nls": "^5.2.0" }, "devDependencies": { diff --git a/extensions/datavirtualization/yarn.lock b/extensions/datavirtualization/yarn.lock index d2ef8367893a..801c83ff7c04 100644 --- a/extensions/datavirtualization/yarn.lock +++ b/extensions/datavirtualization/yarn.lock @@ -497,9 +497,9 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/import/package.json b/extensions/import/package.json index 2e1cbbc05ee5..79c509e00d0c 100644 --- a/extensions/import/package.json +++ b/extensions/import/package.json @@ -77,7 +77,7 @@ } }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "htmlparser2": "^3.10.1", "@microsoft/ads-service-downloader": "^1.2.1", "@microsoft/ads-extension-telemetry": "^3.0.1", diff --git a/extensions/import/src/test/utils.test.ts b/extensions/import/src/test/utils.test.ts index dee7eac482ed..0b2404c11aef 100644 --- a/extensions/import/src/test/utils.test.ts +++ b/extensions/import/src/test/utils.test.ts @@ -78,7 +78,7 @@ export class TestQueryProvider implements azdata.QueryProvider { saveResults(requestParams: azdata.SaveResultsRequestParams): Thenable { throw new Error('Method not implemented.'); } - copyResults(requestParams: azdata.CopyResultsRequestParams): Thenable { + copyResults(requestParams: azdata.CopyResultsRequestParams): Thenable { throw new Error('Method not implemented.'); } setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Thenable { diff --git a/extensions/import/yarn.lock b/extensions/import/yarn.lock index b030ad68a040..198c9a9829c0 100644 --- a/extensions/import/yarn.lock +++ b/extensions/import/yarn.lock @@ -572,9 +572,9 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/kusto/package.json b/extensions/kusto/package.json index ecf00b7a99ad..dd87942c74b6 100644 --- a/extensions/kusto/package.json +++ b/extensions/kusto/package.json @@ -427,7 +427,7 @@ } }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "figures": "^2.0.0", "find-remove": "1.2.1", "@microsoft/ads-service-downloader": "^1.2.1", diff --git a/extensions/kusto/yarn.lock b/extensions/kusto/yarn.lock index 25e1afb05391..c3daa83c1682 100644 --- a/extensions/kusto/yarn.lock +++ b/extensions/kusto/yarn.lock @@ -124,9 +124,9 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index a5cc983e2447..45575877344d 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -1567,7 +1567,7 @@ "dependencies": { "@microsoft/ads-extension-telemetry": "^3.0.1", "@microsoft/ads-service-downloader": "^1.2.1", - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "find-remove": "1.2.1", "vscode-languageclient": "5.2.1", "vscode-nls": "^4.0.0" diff --git a/extensions/mssql/yarn.lock b/extensions/mssql/yarn.lock index 8146e7452f55..cd0919cb6379 100644 --- a/extensions/mssql/yarn.lock +++ b/extensions/mssql/yarn.lock @@ -511,9 +511,9 @@ crypt@~0.0.1: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/extensions/sql-migration/package.json b/extensions/sql-migration/package.json index 68f5b9a91784..5d066ba4575e 100644 --- a/extensions/sql-migration/package.json +++ b/extensions/sql-migration/package.json @@ -162,7 +162,7 @@ ] }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.6", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#1.3.7", "@microsoft/ads-service-downloader": "^1.2.1", "@microsoft/ads-extension-telemetry": "^3.0.1", "uuid": "^8.3.2", diff --git a/extensions/sql-migration/yarn.lock b/extensions/sql-migration/yarn.lock index 06697991f7e5..7ac8879c0b93 100644 --- a/extensions/sql-migration/yarn.lock +++ b/extensions/sql-migration/yarn.lock @@ -62,9 +62,9 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.6": - version "1.3.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/fdd415fd7c79c5c889f192a9122ba41dca66b35b" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#1.3.7": + version "1.3.7" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0f07d03394eeebc2924971746470ac8224348fa4" dependencies: vscode-languageclient "5.2.1" diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 7792f1dae02a..c42968dc129e 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -873,6 +873,13 @@ declare module 'azdata' { selections: SelectionRange[]; } + export interface CopyResultsRequestResult { + /** + * Result string from copy operation + */ + results: string; + } + export interface QueryProvider { /** * Notify clients that the URI for a connection has been changed. @@ -884,7 +891,7 @@ declare module 'azdata' { * ADS will use this if 'supportCopyResultsToClipboard' property is set to true in the provider contribution point in extension's package.json. * Otherwise, The default handler will load all the selected data to ADS and perform the copy operation. */ - copyResults?(requestParams: CopyResultsRequestParams): Thenable; + copyResults?(requestParams: CopyResultsRequestParams): Thenable; } export enum DataProviderType { diff --git a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts index 61bc7ffa37cf..db953a6e6702 100644 --- a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts @@ -161,7 +161,7 @@ export class MainThreadDataProtocol extends Disposable implements MainThreadData return Promise.resolve(self._serializationService.saveAs(requestParams.resultFormat, requestParams.filePath, undefined, true)); } }, - copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { + copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { return Promise.resolve(self._proxy.$copyResults(handle, requestParams)); }, initializeEdit(ownerUri: string, schemaName: string, objectName: string, objectType: string, rowLimit: number, queryString: string): Promise { diff --git a/src/sql/workbench/api/common/extHostDataProtocol.ts b/src/sql/workbench/api/common/extHostDataProtocol.ts index 622bf792d5e8..0e119c3686a1 100644 --- a/src/sql/workbench/api/common/extHostDataProtocol.ts +++ b/src/sql/workbench/api/common/extHostDataProtocol.ts @@ -420,7 +420,7 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { return this._resolveProvider(handle).saveResults(requestParams); } - override $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { + override $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { const provider = this._resolveProvider(handle); if (provider.copyResults) { return provider.copyResults(requestParams); diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index e9ff8539030a..f9b07170c674 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -254,7 +254,7 @@ export abstract class ExtHostDataProtocolShape { /** * Copies the selected data to clipboard. */ - $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { throw ni(); } + $copyResults(handle: number, requestParams: azdata.CopyResultsRequestParams): Thenable { throw ni(); } /** * Commits all pending edits in an edit session diff --git a/src/sql/workbench/services/query/common/queryManagement.ts b/src/sql/workbench/services/query/common/queryManagement.ts index aecb9e8365b8..fce00c548ed8 100644 --- a/src/sql/workbench/services/query/common/queryManagement.ts +++ b/src/sql/workbench/services/query/common/queryManagement.ts @@ -69,7 +69,7 @@ export interface IQueryManagementService { changeConnectionUri(newUri: string, oldUri: string): Promise; saveResults(requestParams: azdata.SaveResultsRequestParams): Promise; setQueryExecutionOptions(uri: string, options: azdata.QueryExecutionOptions): Promise; - copyResults(params: azdata.CopyResultsRequestParams): Promise; + copyResults(params: azdata.CopyResultsRequestParams): Promise; // Callbacks onQueryComplete(result: azdata.QueryExecuteCompleteNotificationResult): void; @@ -108,7 +108,7 @@ export interface IQueryRequestHandler { disposeQuery(ownerUri: string): Promise; connectionUriChanged(newUri: string, oldUri: string): Promise; saveResults(requestParams: azdata.SaveResultsRequestParams): Promise; - copyResults(requestParams: azdata.CopyResultsRequestParams): Promise; + copyResults(requestParams: azdata.CopyResultsRequestParams): Promise; setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Promise; // Edit Data actions @@ -364,7 +364,7 @@ export class QueryManagementService implements IQueryManagementService { }); } - public copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { + public copyResults(requestParams: azdata.CopyResultsRequestParams): Promise { return this._runAction(requestParams.ownerUri, (runner) => { return runner.copyResults(requestParams); }); diff --git a/src/sql/workbench/services/query/common/queryModelService.ts b/src/sql/workbench/services/query/common/queryModelService.ts index 216c2b3b7094..15ba24732899 100644 --- a/src/sql/workbench/services/query/common/queryModelService.ts +++ b/src/sql/workbench/services/query/common/queryModelService.ts @@ -21,6 +21,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import Severity from 'vs/base/common/severity'; import EditQueryRunner from 'sql/workbench/services/editData/common/editQueryRunner'; import { IRange } from 'vs/editor/common/core/range'; +import { ClipboardData, IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; const selectionSnippetMaxLen = 100; @@ -82,6 +83,7 @@ export class QueryModelService implements IQueryModelService { constructor( @IInstantiationService private _instantiationService: IInstantiationService, @INotificationService private _notificationService: INotificationService, + @IClipboardService private _clipboardService: IClipboardService, @ILogService private _logService: ILogService ) { this._queryInfoMap = new Map(); @@ -170,7 +172,11 @@ export class QueryModelService implements IQueryModelService { public async copyResults(uri: string, selection: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { if (this._queryInfoMap.has(uri)) { - return this._queryInfoMap.get(uri)!.queryRunner!.copyResults(selection, batchId, resultId, includeHeaders); + const results = await this._queryInfoMap.get(uri)!.queryRunner!.copyResults(selection, batchId, resultId, includeHeaders); + let clipboardData: ClipboardData = { + text: results.results + }; + this._clipboardService.write(clipboardData); } } diff --git a/src/sql/workbench/services/query/common/queryRunner.ts b/src/sql/workbench/services/query/common/queryRunner.ts index cded1f849b56..07e646195159 100644 --- a/src/sql/workbench/services/query/common/queryRunner.ts +++ b/src/sql/workbench/services/query/common/queryRunner.ts @@ -11,7 +11,7 @@ import { ResultSerializer, SaveFormat } from 'sql/workbench/services/query/commo import * as azdata from 'azdata'; import * as nls from 'vs/nls'; -import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { ClipboardData, IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import * as types from 'vs/base/common/types'; import { Disposable } from 'vs/base/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -483,8 +483,8 @@ export default class QueryRunner extends Disposable { * @param resultId The result id of the result to copy from * @param includeHeaders [Optional]: Should column headers be included in the copy selection */ - async copyResults(selections: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { - await this.queryManagementService.copyResults({ + async copyResults(selections: Slick.Range[], batchId: number, resultId: number, includeHeaders?: boolean): Promise { + return this.queryManagementService.copyResults({ ownerUri: this.uri, batchIndex: batchId, resultSetIndex: resultId, @@ -606,7 +606,11 @@ export class QueryGridDataProvider implements IGridDataProvider { private async handleCopyRequestByProvider(selections: Slick.Range[], includeHeaders?: boolean): Promise { executeCopyWithNotification(this._notificationService, this._configurationService, selections, async () => { - await this.queryRunner.copyResults(selections, this.batchId, this.resultSetId, this.shouldIncludeHeaders(includeHeaders)); + let results = await this.queryRunner.copyResults(selections, this.batchId, this.resultSetId, this.shouldIncludeHeaders(includeHeaders)); + let clipboardData: ClipboardData = { + text: results.results + } + this._clipboardService.write(clipboardData); }); } diff --git a/src/sql/workbench/services/query/test/common/testQueryManagementService.ts b/src/sql/workbench/services/query/test/common/testQueryManagementService.ts index b3c0d1f4ea8f..3f9ac8b4675f 100644 --- a/src/sql/workbench/services/query/test/common/testQueryManagementService.ts +++ b/src/sql/workbench/services/query/test/common/testQueryManagementService.ts @@ -66,7 +66,7 @@ export class TestQueryManagementService implements IQueryManagementService { saveResults(requestParams: azdata.SaveResultsRequestParams): Promise { throw new Error('Method not implemented.'); } - copyResults(params: azdata.CopyResultsRequestParams): Promise { + copyResults(params: azdata.CopyResultsRequestParams): Promise { throw new Error('Method not implemented.'); } setQueryExecutionOptions(uri: string, options: azdata.QueryExecutionOptions): Promise { From 15477774fc7d1c99bd039638fc0c809032e403d1 Mon Sep 17 00:00:00 2001 From: Z Chen <13544267+zijchen@users.noreply.github.com> Date: Sat, 9 Sep 2023 19:57:22 -0700 Subject: [PATCH 20/23] Add serverless DW platform (#24246) * Add serverlesss * Add serverless master.dacpac * vbump --------- Co-authored-by: Kim Santiago --- .../SystemDacpacs/Serverless/master.dacpac | Bin 0 -> 208214 bytes extensions/sql-database-projects/package.json | 2 +- .../src/common/constants.ts | 1 + .../sql-database-projects/src/common/utils.ts | 8 ++++---- .../sql-database-projects/src/sqldbproj.d.ts | 1 + 5 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 extensions/sql-database-projects/BuildDirectory/SystemDacpacs/Serverless/master.dacpac diff --git a/extensions/sql-database-projects/BuildDirectory/SystemDacpacs/Serverless/master.dacpac b/extensions/sql-database-projects/BuildDirectory/SystemDacpacs/Serverless/master.dacpac new file mode 100644 index 0000000000000000000000000000000000000000..25880319dc13a63846e5c313372c1a5691a0a862 GIT binary patch literal 208214 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

    ar2i>(eeg51PiwwuGPHINl;ocl7XK=4VlfU(6 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�?>y^hZ||w= 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

    !0*fy+zHqzkjJo{* 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 E17-Zo1ONa4 literal 0 HcmV?d00001 diff --git a/extensions/sql-database-projects/package.json b/extensions/sql-database-projects/package.json index 6bf9289c3202..3117961638ff 100644 --- a/extensions/sql-database-projects/package.json +++ b/extensions/sql-database-projects/package.json @@ -2,7 +2,7 @@ "name": "sql-database-projects", "displayName": "SQL Database Projects", "description": "Enables users to develop and publish database schemas for MSSQL Databases", - "version": "1.3.0", + "version": "1.3.1", "publisher": "Microsoft", "preview": false, "engines": { diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index aba103185d14..09bc764acbbd 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -629,6 +629,7 @@ export const targetPlatformToVersion: Map = new Map Date: Sun, 10 Sep 2023 00:44:56 -0700 Subject: [PATCH 21/23] Juno: check in to lego/hb_04604851-bac4-4681-9f74-73de611d6e48_20230909153928076. (#24358) --- .../LCL/de/Microsoft.mssql.xlf.lcl | 18 +++++++ .../LCL/de/Microsoft.query-store.xlf.lcl | 3 ++ .../LCL/de/Microsoft.sql-migration.xlf.lcl | 9 ++++ resources/localization/LCL/de/sql.xlf.lcl | 48 +++++-------------- .../LCL/es/Microsoft.mssql.xlf.lcl | 18 +++++++ .../LCL/es/Microsoft.query-store.xlf.lcl | 3 ++ .../LCL/es/Microsoft.sql-migration.xlf.lcl | 9 ++++ resources/localization/LCL/es/sql.xlf.lcl | 48 +++++-------------- .../LCL/it/Microsoft.mssql.xlf.lcl | 20 +++++++- .../LCL/it/Microsoft.query-store.xlf.lcl | 3 ++ .../LCL/it/Microsoft.sql-migration.xlf.lcl | 9 ++++ resources/localization/LCL/it/sql.xlf.lcl | 48 +++++-------------- .../LCL/ko/Microsoft.mssql.xlf.lcl | 18 +++++++ .../LCL/ko/Microsoft.query-store.xlf.lcl | 3 ++ .../LCL/ko/Microsoft.sql-migration.xlf.lcl | 11 ++++- resources/localization/LCL/ko/sql.xlf.lcl | 48 +++++-------------- .../LCL/ru/Microsoft.mssql.xlf.lcl | 20 +++++++- .../LCL/ru/Microsoft.query-store.xlf.lcl | 3 ++ .../LCL/ru/Microsoft.sql-migration.xlf.lcl | 9 ++++ resources/localization/LCL/ru/sql.xlf.lcl | 48 +++++-------------- 20 files changed, 213 insertions(+), 183 deletions(-) diff --git a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl index 9930ac89e3b9..bdf95a2a7349 100644 --- a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl @@ -1635,6 +1635,9 @@ + + + @@ -1950,6 +1953,9 @@ + + + @@ -2406,6 +2412,9 @@ + + + @@ -2547,6 +2556,9 @@ + + + @@ -2646,6 +2658,9 @@ + + + @@ -2886,6 +2901,9 @@ + + + diff --git a/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl index aaf61d19f564..f8e4545fcbb3 100644 --- a/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.query-store.xlf.lcl @@ -496,6 +496,9 @@ + + + diff --git a/resources/localization/LCL/de/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/de/Microsoft.sql-migration.xlf.lcl index 31b80dc069a5..0a2b293cc13c 100644 --- a/resources/localization/LCL/de/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/de/sql.xlf.lcl b/resources/localization/LCL/de/sql.xlf.lcl index 64ab17af5d7b..e6ed65b55330 100644 --- a/resources/localization/LCL/de/sql.xlf.lcl +++ b/resources/localization/LCL/de/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl index 076a18a4f2c0..4db5d3c4ac7e 100644 --- a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl @@ -1635,6 +1635,9 @@ + + + @@ -1950,6 +1953,9 @@ + + + @@ -2406,6 +2412,9 @@ + + + @@ -2547,6 +2556,9 @@ + + + @@ -2646,6 +2658,9 @@ + + + @@ -2886,6 +2901,9 @@ + + + diff --git a/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl index fa3e0f829ea6..2702ce381c0b 100644 --- a/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.query-store.xlf.lcl @@ -496,6 +496,9 @@ + + + diff --git a/resources/localization/LCL/es/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/es/Microsoft.sql-migration.xlf.lcl index 4bd9476b31d1..f3e9c09afc57 100644 --- a/resources/localization/LCL/es/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/es/sql.xlf.lcl b/resources/localization/LCL/es/sql.xlf.lcl index d3ad8bb6da7e..ce06ff032fdb 100644 --- a/resources/localization/LCL/es/sql.xlf.lcl +++ b/resources/localization/LCL/es/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl index ad1eb186e896..73860a7aaa2f 100644 --- a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl @@ -1474,7 +1474,7 @@ - + @@ -1635,6 +1635,9 @@ + + + @@ -1950,6 +1953,9 @@ + + + @@ -2406,6 +2412,9 @@ + + + @@ -2547,6 +2556,9 @@ + + + @@ -2646,6 +2658,9 @@ + + + @@ -2886,6 +2901,9 @@ + + + diff --git a/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl index 4b8b9993ab8f..6517454e9a07 100644 --- a/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.query-store.xlf.lcl @@ -496,6 +496,9 @@ + + + diff --git a/resources/localization/LCL/it/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/it/Microsoft.sql-migration.xlf.lcl index f78bf46f7717..3befa1a2111f 100644 --- a/resources/localization/LCL/it/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/it/sql.xlf.lcl b/resources/localization/LCL/it/sql.xlf.lcl index 1424f4bbccf9..32493e230617 100644 --- a/resources/localization/LCL/it/sql.xlf.lcl +++ b/resources/localization/LCL/it/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl index 361934529f2a..d07d896b8556 100644 --- a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl @@ -1635,6 +1635,9 @@ + + + @@ -1950,6 +1953,9 @@ + + + @@ -2406,6 +2412,9 @@ + + + @@ -2547,6 +2556,9 @@ + + + @@ -2646,6 +2658,9 @@ + + + @@ -2886,6 +2901,9 @@ + + + diff --git a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl index 46c7d8c30bda..fdbf8ffeaae2 100644 --- a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl @@ -496,6 +496,9 @@ + + + diff --git a/resources/localization/LCL/ko/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/ko/Microsoft.sql-migration.xlf.lcl index 574f9e745f35..484cf4add595 100644 --- a/resources/localization/LCL/ko/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.sql-migration.xlf.lcl @@ -3599,7 +3599,7 @@ - + @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ko/sql.xlf.lcl b/resources/localization/LCL/ko/sql.xlf.lcl index c0e703a7cc13..57fabb97f3bf 100644 --- a/resources/localization/LCL/ko/sql.xlf.lcl +++ b/resources/localization/LCL/ko/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl index fd2a056b02d5..0ed258f2c4a8 100644 --- a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl @@ -1474,7 +1474,7 @@ - + @@ -1635,6 +1635,9 @@ + + + @@ -1950,6 +1953,9 @@ + + + @@ -2406,6 +2412,9 @@ + + + @@ -2547,6 +2556,9 @@ + + + @@ -2646,6 +2658,9 @@ + + + @@ -2886,6 +2901,9 @@ + + + diff --git a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl index dbc9afc7346e..14918fda91fc 100644 --- a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl @@ -496,6 +496,9 @@ + + + diff --git a/resources/localization/LCL/ru/Microsoft.sql-migration.xlf.lcl b/resources/localization/LCL/ru/Microsoft.sql-migration.xlf.lcl index 72ca5f476cdc..73652acf4d6c 100644 --- a/resources/localization/LCL/ru/Microsoft.sql-migration.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.sql-migration.xlf.lcl @@ -8317,6 +8317,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ru/sql.xlf.lcl b/resources/localization/LCL/ru/sql.xlf.lcl index da94ef68c60b..154480ed604f 100644 --- a/resources/localization/LCL/ru/sql.xlf.lcl +++ b/resources/localization/LCL/ru/sql.xlf.lcl @@ -1647,6 +1647,18 @@ + + + + + + + + + + + + @@ -15390,24 +15402,6 @@ - - - - - - - - - - - - - - - - - - @@ -15417,24 +15411,6 @@ - - - - - - - - - - - - - - - - - - From f940e931f5e49441b48ff3dbb0936a469f2aae86 Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Mon, 11 Sep 2023 09:44:11 -0700 Subject: [PATCH 22/23] Juno: check in to lego/hb_04604851-bac4-4681-9f74-73de611d6e48_20230910154305184. (#24360) --- .../LCL/de/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- resources/localization/LCL/de/sql.xlf.lcl | 9 + .../LCL/es/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- resources/localization/LCL/es/sql.xlf.lcl | 9 + .../LCL/fr/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- resources/localization/LCL/fr/sql.xlf.lcl | 9 + .../LCL/it/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- resources/localization/LCL/it/sql.xlf.lcl | 9 + .../LCL/ja/Microsoft.mssql.xlf.lcl | 296 +++++++++++++++++- .../LCL/ja/Microsoft.query-store.xlf.lcl | 9 + resources/localization/LCL/ja/sql.xlf.lcl | 9 + .../LCL/ko/Microsoft.mssql.xlf.lcl | 296 +++++++++++++++++- .../LCL/ko/Microsoft.query-store.xlf.lcl | 9 + resources/localization/LCL/ko/sql.xlf.lcl | 9 + .../LCL/pt-BR/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- resources/localization/LCL/pt-BR/sql.xlf.lcl | 9 + .../LCL/ru/Microsoft.mssql.xlf.lcl | 296 +++++++++++++++++- .../LCL/ru/Microsoft.query-store.xlf.lcl | 9 + resources/localization/LCL/ru/sql.xlf.lcl | 9 + .../LCL/zh-Hans/Microsoft.mssql.xlf.lcl | 284 ++++++++++++++++- .../localization/LCL/zh-Hans/sql.xlf.lcl | 9 + .../LCL/zh-Hant/Microsoft.mssql.xlf.lcl | 296 +++++++++++++++++- .../LCL/zh-Hant/Microsoft.query-store.xlf.lcl | 9 + .../localization/LCL/zh-Hant/sql.xlf.lcl | 9 + 24 files changed, 2974 insertions(+), 40 deletions(-) diff --git a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl index bdf95a2a7349..52850287f6ae 100644 --- a/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/de/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/de/sql.xlf.lcl b/resources/localization/LCL/de/sql.xlf.lcl index e6ed65b55330..5e0d00ec67b8 100644 --- a/resources/localization/LCL/de/sql.xlf.lcl +++ b/resources/localization/LCL/de/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl index 4db5d3c4ac7e..27edc0f86beb 100644 --- a/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/es/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/es/sql.xlf.lcl b/resources/localization/LCL/es/sql.xlf.lcl index ce06ff032fdb..0144f07a2e3a 100644 --- a/resources/localization/LCL/es/sql.xlf.lcl +++ b/resources/localization/LCL/es/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl index 69815c5d5376..311f9090cb93 100644 --- a/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/fr/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/fr/sql.xlf.lcl b/resources/localization/LCL/fr/sql.xlf.lcl index 8c263756313e..ae8cea0438ad 100644 --- a/resources/localization/LCL/fr/sql.xlf.lcl +++ b/resources/localization/LCL/fr/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl index 73860a7aaa2f..d04499ebf428 100644 --- a/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/it/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/it/sql.xlf.lcl b/resources/localization/LCL/it/sql.xlf.lcl index 32493e230617..f763147e6623 100644 --- a/resources/localization/LCL/it/sql.xlf.lcl +++ b/resources/localization/LCL/it/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl index dd781c3359fc..bf3999489cca 100644 --- a/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ja/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +942,18 @@ + + + + + + + + + + + + @@ -822,6 +1002,18 @@ + + + + + + + + + + + + @@ -834,6 +1026,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1062,18 @@ + + + + + + + + + + + + @@ -858,6 +1086,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1158,18 @@ + + + + + + + + + + + + @@ -1869,6 +2133,15 @@ + + + + + + + + + @@ -3588,6 +3861,15 @@ + + + + + + + + + @@ -4310,10 +4592,13 @@ - + - + + + + @@ -4406,10 +4691,13 @@ - + - + + + + diff --git a/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl index 60f5dfa72fbc..360d17ea9d83 100644 --- a/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ja/Microsoft.query-store.xlf.lcl @@ -439,6 +439,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ja/sql.xlf.lcl b/resources/localization/LCL/ja/sql.xlf.lcl index b4459719a7af..bc9ad43758d0 100644 --- a/resources/localization/LCL/ja/sql.xlf.lcl +++ b/resources/localization/LCL/ja/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl index d07d896b8556..bb9686c0d2ce 100644 --- a/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +942,18 @@ + + + + + + + + + + + + @@ -822,6 +1002,18 @@ + + + + + + + + + + + + @@ -834,6 +1026,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1062,18 @@ + + + + + + + + + + + + @@ -858,6 +1086,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1158,18 @@ + + + + + + + + + + + + @@ -1869,6 +2133,15 @@ + + + + + + + + + @@ -3588,6 +3861,15 @@ + + + + + + + + + @@ -4310,10 +4592,13 @@ - + - + + + + @@ -4406,10 +4691,13 @@ - + - + + + + diff --git a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl index fdbf8ffeaae2..b1f515613d12 100644 --- a/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ko/Microsoft.query-store.xlf.lcl @@ -439,6 +439,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ko/sql.xlf.lcl b/resources/localization/LCL/ko/sql.xlf.lcl index 57fabb97f3bf..cece6ecc9917 100644 --- a/resources/localization/LCL/ko/sql.xlf.lcl +++ b/resources/localization/LCL/ko/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl index c180c5b0f24c..39d1493c7c2e 100644 --- a/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/pt-BR/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/pt-BR/sql.xlf.lcl b/resources/localization/LCL/pt-BR/sql.xlf.lcl index 30bd58d49c22..895decb7339b 100644 --- a/resources/localization/LCL/pt-BR/sql.xlf.lcl +++ b/resources/localization/LCL/pt-BR/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl index 0ed258f2c4a8..76c631c8a542 100644 --- a/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +942,18 @@ + + + + + + + + + + + + @@ -822,6 +1002,18 @@ + + + + + + + + + + + + @@ -834,6 +1026,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1062,18 @@ + + + + + + + + + + + + @@ -858,6 +1086,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1158,18 @@ + + + + + + + + + + + + @@ -1869,6 +2133,15 @@ + + + + + + + + + @@ -3588,6 +3861,15 @@ + + + + + + + + + @@ -4310,10 +4592,13 @@ - + - + + + + @@ -4406,10 +4691,13 @@ - + - + + + + diff --git a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl index 14918fda91fc..27118757044e 100644 --- a/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/ru/Microsoft.query-store.xlf.lcl @@ -439,6 +439,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/ru/sql.xlf.lcl b/resources/localization/LCL/ru/sql.xlf.lcl index 154480ed604f..1efcfc84ef65 100644 --- a/resources/localization/LCL/ru/sql.xlf.lcl +++ b/resources/localization/LCL/ru/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl index c44aa78ac6c4..3917e4f9dd82 100644 --- a/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +936,18 @@ + + + + + + + + + + + + @@ -822,6 +996,18 @@ + + + + + + + + + + + + @@ -834,6 +1020,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1053,18 @@ + + + + + + + + + + + + @@ -858,6 +1077,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1149,18 @@ + + + + + + + + + + + + @@ -1869,6 +2124,15 @@ + + + + + + + + + @@ -3588,6 +3852,12 @@ + + + + + + @@ -4310,10 +4580,13 @@ - - + + + + + @@ -4406,10 +4679,13 @@ - - + + + + + diff --git a/resources/localization/LCL/zh-Hans/sql.xlf.lcl b/resources/localization/LCL/zh-Hans/sql.xlf.lcl index e36baf3f63a7..e5838498a515 100644 --- a/resources/localization/LCL/zh-Hans/sql.xlf.lcl +++ b/resources/localization/LCL/zh-Hans/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl b/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl index 03194e06455a..a58e2a99d065 100644 --- a/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/Microsoft.mssql.xlf.lcl @@ -168,6 +168,18 @@ + + + + + + + + + + + + @@ -315,6 +327,18 @@ + + + + + + + + + + + + @@ -350,6 +374,15 @@ + + + + + + + + + @@ -465,6 +498,18 @@ + + + + + + + + + + + + @@ -678,6 +723,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -714,6 +783,18 @@ + + + + + + + + + + + + @@ -738,6 +819,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -774,6 +942,18 @@ + + + + + + + + + + + + @@ -822,6 +1002,18 @@ + + + + + + + + + + + + @@ -834,6 +1026,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -846,6 +1062,18 @@ + + + + + + + + + + + + @@ -858,6 +1086,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -906,6 +1158,18 @@ + + + + + + + + + + + + @@ -1869,6 +2133,15 @@ + + + + + + + + + @@ -3588,6 +3861,15 @@ + + + + + + + + + @@ -4310,10 +4592,13 @@ - + - + + + + @@ -4406,10 +4691,13 @@ - + - + + + + diff --git a/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl b/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl index 2148ed2206ab..07fcdc13d8e0 100644 --- a/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/Microsoft.query-store.xlf.lcl @@ -439,6 +439,15 @@ + + + + + + + + + diff --git a/resources/localization/LCL/zh-Hant/sql.xlf.lcl b/resources/localization/LCL/zh-Hant/sql.xlf.lcl index 8176bab99591..98830454e3cd 100644 --- a/resources/localization/LCL/zh-Hant/sql.xlf.lcl +++ b/resources/localization/LCL/zh-Hant/sql.xlf.lcl @@ -18825,6 +18825,15 @@ + + + + + + + + + From 89e41572a8f91dab6f56d5b932e602af5a3555c1 Mon Sep 17 00:00:00 2001 From: erpett <97994807+erpett@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:54:47 -0700 Subject: [PATCH 23/23] updating release version in main post release branch split (#24374) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 25f36956a8fd..cba37fbae2f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "azuredatastudio", - "version": "1.46.0", + "version": "1.47.0", "distro": "7f4613d9a9266732a1d3a616e3d4112495083a71", "author": { "name": "Microsoft Corporation"