diff --git a/build/package.json b/build/package.json index 2a6b648e81..e6dd462545 100644 --- a/build/package.json +++ b/build/package.json @@ -9,20 +9,21 @@ "@types/mime": "0.0.29", "@types/minimatch": "^3.0.3", "@types/node": "8.0.33", - "@types/xml2js": "0.0.33", "@types/request": "^2.47.0", + "@types/xml2js": "0.0.33", "azure-storage": "^2.1.0", "decompress": "^4.2.0", + "del": "^3.0.0", "documentdb": "1.13.0", - "service-downloader": "github:anthonydresser/service-downloader#0.1.5", "fs-extra-promise": "^1.0.1", + "github-releases": "^0.4.1", "mime": "^1.3.4", "minimist": "^1.2.0", + "request": "^2.85.0", + "service-downloader": "github:anthonydresser/service-downloader#0.1.5", "typescript": "2.9.2", "vscode": "^1.0.1", - "xml2js": "^0.4.17", - "github-releases": "^0.4.1", - "request": "^2.85.0" + "xml2js": "^0.4.17" }, "scripts": { "compile": "tsc -p tsconfig.build.json", @@ -30,4 +31,4 @@ "postinstall": "npm run compile", "npmCheckJs": "tsc --noEmit" } -} \ No newline at end of file +} diff --git a/build/yarn.lock b/build/yarn.lock index c92047d496..49c3f3106a 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -571,6 +571,18 @@ deep-assign@^1.0.0: dependencies: is-obj "^1.0.0" +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -942,6 +954,29 @@ glob@^5.0.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + glogg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" @@ -1313,6 +1348,25 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1778,6 +1832,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -1798,6 +1857,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -1820,7 +1884,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.3.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -2118,7 +2182,7 @@ requires-port@~1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= -rimraf@2: +rimraf@2, rimraf@^2.2.8: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== diff --git a/extensions/import/package.json b/extensions/import/package.json index b3d6d7bac0..a1afff3837 100644 --- a/extensions/import/package.json +++ b/extensions/import/package.json @@ -67,7 +67,7 @@ } }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.7", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10", "opener": "^1.4.3", "service-downloader": "github:anthonydresser/service-downloader#0.1.5", "vscode-extension-telemetry": "0.0.18", diff --git a/extensions/import/yarn.lock b/extensions/import/yarn.lock index b1e352edce..ff08225ee8 100644 --- a/extensions/import/yarn.lock +++ b/extensions/import/yarn.lock @@ -11,7 +11,7 @@ agent-base@4, agent-base@^4.1.0: applicationinsights@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927" + resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927" integrity sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc= dependencies: diagnostic-channel "0.2.0" @@ -36,7 +36,7 @@ buffer-alloc-unsafe@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== -buffer-alloc@^1.1.0: +buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== @@ -75,19 +75,26 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.7": - version "0.2.6" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/85653d8b305af8aef334728d71f07bdc240dfcb7" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10": + version "0.2.10" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8" dependencies: vscode-languageclient "3.5.1" -debug@3.1.0, debug@^3.1.0: +debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" @@ -143,12 +150,12 @@ decompress@^4.2.0: diagnostic-channel-publishers@0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3" + resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3" integrity sha1-ji1geottef6IC1SLxYzGvrKIxPM= diagnostic-channel@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17" + resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17" integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc= dependencies: semver "^5.3.0" @@ -161,9 +168,9 @@ end-of-stream@^1.0.0: once "^1.4.0" es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== es6-promisify@^5.0.0: version "5.0.0" @@ -213,9 +220,9 @@ get-stream@^2.2.0: pinkie-promise "^2.0.0" graceful-fs@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -287,6 +294,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -300,9 +312,9 @@ once@^1.4.0: wrappy "1" opener@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" - integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== os-tmpdir@~1.0.2: version "1.0.2" @@ -368,7 +380,7 @@ seek-bzip@^1.0.5: semver@^5.3.0: version "5.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== "service-downloader@github:anthonydresser/service-downloader#0.1.5": @@ -397,16 +409,16 @@ strip-dirs@^2.0.0: is-natural-number "^4.0.1" tar-stream@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" - integrity sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" - buffer-alloc "^1.1.0" + buffer-alloc "^1.2.0" end-of-stream "^1.0.0" fs-constants "^1.0.0" readable-stream "^2.3.0" - to-buffer "^1.1.0" + to-buffer "^1.1.1" xtend "^4.0.0" through@^2.3.6: @@ -421,15 +433,15 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-buffer@^1.1.0: +to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== unbzip2-stream@^1.0.9: - version "1.2.5" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" - integrity sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og== + version "1.3.1" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1" + integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw== dependencies: buffer "^3.0.1" through "^2.3.6" @@ -441,7 +453,7 @@ util-deprecate@~1.0.1: vscode-extension-telemetry@0.0.18: version "0.0.18" - resolved "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327" integrity sha512-Vw3Sr+dZwl+c6PlsUwrTtCOJkgrmvS3OUVDQGcmpXWAgq9xGq6as0K4pUx+aGqTjzLAESmWSrs6HlJm6J6Khcg== dependencies: applicationinsights "1.0.1" @@ -472,9 +484,9 @@ vscode-languageserver-types@3.5.0: integrity sha1-5I15li8LjgLelV4/UkkI4rGcA3Q= vscode-nls@^3.2.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.4.tgz#2166b4183c8aea884d20727f5449e62be69fd398" - integrity sha512-FTjdqa4jDDoBjJqr36O8lmmZf/55kQ2w4ZY/+GL6K92fq765BqO3aYw21atnXUno/P04V5DWagNl4ybDIndJsw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.5.tgz#25520c1955108036dec607c85e00a522f247f1a4" + integrity sha512-ITtoh3V4AkWXMmp3TB97vsMaHRgHhsSFPsUdzlueSL+dRZbSNTZeOmdQv60kjCV306ghPxhDeoNUEm3+EZMuyw== wrappy@1: version "1.0.2" @@ -496,5 +508,5 @@ yauzl@^2.4.2: zone.js@0.7.6: version "0.7.6" - resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009" integrity sha1-+7w50+AmHQmG8boGMG6zrrDSIAk= diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 91fa8e533a..8f2322f065 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -18,7 +18,7 @@ "update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-mssql syntaxes/SQL.plist ./syntaxes/sql.tmLanguage.json" }, "dependencies": { - "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.9", + "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10", "opener": "^1.4.3", "service-downloader": "github:anthonydresser/service-downloader#0.1.5", "vscode-extension-telemetry": "^0.0.15" diff --git a/extensions/mssql/yarn.lock b/extensions/mssql/yarn.lock index fa295abb5f..72631c1c82 100644 --- a/extensions/mssql/yarn.lock +++ b/extensions/mssql/yarn.lock @@ -36,7 +36,7 @@ buffer-alloc-unsafe@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== -buffer-alloc@^1.1.0: +buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== @@ -75,19 +75,26 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.9": - version "0.2.9" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/0a3c0f22940d1c67bb567171508ccb1169c6313a" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10": + version "0.2.10" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8" dependencies: vscode-languageclient "3.5.1" -debug@3.1.0, debug@^3.1.0: +debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" @@ -161,9 +168,9 @@ end-of-stream@^1.0.0: once "^1.4.0" es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== es6-promisify@^5.0.0: version "5.0.0" @@ -213,9 +220,9 @@ get-stream@^2.2.0: pinkie-promise "^2.0.0" graceful-fs@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -287,6 +294,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -300,9 +312,9 @@ once@^1.4.0: wrappy "1" opener@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" - integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== os-tmpdir@~1.0.2: version "1.0.2" @@ -367,9 +379,9 @@ seek-bzip@^1.0.5: commander "~2.8.1" semver@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== "service-downloader@github:anthonydresser/service-downloader#0.1.5": version "0.1.5" @@ -397,16 +409,16 @@ strip-dirs@^2.0.0: is-natural-number "^4.0.1" tar-stream@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" - integrity sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" - buffer-alloc "^1.1.0" + buffer-alloc "^1.2.0" end-of-stream "^1.0.0" fs-constants "^1.0.0" readable-stream "^2.3.0" - to-buffer "^1.1.0" + to-buffer "^1.1.1" xtend "^4.0.0" through@^2.3.6: @@ -421,15 +433,15 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-buffer@^1.1.0: +to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== unbzip2-stream@^1.0.9: - version "1.2.5" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" - integrity sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og== + version "1.3.1" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1" + integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw== dependencies: buffer "^3.0.1" through "^2.3.6" diff --git a/package.json b/package.json index 7db1bc4aec..1d1a089802 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "rxjs": "5.4.0", "sanitize-html": "^1.19.1", "semver": "^5.5.0", - "slickgrid": "github:anthonydresser/SlickGrid#2.3.28", + "slickgrid": "github:anthonydresser/SlickGrid#2.3.29", "spdlog": "0.7.1", "sudo-prompt": "8.2.0", "svg.js": "^2.2.5", @@ -174,6 +174,7 @@ "windows-process-tree": "0.2.2" }, "resolutions": { - "rc": "1.2.8" + "rc": "1.2.8", + "event-stream": "3.3.4" } } diff --git a/src/sql/base/browser/ui/table/asyncDataView.ts b/src/sql/base/browser/ui/table/asyncDataView.ts index 5777dc2f36..8681a5b637 100644 --- a/src/sql/base/browser/ui/table/asyncDataView.ts +++ b/src/sql/base/browser/ui/table/asyncDataView.ts @@ -9,36 +9,27 @@ export interface IObservableCollection { getLength(): number; at(index: number): T; getRange(start: number, end: number): T[]; - setCollectionChangedCallback(callback: (change: CollectionChange, startIndex: number, count: number) => void): void; + setCollectionChangedCallback(callback: (startIndex: number, count: number) => void): void; + setLength(number): void; dispose(): void; } -export interface IGridDataRow { - row?: number; - values: any[]; -} - -export enum CollectionChange { - ItemsReplaced -} - class LoadCancellationToken { isCancelled: boolean; } -class DataWindow { - private _data: TData[]; +class DataWindow { + private _data: T[]; private _length: number = 0; private _offsetFromDataSource: number = -1; private lastLoadCancellationToken: LoadCancellationToken; constructor( - private loadFunction: (offset: number, count: number) => Thenable, - private placeholderItemGenerator: (index: number) => TData, + private loadFunction: (offset: number, count: number) => Thenable, + private placeholderItemGenerator: (index: number) => T, private loadCompleteCallback: (start: number, end: number) => void - ) { - } + ) { } dispose() { this._data = undefined; @@ -50,26 +41,26 @@ class DataWindow { } } - getStartIndex(): number { + public getStartIndex(): number { return this._offsetFromDataSource; } - getEndIndex(): number { + public getEndIndex(): number { return this._offsetFromDataSource + this._length; } - contains(dataSourceIndex: number): boolean { + public contains(dataSourceIndex: number): boolean { return dataSourceIndex >= this.getStartIndex() && dataSourceIndex < this.getEndIndex(); } - getItem(index: number): TData { + public getItem(index: number): T { if (!this._data) { return this.placeholderItemGenerator(index); } return this._data[index - this._offsetFromDataSource]; } - positionWindow(offset: number, length: number): void { + public positionWindow(offset: number, length: number): void { this._offsetFromDataSource = offset; this._length = length; this._data = undefined; @@ -92,34 +83,28 @@ class DataWindow { } } -export class VirtualizedCollection implements IObservableCollection { +export class VirtualizedCollection implements IObservableCollection { + private _bufferWindowBefore: DataWindow; + private _window: DataWindow; + private _bufferWindowAfter: DataWindow; - private _length: number; - private _windowSize: number; - private _bufferWindowBefore: DataWindow; - private _window: DataWindow; - private _bufferWindowAfter: DataWindow; - - private collectionChangedCallback: (change: CollectionChange, startIndex: number, count: number) => void; + private collectionChangedCallback: (startIndex: number, count: number) => void; constructor( - windowSize: number, - length: number, - loadFn: (offset: number, count: number) => Thenable, - private _placeHolderGenerator: (index: number) => TData + private readonly windowSize: number, + private placeHolderGenerator: (index: number) => T, + private length: number, + loadFn: (offset: number, count: number) => Thenable ) { - this._windowSize = windowSize; - this._length = length; - let loadCompleteCallback = (start: number, end: number) => { if (this.collectionChangedCallback) { - this.collectionChangedCallback(CollectionChange.ItemsReplaced, start, end - start); + this.collectionChangedCallback(start, end - start); } }; - this._bufferWindowBefore = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); - this._window = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); - this._bufferWindowAfter = new DataWindow(loadFn, _placeHolderGenerator, loadCompleteCallback); + this._bufferWindowBefore = new DataWindow(loadFn, placeHolderGenerator, loadCompleteCallback); + this._window = new DataWindow(loadFn, placeHolderGenerator, loadCompleteCallback); + this._bufferWindowAfter = new DataWindow(loadFn, placeHolderGenerator, loadCompleteCallback); } dispose() { @@ -128,19 +113,23 @@ export class VirtualizedCollection implements IObservableCollection void): void { + public setCollectionChangedCallback(callback: (startIndex: number, count: number) => void): void { this.collectionChangedCallback = callback; } - getLength(): number { - return this._length; + public getLength(): number { + return this.length; } - at(index: number): TData { + setLength(number: any): void { + this.length = number; + } + + public at(index: number): T { return this.getRange(index, index + 1)[0]; } - getRange(start: number, end: number): TData[] { + public getRange(start: number, end: number): T[] { // current data may contain placeholders let currentData = this.getRangeFromCurrent(start, end); @@ -155,7 +144,7 @@ export class VirtualizedCollection implements IObservableCollection= this._bufferWindowAfter.getStartIndex()) { @@ -164,8 +153,8 @@ export class VirtualizedCollection implements IObservableCollection implements IObservableCollection implements IObservableCollection implements IObservableCollection implements IDisposableDataProvider { +export class AsyncDataProvider implements IDisposableDataProvider { - constructor(private dataRows: IObservableCollection) { } + constructor(public dataRows: IObservableCollection) { } public getLength(): number { - return this.dataRows ? this.dataRows.getLength() : 0; + return this.dataRows.getLength(); } - public getItem(index: number): TData { - return !this.dataRows ? undefined : this.dataRows.at(index); + public getItem(index: number): T { + return this.dataRows.at(index); } - public getRange(start: number, end: number): TData[] { - return !this.dataRows ? undefined : this.dataRows.getRange(start, end); + public getRange(start: number, end: number): T[] { + return this.dataRows.getRange(start, end); + } + + public set length(length: number) { + this.dataRows.setLength(length); + } + + public get length(): number { + return this.dataRows.getLength(); } dispose() { diff --git a/src/sql/base/browser/ui/table/plugins/rowNumberColumn.plugin.ts b/src/sql/base/browser/ui/table/plugins/rowNumberColumn.plugin.ts index 547dcd15f3..789832b51d 100644 --- a/src/sql/base/browser/ui/table/plugins/rowNumberColumn.plugin.ts +++ b/src/sql/base/browser/ui/table/plugins/rowNumberColumn.plugin.ts @@ -5,8 +5,6 @@ 'use strict'; -import { range } from 'vs/base/common/arrays'; - export interface IRowNumberColumnOptions { numberOfRows: number; cssClass?: string; @@ -17,7 +15,7 @@ const sizePerDigit = 15; export class RowNumberColumn implements Slick.Plugin { private handler = new Slick.EventHandler(); private grid: Slick.Grid; - + private currentColumnWidth: number; constructor(private options: IRowNumberColumnOptions) { } @@ -52,19 +50,25 @@ export class RowNumberColumn implements Slick.Plugin { } } + public updateRowCount(rowNum: number) { + this.options.numberOfRows = rowNum; + let columnWidth = Math.max(this.options.numberOfRows.toString().length * sizePerDigit, 22); + if (columnWidth !== this.currentColumnWidth) { + this.grid.setColumnWidths([this.getColumnDefinition()]); + } + } + public getColumnDefinition(): Slick.Column { // that smallest we can make it is 22 due to padding and margins in the cells - let columnWidth = Math.max(this.options.numberOfRows.toString().length * sizePerDigit, 22); + this.currentColumnWidth = Math.max(this.options.numberOfRows.toString().length * sizePerDigit, 22); return { id: 'rowNumber', name: '', field: 'rowNumber', - width: columnWidth, - minWidth: columnWidth, - maxWidth: columnWidth, + width: this.currentColumnWidth, resizable: false, cssClass: this.options.cssClass, - focusable: false, + focusable: true, selectable: false, formatter: (r, c, v, cd, dc) => this.formatter(r, c, v, cd, dc) }; diff --git a/src/sql/parts/grid/services/sharedServices.ts b/src/sql/parts/grid/services/sharedServices.ts index f076038a29..76184487a0 100644 --- a/src/sql/parts/grid/services/sharedServices.ts +++ b/src/sql/parts/grid/services/sharedServices.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { $ } from 'vs/base/browser/dom'; import { escape } from 'sql/base/common/strings'; export class DBCellValue { @@ -41,20 +40,24 @@ export function hyperLinkFormatter(row: number, cell: any, value: any, columnDef */ export function textFormatter(row: number, cell: any, value: any, columnDef: any, dataContext: any): string { let cellClasses = 'grid-cell-value-container'; - let valueToDisplay: string = ''; + let valueToDisplay = ''; + let titleValue = ''; if (DBCellValue.isDBCellValue(value)) { valueToDisplay = 'NULL'; if (!value.isNull) { - valueToDisplay = escape(value.displayValue.replace(/(\r\n|\n|\r)/g, ' ')); + valueToDisplay = value.displayValue.replace(/(\r\n|\n|\r)/g, ' '); + valueToDisplay = escape(valueToDisplay.length > 250 ? valueToDisplay.slice(0, 250) + '...' : valueToDisplay); + titleValue = value.displayValue; } else { cellClasses += ' missing-value'; } } else if (typeof value === 'string') { - valueToDisplay = escape(value); + valueToDisplay = escape(value.length > 250 ? value.slice(0, 250) + '...' : value); + titleValue = value; } - return `${valueToDisplay}`; + return `${valueToDisplay}`; } /** The following code is a rewrite over the both formatter function using dom builder diff --git a/src/sql/parts/query/common/queryManagement.ts b/src/sql/parts/query/common/queryManagement.ts index 65ea8ff449..a50eb75318 100644 --- a/src/sql/parts/query/common/queryManagement.ts +++ b/src/sql/parts/query/common/queryManagement.ts @@ -29,7 +29,7 @@ export interface IQueryManagementService { runQueryStatement(ownerUri: string, line: number, column: number): Thenable; runQueryString(ownerUri: string, queryString: string): Thenable; runQueryAndReturn(ownerUri: string, queryString: string): Thenable; - parseSyntax(ownerUri:string, query: string): Thenable; + parseSyntax(ownerUri: string, query: string): Thenable; getQueryRows(rowData: sqlops.QueryExecuteSubsetParams): Thenable; disposeQuery(ownerUri: string): Thenable; saveResults(requestParams: sqlops.SaveResultsRequestParams): Thenable; @@ -38,7 +38,8 @@ export interface IQueryManagementService { onQueryComplete(result: sqlops.QueryExecuteCompleteNotificationResult): void; onBatchStart(batchInfo: sqlops.QueryExecuteBatchNotificationParams): void; onBatchComplete(batchInfo: sqlops.QueryExecuteBatchNotificationParams): void; - onResultSetComplete(resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void; + onResultSetAvailable(resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void; + onResultSetUpdated(resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void; onMessage(message: sqlops.QueryExecuteMessageParams): void; // Edit Data Callbacks @@ -65,7 +66,7 @@ export interface IQueryRequestHandler { runQueryStatement(ownerUri: string, line: number, column: number): Thenable; runQueryString(ownerUri: string, queryString: string): Thenable; runQueryAndReturn(ownerUri: string, queryString: string): Thenable; - parseSyntax(ownerUri:string, query: string): Thenable; + parseSyntax(ownerUri: string, query: string): Thenable; getQueryRows(rowData: sqlops.QueryExecuteSubsetParams): Thenable; disposeQuery(ownerUri: string): Thenable; saveResults(requestParams: sqlops.SaveResultsRequestParams): Thenable; @@ -244,9 +245,15 @@ export class QueryManagementService implements IQueryManagementService { }); } - public onResultSetComplete(resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void { + public onResultSetAvailable(resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { this._notify(resultSetInfo.ownerUri, (runner: QueryRunner) => { - runner.handleResultSetComplete(resultSetInfo); + runner.handleResultSetAvailable(resultSetInfo); + }); + } + + public onResultSetUpdated(resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { + this._notify(resultSetInfo.ownerUri, (runner: QueryRunner) => { + runner.handleResultSetUpdated(resultSetInfo); }); } diff --git a/src/sql/parts/query/editor/gridPanel.ts b/src/sql/parts/query/editor/gridPanel.ts index 098ce82117..abe28a5ba1 100644 --- a/src/sql/parts/query/editor/gridPanel.ts +++ b/src/sql/parts/query/editor/gridPanel.ts @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as pretty from 'pretty-data'; + import { attachTableStyler } from 'sql/common/theme/styler'; import QueryRunner from 'sql/parts/query/execution/queryRunner'; import { VirtualizedCollection, AsyncDataProvider } from 'sql/base/browser/ui/table/asyncDataView'; @@ -12,7 +14,7 @@ import { ScrollableSplitView } from 'sql/base/browser/ui/scrollableSplitview/scr import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin'; import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin'; import { SaveFormat } from 'sql/parts/grid/common/interfaces'; -import { IGridActionContext, SaveResultAction, CopyResultAction, SelectAllGridAction, MaximizeTableAction, RestoreTableAction, ChartDataAction, ShowQueryPlanAction } from 'sql/parts/query/editor/actions'; +import { IGridActionContext, SaveResultAction, CopyResultAction, SelectAllGridAction, MaximizeTableAction, RestoreTableAction, ChartDataAction } from 'sql/parts/query/editor/actions'; import { CellSelectionModel } from 'sql/base/browser/ui/table/plugins/cellSelectionModel.plugin'; import { RowNumberColumn } from 'sql/base/browser/ui/table/plugins/rowNumberColumn.plugin'; import { escape } from 'sql/base/common/strings'; @@ -20,9 +22,9 @@ import { hyperLinkFormatter, textFormatter } from 'sql/parts/grid/services/share import { CopyKeybind } from 'sql/base/browser/ui/table/plugins/copyKeybind.plugin'; import { AdditionalKeyBindings } from 'sql/base/browser/ui/table/plugins/additionalKeyBindings.plugin'; import { ITableStyles, ITableMouseEvent } from 'sql/base/browser/ui/table/interfaces'; +import { warn } from 'sql/base/common/log'; import * as sqlops from 'sqlops'; -import * as pretty from 'pretty-data'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -38,7 +40,7 @@ import { $ } from 'vs/base/browser/builder'; import { generateUuid } from 'vs/base/common/uuid'; import { TPromise } from 'vs/base/common/winjs.base'; import { Separator, ActionBar, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; -import { Dimension, getContentWidth, isInDOM } from 'vs/base/browser/dom'; +import { isInDOM } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -175,7 +177,8 @@ export class GridPanel extends ViewletPanel { this.reset(); this.queryRunnerDisposables = []; this.runner = runner; - this.queryRunnerDisposables.push(this.runner.onResultSet(e => this.onResultSet(e))); + this.queryRunnerDisposables.push(this.runner.onResultSet(this.onResultSet, this)); + this.queryRunnerDisposables.push(this.runner.onResultSetUpdate(this.updateResultSet, this)); this.queryRunnerDisposables.push(this.runner.onQueryStart(() => { if (this.state) { this.state.tableStates = []; @@ -200,6 +203,33 @@ export class GridPanel extends ViewletPanel { } } + private updateResultSet(resultSet: sqlops.ResultSetSummary | sqlops.ResultSetSummary[]) { + + let resultsToUpdate: sqlops.ResultSetSummary[]; + if (!Array.isArray(resultSet)) { + resultsToUpdate = [resultSet]; + } else { + resultsToUpdate = resultSet; + } + + for (let set of resultsToUpdate) { + let table = this.tables.find(t => t.resultSet.batchId === set.batchId && t.resultSet.id === set.id); + if (table) { + table.updateResult(set); + } else { + warn('Got result set update request for non-existant table'); + } + } + + this.maximumBodySize = this.tables.reduce((p, c) => { + return p + c.maximumSize; + }, 0); + + if (this.state && this.state.scrollPosition) { + this.splitView.setScrollPosition(this.state.scrollPosition); + } + } + private addResultSet(resultSet: sqlops.ResultSetSummary | sqlops.ResultSetSummary[]) { let resultsToAdd: sqlops.ResultSetSummary[]; if (!Array.isArray(resultSet)) { @@ -323,9 +353,12 @@ class GridTable extends Disposable implements IView { private selectionModel = new CellSelectionModel(); private styles: ITableStyles; private currentHeight: number; + private dataProvider: AsyncDataProvider; private columns: Slick.Column[]; + private rowNumberColumn: RowNumberColumn; + private _onDidChange = new Emitter(); public readonly onDidChange: Event = this._onDidChange.event; @@ -335,13 +368,20 @@ class GridTable extends Disposable implements IView { private _state: GridTableState; private scrolled = false; + private visible = false; + + public get resultSet(): sqlops.ResultSetSummary { + return this._resultSet; + } // this handles if the row count is small, like 4-5 rows - private readonly maxSize = ((this.resultSet.rowCount) * ROW_HEIGHT) + HEADER_HEIGHT + ESTIMATED_SCROLL_BAR_HEIGHT; + private get maxSize(): number { + return ((this.resultSet.rowCount) * ROW_HEIGHT) + HEADER_HEIGHT + ESTIMATED_SCROLL_BAR_HEIGHT; + } constructor( private runner: QueryRunner, - public readonly resultSet: sqlops.ResultSetSummary, + private _resultSet: sqlops.ResultSetSummary, @IContextMenuService private contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService, @IEditorService private editorService: IEditorService, @@ -367,7 +407,31 @@ class GridTable extends Disposable implements IView { }); } + public onAdd() { + this.visible = true; + let collection = new VirtualizedCollection( + 50, + index => this.placeholdGenerator(index), + this.resultSet.rowCount, + (offset, count) => this.loadData(offset, count) + ); + collection.setCollectionChangedCallback((startIndex, count) => { + this.renderGridDataRowsRange(startIndex, count); + }); + this.dataProvider.dataRows = collection; + this.table.updateRowCount(); + } + public onRemove() { + this.visible = false; + let collection = new VirtualizedCollection( + 50, + index => this.placeholdGenerator(index), + 0, + () => TPromise.as([]) + ); + this.dataProvider.dataRows = collection; + this.table.updateRowCount(); // when we are removed slickgrid acts badly so we need to account for that this.scrolled = false; } @@ -379,34 +443,38 @@ class GridTable extends Disposable implements IView { private build(): void { let tableContainer = document.createElement('div'); tableContainer.style.display = 'inline-block'; + tableContainer.style.width = `calc(100% - ${ACTIONBAR_WIDTH}px)`; this.container.appendChild(tableContainer); - let collection = new VirtualizedCollection(50, this.resultSet.rowCount, - (offset, count) => this.loadData(offset, count), - index => this.placeholdGenerator(index) + let collection = new VirtualizedCollection( + 50, + index => this.placeholdGenerator(index), + 0, + () => TPromise.as([]) ); - collection.setCollectionChangedCallback((change, startIndex, count) => { + collection.setCollectionChangedCallback((startIndex, count) => { this.renderGridDataRowsRange(startIndex, count); }); - let numberColumn = new RowNumberColumn({ numberOfRows: this.resultSet.rowCount }); + this.rowNumberColumn = new RowNumberColumn({ numberOfRows: this.resultSet.rowCount }); let copyHandler = new CopyKeybind(); copyHandler.onCopy(e => { new CopyResultAction(CopyResultAction.COPY_ID, CopyResultAction.COPY_LABEL, false).run(this.generateContext()); }); - this.columns.unshift(numberColumn.getColumnDefinition()); + this.columns.unshift(this.rowNumberColumn.getColumnDefinition()); let tableOptions: Slick.GridOptions = { rowHeight: ROW_HEIGHT, showRowNumber: true, forceFitColumns: false, defaultColumnWidth: 120 }; - this.table = this._register(new Table(tableContainer, { dataProvider: new AsyncDataProvider(collection), columns: this.columns }, tableOptions)); + this.dataProvider = new AsyncDataProvider(collection); + this.table = this._register(new Table(tableContainer, { dataProvider: this.dataProvider, columns: this.columns }, tableOptions)); this.table.setSelectionModel(this.selectionModel); this.table.registerPlugin(new MouseWheelSupport()); this.table.registerPlugin(new AutoColumnSize()); this.table.registerPlugin(copyHandler); - this.table.registerPlugin(numberColumn); + this.table.registerPlugin(this.rowNumberColumn); this.table.registerPlugin(new AdditionalKeyBindings()); this._register(this.table.onContextMenu(this.contextMenu, this)); this._register(this.table.onClick(this.onTableClick, this)); @@ -507,7 +575,7 @@ class GridTable extends Disposable implements IView { } catch (e) { // If Xml fails to parse, fall back on original Xml content } - } else { + } else { let jsonContent: string = undefined; try { jsonContent = JSON.parse(content); @@ -526,6 +594,15 @@ class GridTable extends Disposable implements IView { } } + public updateResult(resultSet: sqlops.ResultSetSummary) { + this._resultSet = resultSet; + if (this.table && this.visible) { + this.dataProvider.length = resultSet.rowCount; + this.table.updateRowCount(); + } + this.rowNumberColumn.updateRowCount(resultSet.rowCount); + } + private generateContext(cell?: Slick.Cell): IGridActionContext { const selection = this.selectionModel.getSelectedRanges(); return { @@ -577,12 +654,7 @@ class GridTable extends Disposable implements IView { } else { this.currentHeight = size; } - this.table.layout( - new Dimension( - getContentWidth(this.container) - ACTIONBAR_WIDTH, - size - ) - ); + this.table.layout(size, Orientation.VERTICAL); } public get minimumSize(): number { @@ -596,6 +668,9 @@ class GridTable extends Disposable implements IView { private loadData(offset: number, count: number): Thenable { return this.runner.getQueryRows(offset, count, this.resultSet.batchId, this.resultSet.id).then(response => { + if (!response.resultSubset) { + return []; + } return response.resultSubset.rows.map(r => { let dataWithSchema = {}; // skip the first column since its a number column diff --git a/src/sql/parts/query/execution/queryRunner.ts b/src/sql/parts/query/execution/queryRunner.ts index cfda2c605d..5fffc72b4b 100644 --- a/src/sql/parts/query/execution/queryRunner.ts +++ b/src/sql/parts/query/execution/queryRunner.ts @@ -100,6 +100,18 @@ export default class QueryRunner extends Disposable { private _echoedResultSet = echo(this._debouncedResultSet.event); public readonly onResultSet = this._echoedResultSet.event; + private _onResultSetUpdate = this._register(new Emitter()); + private _debouncedResultSetUpdate = debounceEvent(this._onResultSetUpdate.event, (l, e) => { + // on first run + if (types.isUndefinedOrNull(l)) { + return [e]; + } else { + return l.concat(e); + } + }); + private _echoedResultSetUpdate = echo(this._debouncedResultSetUpdate.event); + public readonly onResultSetUpdate = this._echoedResultSetUpdate.event; + private _onQueryStart = this._register(new Emitter()); public readonly onQueryStart: Event = this._onQueryStart.event; @@ -336,7 +348,7 @@ export default class QueryRunner extends Disposable { /** * Handle a ResultSetComplete from the service layer */ - public handleResultSetComplete(result: sqlops.QueryExecuteResultSetCompleteNotificationParams): void { + public handleResultSetAvailable(result: sqlops.QueryExecuteResultSetNotificationParams): void { if (result && result.resultSetSummary) { let resultSet = result.resultSetSummary; let batchSet: sqlops.BatchSummary; @@ -365,7 +377,9 @@ export default class QueryRunner extends Disposable { this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => this._planXml.resolve(e.resultSubset.rows[0][0].displayValue)); } } - if (batchSet) { + // we will just ignore the set if we already have it + // ideally this should never happen + if (batchSet && !batchSet.resultSetSummaries[resultSet.id]) { // Store the result set in the batch and emit that a result set has completed batchSet.resultSetSummaries[resultSet.id] = resultSet; this._eventEmitter.emit(EventType.RESULT_SET, resultSet); @@ -374,6 +388,27 @@ export default class QueryRunner extends Disposable { } } + public handleResultSetUpdated(result: sqlops.QueryExecuteResultSetNotificationParams): void { + if (result && result.resultSetSummary) { + let resultSet = result.resultSetSummary; + let batchSet: sqlops.BatchSummary; + batchSet = this.batchSets[resultSet.batchId]; + // handle getting queryPlanxml if we need too + if (this.isQueryPlan) { + // check if this result has show plan, this needs work, it won't work for any other provider + let hasShowPlan = !!result.resultSetSummary.columnInfo.find(e => e.columnName === 'Microsoft SQL Server 2005 XML Showplan'); + if (hasShowPlan) { + this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => this._planXml.resolve(e.resultSubset.rows[0][0].displayValue)); + } + } + if (batchSet) { + // Store the result set in the batch and emit that a result set has completed + batchSet.resultSetSummaries[resultSet.id] = resultSet; + this._onResultSetUpdate.fire(resultSet); + } + } + } + /** * Handle a Mssage from the service layer */ diff --git a/src/sql/parts/query/services/queryEditorService.ts b/src/sql/parts/query/services/queryEditorService.ts index f11438782c..a9949b4084 100644 --- a/src/sql/parts/query/services/queryEditorService.ts +++ b/src/sql/parts/query/services/queryEditorService.ts @@ -249,9 +249,9 @@ export class QueryEditorService implements IQueryEditorService { QueryEditorService.editorService.openEditor(newEditorInput, options, group).then((editor) => { resolve(QueryEditorService._onEditorOpened(editor, uri.toString(), undefined, options.pinned)); }, - (error) => { - reject(error); - }); + (error) => { + reject(error); + }); }); }); } diff --git a/src/sql/sqlops.d.ts b/src/sql/sqlops.d.ts index c477540f51..b78d05f794 100644 --- a/src/sql/sqlops.d.ts +++ b/src/sql/sqlops.d.ts @@ -694,7 +694,8 @@ declare module 'sqlops' { registerOnQueryComplete(handler: (result: QueryExecuteCompleteNotificationResult) => any): void; registerOnBatchStart(handler: (batchInfo: QueryExecuteBatchNotificationParams) => any): void; registerOnBatchComplete(handler: (batchInfo: QueryExecuteBatchNotificationParams) => any): void; - registerOnResultSetComplete(handler: (resultSetInfo: QueryExecuteResultSetCompleteNotificationParams) => any): void; + registerOnResultSetAvailable(handler: (resultSetInfo: QueryExecuteResultSetNotificationParams) => any): void; + registerOnResultSetUpdated(handler: (resultSetInfo: QueryExecuteResultSetNotificationParams) => any): void; registerOnMessage(handler: (message: QueryExecuteMessageParams) => any): void; // Edit Data Requests @@ -769,6 +770,7 @@ declare module 'sqlops' { batchId: number; rowCount: number; columnInfo: IDbColumn[]; + complete: boolean; } export interface BatchSummary { @@ -837,7 +839,7 @@ declare module 'sqlops' { } - export interface QueryExecuteResultSetCompleteNotificationParams { + export interface QueryExecuteResultSetNotificationParams { resultSetSummary: ResultSetSummary; ownerUri: string; } diff --git a/src/sql/workbench/api/node/extHostDataProtocol.ts b/src/sql/workbench/api/node/extHostDataProtocol.ts index af4e9ad4cf..528e2ee8a7 100644 --- a/src/sql/workbench/api/node/extHostDataProtocol.ts +++ b/src/sql/workbench/api/node/extHostDataProtocol.ts @@ -265,8 +265,11 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { $onBatchComplete(handle: number, batchInfo: sqlops.QueryExecuteBatchNotificationParams): void { this._proxy.$onBatchComplete(handle, batchInfo); } - $onResultSetComplete(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void { - this._proxy.$onResultSetComplete(handle, resultSetInfo); + $onResultSetAvailable(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { + this._proxy.$onResultSetAvailable(handle, resultSetInfo); + } + $onResultSetUpdated(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { + this._proxy.$onResultSetUpdated(handle, resultSetInfo); } $onQueryMessage(handle: number, message: sqlops.QueryExecuteMessageParams): void { this._proxy.$onQueryMessage(handle, message); diff --git a/src/sql/workbench/api/node/mainThreadDataProtocol.ts b/src/sql/workbench/api/node/mainThreadDataProtocol.ts index a09877555d..96c7edf287 100644 --- a/src/sql/workbench/api/node/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/node/mainThreadDataProtocol.ts @@ -444,8 +444,11 @@ export class MainThreadDataProtocol implements MainThreadDataProtocolShape { public $onBatchComplete(handle: number, batchInfo: sqlops.QueryExecuteBatchNotificationParams): void { this._queryManagementService.onBatchComplete(batchInfo); } - public $onResultSetComplete(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void { - this._queryManagementService.onResultSetComplete(resultSetInfo); + public $onResultSetAvailable(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { + this._queryManagementService.onResultSetAvailable(resultSetInfo); + } + public $onResultSetUpdated(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { + this._queryManagementService.onResultSetUpdated(resultSetInfo); } public $onQueryMessage(handle: number, message: sqlops.QueryExecuteMessageParams): void { this._queryManagementService.onMessage(message); diff --git a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts index df20136df3..4199340173 100644 --- a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts @@ -197,8 +197,12 @@ export function createApiFactory( extHostDataProvider.$onBatchComplete(provider.handle, batchInfo); }); - provider.registerOnResultSetComplete((resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams) => { - extHostDataProvider.$onResultSetComplete(provider.handle, resultSetInfo); + provider.registerOnResultSetAvailable((resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams) => { + extHostDataProvider.$onResultSetAvailable(provider.handle, resultSetInfo); + }); + + provider.registerOnResultSetUpdated((resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams) => { + extHostDataProvider.$onResultSetUpdated(provider.handle, resultSetInfo); }); provider.registerOnMessage((message: sqlops.QueryExecuteMessageParams) => { diff --git a/src/sql/workbench/api/node/sqlExtHost.protocol.ts b/src/sql/workbench/api/node/sqlExtHost.protocol.ts index 9297c84688..b8b99133b0 100644 --- a/src/sql/workbench/api/node/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/node/sqlExtHost.protocol.ts @@ -193,7 +193,11 @@ export abstract class ExtHostDataProtocolShape { /** * Callback when a result set has been returned from query execution and can be displayed */ - $onResultSetComplete(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void { throw ni(); } + $onResultSetAvailable(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { throw ni(); } + /** + * Callback when a result set has been returned from query execution and can be displayed + */ + $onResultSetUpdate(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void { throw ni(); } /** * Callback when a message generated during query execution is issued */ @@ -504,7 +508,8 @@ export interface MainThreadDataProtocolShape extends IDisposable { $onQueryComplete(handle: number, result: sqlops.QueryExecuteCompleteNotificationResult): void; $onBatchStart(handle: number, batchInfo: sqlops.QueryExecuteBatchNotificationParams): void; $onBatchComplete(handle: number, batchInfo: sqlops.QueryExecuteBatchNotificationParams): void; - $onResultSetComplete(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetCompleteNotificationParams): void; + $onResultSetAvailable(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void; + $onResultSetUpdated(handle: number, resultSetInfo: sqlops.QueryExecuteResultSetNotificationParams): void; $onQueryMessage(handle: number, message: sqlops.QueryExecuteMessageParams): void; $onObjectExplorerSessionCreated(handle: number, message: sqlops.ObjectExplorerSession): void; $onObjectExplorerSessionDisconnected(handle: number, message: sqlops.ObjectExplorerSession): void; diff --git a/src/sqltest/parts/query/editor/queryEditor.test.ts b/src/sqltest/parts/query/editor/queryEditor.test.ts index a923fffe56..b560031a0a 100644 --- a/src/sqltest/parts/query/editor/queryEditor.test.ts +++ b/src/sqltest/parts/query/editor/queryEditor.test.ts @@ -349,7 +349,7 @@ suite('SQL QueryEditor Tests', () => { queryActionInstantiationService.setup(x => x.createInstance(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())) .returns((definition, editor, action, selectBox) => { if (definition.ID === 'listDatabaseQueryActionItem') { - let item = new ListDatabasesActionItem(editor, action, queryConnectionService.object, undefined, undefined, undefined,configurationService.object); + let item = new ListDatabasesActionItem(editor, action, queryConnectionService.object, undefined, undefined, undefined, configurationService.object); return item; } // Default diff --git a/src/typings/globals/slickgrid/index.d.ts b/src/typings/globals/slickgrid/index.d.ts index 07ef5289ac..c4bb327d64 100644 --- a/src/typings/globals/slickgrid/index.d.ts +++ b/src/typings/globals/slickgrid/index.d.ts @@ -830,7 +830,7 @@ declare namespace Slick { * @param newData New databinding source using a regular JavaScript array.. * @param scrollToTop If true, the grid will reset the vertical scroll position to the top of the grid. **/ - public setData(newData: T[], scrollToTop: boolean): void; + public setData(newData: T[], scrollToTop?: boolean): void; /** * Sets a new source for databinding and removes all rendered rows. Note that this doesn't render the new rows - you can follow it with a call to render() to do that. diff --git a/yarn.lock b/yarn.lock index 31a4969fc2..ce67901792 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6389,9 +6389,9 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" -"slickgrid@github:anthonydresser/SlickGrid#2.3.28": - version "2.3.28" - resolved "https://codeload.github.com/anthonydresser/SlickGrid/tar.gz/57db056e2bd15451e6ad30946a71df49e1c9451f" +"slickgrid@github:anthonydresser/SlickGrid#2.3.29": + version "2.3.29" + resolved "https://codeload.github.com/anthonydresser/SlickGrid/tar.gz/40b88f10d36d35f350838d1a2142c4b790701709" dependencies: jquery ">=1.8.0" jquery-ui ">=1.8.0"