@adonisjs/lucid
Version:
SQL ORM built on top of Active Record pattern
181 lines (180 loc) • 6.01 kB
JavaScript
;
/*
* @adonisjs/lucid
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.RedshiftDialect = void 0;
class RedshiftDialect {
constructor(client, config) {
Object.defineProperty(this, "client", {
enumerable: true,
configurable: true,
writable: true,
value: client
});
Object.defineProperty(this, "config", {
enumerable: true,
configurable: true,
writable: true,
value: config
});
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: 'redshift'
});
Object.defineProperty(this, "supportsAdvisoryLocks", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "supportsViews", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "supportsTypes", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "supportsReturningStatement", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
/**
* Reference to the database version. Knex.js fetches the version after
* the first database query, so it will be set to undefined initially
*/
Object.defineProperty(this, "version", {
enumerable: true,
configurable: true,
writable: true,
value: this.client.getReadClient()['context']['client'].version
});
/**
* The default format for datetime column. The date formats is
* valid for luxon date parsing library
*/
Object.defineProperty(this, "dateTimeFormat", {
enumerable: true,
configurable: true,
writable: true,
value: "yyyy-MM-dd'T'HH:mm:ss.SSSZZ"
});
}
/**
* Returns an array of table names for one or many schemas.
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async getAllTables(schemas) {
const tables = await this.client
.query()
.from('pg_catalog.pg_tables')
.select('tablename as table_name')
.whereIn('schemaname', schemas)
.orderBy('tablename', 'asc');
return tables.map(({ table_name }) => table_name);
}
/**
* Returns an array of all views names for one or many schemas
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async getAllViews(schemas) {
const views = await this.client
.query()
.from('pg_catalog.pg_views')
.select('viewname as view_name')
.whereIn('schemaname', schemas)
.orderBy('viewname', 'asc');
return views.map(({ view_name }) => view_name);
}
/**
* Returns an array of all types names
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async getAllTypes(_schemas) {
const types = await this.client
.query()
.select('pg_type.typname')
.distinct()
.from('pg_type')
.innerJoin('pg_enum', 'pg_enum.enumtypid', 'pg_type.oid');
return types.map(({ typname }) => typname);
}
/**
* Truncate redshift table with option to cascade and restart identity.
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async truncate(table, cascade = false) {
return cascade
? this.client.rawQuery(`TRUNCATE "${table}" RESTART IDENTITY CASCADE;`)
: this.client.rawQuery(`TRUNCATE "${table}";`);
}
/**
* Drop all tables inside the database
*/
async dropAllTables(schemas) {
let tables = await this.getAllTables(schemas);
/**
* Filter out tables that are not allowed to be dropped
*/
tables = tables.filter((table) => !(this.config.wipe?.ignoreTables || ['spatial_ref_sys']).includes(table));
if (!tables.length) {
return;
}
await this.client.rawQuery(`DROP table ${tables.join(',')} CASCADE;`);
}
/**
* Drop all views inside the database
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async dropAllViews(schemas) {
const views = await this.getAllViews(schemas);
if (!views.length)
return;
await this.client.rawQuery(`DROP view ${views.join(',')} CASCADE;`);
}
/**
* Drop all types inside the database
*
* NOTE: ASSUMING FEATURE PARITY WITH POSTGRESQL HERE (NOT TESTED)
*/
async dropAllTypes(schemas) {
const types = await this.getAllTypes(schemas);
if (!types.length)
return;
await this.client.rawQuery(`DROP type ${types.join(',')};`);
}
/**
* Redshift doesn't support advisory locks. Learn more:
* https://tableplus.com/blog/2018/10/redshift-vs-postgres-database-comparison.html
*/
getAdvisoryLock() {
throw new Error("Redshift doesn't support advisory locks");
}
/**
* Redshift doesn't support advisory locks. Learn more:
* https://tableplus.com/blog/2018/10/redshift-vs-postgres-database-comparison.html
*/
releaseAdvisoryLock() {
throw new Error("Redshift doesn't support advisory locks");
}
}
exports.RedshiftDialect = RedshiftDialect;