UNPKG

@rcronin/sequelize-ibmi-mapepire

Version:

IBM i (via Mapepire) Sequelize V7 Dialect

169 lines 9.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IBMiQueryGeneratorTypeScript = void 0; const core_1 = require("@sequelize/core"); const query_generator_typescript_js_1 = require("@sequelize/core/_non-semver-use-at-your-own-risk_/abstract-dialect/query-generator-typescript.js"); const check_js_1 = require("@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js"); const join_sql_fragments_js_1 = require("@sequelize/core/_non-semver-use-at-your-own-risk_/utils/join-sql-fragments.js"); const object_js_1 = require("@sequelize/core/_non-semver-use-at-your-own-risk_/utils/object.js"); const string_js_1 = require("@sequelize/core/_non-semver-use-at-your-own-risk_/utils/string.js"); const query_generator_internal_js_1 = require("./query-generator.internal.js"); const REMOVE_INDEX_QUERY_SUPPORTED_OPTIONS = new Set(['ifExists']); /** * Temporary class to ease the TypeScript migration */ class IBMiQueryGeneratorTypeScript extends core_1.AbstractQueryGenerator { #internals; constructor(dialect, internals = new query_generator_internal_js_1.IBMiQueryGeneratorInternal(dialect)) { super(dialect, internals); this.#internals = internals; } listSchemasQuery(options) { return (0, join_sql_fragments_js_1.joinSQLFragments)([ `SELECT DISTINCT SCHEMA_NAME AS "schema" FROM QSYS2.SYSSCHEMAAUTH WHERE GRANTEE = CURRENT USER`, `AND SCHEMA_NAME NOT LIKE 'Q%' AND SCHEMA_NAME NOT LIKE 'SYS%'`, options?.skip && Array.isArray(options.skip) && options.skip.length > 0 ? `AND SCHEMA_NAME NOT IN (${options?.skip.map(schema => this.escape(schema)).join(', ')})` : '', ]); } describeTableQuery(tableName) { const table = this.extractTableDetails(tableName); return (0, join_sql_fragments_js_1.joinSQLFragments)([ 'SELECT', 'QSYS2.SYSCOLUMNS.*,', 'QSYS2.SYSCST.CONSTRAINT_NAME,', 'QSYS2.SYSCST.CONSTRAINT_TYPE', 'FROM QSYS2.SYSCOLUMNS', 'LEFT OUTER JOIN QSYS2.SYSCSTCOL', 'ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA', 'AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME', 'AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME', 'LEFT JOIN QSYS2.SYSCST', 'ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME', 'WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA =', table.schema ? this.escape(table.schema) : 'CURRENT SCHEMA', 'AND QSYS2.SYSCOLUMNS.TABLE_NAME =', this.escape(table.tableName), ]); } listTablesQuery(options) { return (0, join_sql_fragments_js_1.joinSQLFragments)([ 'SELECT TABLE_NAME AS "tableName",', 'TABLE_SCHEMA AS "schema"', `FROM QSYS2.SYSTABLES WHERE TABLE_TYPE = 'T'`, options?.schema ? `AND TABLE_SCHEMA = ${this.escape(options.schema)}` : `AND TABLE_SCHEMA NOT LIKE 'Q%' AND TABLE_SCHEMA NOT LIKE 'SYS%'`, 'ORDER BY TABLE_SCHEMA, TABLE_NAME', ]); } renameTableQuery(beforeTableName, afterTableName, options) { if (options) { (0, check_js_1.rejectInvalidOptions)('renameTableQuery', this.dialect, query_generator_typescript_js_1.RENAME_TABLE_QUERY_SUPPORTABLE_OPTIONS, object_js_1.EMPTY_SET, options); } const beforeTable = this.extractTableDetails(beforeTableName); const afterTable = this.extractTableDetails(afterTableName); if (beforeTable.schema !== afterTable.schema) { throw new Error(`Moving tables between schemas is not supported by ${this.dialect.name} dialect.`); } return `RENAME TABLE ${this.quoteTable(beforeTableName)} TO ${this.quoteIdentifier(afterTable.tableName)}`; } truncateTableQuery(tableName, options) { if (options) { (0, check_js_1.rejectInvalidOptions)('truncateTableQuery', this.dialect, query_generator_typescript_js_1.TRUNCATE_TABLE_QUERY_SUPPORTABLE_OPTIONS, object_js_1.EMPTY_SET, options); } return `TRUNCATE TABLE ${this.quoteTable(tableName)} IMMEDIATE`; } showConstraintsQuery(tableName, options) { const table = this.extractTableDetails(tableName); return (0, join_sql_fragments_js_1.joinSQLFragments)([ 'SELECT c.CONSTRAINT_SCHEMA AS "constraintSchema",', 'c.CONSTRAINT_NAME AS "constraintName",', 'c.CONSTRAINT_TYPE AS "constraintType",', 'c.TABLE_SCHEMA AS "tableSchema",', 'c.TABLE_NAME AS "tableName",', 'k.COLUMN_NAME AS "columnNames",', 'fk.TABLE_SCHEMA AS "referencedTableSchema",', 'fk.TABLE_NAME AS "referencedTableName",', 'fk.COLUMN_NAME AS "referencedColumnNames",', 'r.DELETE_RULE AS "deleteRule",', 'r.UPDATE_RULE AS "updateRule",', 'ch.CHECK_CLAUSE AS "definition",', 'c.IS_DEFERRABLE AS "isDeferrable",', 'c.INITIALLY_DEFERRED AS "initiallyDeferred"', 'FROM QSYS2.SYSCST c', 'LEFT JOIN QSYS2.SYSREFCST r ON c.CONSTRAINT_NAME = r.CONSTRAINT_NAME AND c.CONSTRAINT_SCHEMA = r.CONSTRAINT_SCHEMA', 'LEFT JOIN QSYS2.SYSKEYCST k ON c.CONSTRAINT_NAME = k.CONSTRAINT_NAME AND c.CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA', 'LEFT JOIN QSYS2.SYSKEYCST fk ON r.UNIQUE_CONSTRAINT_NAME = k.CONSTRAINT_NAME AND r.UNIQUE_CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA', 'LEFT JOIN QSYS2.SYSCHKCST ch ON c.CONSTRAINT_NAME = ch.CONSTRAINT_NAME AND c.CONSTRAINT_SCHEMA = ch.CONSTRAINT_SCHEMA', `WHERE c.TABLE_NAME = ${this.escape(table.tableName)}`, 'AND c.TABLE_SCHEMA =', table.schema ? this.escape(table.schema) : 'CURRENT SCHEMA', options?.columnName ? `AND k.COLUMN_NAME = ${this.escape(options.columnName)}` : '', options?.constraintName ? `AND c.CONSTRAINT_NAME = ${this.escape(options.constraintName)}` : '', options?.constraintType ? `AND c.CONSTRAINT_TYPE = ${this.escape(options.constraintType)}` : '', 'ORDER BY c.CONSTRAINT_NAME, k.ORDINAL_POSITION, fk.ORDINAL_POSITION', ]); } showIndexesQuery(tableName) { const table = this.extractTableDetails(tableName); // TODO [+odbc]: check if the query also works when capitalized (for consistency) return (0, join_sql_fragments_js_1.joinSQLFragments)([ 'select QSYS2.SYSCSTCOL.CONSTRAINT_NAME as NAME, QSYS2.SYSCSTCOL.COLUMN_NAME, QSYS2.SYSCST.CONSTRAINT_TYPE, QSYS2.SYSCST.TABLE_SCHEMA,', 'QSYS2.SYSCST.TABLE_NAME from QSYS2.SYSCSTCOL left outer join QSYS2.SYSCST on QSYS2.SYSCSTCOL.TABLE_SCHEMA = QSYS2.SYSCST.TABLE_SCHEMA and', 'QSYS2.SYSCSTCOL.TABLE_NAME = QSYS2.SYSCST.TABLE_NAME and QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME where', 'QSYS2.SYSCSTCOL.TABLE_SCHEMA =', table.schema ? this.escape(table.schema) : 'CURRENT SCHEMA', `and QSYS2.SYSCSTCOL.TABLE_NAME = ${this.escape(table.tableName)} union select QSYS2.SYSKEYS.INDEX_NAME AS NAME,`, `QSYS2.SYSKEYS.COLUMN_NAME, CAST('INDEX' AS VARCHAR(11)), QSYS2.SYSINDEXES.TABLE_SCHEMA, QSYS2.SYSINDEXES.TABLE_NAME from QSYS2.SYSKEYS`, 'left outer join QSYS2.SYSINDEXES on QSYS2.SYSKEYS.INDEX_NAME = QSYS2.SYSINDEXES.INDEX_NAME where QSYS2.SYSINDEXES.TABLE_SCHEMA =', table.schema ? this.escape(table.schema) : 'CURRENT SCHEMA', 'and QSYS2.SYSINDEXES.TABLE_NAME =', this.escape(table.tableName), ]); } removeIndexQuery(tableName, indexNameOrAttributes, options) { if (options) { (0, check_js_1.rejectInvalidOptions)('removeIndexQuery', this.dialect, query_generator_typescript_js_1.REMOVE_INDEX_QUERY_SUPPORTABLE_OPTIONS, REMOVE_INDEX_QUERY_SUPPORTED_OPTIONS, options); } let indexName; if (Array.isArray(indexNameOrAttributes)) { const table = this.extractTableDetails(tableName); indexName = (0, string_js_1.generateIndexName)(table, { fields: indexNameOrAttributes }); } else { indexName = indexNameOrAttributes; } return (0, join_sql_fragments_js_1.joinSQLFragments)([ 'BEGIN', options?.ifExists ? `IF EXISTS (SELECT * FROM QSYS2.SYSINDEXES WHERE INDEX_NAME = ${this.quoteIdentifier(indexName)}) THEN` : '', `DROP INDEX ${this.quoteIdentifier(indexName)};`, 'COMMIT;', options?.ifExists ? 'END IF;' : '', 'END', ]); } // Version queries versionQuery() { return 'SELECT CONCAT(OS_VERSION, CONCAT(\'.\', OS_RELEASE)) AS "version" FROM SYSIBMADM.ENV_SYS_INFO'; } tableExistsQuery(tableName) { const table = this.extractTableDetails(tableName); return (0, join_sql_fragments_js_1.joinSQLFragments)([ `SELECT TABLE_NAME FROM QSYS2.SYSTABLES WHERE TABLE_NAME = ${this.escape(table.tableName)} AND TABLE_SCHEMA = `, table.schema ? this.escape(table.schema) : 'CURRENT SCHEMA', ]); } createSavepointQuery(savepointName) { return `SAVEPOINT ${this.quoteIdentifier(savepointName)} ON ROLLBACK RETAIN CURSORS`; } } exports.IBMiQueryGeneratorTypeScript = IBMiQueryGeneratorTypeScript; //# sourceMappingURL=query-generator-typescript.internal.js.map