diff --git a/packages/tools/src/driverBase.ts b/packages/tools/src/driverBase.ts index 10f73a5ac..1132af432 100644 --- a/packages/tools/src/driverBase.ts +++ b/packages/tools/src/driverBase.ts @@ -24,7 +24,8 @@ export const driverBase = { const analyser = new this.analyserClass(pool, this); analyser.singleObjectFilter = { ...name, typeField }; const res = await analyser.fullAnalysis(); - return res.tables[0]; + if (res[typeField].length == 1) return res[typeField][0]; + return res[typeField].find(x => x.pureName == name.pureName && x.schemaName == name.schemaName); }, analyseSingleTable(pool, name) { return this.analyseSingleObject(pool, name, 'tables'); diff --git a/packages/web/src/freetable/FreeTableColumnEditor.svelte b/packages/web/src/freetable/FreeTableColumnEditor.svelte index 79d8b462e..a3cf54495 100644 --- a/packages/web/src/freetable/FreeTableColumnEditor.svelte +++ b/packages/web/src/freetable/FreeTableColumnEditor.svelte @@ -40,7 +40,7 @@ - {#each structure.columns as column, index} + {#each structure.columns || [] as column, index} {#if index == editingColumn} [...cols, { columnName }]); }} placeholder="New column" - existingNames={structure.columns.map(x => x.columnName)} + existingNames={(structure.columns || []).map(x => x.columnName)} /> diff --git a/plugins/dbgate-plugin-sqlite/src/backend/driver.js b/plugins/dbgate-plugin-sqlite/src/backend/driver.js index 1c56ba30d..f1799ac7e 100644 --- a/plugins/dbgate-plugin-sqlite/src/backend/driver.js +++ b/plugins/dbgate-plugin-sqlite/src/backend/driver.js @@ -6,6 +6,15 @@ const { identify } = require('sql-query-identifier'); let Database; +async function waitForDrain(stream) { + return new Promise((resolve) => { + stream.once('drain', () => { + // console.log('CONTINUE DRAIN'); + resolve(); + }); + }); +} + function runStreamItem(client, sql, options, rowCounter) { const stmt = client.prepare(sql); if (stmt.reader) { @@ -96,16 +105,36 @@ const driver = { options.done(); // return stream; }, + async readQueryTask(stmt, pass) { + // let sent = 0; + for (const row of stmt.iterate()) { + // sent++; + if (!pass.write(row)) { + // console.log('WAIT DRAIN', sent); + await waitForDrain(pass); + } + } + pass.end(); + }, 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() + const stmt = pool.prepare(sql); + const columns = stmt.columns(); + + pass.write({ + __isStreamHeader: true, + ...(structure || { + columns: columns.map((col) => ({ + columnName: col.name, + dataType: col.type, + })), + }), + }); + this.readQueryTask(stmt, pass); return pass; },