trilogy
Version:
TypeScript SQLite layer with support for both native C++ & pure JavaScript drivers.
46 lines (45 loc) • 1.32 kB
JavaScript
import { dirname } from 'path';
import { readFileSync, writeFileSync } from 'fs';
import { createPool } from 'generic-pool';
import { makeDirPath } from './util';
export async function readDatabase(instance) {
const name = instance.options.connection.filename;
const init = await import('sql.js');
const SQL = await init.default();
if (name === ':memory:') {
return new SQL.Database();
}
let client;
try {
makeDirPath(dirname(name));
const file = readFileSync(name);
client = new SQL.Database(file);
}
catch (e) {
if (e.code === 'ENOENT') {
client = new SQL.Database();
writeDatabase(instance, client);
}
else {
throw e;
}
}
return client;
}
export function writeDatabase(instance, db) {
const name = instance.options.connection.filename;
if (name === ':memory:')
return;
makeDirPath(dirname(name));
writeFileSync(name, db.export(), { mode: parseInt('0777', 8) });
}
export function pureConnect(instance) {
return createPool({
create() {
return readDatabase(instance);
},
async destroy(client) {
client.close();
}
}, { min: 1, max: 1 });
}