diff --git a/plugins/dbgate-plugin-duckdb/src/backend/Analyser.helpers.js b/plugins/dbgate-plugin-duckdb/src/backend/Analyser.helpers.js index 99ab7ad55..ace6e464e 100644 --- a/plugins/dbgate-plugin-duckdb/src/backend/Analyser.helpers.js +++ b/plugins/dbgate-plugin-duckdb/src/backend/Analyser.helpers.js @@ -231,6 +231,7 @@ function mapConstraintRowToForeignKeyInfo(duckDbConstraintData) { constraintType: 'foreignKey', columns: columns, refTableName: duckDbConstraintData.referenced_table, + refSchemaName: duckDbConstraintData.schema_name, }; if (duckDbConstraintData.constraint_name != null) { @@ -363,6 +364,31 @@ function mapIndexRowToIndexInfo(duckDbIndexRow) { return /** @type {import("dbgate-types").IndexInfo} */ (indexInfo); } +/** + * @typedef {object} DuckDbSchemaRow + * @property {string} oid + * @property {string} database_name + * @property {string} database_oid + * @property {string} schema_name + * @property {string | null} comment + * @property {{ [key: string]: string } | null} tags + * @property {boolean} internal + * @property {string | null} sql + */ + +/** + * @param {DuckDbSchemaRow} duckDbSchemaRow + * @returns {import("dbgate-types").SchemaInfo} + */ +function mapSchemaRowToSchemaInfo(duckDbSchemaRow) { + const schemaInfo = { + schemaName: duckDbSchemaRow.schema_name, + objectId: duckDbSchemaRow.oid, + }; + + return /** @type {import("dbgate-types").SchemaInfo} */ (schemaInfo); +} + module.exports = { mapRawTableToTableInfo, mapRawColumnToColumnInfo, @@ -371,4 +397,5 @@ module.exports = { mapConstraintRowToUniqueInfo, mapViewRowToViewInfo, mapIndexRowToIndexInfo, + mapSchemaRowToSchemaInfo, }; diff --git a/plugins/dbgate-plugin-duckdb/src/backend/driver.js b/plugins/dbgate-plugin-duckdb/src/backend/driver.js index 81be19869..c1fc43bcc 100644 --- a/plugins/dbgate-plugin-duckdb/src/backend/driver.js +++ b/plugins/dbgate-plugin-duckdb/src/backend/driver.js @@ -5,6 +5,8 @@ const Analyser = require('./Analyser'); const driverBase = require('../frontend/driver'); const { getLogger, extractErrorLogData, createBulkInsertStreamBase } = require('dbgate-tools'); const { getColumnsInfo, normalizeRow } = require('./helpers'); +const sql = require('./sql'); +const { mapSchemaRowToSchemaInfo } = require('./Analyser.helpers'); const logger = getLogger('sqliteDriver'); @@ -111,11 +113,13 @@ const driver = { options.done(); } }, - async script(dbhan, sql) { - const dmp1 = driver.createDumper(); - dmp1.beginTransaction(); + async script(dbhan, sql, { useTransaction } = { useTransaction: false }) { + if (useTransaction) { + const dmp1 = driver.createDumper(); + dmp1.beginTransaction(); - await dbhan.client.run(dmp1.s); + await dbhan.client.run(dmp1.s); + } const statements = await dbhan.client.extractStatements(sql); const count = statements.count; @@ -125,10 +129,12 @@ const driver = { await stmt.run(); } - const dmp2 = driver.createDumper(); - dmp2.commitTransaction(); + if (useTransaction) { + const dmp2 = driver.createDumper(); + dmp2.commitTransaction(); - await dbhan.client.run(dmp2.s); + await dbhan.client.run(dmp2.s); + } }, async readQuery(dbhan, sql, structure) { @@ -168,13 +174,20 @@ const driver = { }, async getVersion(dbhan) { const { rows } = await this.query(dbhan, 'SELECT version() AS version;'); - const { version } = rows[0]; + const { version } = rows?.[0]; return { version, versionText: `DuchDB ${version}`, }; }, + + async listSchemas(dbhan) { + const schemasResult = await this.query(dbhan, sql.schemas); + const schemas = schemasResult.rows?.map(mapSchemaRowToSchemaInfo); + + return schemas ?? null; + }, }; module.exports = driver; diff --git a/plugins/dbgate-plugin-duckdb/src/backend/sql/index.js b/plugins/dbgate-plugin-duckdb/src/backend/sql/index.js index ed1ee30bb..d867c203d 100644 --- a/plugins/dbgate-plugin-duckdb/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-duckdb/src/backend/sql/index.js @@ -5,6 +5,7 @@ const primaryKeys = require('./primaryKeys.js'); const indexes = require('./indexes.js'); const uniques = require('./uniques.js'); const views = require('./views.js'); +const schemas = require('./schemas.js'); module.exports = { tables, @@ -14,4 +15,5 @@ module.exports = { indexes, uniques, views, + schemas, }; diff --git a/plugins/dbgate-plugin-duckdb/src/backend/sql/schemas.js b/plugins/dbgate-plugin-duckdb/src/backend/sql/schemas.js new file mode 100644 index 000000000..ff810b57a --- /dev/null +++ b/plugins/dbgate-plugin-duckdb/src/backend/sql/schemas.js @@ -0,0 +1 @@ +module.exports = `SELECT * FROM duckdb_schemas() WHERE internal = false`;