From 8692283cb8478a88b352849cb185720ef3da4e90 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 5 Mar 2022 11:14:07 +0100 Subject: [PATCH 01/15] redis connection --- .github/workflows/build-npm.yaml | 5 ++ .../web/src/appobj/DatabaseAppObject.svelte | 1 + .../web/src/appobj/SubDatabaseList.svelte | 2 +- .../modals/ConnectionModalDriverFields.svelte | 33 +++++--- .../src/frontend/driver.js | 1 - plugins/dbgate-plugin-redis/.gitignore | 25 ++++++ plugins/dbgate-plugin-redis/README.md | 6 ++ plugins/dbgate-plugin-redis/icon.svg | 35 +++++++++ plugins/dbgate-plugin-redis/package.json | 42 ++++++++++ .../dbgate-plugin-redis/prettier.config.js | 8 ++ .../src/backend/Analyser.js | 9 +++ .../dbgate-plugin-redis/src/backend/driver.js | 67 ++++++++++++++++ .../dbgate-plugin-redis/src/backend/index.js | 6 ++ .../src/frontend/Dumper.js | 6 ++ .../src/frontend/driver.js | 30 ++++++++ .../dbgate-plugin-redis/src/frontend/index.js | 6 ++ .../webpack-backend.config.js | 23 ++++++ .../webpack-frontend.config.js | 24 ++++++ setCurrentVersion.js | 1 + yarn.lock | 76 +++++++++++++++++++ 20 files changed, 393 insertions(+), 13 deletions(-) create mode 100644 plugins/dbgate-plugin-redis/.gitignore create mode 100644 plugins/dbgate-plugin-redis/README.md create mode 100644 plugins/dbgate-plugin-redis/icon.svg create mode 100644 plugins/dbgate-plugin-redis/package.json create mode 100644 plugins/dbgate-plugin-redis/prettier.config.js create mode 100644 plugins/dbgate-plugin-redis/src/backend/Analyser.js create mode 100644 plugins/dbgate-plugin-redis/src/backend/driver.js create mode 100644 plugins/dbgate-plugin-redis/src/backend/index.js create mode 100644 plugins/dbgate-plugin-redis/src/frontend/Dumper.js create mode 100644 plugins/dbgate-plugin-redis/src/frontend/driver.js create mode 100644 plugins/dbgate-plugin-redis/src/frontend/index.js create mode 100644 plugins/dbgate-plugin-redis/webpack-backend.config.js create mode 100644 plugins/dbgate-plugin-redis/webpack-frontend.config.js diff --git a/.github/workflows/build-npm.yaml b/.github/workflows/build-npm.yaml index cb7dbf2c..929dc5ab 100644 --- a/.github/workflows/build-npm.yaml +++ b/.github/workflows/build-npm.yaml @@ -133,3 +133,8 @@ jobs: working-directory: plugins/dbgate-plugin-sqlite run: | npm publish + + - name: Publish dbgate-plugin-redis + working-directory: plugins/dbgate-plugin-redis + run: | + npm publish diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index 7611f0fc..2ed204b7 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -256,6 +256,7 @@ {...$$restProps} {data} title={data.name} + extInfo={data.extInfo} icon="img database" colorMark={passProps?.connectionColorFactory && passProps?.connectionColorFactory({ conid: _.get(data.connection, '_id'), database: data.name }, null, null, false)} diff --git a/packages/web/src/appobj/SubDatabaseList.svelte b/packages/web/src/appobj/SubDatabaseList.svelte index b719ac97..c733007c 100644 --- a/packages/web/src/appobj/SubDatabaseList.svelte +++ b/packages/web/src/appobj/SubDatabaseList.svelte @@ -15,7 +15,7 @@ filterName(filter, x.name)), - 'name' + x => x.sortOrder ?? x.name ).map(db => ({ ...db, connection: data }))} module={databaseAppObject} {passProps} diff --git a/packages/web/src/modals/ConnectionModalDriverFields.svelte b/packages/web/src/modals/ConnectionModalDriverFields.svelte index 972a8509..41b6b719 100644 --- a/packages/web/src/modals/ConnectionModalDriverFields.svelte +++ b/packages/web/src/modals/ConnectionModalDriverFields.svelte @@ -26,6 +26,9 @@ $: disabledFields = (currentAuthType ? currentAuthType.disabledFields : null) || []; $: driver = $extensions.drivers.find(x => x.engine == engine); $: defaultDatabase = $values.defaultDatabase; + + $: showUser = !driver?.showConnectionField || driver.showConnectionField('user', $values); + $: showPassword = !driver?.showConnectionField || driver.showConnectionField('password', $values); {/if} -{#if !driver?.showConnectionField || driver.showConnectionField('user', $values)} +{#if showUser && showPassword}
-
- -
- {#if !driver?.showConnectionField || driver.showConnectionField('password', $values)} + {#if showUser} +
+ +
+ {/if} + {#if showPassword}
{/if} +{#if showUser && !showPassword} + +{/if} +{#if !showUser && showPassword} + +{/if} -{#if !disabledFields.includes('password') && (!driver?.showConnectionField || driver.showConnectionField('password', $values))} +{#if !disabledFields.includes('password') && showPassword} + + + + + + + + + + + + diff --git a/plugins/dbgate-plugin-redis/package.json b/plugins/dbgate-plugin-redis/package.json new file mode 100644 index 00000000..777e938a --- /dev/null +++ b/plugins/dbgate-plugin-redis/package.json @@ -0,0 +1,42 @@ +{ + "name": "dbgate-plugin-redis", + "main": "dist/backend.js", + "version": "1.0.0", + "license": "MIT", + "description": "Redis connector plugin for DbGate", + "homepage": "https://dbgate.org", + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate" + }, + "author": "Jan Prochazka", + "keywords": [ + "dbgate", + "dbgateplugin", + "redis" + ], + "files": [ + "dist" + ], + "scripts": { + "build:frontend": "webpack --config webpack-frontend.config", + "build:frontend:watch": "webpack --watch --config webpack-frontend.config", + "build:backend": "webpack --config webpack-backend.config.js", + "build": "yarn build:frontend && yarn build:backend", + "plugin": "yarn build && yarn pack && dbgate-plugin dbgate-plugin-redis", + "plugout": "dbgate-plugout dbgate-plugin-redis", + "copydist": "yarn build && yarn pack && dbgate-copydist ../dist/dbgate-plugin-redis", + "prepublishOnly": "yarn build" + }, + "devDependencies": { + "dbgate-plugin-tools": "^1.0.7", + "dbgate-query-splitter": "^4.1.1", + "dbgate-tools": "^4.1.1", + "lodash": "^4.17.21", + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" + }, + "dependencies": { + "ioredis": "^4.28.5" + } +} diff --git a/plugins/dbgate-plugin-redis/prettier.config.js b/plugins/dbgate-plugin-redis/prettier.config.js new file mode 100644 index 00000000..40648407 --- /dev/null +++ b/plugins/dbgate-plugin-redis/prettier.config.js @@ -0,0 +1,8 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, + arrowParen: 'avoid', + printWidth: 120, +}; diff --git a/plugins/dbgate-plugin-redis/src/backend/Analyser.js b/plugins/dbgate-plugin-redis/src/backend/Analyser.js new file mode 100644 index 00000000..3e176ddc --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/backend/Analyser.js @@ -0,0 +1,9 @@ +const { DatabaseAnalyser } = require('dbgate-tools'); + +class Analyser extends DatabaseAnalyser { + constructor(pool, driver) { + super(pool, driver); + } +} + +module.exports = Analyser; diff --git a/plugins/dbgate-plugin-redis/src/backend/driver.js b/plugins/dbgate-plugin-redis/src/backend/driver.js new file mode 100644 index 00000000..e48ab07f --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/backend/driver.js @@ -0,0 +1,67 @@ +const _ = require('lodash'); +const stream = require('stream'); +const driverBase = require('../frontend/driver'); +const Analyser = require('./Analyser'); +const Redis = require('ioredis'); + +/** @type {import('dbgate-types').EngineDriver} */ +const driver = { + ...driverBase, + analyserClass: Analyser, + async connect({ server, port, password, database }) { + const pool = new Redis({ + host: server, + port, + password, + db: 0, + }); + return pool; + }, + // @ts-ignore + async query(pool, sql) { + return { + rows: [], + columns: [], + }; + }, + async stream(pool, sql, options) { + return null; + }, + async readQuery(pool, sql, structure) { + const pass = new stream.PassThrough({ + objectMode: true, + highWaterMark: 100, + }); + + // pass.write(structure) + // pass.write(row1) + // pass.write(row2) + // pass.end() + + return pass; + }, + async writeTable(pool, name, options) { + return createBulkInsertStreamBase(this, stream, pool, name, options); + }, + async info(pool) { + const info = await pool.info(); + return _.fromPairs( + info + .split('\n') + .filter((x) => x.trim() && !x.trim().startsWith('#')) + .map((x) => x.split(':')) + ); + }, + async getVersion(pool) { + const info = await this.info(pool); + + return { version: info.redis_version }; + }, + async listDatabases(pool) { + const info = await this.info(pool); + + return _.range(16).map((index) => ({ name: `db${index}`, extInfo: info[`db${index}`], sortOrder: index })); + }, +}; + +module.exports = driver; diff --git a/plugins/dbgate-plugin-redis/src/backend/index.js b/plugins/dbgate-plugin-redis/src/backend/index.js new file mode 100644 index 00000000..cdad4131 --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/backend/index.js @@ -0,0 +1,6 @@ +const driver = require('./driver'); + +module.exports = { + packageName: 'dbgate-plugin-redis', + drivers: [driver], +}; diff --git a/plugins/dbgate-plugin-redis/src/frontend/Dumper.js b/plugins/dbgate-plugin-redis/src/frontend/Dumper.js new file mode 100644 index 00000000..afcc6473 --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/frontend/Dumper.js @@ -0,0 +1,6 @@ +const { SqlDumper } = require('dbgate-tools'); + +class Dumper extends SqlDumper { +} + +module.exports = Dumper; diff --git a/plugins/dbgate-plugin-redis/src/frontend/driver.js b/plugins/dbgate-plugin-redis/src/frontend/driver.js new file mode 100644 index 00000000..3013d6ef --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/frontend/driver.js @@ -0,0 +1,30 @@ +const { driverBase } = global.DBGATE_TOOLS; +const Dumper = require('./Dumper'); + +/** @type {import('dbgate-types').SqlDialect} */ +const dialect = { + limitSelect: true, + rangeSelect: true, + offsetFetchRangeSyntax: true, + stringEscapeChar: "'", + fallbackDataType: 'nvarchar(max)', + quoteIdentifier(s) { + return `[${s}]`; + }, +}; + +/** @type {import('dbgate-types').EngineDriver} */ +const driver = { + ...driverBase, + dumperClass: Dumper, + dialect, + engine: 'redis@dbgate-plugin-redis', + title: 'Redis', + defaultPort: 6379, + + showConnectionField: (field, values) => { + return ['server', 'port', 'password'].includes(field); + }, +}; + +module.exports = driver; diff --git a/plugins/dbgate-plugin-redis/src/frontend/index.js b/plugins/dbgate-plugin-redis/src/frontend/index.js new file mode 100644 index 00000000..a7076224 --- /dev/null +++ b/plugins/dbgate-plugin-redis/src/frontend/index.js @@ -0,0 +1,6 @@ +import driver from './driver'; + +export default { + packageName: 'dbgate-plugin-redis', + drivers: [driver], +}; diff --git a/plugins/dbgate-plugin-redis/webpack-backend.config.js b/plugins/dbgate-plugin-redis/webpack-backend.config.js new file mode 100644 index 00000000..e75357df --- /dev/null +++ b/plugins/dbgate-plugin-redis/webpack-backend.config.js @@ -0,0 +1,23 @@ +var webpack = require('webpack'); +var path = require('path'); + +var config = { + context: __dirname + '/src/backend', + + entry: { + app: './index.js', + }, + target: 'node', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'backend.js', + libraryTarget: 'commonjs2', + }, + + // uncomment for disable minimalization + // optimization: { + // minimize: false, + // }, +}; + +module.exports = config; diff --git a/plugins/dbgate-plugin-redis/webpack-frontend.config.js b/plugins/dbgate-plugin-redis/webpack-frontend.config.js new file mode 100644 index 00000000..db07de29 --- /dev/null +++ b/plugins/dbgate-plugin-redis/webpack-frontend.config.js @@ -0,0 +1,24 @@ +var webpack = require("webpack"); +var path = require("path"); + +var config = { + context: __dirname + "/src/frontend", + + entry: { + app: "./index.js", + }, + target: "web", + output: { + path: path.resolve(__dirname, "dist"), + filename: "frontend.js", + libraryTarget: "var", + library: 'plugin', + }, + + // uncomment for disable minimalization + // optimization: { + // minimize: false, + // }, +}; + +module.exports = config; diff --git a/setCurrentVersion.js b/setCurrentVersion.js index 6b077950..fa3405e0 100644 --- a/setCurrentVersion.js +++ b/setCurrentVersion.js @@ -49,3 +49,4 @@ changePackageFile('plugins/dbgate-plugin-mysql', json.version); changePackageFile('plugins/dbgate-plugin-mongo', json.version); changePackageFile('plugins/dbgate-plugin-postgres', json.version); changePackageFile('plugins/dbgate-plugin-sqlite', json.version); +changePackageFile('plugins/dbgate-plugin-redis', json.version); diff --git a/yarn.lock b/yarn.lock index b46d5176..61955250 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2711,6 +2711,11 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cluster-key-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3217,6 +3222,13 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" +debug@^4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -3320,6 +3332,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +denque@^1.1.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== + denque@^1.4.1: version "1.5.0" resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" @@ -5182,6 +5199,23 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +ioredis@^4.28.5: + version "4.28.5" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.5.tgz#5c149e6a8d76a7f8fa8a504ffc85b7d5b6797f9f" + integrity sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A== + dependencies: + cluster-key-slot "^1.1.0" + debug "^4.3.1" + denque "^1.1.0" + lodash.defaults "^4.2.0" + lodash.flatten "^4.4.0" + lodash.isarguments "^3.1.0" + p-map "^2.1.0" + redis-commands "1.7.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -6821,6 +6855,21 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7988,6 +8037,11 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-map@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -8841,6 +8895,23 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redis-commands@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== + +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= + dependencies: + redis-errors "^1.0.0" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -9822,6 +9893,11 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" From d7a2bf3ac0644b7b1a5c143e9cf3abb58dd5f1a9 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 5 Mar 2022 12:12:02 +0100 Subject: [PATCH 02/15] refactor:dialect.nosql=>driver.databaseEngineTypes --- packages/api/src/controllers/connections.js | 1 + packages/api/src/shell/tableReader.js | 2 +- .../tools/src/createBulkInsertStreamBase.ts | 2 +- packages/tools/src/driverBase.ts | 3 +- packages/types/dialect.d.ts | 1 - packages/types/engines.d.ts | 1 + .../web/src/appobj/DatabaseAppObject.svelte | 4 +- packages/web/src/commands/stdCommands.ts | 4 +- .../web/src/datagrid/DataFilterControl.svelte | 2 +- packages/web/src/tabs/QueryTab.svelte | 4 +- .../web/src/widgets/CellDataWidget.svelte | 2 +- .../web/src/widgets/DatabaseWidget.svelte | 37 +++++++++++++++---- packages/web/src/widgets/SqlObjectList.svelte | 9 +++-- .../src/frontend/driver.js | 2 +- .../src/frontend/driver.js | 1 + 15 files changed, 50 insertions(+), 25 deletions(-) diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index fb86362d..cf9147ee 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -240,6 +240,7 @@ module.exports = { get_meta: true, async get({ conid }) { + if (!conid) return null; if (portalConnections) return portalConnections.find(x => x._id == conid) || null; const res = await this.datastore.get(conid); return res || null; diff --git a/packages/api/src/shell/tableReader.js b/packages/api/src/shell/tableReader.js index 46e7fe16..c0824ee6 100644 --- a/packages/api/src/shell/tableReader.js +++ b/packages/api/src/shell/tableReader.js @@ -9,7 +9,7 @@ async function tableReader({ connection, pureName, schemaName }) { const fullName = { pureName, schemaName }; - if (driver.dialect.nosql) { + if (driver.databaseEngineTypes.includes('document')) { // @ts-ignore console.log(`Reading collection ${fullNameToString(fullName)}`); // @ts-ignore diff --git a/packages/tools/src/createBulkInsertStreamBase.ts b/packages/tools/src/createBulkInsertStreamBase.ts index 37d0f6c5..01f8b1b2 100644 --- a/packages/tools/src/createBulkInsertStreamBase.ts +++ b/packages/tools/src/createBulkInsertStreamBase.ts @@ -14,7 +14,7 @@ export function createBulkInsertStreamBase(driver, stream, pool, name, options): writable.buffer = []; writable.structure = null; writable.columnNames = null; - writable.requireFixedStructure = !driver.dialect.nosql; + writable.requireFixedStructure = driver.databaseEngineTypes.includes('sql'); writable.addRow = async row => { if (writable.structure) { diff --git a/packages/tools/src/driverBase.ts b/packages/tools/src/driverBase.ts index b4e9dc98..6618ec48 100644 --- a/packages/tools/src/driverBase.ts +++ b/packages/tools/src/driverBase.ts @@ -20,6 +20,7 @@ export const driverBase = { analyserClass: null, dumperClass: SqlDumper, dialect, + databaseEngineTypes: ['sql'], async analyseFull(pool, version) { const analyser = new this.analyserClass(pool, this, version); @@ -45,7 +46,7 @@ export const driverBase = { } }, getNewObjectTemplates() { - if (!this.dialect?.nosql) { + if (this.databaseEngineTypes.includes('sql')) { return [{ label: 'New view', sql: 'CREATE VIEW myview\nAS\nSELECT * FROM table1' }]; } return []; diff --git a/packages/types/dialect.d.ts b/packages/types/dialect.d.ts index f05dc052..71f496d0 100644 --- a/packages/types/dialect.d.ts +++ b/packages/types/dialect.d.ts @@ -10,7 +10,6 @@ export interface SqlDialect { explicitDropConstraint?: boolean; anonymousPrimaryKey?: boolean; enableConstraintsPerTable?: boolean; - nosql?: boolean; // mongo dropColumnDependencies?: string[]; changeColumnDependencies?: string[]; diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 2f1d2719..31504062 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -46,6 +46,7 @@ export interface EngineDriver { engine: string; title: string; defaultPort?: number; + databaseEngineTypes: string[]; supportsDatabaseUrl?: boolean; isElectronOnly?: boolean; showConnectionField?: (field: string, values: any) => boolean; diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index 2ed204b7..78e86a98 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -174,8 +174,8 @@ return [ { onClick: handleNewQuery, text: 'New query', isNewQuery: true }, - !driver?.dialect?.nosql && { onClick: handleNewTable, text: 'New table' }, - driver?.dialect?.nosql && { onClick: handleNewCollection, text: 'New collection' }, + driver?.databaseEngineTypes?.includes('sql') && { onClick: handleNewTable, text: 'New table' }, + driver?.databaseEngineTypes?.includes('document') && { onClick: handleNewCollection, text: 'New collection' }, { divider: true }, { onClick: handleImport, text: 'Import' }, { onClick: handleExport, text: 'Export' }, diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 46f28583..143ea85d 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -158,7 +158,7 @@ registerCommand({ toolbarName: 'New table', testEnabled: () => { const driver = findEngineDriver(get(currentDatabase)?.connection, getExtensions()); - return !!get(currentDatabase) && !driver?.dialect?.nosql; + return !!get(currentDatabase) && driver?.databaseEngineTypes?.includes('sql'); }, onClick: () => { const $currentDatabase = get(currentDatabase); @@ -196,7 +196,7 @@ registerCommand({ toolbarName: 'New collection', testEnabled: () => { const driver = findEngineDriver(get(currentDatabase)?.connection, getExtensions()); - return !!get(currentDatabase) && driver?.dialect?.nosql; + return !!get(currentDatabase) && driver?.databaseEngineTypes?.includes('document'); }, onClick: async () => { const $currentDatabase = get(currentDatabase); diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 1afe6642..2f49ac42 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -266,7 +266,7 @@ class:isOk placeholder="Filter" /> - {#if conid && database && driver && !driver?.dialect?.nosql} + {#if conid && database && driver && driver?.databaseEngineTypes?.includes('sql')} {#if foreignKey} diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index 669f3d95..94f50a8b 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -124,7 +124,7 @@ } export function isSqlEditor() { - return !driver?.dialect?.nosql; + return driver?.databaseEngineTypes?.includes('sql'); } export function canKill() { @@ -281,7 +281,7 @@ - {#if driver?.dialect?.nosql} + {#if driver?.databaseEngineTypes?.includes('document')}