UNPKG

@sqb/sqljs

Version:

SQB serialization extension for sql.js driver

72 lines (71 loc) 2.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SqljsAdapter = void 0; exports.closeMemoryDatabase = closeMemoryDatabase; const tslib_1 = require("tslib"); require("@sqb/sqlite-dialect"); const fs_1 = tslib_1.__importDefault(require("fs")); const path_1 = tslib_1.__importDefault(require("path")); const putil_promisify_1 = tslib_1.__importDefault(require("putil-promisify")); const sql_js_1 = tslib_1.__importDefault(require("sql.js")); const sqljs_connection_js_1 = require("./sqljs-connection.js"); const dbCache = new Map(); class SqljsAdapter { constructor() { this.driver = 'sqljs'; this.dialect = 'sqlite'; this.features = { cursor: true, // fetchAsString: [DataType.DATE, DataType.TIMESTAMP, DataType.TIMESTAMPTZ] }; } async connect(config) { if (!config.database) throw new Error('You must provide sqlite database file for sql.js driver'); let dbName = ''; let isMemory = false; const m = config.database.match(/^(:memory:)(\w+)?$/); if (m) { isMemory = true; dbName = config.database; } else { dbName = path_1.default.resolve(config.database); } let intlDb = dbCache.get(dbName); if (intlDb) { intlDb._refCount++; } else { const SQL = await (0, sql_js_1.default)(); if (isMemory) { intlDb = new SQL.Database(); intlDb._refCount = 0; } else { const buf = await putil_promisify_1.default.fromCallback(cb => fs_1.default.readFile(dbName, cb)); intlDb = new SQL.Database(buf); intlDb._refCount = 1; } dbCache.set(dbName, intlDb); } const _intlDb = intlDb; return new sqljs_connection_js_1.SqljsConnection(_intlDb, () => { if (isMemory) return; if (--_intlDb._refCount <= 0) { _intlDb.close(); dbCache.delete(dbName); } }); } } exports.SqljsAdapter = SqljsAdapter; async function closeMemoryDatabase(name) { const memoryDbName = name || ':memory:'; const memDb = dbCache.get(memoryDbName); if (memDb) { dbCache.delete(memoryDbName); memDb.close(); } }