1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import process from "node:process";
import url from "node:url";
import util from "node:util";
import sqlite from "./sqlite.cjs";
import * as u from "./utils.mjs";
import * as accretion from "./accretion.mjs";
export const promisifyDb = dbHandle => ({
ref: dbHandle,
all: util.promisify((...args) => dbHandle.all(...args)),
exec: util.promisify((...args) => dbHandle.exec(...args)),
run: util.promisify((...args) => dbHandle.run(...args)),
each: (...args) =>
new Promise((resolve, reject) => {
const cb = args[args.length - 1];
dbHandle.each(
...args.slice(0, args.length - 1),
(err, row) => err ? reject(err) : cb(row),
(err, data) => err ? reject(err) : resolve(data),
);
}),
prepare: (...args) =>
new Promise((resolve, reject) => {
const mkStmt = stmtRef => ({
ref: stmtRef,
run: util.promisify((...args) => stmtRef.run(...args)),
finalize: util.promisify((...args) => stmtRef.finalize(...args)),
});
const ref = dbHandle.prepare(
...args,
err => err ? reject(err) : resolve(mkStmt(ref)),
);
}),
});
export const open = (...args) =>
new Promise((resolve, reject) => {
const dbName = args[0];
assert(dbName);
const ref = promisifyDb(new sqlite.Database(
...args,
err => err ? reject(err) : resolve(ref),
));
});
export let handle = null;
export const init = async (logFn, dbName = process.env.PAPO_DB_PATH || ":memory:") => {
handle = await open(dbName);
await accretion.runMigrations(logFn, handle);
};
|