-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsqlite3.jsy
42 lines (34 loc) · 1.42 KB
/
sqlite3.jsy
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
import {bkc_hexkey_api, as_hex_key, as_u8_key} from '../_utils.jsy'
export {as_hex_key, as_u8_key}
export default bkc_with_sqlite3
export async function bkc_with_sqlite3(db, opt={}) ::
let immutable = !! opt.immutable
let table = opt.table || 'phorbas_kv'
::
let sql_create = `CREATE TABLE IF NOT EXISTS "${table}" ( "hk" TEXT PRIMARY KEY, "bc" BLOB );`
await new Promise @\ resolve, reject ::
db.run @ sql_create, err => err ? reject(err) : resolve()
let sql_has = `SELECT 1 FROM "${table}" WHERE "hk"=?`
let sql_get = `SELECT "hk", "bc" FROM "${table}" WHERE "hk"=?`
let sql_set = `INSERT ${immutable ? '' : 'OR REPLACE'} INTO "${table}" ("hk", "bc") VALUES (?, ?)`
return bkc_hexkey_api @:
bkc_opt: @{} immutable
hk_has: hex_key =>
new Promise @\ resolve, reject ::
db.get @ sql_has, hex_key,
@\ err, ans ::
if (err) return reject(err)
resolve(ans ? 1 : 0)
hk_get: hex_key =>
new Promise @\ resolve, reject ::
db.get @ sql_get, hex_key,
@\ err, ans ::
if (err) return reject(err)
resolve @ null == ans ? void ans
: Uint8Array.from(ans.bc)
hk_set: @\ hex_key, u8_content =>
new Promise @\ resolve ::
db.run @ sql_set, hex_key, Buffer.from(u8_content),
err => !err ? resolve()
: immutable && 19===err.errno ? resolve(false)
: resolve(err)