From 51952ecfdd66675b622c7d880f0580fe74ae5f27 Mon Sep 17 00:00:00 2001 From: Rinie Kervel Date: Tue, 11 Oct 2022 17:04:38 +0200 Subject: [PATCH] Oracle driver first data --- .../src/backend/Analyser.js | 151 +++++------------- .../src/backend/drivers.js | 38 +++-- .../src/backend/sql/columns.js | 34 ++-- .../src/backend/sql/fk_key_column_usage.js | 8 - .../backend/sql/fk_referential_constraints.js | 8 - .../src/backend/sql/fk_table_constraints.js | 6 - .../src/backend/sql/foreignKeys.js | 44 ++--- .../src/backend/sql/geographyColumns.js | 6 - .../src/backend/sql/geometryColumns.js | 6 - .../src/backend/sql/index.js | 27 ++-- .../src/backend/sql/indexcols.js | 22 --- .../src/backend/sql/indexes.js | 39 ++--- .../src/backend/sql/matviewColumns.js | 22 +-- .../src/backend/sql/matviewModifications.js | 6 - .../src/backend/sql/matviews.js | 21 ++- .../src/backend/sql/primaryKeys.js | 29 ++-- .../src/backend/sql/routineModifications.js | 8 - .../src/backend/sql/routines.js | 45 ++++-- .../src/backend/sql/tableList.js | 37 +++-- .../src/backend/sql/tableModifications.js | 26 --- .../src/backend/sql/uniqueNames.js | 5 +- .../src/backend/sql/viewModifications.js | 6 - .../src/backend/sql/views.js | 39 ++++- .../src/frontend/drivers.js | 3 +- start.bat | 4 + 25 files changed, 259 insertions(+), 381 deletions(-) create mode 100644 start.bat diff --git a/plugins/dbgate-plugin-oracle/src/backend/Analyser.js b/plugins/dbgate-plugin-oracle/src/backend/Analyser.js index 90d8563ec..72453f1bc 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-oracle/src/backend/Analyser.js @@ -57,8 +57,8 @@ class Analyser extends DatabaseAnalyser { createQuery(resFileName, typeFields) { const query = super.createQuery(sql[resFileName], typeFields); - if (query) return query.replace('#REFTABLECOND#', this.driver.__analyserInternals.refTableCond); - return null; + //if (query) return query.replace('#REFTABLECOND#', this.driver.__analyserInternals.refTableCond); + return query; } async _computeSingleObjectId() { @@ -70,76 +70,22 @@ class Analyser extends DatabaseAnalyser { this.feedback({ analysingMessage: 'Loading tables' }); const tables = await this.driver.query( this.pool, - this.createQuery(this.driver.dialect.stringAgg ? 'tableModifications' : 'tableList', ['tables']) + this.createQuery(this.driver.dialect.stringAgg ? 'tableList' : 'tableList', ['tables']) ); this.feedback({ analysingMessage: 'Loading columns' }); const columns = await this.driver.query(this.pool, this.createQuery('columns', ['tables', 'views'])); this.feedback({ analysingMessage: 'Loading primary keys' }); const pkColumns = await this.driver.query(this.pool, this.createQuery('primaryKeys', ['tables'])); - let fkColumns = null; + //let fkColumns = null; - // if (true) { - if (this.containsObjectIdCondition(['tables']) || this.driver.__analyserInternals.refTableCond) { this.feedback({ analysingMessage: 'Loading foreign keys' }); - fkColumns = await this.driver.query(this.pool, this.createQuery('foreignKeys', ['tables'])); - } else { - this.feedback({ analysingMessage: 'Loading foreign key constraints' }); - const fk_tableConstraints = await this.driver.query( - this.pool, - this.createQuery('fk_tableConstraints', ['tables']) - ); - - this.feedback({ analysingMessage: 'Loading foreign key refs' }); - const fk_referentialConstraints = await this.driver.query( - this.pool, - this.createQuery('fk_referentialConstraints', ['tables']) - ); - - this.feedback({ analysingMessage: 'Loading foreign key columns' }); - const fk_keyColumnUsage = await this.driver.query(this.pool, this.createQuery('fk_keyColumnUsage', ['tables'])); - - const cntKey = x => `${x.constraint_name}|${x.constraint_schema}`; - const rows = []; - const constraintDct = _.keyBy(fk_tableConstraints.rows, cntKey); - for (const fkRef of fk_referentialConstraints.rows) { - const cntBase = constraintDct[cntKey(fkRef)]; - const cntRef = constraintDct[`${fkRef.unique_constraint_name}|${fkRef.unique_constraint_schema}`]; - if (!cntBase || !cntRef) continue; - const baseCols = _.sortBy( - fk_keyColumnUsage.rows.filter( - x => x.table_name == cntBase.table_name && x.constraint_name == cntBase.constraint_name - ), - 'ordinal_position' - ); - const refCols = _.sortBy( - fk_keyColumnUsage.rows.filter( - x => x.table_name == cntRef.table_name && x.constraint_name == cntRef.constraint_name - ), - 'ordinal_position' - ); - if (baseCols.length != refCols.length) continue; - - for (let i = 0; i < baseCols.length; i++) { - const baseCol = baseCols[i]; - const refCol = refCols[i]; - - rows.push({ - ...fkRef, - pure_name: cntBase.table_name, - schema_name: cntBase.table_schema, - ref_table_name: cntRef.table_name, - ref_schema_name: cntRef.table_schema, - column_name: baseCol.column_name, - ref_column_name: refCol.column_name, - }); - } - } - fkColumns = { rows }; - } - + const fkColumns = await this.driver.query(this.pool, this.createQuery('foreignKeys', ['tables'])); this.feedback({ analysingMessage: 'Loading views' }); const views = await this.driver.query(this.pool, this.createQuery('views', ['views'])); + let geometryColumns = { rows: [] }; + let geographyColumns = { rows: [] }; + this.feedback({ analysingMessage: 'Loading materialized views' }); const matviews = this.driver.dialect.materializedViews ? await this.driver.query(this.pool, this.createQuery('matviews', ['matviews'])) @@ -155,23 +101,11 @@ class Analyser extends DatabaseAnalyser { ? { rows: [] } : await this.driver.query(this.pool, this.createQuery('indexes', ['tables'])); this.feedback({ analysingMessage: 'Loading index columns' }); - const indexcols = this.driver.__analyserInternals.skipIndexes - ? { rows: [] } - : await this.driver.query(this.pool, this.createQuery('indexcols', ['tables'])); +// const indexcols = this.driver.__analyserInternals.skipIndexes +// ? { rows: [] } +// : await this.driver.query(this.pool, this.createQuery('indexcols', ['tables'])); this.feedback({ analysingMessage: 'Loading unique names' }); const uniqueNames = await this.driver.query(this.pool, this.createQuery('uniqueNames', ['tables'])); - - let geometryColumns = { rows: [] }; - if (views.rows.find(x => x.pure_name == 'geometry_columns' && x.schema_name == 'public')) { - this.feedback({ analysingMessage: 'Loading geometry columns' }); - geometryColumns = await this.safeQuery(this.createQuery('geometryColumns', ['tables'])); - } - let geographyColumns = { rows: [] }; - if (views.rows.find(x => x.pure_name == 'geography_columns' && x.schema_name == 'public')) { - this.feedback({ analysingMessage: 'Loading geography columns' }); - geographyColumns = await this.safeQuery(this.createQuery('geographyColumns', ['tables'])); - } - this.feedback({ analysingMessage: 'Finalizing DB structure' }); const columnColumnsMapped = fkColumns.rows.map(x => ({ @@ -209,45 +143,34 @@ class Analyser extends DatabaseAnalyser { .map(col => getColumnInfo(col, newTable, geometryColumns, geographyColumns)), primaryKey: DatabaseAnalyser.extractPrimaryKeys(newTable, pkColumnsMapped), foreignKeys: DatabaseAnalyser.extractForeignKeys(newTable, columnColumnsMapped), - indexes: indexes.rows - .filter( - x => - x.table_name == table.pure_name && - x.schema_name == table.schema_name && - !uniqueNames.rows.find(y => y.constraint_name == x.index_name) - ) - .map(idx => ({ - constraintName: idx.index_name, - isUnique: idx.is_unique, - columns: _.compact( - idx.indkey - .split(' ') - .map(colid => indexcols.rows.find(col => col.oid == idx.oid && col.attnum == colid)) - .filter(col => col != null) - .map(col => ({ - columnName: col.column_name, - })) - ), + indexes: _.uniqBy( + indexes.rows.filter( + idx => + idx.tableName == table.pureName && !uniqueNames.rows.find(x => x.constraintName == idx.constraintName) + ), + 'constraintName' + ).map(idx => ({ + ..._.pick(idx, ['constraintName', 'indexType']), + isUnique: idx.Unique === 'UNIQUE', + columns: indexes.rows + .filter(col => col.tableName == idx.tableName && col.constraintName == idx.constraintName) + .map(col => ({ + ..._.pick(col, ['columnName']), })), - uniques: indexes.rows - .filter( - x => - x.table_name == table.pure_name && - x.schema_name == table.schema_name && - uniqueNames.rows.find(y => y.constraint_name == x.index_name) - ) - .map(idx => ({ - constraintName: idx.index_name, - columns: _.compact( - idx.indkey - .split(' ') - .map(colid => indexcols.rows.find(col => col.oid == idx.oid && col.attnum == colid)) - .filter(col => col != null) - .map(col => ({ - columnName: col.column_name, - })) - ), + })), + uniques: _.uniqBy( + indexes.rows.filter( + idx => idx.tableName == table.pureName && uniqueNames.rows.find(x => x.constraintName == idx.constraintName) + ), + 'constraintName' + ).map(idx => ({ + ..._.pick(idx, ['constraintName']), + columns: indexes.rows + .filter(col => col.tableName == idx.tableName && col.constraintName == idx.constraintName) + .map(col => ({ + ..._.pick(col, ['columnName']), })), + })), }; }), views: views.rows.map(view => ({ diff --git a/plugins/dbgate-plugin-oracle/src/backend/drivers.js b/plugins/dbgate-plugin-oracle/src/backend/drivers.js index 52044e7d2..a811070eb 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/drivers.js +++ b/plugins/dbgate-plugin-oracle/src/backend/drivers.js @@ -15,7 +15,7 @@ pg.types.setTypeParser(1184, 'text', val => val); // timestamp function extractOracleColumns(result) { console.log('result', result); - console.log('result.name', result[0].name); + //console.log('result.name', result[0].name); console.log('result.map', result.map(fld => ({ columnName: fld.name.toLowerCase(), }))); @@ -112,12 +112,21 @@ const drivers = driverBases.map(driverBase => ({ columns: [], }; } +try { console.log('sql', sql); const res = await client.execute(sql); console.log('res', res); const columns = extractOracleColumns(res.metaData); console.log('columns', columns); return { rows: (res.rows || []).map(row => zipDataRow(row, columns)), columns }; +} +catch(err) { + console.log('Error query', err); +} +finally { + console.log('finally', sql); +} + }, stream(client, sql, options) { /* @@ -128,12 +137,14 @@ const drivers = driverBases.map(driverBase => ({ */ console.log('queryStream', sql); const query = client.queryStream(sql); + // const consumeStream = new Promise((resolve, reject) => { + let rowcount = 0; let wasHeader = false; - query.on('metaData', row => { - console.log('metaData', row); + query.on('metadata', row => { + console.log('metadata', row); if (!wasHeader) { - columns = extractOracleColumns(query.metaData); + columns = extractOracleColumns(row); if (columns && columns.length > 0) { options.recordset(columns); } @@ -145,14 +156,6 @@ const drivers = driverBases.map(driverBase => ({ query.on('data', row => { console.log('DATA', row); - if (!wasHeader) { - columns = extractOracleColumns(query._result); - if (columns && columns.length > 0) { - options.recordset(columns); - } - wasHeader = true; - } - options.row(zipDataRow(row, columns)); }); @@ -190,7 +193,16 @@ const drivers = driverBases.map(driverBase => ({ }); options.done(); }); + query.on('close', function() { + // console.log("stream 'close' event"); + // The underlying ResultSet has been closed, so the connection can now + // be closed, if desired. Note: do not close connections on 'end'. + resolve(rowcount); + }); + //}); + //const numrows = await consumeStream; + //console.log('Rows selected: ' + numrows); client.query(query); }, async getVersion(client) { @@ -273,7 +285,7 @@ const drivers = driverBases.map(driverBase => ({ pass.end(); }); - client.query(query); + //client.query(query); return pass; }, diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/columns.js b/plugins/dbgate-plugin-oracle/src/backend/sql/columns.js index 0be8a81df..3e046a39a 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/columns.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/columns.js @@ -1,23 +1,15 @@ module.exports = ` -select - table_schema as "schema_name", - table_name as "pure_name", - column_name as "column_name", - is_nullable as "is_nullable", - data_type as "data_type", - character_maximum_length as "char_max_length", - numeric_precision as "numeric_precision", - numeric_scale as "numeric_scale", - column_default as "default_value" -from information_schema.columns -where - table_schema <> 'information_schema' - and table_schema <> 'pg_catalog' - and table_schema !~ '^pg_toast' - and ( - ('tables:' || table_schema || '.' || table_name) =OBJECT_ID_CONDITION - or - ('views:' || table_schema || '.' || table_name) =OBJECT_ID_CONDITION - ) -order by ordinal_position +select + owner as "schema_name", + table_name as "pure_name", + column_name as "column_name", + nullable as "is_nullable", + data_type as "data_type", + data_length as "char_max_length", + data_precision as "numeric_precision", + data_scale as "numeric_scale", + data_default as "default_value" + FROM all_tab_columns av + where TABLE_NAME =OBJECT_ID_CONDITION +order by column_id `; \ No newline at end of file diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_key_column_usage.js b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_key_column_usage.js index ea5a73820..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_key_column_usage.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_key_column_usage.js @@ -1,10 +1,2 @@ module.exports = ` -select - basecol.constraint_name, - basecol.constraint_schema, - basecol.column_name as "column_name", - basecol.table_schema, - basecol.table_name, - basecol.ordinal_position -from information_schema.key_column_usage basecol `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_referential_constraints.js b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_referential_constraints.js index a93584d63..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_referential_constraints.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_referential_constraints.js @@ -1,10 +1,2 @@ module.exports = ` -select - fk.constraint_name as "constraint_name", - fk.constraint_schema as "constraint_schema", - fk.update_rule as "update_action", - fk.delete_rule as "delete_action", - fk.unique_constraint_name as "unique_constraint_name", - fk.unique_constraint_schema as "unique_constraint_schema" -from information_schema.referential_constraints fk `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_table_constraints.js b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_table_constraints.js index 51354f212..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/fk_table_constraints.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/fk_table_constraints.js @@ -1,8 +1,2 @@ module.exports = ` -select - base.table_name as "table_name", - base.table_schema as "table_schema", - base.constraint_name as "constraint_name", - base.constraint_schema as "constraint_schema" -from information_schema.table_constraints base `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/foreignKeys.js b/plugins/dbgate-plugin-oracle/src/backend/sql/foreignKeys.js index 81b966363..ffaa26f50 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/foreignKeys.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/foreignKeys.js @@ -1,24 +1,24 @@ module.exports = ` -select - fk.constraint_name as "constraint_name", - fk.constraint_schema as "constraint_schema", - base.table_name as "pure_name", - base.table_schema as "schema_name", - fk.update_rule as "update_action", - fk.delete_rule as "delete_action", - ref.table_name as "ref_table_name", - ref.table_schema as "ref_schema_name", - basecol.column_name as "column_name", - refcol.column_name as "ref_column_name" -from information_schema.referential_constraints fk -inner join information_schema.table_constraints base on fk.constraint_name = base.constraint_name and fk.constraint_schema = base.constraint_schema -inner join information_schema.table_constraints ref on fk.unique_constraint_name = ref.constraint_name and fk.unique_constraint_schema = ref.constraint_schema #REFTABLECOND# -inner join information_schema.key_column_usage basecol on base.table_name = basecol.table_name and base.constraint_name = basecol.constraint_name -inner join information_schema.key_column_usage refcol on ref.table_name = refcol.table_name and ref.constraint_name = refcol.constraint_name and basecol.ordinal_position = refcol.ordinal_position -where - base.table_schema <> 'information_schema' - and base.table_schema <> 'pg_catalog' - and base.table_schema !~ '^pg_toast' - and ('tables:' || base.table_schema || '.' || base.table_name) =OBJECT_ID_CONDITION -order by basecol.ordinal_position +select fk.constraint_name as "constraint_name", + fk.owner as "constraint_schema", + fk.table_name as "pure_name", + fk.owner as "schema_name", + fk.delete_rule as "update_action", + fk.delete_rule as "delete_action", + ref.table_name as "ref_table_name", + ref.owner as "ref_schema_name", + basecol.column_name as "column_name", + refcol.column_name as "ref_column_name" +from all_cons_columns refcol, all_cons_columns basecol, all_constraints ref, all_constraints fk +where fk.constraint_type = 'R' +and ref.owner = fk.r_owner +and ref.constraint_name = fk.r_constraint_name +and basecol.owner = fk.owner +and basecol.constraint_name = fk.constraint_name +and basecol.table_name = fk.table_name +and refcol.owner = ref.owner +and refcol.constraint_name = ref.constraint_name +and refcol.table_name = ref.table_name +AND fk.constraint_name =OBJECT_ID_CONDITION +order by basecol.position `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/geographyColumns.js b/plugins/dbgate-plugin-oracle/src/backend/sql/geographyColumns.js index 343d9c5d6..5b78f2390 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/geographyColumns.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/geographyColumns.js @@ -1,8 +1,2 @@ module.exports = ` -select - f_table_schema as "schema_name", - f_table_name as "pure_name", - f_geography_column as "column_name" -from public.geography_columns -where ('tables:' || f_table_schema || '.' || f_table_name) =OBJECT_ID_CONDITION `; \ No newline at end of file diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/geometryColumns.js b/plugins/dbgate-plugin-oracle/src/backend/sql/geometryColumns.js index 94b8d5516..5b78f2390 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/geometryColumns.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/geometryColumns.js @@ -1,8 +1,2 @@ module.exports = ` -select - f_table_schema as "schema_name", - f_table_name as "pure_name", - f_geometry_column as "column_name" -from public.geometry_columns -where ('tables:' || f_table_schema || '.' || f_table_name) =OBJECT_ID_CONDITION `; \ No newline at end of file diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/index.js b/plugins/dbgate-plugin-oracle/src/backend/sql/index.js index f845604e2..3c3eb665e 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/index.js @@ -2,23 +2,23 @@ const columns = require('./columns'); const tableModifications = require('./tableList'); const tableList = require('./tableList'); const viewModifications = require('./views'); -const matviewModifications = require('./matviewModifications'); +const matviewModifications = require('./matviews'); const primaryKeys = require('./primaryKeys'); const foreignKeys = require('./foreignKeys'); const views = require('./views'); const matviews = require('./matviews'); const routines = require('./routines'); -const routineModifications = require('./routineModifications'); +const routineModifications = require('./routines'); const matviewColumns = require('./matviewColumns'); -const indexes = require('./indexes'); -const indexcols = require('./indexcols'); +const indexes = require('./indexes'); // use mysql +//const indexcols = require('./indexcols'); const uniqueNames = require('./uniqueNames'); -const geometryColumns = require('./geometryColumns'); -const geographyColumns = require('./geographyColumns'); +//const geometryColumns = require('./geometryColumns'); +//const geographyColumns = require('./geographyColumns'); -const fk_keyColumnUsage = require('./fk_key_column_usage'); -const fk_referentialConstraints = require('./fk_referential_constraints'); -const fk_tableConstraints = require('./fk_table_constraints'); +//const fk_keyColumnUsage = require('./fk_key_column_usage'); +//const fk_referentialConstraints = require('./fk_referential_constraints'); +//const fk_tableConstraints = require('./fk_table_constraints'); module.exports = { columns, @@ -27,9 +27,6 @@ module.exports = { viewModifications, primaryKeys, foreignKeys, - fk_keyColumnUsage, - fk_referentialConstraints, - fk_tableConstraints, views, routines, routineModifications, @@ -37,8 +34,8 @@ module.exports = { matviewModifications, matviewColumns, indexes, - indexcols, +// indexcols, uniqueNames, - geometryColumns, - geographyColumns, + //geometryColumns, + //geographyColumns, }; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/indexcols.js b/plugins/dbgate-plugin-oracle/src/backend/sql/indexcols.js index 4acf4fbd2..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/indexcols.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/indexcols.js @@ -1,24 +1,2 @@ module.exports = ` - select - a.attname as "column_name", - a.attnum as "attnum", - a.attrelid as "oid" - from - pg_class t, - pg_class i, - pg_attribute a, - pg_index ix, - pg_namespace c - where - t.oid = ix.indrelid - and a.attnum = ANY(ix.indkey) - and a.attrelid = t.oid - and i.oid = ix.indexrelid - and t.relkind = 'r' - and ix.indisprimary = false - and t.relnamespace = c.oid - and c.nspname != 'pg_catalog' - and ('tables:' || c.nspname || '.' || t.relname) =OBJECT_ID_CONDITION - order by - t.relname `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/indexes.js b/plugins/dbgate-plugin-oracle/src/backend/sql/indexes.js index 06922b159..32aa10437 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/indexes.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/indexes.js @@ -1,25 +1,18 @@ module.exports = ` - select - t.relname as "table_name", - c.nspname as "schema_name", - i.relname as "index_name", - ix.indisprimary as "is_primary", - ix.indisunique as "is_unique", - ix.indkey as "indkey", - t.oid as "oid" - from - pg_class t, - pg_class i, - pg_index ix, - pg_namespace c - where - t.oid = ix.indrelid - and i.oid = ix.indexrelid - and t.relkind = 'r' - and ix.indisprimary = false - and t.relnamespace = c.oid - and c.nspname != 'pg_catalog' - and ('tables:' || c.nspname || '.' || t.relname) =OBJECT_ID_CONDITION - order by - t.relname +select i.table_name as "tableName", + i.table_owner as "schemaName", + i.index_name as "constraintName", + i.index_type as "indexType", + i.uniqueness as "Unique", + ic.column_name as "columnName", + ic.column_position as "postion", + ic.descend as "descending" +from all_ind_columns ic, all_indexes i +where ic.index_owner = i.owner +and ic.index_name = i.index_name +and i.index_name =OBJECT_ID_CONDITION +order by i.table_owner, + i.table_name, + i.index_name, + ic.column_position `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/matviewColumns.js b/plugins/dbgate-plugin-oracle/src/backend/sql/matviewColumns.js index 292d90c41..2049c1d3f 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/matviewColumns.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/matviewColumns.js @@ -1,17 +1,9 @@ module.exports = ` -SELECT pg_namespace.nspname AS "schema_name" - , pg_class.relname AS "pure_name" - , pg_attribute.attname AS "column_name" - , pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS "data_type" -FROM pg_catalog.pg_class - INNER JOIN pg_catalog.pg_namespace - ON pg_class.relnamespace = pg_namespace.oid - INNER JOIN pg_catalog.pg_attribute - ON pg_class.oid = pg_attribute.attrelid --- Keeps only materialized views, and non-db/catalog/index columns -WHERE pg_class.relkind = 'm' - AND pg_attribute.attnum >= 1 - AND ('matviews:' || pg_namespace.nspname || '.' || pg_class.relname) =OBJECT_ID_CONDITION - -ORDER BY pg_attribute.attnum +SELECT owner "schema_name" + , table_name "pure_name" + , column_name "column_name" + , data_type "data_type" + FROM all_tab_columns av + where table_name =OBJECT_ID_CONDITION +order by column_id `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/matviewModifications.js b/plugins/dbgate-plugin-oracle/src/backend/sql/matviewModifications.js index f8ad85ad4..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/matviewModifications.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/matviewModifications.js @@ -1,8 +1,2 @@ module.exports = ` -select - matviewname as "pure_name", - schemaname as "schema_name", - md5(definition) as "hash_code" -from - pg_catalog.pg_matviews WHERE schemaname NOT LIKE 'pg_%' `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/matviews.js b/plugins/dbgate-plugin-oracle/src/backend/sql/matviews.js index de1105d8f..85c7f2592 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/matviews.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/matviews.js @@ -1,10 +1,15 @@ module.exports = ` -select - matviewname as "pure_name", - schemaname as "schema_name", - definition as "definition", - md5(definition) as "hash_code" -from - pg_catalog.pg_matviews WHERE schemaname NOT LIKE 'pg_%' - and ('matviews:' || schemaname || '.' || matviewname) =OBJECT_ID_CONDITION +select owner as schema_name, + mview_name pure_name, + container_name, + query as definition, + ora_hash(query, 'MD5') as "hash_code" + --refresh_mode, + --refresh_method, + --build_mode, + --last_refresh_date, + --ompile_state +from all_mviews +where mview_name=OBJECT_ID_CONDITION +order by owner, mview_name `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/primaryKeys.js b/plugins/dbgate-plugin-oracle/src/backend/sql/primaryKeys.js index aa9542581..6d10262d6 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/primaryKeys.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/primaryKeys.js @@ -1,17 +1,16 @@ module.exports = ` -select - table_constraints.constraint_schema as "constraint_schema", - table_constraints.constraint_name as "constraint_name", - table_constraints.table_schema as "schema_name", - table_constraints.table_name as "pure_name", - key_column_usage.column_name as "column_name" -from information_schema.table_constraints -inner join information_schema.key_column_usage on table_constraints.table_name = key_column_usage.table_name and table_constraints.constraint_name = key_column_usage.constraint_name -where - table_constraints.table_schema <> 'information_schema' - and table_constraints.table_schema <> 'pg_catalog' - and table_constraints.table_schema !~ '^pg_toast' - and table_constraints.constraint_type = 'PRIMARY KEY' - and ('tables:' || table_constraints.table_schema || '.' || table_constraints.table_name) =OBJECT_ID_CONDITION -order by key_column_usage.ordinal_position +select + pk.owner as "constraint_schema", + pk.constraint_name as "constraint_name", + pk.owner as "schema_name", + pk.table_name as "pure_name", + basecol.column_name as "column_name" +from all_cons_columns basecol, + all_constraints pk +where constraint_type = 'P' +and basecol.owner = pk.owner +and basecol.constraint_name = pk.constraint_name +and basecol.table_name = pk.table_name +and pk.constraint_name =OBJECT_ID_CONDITION +order by basecol.position `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/routineModifications.js b/plugins/dbgate-plugin-oracle/src/backend/sql/routineModifications.js index ad93e9734..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/routineModifications.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/routineModifications.js @@ -1,10 +1,2 @@ module.exports = ` -select - routine_name as "pure_name", - routine_schema as "schema_name", - md5(routine_definition) as "hash_code", - routine_type as "object_type" -from - information_schema.routines where routine_schema != 'information_schema' and routine_schema != 'pg_catalog' - and routine_type in ('PROCEDURE', 'FUNCTION') `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/routines.js b/plugins/dbgate-plugin-oracle/src/backend/sql/routines.js index f136eebac..c66004bd9 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/routines.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/routines.js @@ -1,17 +1,40 @@ module.exports = ` -select +select routine_name as "pure_name", routine_schema as "schema_name", routine_definition as "definition", - md5(routine_definition) as "hash_code", + standard_hash(routine_definition, 'MD5') as "hash_code", routine_type as "object_type", - data_type as "data_type", - external_language as "language" -from - information_schema.routines where routine_schema != 'information_schema' and routine_schema != 'pg_catalog' - and ( - (routine_type = 'PROCEDURE' and ('procedures:' || routine_schema || '.' || routine_name) =OBJECT_ID_CONDITION) - or - (routine_type = 'FUNCTION' and ('functions:' || routine_schema || '.' || routine_name) =OBJECT_ID_CONDITION) - ) + 'fixme_data_type' as "data_type", + 'fixme_external_language' as "language" +from (select + sys_context('userenv', 'DB_NAME') routine_catalog, + sys_context('userenv', 'DB_NAME') specific_catalog, + ap.owner specific_schema, + ap.owner routine_schema, + decode( ap.procedure_name, null, ap.object_name || ap.procedure_name, ap.procedure_name ) specific_name, + decode( ap.procedure_name, null, ap.object_name || ap.procedure_name, ap.procedure_name ) routine_name, + ao.object_type routine_type, + decode(impltypeowner, null, to_char(null), SYS_CONTEXT('userenv', 'DB_NAME')) type_udt_catalog, + --to_clob(get_proc_text(ap.owner, ap.object_name, ao.object_type, 32767)) routine_body, + 'fixme_routine_body.' || ap.owner || '.' || decode( ap.procedure_name, null, ap.object_name || ap.procedure_name, ap.procedure_name ) routine_body, + --to_clob(get_proc_text(ap.owner, ap.object_name, ao.object_type, 4000)) routine_definition, + 'fixme_routine_definition.' || ap.owner || '.' || decode( ap.procedure_name, null, ap.object_name || ap.procedure_name, ap.procedure_name ) routine_definition, + sys_context('userenv', 'DB_NAME') character_set_catalog, + 'SYS' character_set_schema, + sys_context('userenv', 'DB_NAME') collation_catalog, + 'SYS' collation_schema, + deterministic is_deterministic, + pipelined is_pipelined , + aggregate is_aggregate, + authid is_definer + from + all_procedures ap, + all_objects ao + where + ap.owner = ao.owner and + ap.object_name = ao.object_name and + ao.object_type in ('PACKAGE', 'PROCEDURE', 'FUNCTION') + and ao.object_name =OBJECT_ID_CONDITION + ) routines `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/tableList.js b/plugins/dbgate-plugin-oracle/src/backend/sql/tableList.js index 6846ac898..88dfc557a 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/tableList.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/tableList.js @@ -1,18 +1,27 @@ module.exports = ` -select ao.owner as "schema_name", ao.object_name as "pure_name" -from all_objects ao -where exists(select null from user_objects uo where uo.object_id = ao.object_id) -and object_type = 'TABLE' -`; -/* -module.exports = ` select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name" -from information_schema.tables infoTables +from ( + select + sys_context('userenv', 'DB_NAME') table_catalog, + owner table_schema, + table_name table_name, + case + when iot_type = 'Y' then 'IOT' + when temporary = 'Y' then 'TEMP' + else 'BASE TABLE' + end table_type + from + all_tables +union all + select + sys_context('userenv', 'DB_NAME') table_catalog, + owner table_schema, + view_name table_name, + 'VIEW' table_type +from + all_views +) infoTables where infoTables.table_type not like '%VIEW%' - and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION -and infoTables.table_schema <> 'pg_catalog' -and infoTables.table_schema <> 'information_schema' -and infoTables.table_schema <> 'pg_internal' -and infoTables.table_schema !~ '^pg_toast' +and table_name =OBJECT_ID_CONDITION `; -*/ + diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/tableModifications.js b/plugins/dbgate-plugin-oracle/src/backend/sql/tableModifications.js index 700405dac..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/tableModifications.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/tableModifications.js @@ -1,28 +1,2 @@ module.exports = ` -select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name", - ( - select md5(string_agg( - infoColumns.column_name || '|' || infoColumns.data_type || '|' || infoColumns.is_nullable::varchar(255) || '|' || coalesce(infoColumns.character_maximum_length, -1)::varchar(255) - || '|' || coalesce(infoColumns.numeric_precision, -1)::varchar(255) , - ',' order by infoColumns.ordinal_position - )) as "hash_code_columns" - from information_schema.columns infoColumns - where infoColumns.table_schema = infoTables.table_schema and infoColumns.table_name = infoTables.table_name - ), - ( - select md5(string_agg( - infoConstraints.constraint_name || '|' || infoConstraints.constraint_type , - ',' order by infoConstraints.constraint_name - )) as "hash_code_constraints" - from information_schema.table_constraints infoConstraints - where infoConstraints.table_schema = infoTables.table_schema and infoConstraints.table_name = infoTables.table_name - ) - -from information_schema.tables infoTables -where infoTables.table_type not like '%VIEW%' - and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION -and infoTables.table_schema <> 'pg_catalog' -and infoTables.table_schema <> 'information_schema' -and infoTables.table_schema <> 'pg_internal' -and infoTables.table_schema !~ '^pg_toast' `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/uniqueNames.js b/plugins/dbgate-plugin-oracle/src/backend/sql/uniqueNames.js index a6eec71b4..5832aa800 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/uniqueNames.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/uniqueNames.js @@ -1,3 +1,6 @@ module.exports = ` - select conname as "constraint_name" from pg_constraint where contype = 'u' +select constraint_name +from all_constraints +where constraint_type = 'U' + and constraint_name =OBJECT_ID_CONDITION `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/viewModifications.js b/plugins/dbgate-plugin-oracle/src/backend/sql/viewModifications.js index 9a61358a9..1cb290383 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/viewModifications.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/viewModifications.js @@ -1,8 +1,2 @@ module.exports = ` -select - table_name as "pure_name", - table_schema as "schema_name", - md5(view_definition) as "hash_code" -from - information_schema.views where table_schema != 'information_schema' and table_schema != 'pg_catalog' `; diff --git a/plugins/dbgate-plugin-oracle/src/backend/sql/views.js b/plugins/dbgate-plugin-oracle/src/backend/sql/views.js index a7644492f..68a24c5a7 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/sql/views.js +++ b/plugins/dbgate-plugin-oracle/src/backend/sql/views.js @@ -1,9 +1,36 @@ module.exports = ` select -ao.owner as "schema_name", ao.object_name as "pure_name", - 'later' as "create_sql", - object_id as "hash_code" -from all_objects ao -where exists(select null from user_objects uo where uo.object_id = ao.object_id) -and object_type = 'VIEW' + table_name as "pure_name", + table_schema as "schema_name", + table_name as "create_sql", + ora_hash(view_definition, 3768421) as "hash_code" -- fixme +from (select + sys_context('userenv', 'DB_NAME') table_catalog, + owner table_schema, + view_name table_name, + text view_definition, + 'VIEW' table_type, + (select max( case when uuc.updatable = 'YES' or + uuc.deletable = 'YES' or + uuc.insertable = 'YES' then 'YES' else 'NO' end + ) + from + user_updatable_columns uuc + where + uuc.owner = av.owner and + uuc.table_name = av.view_name + ) is_updatable, + decode( + (select 1 + from + all_constraints ac + where + ac.owner = av.owner and + ac.table_name = av.view_name and + ac.constraint_type = 'V'), 1, 'CASCADE', 'NONE') check_option +from + all_views av + where text is not null + ) views + where table_name =OBJECT_ID_CONDITION `; diff --git a/plugins/dbgate-plugin-oracle/src/frontend/drivers.js b/plugins/dbgate-plugin-oracle/src/frontend/drivers.js index 752dfbeef..d0616da9d 100644 --- a/plugins/dbgate-plugin-oracle/src/frontend/drivers.js +++ b/plugins/dbgate-plugin-oracle/src/frontend/drivers.js @@ -6,7 +6,8 @@ const spatialTypes = ['GEOGRAPHY']; /** @type {import('dbgate-types').SqlDialect} */ const dialect = { - rangeSelect: true, + rangeSelect: false, + limitSelect: false, ilike: true, // stringEscapeChar: '\\', stringEscapeChar: "'", diff --git a/start.bat b/start.bat new file mode 100644 index 000000000..bc6b1c5e2 --- /dev/null +++ b/start.bat @@ -0,0 +1,4 @@ +set NODE_OPTIONS=--openssl-legacy-provider +start cmd /k yarn start:api +start cmd /k yarn start:web +start cmd /k yarn lib \ No newline at end of file