From 296038a3de7c2d9dbe3b4215482d8d4c0bae4a32 Mon Sep 17 00:00:00 2001 From: Christian Schreier Date: Sat, 31 Jul 2021 12:35:48 +0200 Subject: [PATCH 1/9] enable horizontal scroll with touchpad --- packages/web/src/datagrid/DataGridCore.svelte | 78 ++++++++++--------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index e9e59ac9b..40485c8e0 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -171,7 +171,6 @@ if (_.isPlainObject(value) || _.isArray(value)) return JSON.stringify(value); return value; } - {#if !display || (!isDynamicStructure && (!columns || columns.length == 0))} @@ -1187,5 +1194,4 @@ right: 40px; bottom: 20px; } - From 2baf9a1446ef0f05aa7e6f87b87ad77be0042372 Mon Sep 17 00:00:00 2001 From: Christian Schreier Date: Sat, 31 Jul 2021 12:37:14 +0200 Subject: [PATCH 2/9] enable scroll in whole table container --- packages/web/src/datagrid/DataGridCore.svelte | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 40485c8e0..f88a2ce0f 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -1008,7 +1008,13 @@ {/each} {:else} -
+
From 7453afa6843c582e280979b86f6168fe2ee8f786 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 11:09:05 +0200 Subject: [PATCH 3/9] #160 json view dark mode colors --- packages/web/src/celldata/JsonCellView.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/web/src/celldata/JsonCellView.svelte b/packages/web/src/celldata/JsonCellView.svelte index fbb9c2e62..ecad18e7e 100644 --- a/packages/web/src/celldata/JsonCellView.svelte +++ b/packages/web/src/celldata/JsonCellView.svelte @@ -51,11 +51,11 @@ } :global(.theme-type-dark) .inner { - --json-tree-string-color: #efc5c5; - --json-tree-symbol-color: #efc5c5; - --json-tree-boolean-color: #a6b3f5; - --json-tree-function-color: #a6b3f5; - --json-tree-number-color: #bfbdf2; + --json-tree-string-color: #ffc5c5; + --json-tree-symbol-color: #ffc5c5; + --json-tree-boolean-color: #b6c3ff; + --json-tree-function-color: #b6c3ff; + --json-tree-number-color: #bfbdff; --json-tree-label-color: #e9aaed; --json-tree-arrow-color: #d4d4d4; --json-tree-null-color: #dcdcdc; From e3bdad6d771e5a5f2f6c56e4de6e69fcfa29d039 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 11:53:08 +0200 Subject: [PATCH 4/9] fixed messages table display --- packages/web/src/query/MessageView.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/web/src/query/MessageView.svelte b/packages/web/src/query/MessageView.svelte index c5cee48d3..99d47cc78 100644 --- a/packages/web/src/query/MessageView.svelte +++ b/packages/web/src/query/MessageView.svelte @@ -69,11 +69,16 @@ .main { flex: 1; display: flex; + position: relative; overflow-y: scroll; background-color: var(--theme-bg-0); } table { - flex: 1; + position: absolute; + left: 0; + right: 0; + top: 0; + width: 100%; border-spacing: 0; border-collapse: collapse; } From b5c313e5175cbe64f0faec6476a19ed7d47b310d Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 12:41:43 +0200 Subject: [PATCH 5/9] SQL file export --- packages/api/src/shell/index.js | 2 ++ packages/api/src/shell/sqlDataWriter.js | 48 +++++++++++++++++++++++++ packages/web/src/plugins/fileformats.ts | 22 ++++++++++-- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 packages/api/src/shell/sqlDataWriter.js diff --git a/packages/api/src/shell/index.js b/packages/api/src/shell/index.js index 905c3e6ea..2e3a42b83 100644 --- a/packages/api/src/shell/index.js +++ b/packages/api/src/shell/index.js @@ -8,6 +8,7 @@ const consoleObjectWriter = require('./consoleObjectWriter'); const jsonLinesWriter = require('./jsonLinesWriter'); const jsonArrayWriter = require('./jsonArrayWriter'); const jsonLinesReader = require('./jsonLinesReader'); +const sqlDataWriter = require('./sqlDataWriter'); const jslDataReader = require('./jslDataReader'); const archiveWriter = require('./archiveWriter'); const archiveReader = require('./archiveReader'); @@ -29,6 +30,7 @@ const dbgateApi = { jsonLinesWriter, jsonArrayWriter, jsonLinesReader, + sqlDataWriter, fakeObjectReader, consoleObjectWriter, jslDataReader, diff --git a/packages/api/src/shell/sqlDataWriter.js b/packages/api/src/shell/sqlDataWriter.js new file mode 100644 index 000000000..9783f3883 --- /dev/null +++ b/packages/api/src/shell/sqlDataWriter.js @@ -0,0 +1,48 @@ +const fs = require('fs'); +const stream = require('stream'); +const path = require('path'); +const { driverBase } = require('dbgate-tools'); + +class SqlizeStream extends stream.Transform { + constructor({ fileName }) { + super({ objectMode: true }); + this.wasHeader = false; + this.tableName = path.parse(fileName).name; + } + _transform(chunk, encoding, done) { + let skip = false; + if (!this.wasHeader) { + if ( + chunk.__isStreamHeader || + // TODO remove isArray test + Array.isArray(chunk.columns) + ) { + skip = true; + this.tableName = chunk.pureName; + } + this.wasHeader = true; + } + if (!skip) { + const dmp = driverBase.createDumper(); + dmp.put( + '^insert ^into %f (%,i) ^values (%,v);\n', + { pureName: this.tableName }, + Object.keys(chunk), + Object.values(chunk) + ); + this.push(dmp.s); + } + done(); + } +} + +async function sqlDataWriter({ fileName, driver, encoding = 'utf-8' }) { + console.log(`Writing file ${fileName}`); + const stringify = new SqlizeStream({ fileName }); + const fileStream = fs.createWriteStream(fileName, encoding); + stringify.pipe(fileStream); + stringify['finisher'] = fileStream; + return stringify; +} + +module.exports = sqlDataWriter; diff --git a/packages/web/src/plugins/fileformats.ts b/packages/web/src/plugins/fileformats.ts index 6f91fa086..e10082891 100644 --- a/packages/web/src/plugins/fileformats.ts +++ b/packages/web/src/plugins/fileformats.ts @@ -15,6 +15,13 @@ const jsonFormat = { writerFunc: 'jsonArrayWriter', }; +const sqlFormat = { + storageType: 'sql', + extension: 'sql', + name: 'SQL', + writerFunc: 'sqlDataWriter', +}; + const jsonlQuickExport = { label: 'JSON lines', extension: 'jsonl', @@ -37,8 +44,19 @@ const jsonQuickExport = { }), }; +const sqlQuickExport = { + label: 'SQL', + extension: 'sql', + createWriter: fileName => ({ + functionName: 'sqlDataWriter', + props: { + fileName, + }, + }), +}; + export function buildFileFormats(plugins): FileFormatDefinition[] { - const res = [jsonlFormat, jsonFormat]; + const res = [jsonlFormat, jsonFormat, sqlFormat]; for (const { content } of plugins) { const { fileFormats } = content; if (fileFormats) res.push(...fileFormats); @@ -47,7 +65,7 @@ export function buildFileFormats(plugins): FileFormatDefinition[] { } export function buildQuickExports(plugins): QuickExportDefinition[] { - const res = [jsonQuickExport, jsonlQuickExport]; + const res = [jsonQuickExport, jsonlQuickExport, sqlQuickExport]; for (const { content } of plugins) { if (content.quickExports) res.push(...content.quickExports); } From 60545674c5efdab8faaabaf6fae30743cfb46968 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 13:30:57 +0200 Subject: [PATCH 6/9] sql export with correct dialect --- packages/api/src/shell/sqlDataWriter.js | 8 +++++++- packages/tools/src/DatabaseAnalyser.ts | 25 ++++++++++++++++++++----- packages/types/dbinfo.d.ts | 1 + 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/api/src/shell/sqlDataWriter.js b/packages/api/src/shell/sqlDataWriter.js index 9783f3883..50324db03 100644 --- a/packages/api/src/shell/sqlDataWriter.js +++ b/packages/api/src/shell/sqlDataWriter.js @@ -2,12 +2,14 @@ const fs = require('fs'); const stream = require('stream'); const path = require('path'); const { driverBase } = require('dbgate-tools'); +const requireEngineDriver = require('../utility/requireEngineDriver'); class SqlizeStream extends stream.Transform { constructor({ fileName }) { super({ objectMode: true }); this.wasHeader = false; this.tableName = path.parse(fileName).name; + this.driver = driverBase; } _transform(chunk, encoding, done) { let skip = false; @@ -19,11 +21,15 @@ class SqlizeStream extends stream.Transform { ) { skip = true; this.tableName = chunk.pureName; + if (chunk.engine) { + // @ts-ignore + this.driver = requireEngineDriver(chunk.engine) || driverBase; + } } this.wasHeader = true; } if (!skip) { - const dmp = driverBase.createDumper(); + const dmp = this.driver.createDumper(); dmp.put( '^insert ^into %f (%,i) ^values (%,v);\n', { pureName: this.tableName }, diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index 4b5ee4eda..45d8d7baa 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -4,7 +4,10 @@ import _groupBy from 'lodash/groupBy'; import _pick from 'lodash/pick'; import _compact from 'lodash/compact'; +const STRUCTURE_FIELDS = ['tables', 'collections', 'views', 'matviews', 'functions', 'procedures', 'triggers']; + const fp_pick = arg => array => _pick(array, arg); + export class DatabaseAnalyser { structure: DatabaseInfo; modifications: DatabaseModification[]; @@ -23,8 +26,20 @@ export class DatabaseAnalyser { async _computeSingleObjectId() {} + addEngineField(db: DatabaseInfo) { + if (!this.driver?.engine) return; + for (const field of STRUCTURE_FIELDS) { + if (!db[field]) continue; + for (const item of db[field]) { + item.engine = this.driver.engine; + } + } + db.engine = this.driver.engine; + return db; + } + async fullAnalysis() { - const res = await this._runAnalysis(); + const res = this.addEngineField(await this._runAnalysis()); // console.log('FULL ANALYSIS', res); return res; } @@ -33,7 +48,7 @@ export class DatabaseAnalyser { // console.log('Analysing SINGLE OBJECT', name, typeField); this.singleObjectFilter = { ...name, typeField }; await this._computeSingleObjectId(); - const res = await this._runAnalysis(); + const res = this.addEngineField(await this._runAnalysis()); // console.log('SINGLE OBJECT RES', res); const obj = res[typeField]?.length == 1 @@ -50,11 +65,11 @@ export class DatabaseAnalyser { if (this.modifications == null) { // modifications not implemented, perform full analysis this.structure = null; - return this._runAnalysis(); + return this.addEngineField(await this._runAnalysis()); } if (this.modifications.length == 0) return null; console.log('DB modifications detected:', this.modifications); - return this.mergeAnalyseResult(await this._runAnalysis()); + return this.addEngineField(this.mergeAnalyseResult(await this._runAnalysis())); } mergeAnalyseResult(newlyAnalysed) { @@ -66,7 +81,7 @@ export class DatabaseAnalyser { } const res = {}; - for (const field of ['tables', 'collections', 'views', 'matviews', 'functions', 'procedures', 'triggers']) { + for (const field of STRUCTURE_FIELDS) { const removedIds = this.modifications .filter(x => x.action == 'remove' && x.objectTypeField == field) .map(x => x.objectId); diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index faa33f8ad..4e4a45194 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -103,4 +103,5 @@ export interface DatabaseInfoObjects { export interface DatabaseInfo extends DatabaseInfoObjects { schemas: SchemaInfo[]; + engine: string; } From 3ac96c4ae4ac62ffd38960c853fed7d5bb26af07 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 13:32:20 +0200 Subject: [PATCH 7/9] v4.2.8-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4658893ca..062f5aeed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "4.2.7", + "version": "4.2.8-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From d5cee7b35b6309170f0110cb99951e1b9b20ea42 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 13:35:07 +0200 Subject: [PATCH 8/9] fix --- packages/types/dbinfo.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index 4e4a45194..12112abe5 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -103,5 +103,5 @@ export interface DatabaseInfoObjects { export interface DatabaseInfo extends DatabaseInfoObjects { schemas: SchemaInfo[]; - engine: string; + engine?: string; } From 77ebf0051c81fd28ab2fa858209a482f1fe5b909 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 19 Aug 2021 13:35:19 +0200 Subject: [PATCH 9/9] v4.2.8-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 062f5aeed..6d403f16c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "4.2.8-beta.1", + "version": "4.2.8-beta.2", "name": "dbgate-all", "workspaces": [ "packages/*",