UNPKG

firebird-cubejs-driver

Version:
102 lines (101 loc) 4.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FirebirdDriver = void 0; const base_driver_1 = require("@cubejs-backend/base-driver"); const node_firebird_1 = require("node-firebird"); const FirebirdQuery_1 = require("./FirebirdQuery"); class FirebirdDriver extends base_driver_1.BaseDriver { constructor(config) { super(); this.pool = (0, node_firebird_1.pool)(config.maxPoolSize || 8, config); } static dialectClass() { return FirebirdQuery_1.FirebirdQuery; } async testConnection() { return new Promise((resolve, reject) => { this.pool.get((err, db) => { if (err) return reject(err); db.query("SELECT 1 FROM RDB$DATABASE", [], (err, result) => { db.detach((detachErr) => { if (detachErr) console.error("Error when detaching from database!", detachErr); }); if (err) return reject(err); return resolve(); }); }); }); } async query(query, values, options) { return new Promise((resolve, reject) => { this.pool.get((err, db) => { if (err) return reject(err); db.query(query, values, (err, result) => { db.detach((detachErr) => { if (detachErr) console.error("Error when detaching from database!", detachErr); }); if (err) return reject(err); return resolve(result); }); }); }); } informationSchemaQuery() { return `SELECT TRIM(r.RDB$RELATION_NAME) AS "table_name", TRIM(f.RDB$FIELD_NAME) AS "column_name", TRIM(r.RDB$OWNER_NAME) AS "table_schema", TRIM(t.RDB$TYPE_NAME) AS "data_type" FROM RDB$RELATION_FIELDS f JOIN RDB$RELATIONS r ON f.RDB$RELATION_NAME = r.RDB$RELATION_NAME JOIN RDB$FIELDS fld ON f.RDB$FIELD_SOURCE = fld.RDB$FIELD_NAME JOIN RDB$TYPES t ON fld.RDB$FIELD_TYPE = t.RDB$TYPE WHERE r.RDB$SYSTEM_FLAG = 0 AND r.RDB$RELATION_NAME NOT IN ('RDB$DATABASE', 'RDB$FIELDS', 'RDB$INDEX_SEGMENTS', 'RDB$INDICES', 'RDB$RELATION_CONSTRAINTS', 'RDB$RELATION_FIELDS', 'RDB$ROLES', 'RDB$SECURITY_CLASSES', 'RDB$TRIGGERS', 'RDB$USER_PRIVILEGES', 'RDB$VIEW_RELATIONS') AND t.RDB$FIELD_NAME = 'RDB$FIELD_TYPE'`; } primaryKeysQuery(conditionString) { return `SELECT TRIM(r.RDB$OWNER_NAME) AS "table_schema", TRIM(cst.RDB$RELATION_NAME) AS "table_name", TRIM(s.RDB$FIELD_NAME) AS "column_name" FROM RDB$RELATION_CONSTRAINTS cst JOIN RDB$RELATIONS r ON cst.RDB$RELATION_NAME = r.RDB$RELATION_NAME JOIN RDB$INDEX_SEGMENTS s ON cst.RDB$INDEX_NAME = s.RDB$INDEX_NAME WHERE cst.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND cst.RDB$RELATION_NAME NOT IN ('RDB$DATABASE')${conditionString ? ` AND (${conditionString})` : ''}`; } foreignKeysQuery(conditionString) { return `SELECT TRIM(r.RDB$OWNER_NAME) AS "table_schema", TRIM(rc.RDB$RELATION_NAME) AS "table_name", TRIM(isc.RDB$FIELD_NAME) AS "column_name", TRIM(refc.RDB$CONST_NAME_UQ) AS "target_table", TRIM(isf.RDB$FIELD_NAME) AS "target_column" FROM RDB$RELATION_CONSTRAINTS rc JOIN RDB$RELATIONS r ON rc.RDB$RELATION_NAME = r.RDB$RELATION_NAME JOIN RDB$INDEX_SEGMENTS isc ON rc.RDB$INDEX_NAME = isc.RDB$INDEX_NAME JOIN RDB$REF_CONSTRAINTS refc ON rc.RDB$CONSTRAINT_NAME = refc.RDB$CONSTRAINT_NAME JOIN RDB$RELATION_CONSTRAINTS tgtc ON tgtc.RDB$CONSTRAINT_NAME = refc.RDB$CONST_NAME_UQ JOIN RDB$INDEX_SEGMENTS isf ON tgtc.RDB$INDEX_NAME = isf.RDB$INDEX_NAME WHERE rc.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' AND rc.RDB$RELATION_NAME NOT IN ('RDB$DATABASE')${conditionString ? ` AND (${conditionString})` : ''}`; } /** * Not being called by cube but added it just in case */ wrapQueryWithLimit(query) { query.query = `SELECT * FROM (${query.query}) AS t ROWS 1 TO ${query.limit}`; } async release() { if (this.pool) this.pool.destroy(); } } exports.FirebirdDriver = FirebirdDriver;