summaryrefslogtreecommitdiff
path: root/packages/idb-bridge/src/node-sqlite3-impl.ts
blob: fa38d298feddda04eaaf5e8d55f402a92abbd6e0 (plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 This file is part of GNU Taler
 (C) 2023 Taler Systems S.A.

 GNU Taler is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
 Foundation; either version 3, or (at your option) any later version.

 GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

// @ts-ignore: optional dependency
import type Database from "better-sqlite3";
import {
  ResultRow,
  Sqlite3Interface,
  Sqlite3Statement,
} from "./sqlite3-interface.js";

export async function createNodeSqlite3Impl(): Promise<Sqlite3Interface> {
  // @ts-ignore: optional dependency
  const bsq = (await import("better-sqlite3")).default;

  return {
    open(filename: string) {
      const internalDbHandle = bsq(filename);
      return {
        internalDbHandle,
        close() {
          internalDbHandle.close();
        },
        prepare(stmtStr): Sqlite3Statement {
          const stmtHandle = internalDbHandle.prepare(stmtStr);
          return {
            internalStatement: stmtHandle,
            getAll(params): ResultRow[] {
              let res: ResultRow[];
              if (params === undefined) {
                res = stmtHandle.all() as ResultRow[];
              } else {
                res = stmtHandle.all(params) as ResultRow[];
              }
              return res;
            },
            getFirst(params): ResultRow | undefined {
              let res: ResultRow | undefined;
              if (params === undefined) {
                res = stmtHandle.get() as ResultRow | undefined;
              } else {
                res = stmtHandle.get(params) as ResultRow | undefined;
              }
              return res;
            },
            run(params) {
              const myParams = [];
              if (params !== undefined) {
                myParams.push(params);
              }
              // The better-sqlite3 library doesn't like it we pass
              // undefined directly.
              let res: Database.RunResult;
              if (params !== undefined) {
                res = stmtHandle.run(params);
              } else {
                res = stmtHandle.run();
              }
              return {
                lastInsertRowid: res.lastInsertRowid,
              };
            },
          };
        },
        exec(sqlStr): void {
          internalDbHandle.exec(sqlStr);
        },
      };
    },
  };
}