UNPKG

@grandlinex/bundle-sqlight

Version:

> SQLight support GrandlineX using better-sqlite3

301 lines (300 loc) 10.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const core_1 = require("@grandlinex/core"); const better_sqlite3_1 = __importDefault(require("better-sqlite3")); const index_js_1 = require("../util/index.js"); class SQLCon extends core_1.CoreDBCon { constructor(module, dbversion, printLog = false) { super(dbversion, 'main', module); const store = module.getKernel().getConfigStore(); const path = store.get('GLOBAL_PATH_DB'); if (!path) { this.error('Cant get db path from store'); throw new Error('Cant get db path from store'); } this.path = path_1.default.join(path, `${module.getName()}.db`); this.db = null; this.printLog = printLog; } async createEntity(config, entity) { const [keys, values, params] = (0, index_js_1.objToTable)(entity, config); const query = { exec: `INSERT INTO ${this.schemaName}.${config.className}(${keys.join(', ')}) VALUES (${values.join(', ')})`, param: params, }; const res = await this.execScripts([query]); if (!res || !res[0]) { throw this.lError('Cant Create entity'); } return entity; } async updateEntity(config, e_id, entity) { const [, values, params] = (0, index_js_1.objToTable)(entity, config, true); const result = await this.execScripts([ { exec: `UPDATE ${this.schemaName}.${config.className} SET ${values.join(', ')} WHERE e_id = ?;`, param: [...params, e_id], }, ]); return result[0] !== null; } async updateBulkEntity(config, e_id, entity) { if (e_id.length === 0) { return false; } const [, values, params] = (0, index_js_1.objToTable)(entity, config, true); const result = await this.execScripts([ { exec: `UPDATE ${this.schemaName}.${config.className} SET ${values.join(', ')} WHERE e_id in (${e_id.map(() => '?').join(',')});`, param: [...params, ...e_id], }, ]); return result[0] !== null; } async getEntityById(config, id) { const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.${config.className} WHERE e_id = ?;`); const res = query?.get([id]); if (res) { return (0, index_js_1.rowToObj)(config, res); } return null; } async getEntityBulkById(config, e_id) { if (e_id.length === 0) { return []; } const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.${config.className} WHERE e_id in (${e_id.map(() => '?').join(',')});`); const res = query?.all(e_id); if (res) { return (0, index_js_1.tableToObj)(config, res); } return []; } async findEntity(config, search) { let searchQ = ''; const param = []; searchQ = (0, index_js_1.buildSearchQ)(config, search, param, searchQ); const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.${config.className} ${searchQ};`); const res = query?.get(param); if (res) { return (0, index_js_1.rowToObj)(config, res); } return null; } async deleteEntityById(className, id) { const query = this.db?.prepare(`DELETE FROM ${this.schemaName}.${className} WHERE e_id = ?;`); return query?.run([id]).changes === 1; } async deleteEntityBulkById(className, e_id) { if (e_id.length === 0) { return false; } const query = this.db?.prepare(`DELETE FROM ${this.schemaName}.${className} WHERE e_id in (${e_id.map(() => '?').join(',')});`); return (query?.run([...e_id]).changes ?? 0) > 1; } async getEntityList(q) { const { limit, search, config, order, offset } = q; if (limit === 0) { return []; } let searchQ = ''; const orderBy = []; let orderByQ = ''; const off = offset !== undefined ? ` OFFSET ${offset}` : ''; const range = limit ? `LIMIT ${limit}${off}` : ''; const param = []; if (search) { searchQ = (0, index_js_1.buildSearchQ)(config, search, param, searchQ); } if (order && order.length > 0) { order.forEach((val) => { orderBy.push(`${String(val.key)} ${val.order}`); }); orderByQ = `ORDER BY ${orderBy.join(',\n')}`; } const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.${config.className} ${searchQ} ${orderByQ} ${range};`); const res = query?.all(param); if (res) { return (0, index_js_1.tableToObj)(config, res); } return []; } async initEntity(className, entity) { await this.execScripts([ { exec: `CREATE TABLE ${this.schemaName}.${className} ( ${this.transformEntityKeys(entity)} );`, param: [], }, ]); return true; } transformEntityKeys(entity) { const keys = Object.keys(entity); const out = []; keys.forEach((key) => { const meta = (0, core_1.getColumnMeta)(entity, key); if (key === 'e_id') { out.push(`e_id TEXT PRIMARY KEY`); } else if (meta?.dataType) { (0, index_js_1.mappingWithDataType)(meta, out, key); } else { const type = typeof entity[key]; switch (type) { case 'bigint': case 'number': out.push(`${String(key)} INTEGER NOT NULL`); break; case 'string': out.push(`${String(key)} TEXT NOT NULL`); break; default: throw Error('TypeNotSupported'); } } }); return out.join(',\n'); } async removeConfig(key) { try { const query = await this.execScripts([ { exec: `DELETE FROM ${this.schemaName}.config WHERE c_key = ?;`, param: [key], }, ]); this.log(query); if (query.length !== 1) { this.error('invalid result'); } } catch (e) { this.error(e); } } async initNewDB() { this.debug('no init '); } async connect() { try { this.db = new better_sqlite3_1.default(this.path, { verbose: (message, additionalArgs) => { if (this.printLog) { this.verbose(message, additionalArgs); } }, }); } catch (e) { this.error(e); return false; } try { const query = this.db.prepare(`SELECT * FROM ${this.schemaName}.config;`); const result = query.all(); const version = result.find((el) => { return el.c_key === 'dbversion'; }); return !!version; } catch (e) { this.warn(e); this.log('Create new Database'); await this.execScripts([ { exec: `CREATE TABLE ${this.schemaName}.config ( c_key text not null, c_value text, PRIMARY KEY (c_key) );`, param: [], }, { exec: `INSERT INTO ${this.schemaName}.config (c_key, c_value) VALUES ('dbversion', '${this.dbVersion}');`, param: [], }, ]); this.setNew(true); return true; } } getRawDBObject() { return this.db; } async configExist(key) { const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.config WHERE c_key = '${key}'`); const exist = query?.get(); return !!exist && exist.c_key !== undefined && exist.c_value !== undefined; } async setConfig(key, value) { const query = this.db?.prepare(`REPLACE INTO ${this.schemaName} . config ( c_key, c_value ) VALUES ('${key}', '${value}');`); if (query === undefined) { return false; } query.run(); return true; } async getConfig(key) { const query = this.db?.prepare(`SELECT * FROM ${this.schemaName}.config WHERE c_key = '${key}'`); return query?.get(); } async execScripts(list) { const result = []; list.forEach((el) => { const prep = this.db?.prepare(el.exec); const res = prep?.run(el.param); if (res) { result.push(res); } }); return result; } async disconnect() { this.db?.close(); return true; } } exports.default = SQLCon;