@sqb/sqljs
Version:
SQB serialization extension for sql.js driver
72 lines (71 loc) • 2.42 kB
JavaScript
;
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();
}
}