rado 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/define/CTE.d.ts +2 -0
  2. package/dist/define/CTE.js +51 -0
  3. package/dist/define/Cursor.d.ts +108 -0
  4. package/dist/define/Cursor.js +338 -0
  5. package/dist/define/Update.d.ts +4 -0
  6. package/dist/define/Update.js +0 -0
  7. package/dist/define/query/Batch.d.ts +7 -0
  8. package/dist/define/query/Batch.js +17 -0
  9. package/dist/define/query/CreateTable.d.ts +6 -0
  10. package/dist/define/query/CreateTable.js +11 -0
  11. package/dist/define/query/Delete.d.ts +11 -0
  12. package/dist/define/query/Delete.js +18 -0
  13. package/dist/define/query/Insert.d.ts +22 -0
  14. package/dist/define/query/Insert.js +47 -0
  15. package/dist/define/query/Select.d.ts +39 -0
  16. package/dist/define/query/Select.js +170 -0
  17. package/dist/define/query/TableSelect.d.ts +28 -0
  18. package/dist/define/query/TableSelect.js +79 -0
  19. package/dist/define/query/Union.d.ts +17 -0
  20. package/dist/define/query/Union.js +116 -0
  21. package/dist/define/query/Update.d.ts +12 -0
  22. package/dist/define/query/Update.js +18 -0
  23. package/dist/deno/driver/better-sqlite3.js +57 -0
  24. package/dist/deno/driver/bun-sqlite.js +69 -0
  25. package/dist/deno/driver/sql.js.js +72 -0
  26. package/dist/deno/driver/sqlite3.js +123 -0
  27. package/dist/deno/index.js +14 -0
  28. package/dist/deno/lib/Driver.js +330 -0
  29. package/dist/deno/lib/Formatter.js +715 -0
  30. package/dist/deno/lib/Sanitizer.js +0 -0
  31. package/dist/deno/lib/SqlError.js +11 -0
  32. package/dist/deno/lib/Statement.js +108 -0
  33. package/dist/deno/sqlite/SqliteFormatter.js +70 -0
  34. package/dist/deno/sqlite/SqliteFunctions.js +150 -0
  35. package/dist/deno/sqlite/SqliteSchema.js +47 -0
  36. package/dist/deno/sqlite.js +3 -0
  37. package/dist/deno/util/Callable.js +15 -0
  38. package/dist/driver/d1.d.ts +4 -1
  39. package/dist/driver/d1.js +4 -2
  40. package/dist/driver/sqlite3.d.ts +4 -1
  41. package/dist/driver/sqlite3.js +4 -2
  42. package/dist/lib/Driver.d.ts +8 -2
  43. package/dist/lib/Driver.js +7 -4
  44. package/dist/sqlite/index.d.ts +2 -0
  45. package/dist/sqlite/index.js +3 -0
  46. package/dist/src/driver/better-sqlite3.js +49 -0
  47. package/dist/src/driver/sql.js.js +66 -0
  48. package/dist/src/driver/sqlite3.js +87 -0
  49. package/dist/src/index.js +24 -0
  50. package/dist/src/lib/Column.js +63 -0
  51. package/dist/src/lib/Cursor.js +231 -0
  52. package/dist/src/lib/Driver.js +316 -0
  53. package/dist/src/lib/Expr.js +284 -0
  54. package/dist/src/lib/Fields.js +0 -0
  55. package/dist/src/lib/Formatter.js +625 -0
  56. package/dist/src/lib/Functions.js +11 -0
  57. package/dist/src/lib/Id.js +0 -0
  58. package/dist/src/lib/Index.js +20 -0
  59. package/dist/src/lib/Ops.js +45 -0
  60. package/dist/src/lib/OrderBy.js +9 -0
  61. package/dist/src/lib/Param.js +27 -0
  62. package/dist/src/lib/Query.js +74 -0
  63. package/dist/src/lib/Sanitizer.js +0 -0
  64. package/dist/src/lib/Schema.js +67 -0
  65. package/dist/src/lib/Selection.js +7 -0
  66. package/dist/src/lib/Statement.js +103 -0
  67. package/dist/src/lib/Table.js +130 -0
  68. package/dist/src/lib/Target.js +37 -0
  69. package/dist/src/lib/Update.js +0 -0
  70. package/dist/src/sqlite/SqliteFormatter.js +67 -0
  71. package/dist/src/sqlite/SqliteFunctions.js +146 -0
  72. package/dist/src/sqlite/SqliteSchema.js +47 -0
  73. package/dist/src/sqlite.js +3 -0
  74. package/dist/test/DbSuite.js +28 -0
  75. package/dist/test/TSTestTypes.js +6 -0
  76. package/dist/test/TestBasic.js +172 -0
  77. package/dist/test/TestExtend.js +68 -0
  78. package/dist/test/TestFts5.js +34 -0
  79. package/dist/test/TestFunctions.js +28 -0
  80. package/dist/test/TestJoins.js +34 -0
  81. package/dist/test/TestJson.js +33 -0
  82. package/dist/test/TestPrepare.js +27 -0
  83. package/dist/test/TestRawSql.js +31 -0
  84. package/dist/test/TestSchema.js +69 -0
  85. package/dist/test/TestSubQueries.js +79 -0
  86. package/dist/test/TestTransaction.js +54 -0
  87. package/dist/test/TestUpdate.js +95 -0
  88. package/dist/test/index.js +14 -0
  89. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ // src/lib/SqlError.ts
2
+ var SqlError = class extends Error {
3
+ constructor(cause, sql) {
4
+ super(`${sql}
5
+ \u2502
6
+ \u2514\u2500\u2500\u2500\u2500 ${cause}`, { cause });
7
+ }
8
+ };
9
+ export {
10
+ SqlError
11
+ };
@@ -0,0 +1,108 @@
1
+ // src/lib/Statement.ts
2
+ import { ParamData, ParamType } from "../define/Param.ts";
3
+ var SEPARATE = ", ";
4
+ var WHITESPACE = " ";
5
+ var NEWLINE = "\n";
6
+ var INSERT_PARAM = "?";
7
+ var Statement = class {
8
+ constructor(sanitizer, options = {}) {
9
+ this.sanitizer = sanitizer;
10
+ this.options = options;
11
+ }
12
+ sql = "";
13
+ paramData = [];
14
+ currentIndent = "";
15
+ space() {
16
+ if (this.sql === "")
17
+ return this;
18
+ return this.raw(WHITESPACE);
19
+ }
20
+ add(addition) {
21
+ if (!addition)
22
+ return this;
23
+ return this.space().raw(addition);
24
+ }
25
+ addLine(addition) {
26
+ if (!addition)
27
+ return this;
28
+ return this.newline().raw(addition);
29
+ }
30
+ indent() {
31
+ this.currentIndent = this.currentIndent + " ";
32
+ return this;
33
+ }
34
+ dedent() {
35
+ this.currentIndent = this.currentIndent.slice(0, -2);
36
+ return this;
37
+ }
38
+ newline() {
39
+ if (this.options.skipNewlines)
40
+ return this;
41
+ return this.raw(NEWLINE + this.currentIndent);
42
+ }
43
+ identifier(name) {
44
+ return this.raw(this.sanitizer.escapeIdentifier(name));
45
+ }
46
+ addIdentifier(name) {
47
+ return this.space().identifier(name);
48
+ }
49
+ value(value) {
50
+ this.paramData.push(ParamData.Value(value));
51
+ return this.raw(INSERT_PARAM);
52
+ }
53
+ addValue(value) {
54
+ return this.space().value(value);
55
+ }
56
+ param(data) {
57
+ this.paramData.push(data);
58
+ return this.raw(INSERT_PARAM);
59
+ }
60
+ addParam(data) {
61
+ return this.space().param(data);
62
+ }
63
+ raw(query) {
64
+ if (!query)
65
+ return this;
66
+ this.sql += query;
67
+ return this;
68
+ }
69
+ openParenthesis() {
70
+ return this.raw("(").indent().newline();
71
+ }
72
+ closeParenthesis() {
73
+ return this.dedent().newline().raw(")");
74
+ }
75
+ *call(parts, separator = SEPARATE) {
76
+ if (parts.length === 0)
77
+ return this.raw("()");
78
+ this.openParenthesis();
79
+ yield* this.separate(parts, separator);
80
+ this.closeParenthesis();
81
+ }
82
+ *separate(parts, separator = SEPARATE) {
83
+ for (let i = 0; i < parts.length; i++) {
84
+ if (i > 0)
85
+ this.raw(separator).newline();
86
+ yield parts[i];
87
+ }
88
+ }
89
+ isEmpty() {
90
+ return this.sql === "";
91
+ }
92
+ params(input) {
93
+ return this.paramData.map((param) => {
94
+ if (param.type === ParamType.Named) {
95
+ if (input && param.name in input)
96
+ return this.sanitizer.formatParamValue(input[param.name]);
97
+ throw new TypeError(`Missing parameter ${param.name}`);
98
+ }
99
+ return this.sanitizer.formatParamValue(param.value);
100
+ });
101
+ }
102
+ toString() {
103
+ return this.sql;
104
+ }
105
+ };
106
+ export {
107
+ Statement
108
+ };
@@ -0,0 +1,70 @@
1
+ // src/sqlite/SqliteFormatter.ts
2
+ import { ExprType } from "../define/Expr.ts";
3
+ import { Formatter } from "../lib/Formatter.ts";
4
+ var BACKTICK = "`";
5
+ var ESCAPE_BACKTICK = "``";
6
+ var SINGLE_QUOTE = "'";
7
+ var ESCAPE_SINGLE_QUOTE = "''";
8
+ var MATCH_BACKTICK = /`/g;
9
+ var MATCH_SINGLE_QUOTE = /'/g;
10
+ var SqliteFormatter = class extends Formatter {
11
+ formatParamValue(paramValue) {
12
+ if (paramValue === null || paramValue === void 0)
13
+ return null;
14
+ if (typeof paramValue === "boolean")
15
+ return paramValue ? 1 : 0;
16
+ if (typeof paramValue === "number")
17
+ return paramValue;
18
+ if (typeof paramValue === "string")
19
+ return paramValue;
20
+ return JSON.stringify(paramValue);
21
+ }
22
+ escapeValue(value) {
23
+ if (value === null || value === void 0)
24
+ return "NULL";
25
+ if (typeof value === "boolean")
26
+ return value ? "1" : "0";
27
+ if (typeof value === "number")
28
+ return String(value);
29
+ if (typeof value === "string")
30
+ return this.escapeString(value);
31
+ return "json(" + this.escapeString(JSON.stringify(value)) + ")";
32
+ }
33
+ escapeIdentifier(input) {
34
+ return BACKTICK + input.replace(MATCH_BACKTICK, ESCAPE_BACKTICK) + BACKTICK;
35
+ }
36
+ escapeString(input) {
37
+ return SINGLE_QUOTE + input.replace(MATCH_SINGLE_QUOTE, ESCAPE_SINGLE_QUOTE) + SINGLE_QUOTE;
38
+ }
39
+ formatAccess(ctx, mkSubject, field) {
40
+ const { stmt, formatAsJson } = ctx;
41
+ mkSubject();
42
+ stmt.raw(formatAsJson ? "->" : "->>");
43
+ return this.formatString(ctx, `$.${field}`);
44
+ }
45
+ formatExpr(ctx, expr) {
46
+ const { stmt } = ctx;
47
+ switch (expr.type) {
48
+ case ExprType.Call:
49
+ switch (expr.method) {
50
+ case "match":
51
+ const [from, query] = expr.params;
52
+ this.formatExprValue({ ...ctx, tableAsExpr: true }, from);
53
+ stmt.raw(" MATCH ");
54
+ this.formatExprValue(ctx, query);
55
+ return stmt;
56
+ case "highlight":
57
+ case "snippet":
58
+ stmt.identifier(expr.method);
59
+ for (const param of stmt.call(expr.params))
60
+ this.formatExprValue({ ...ctx, tableAsExpr: true }, param);
61
+ return stmt;
62
+ }
63
+ default:
64
+ return super.formatExpr(ctx, expr);
65
+ }
66
+ }
67
+ };
68
+ export {
69
+ SqliteFormatter
70
+ };
@@ -0,0 +1,150 @@
1
+ // src/sqlite/SqliteFunctions.ts
2
+ import { Functions } from "../define/Functions.ts";
3
+ var SqliteFunctions = Functions;
4
+ var {
5
+ count,
6
+ iif,
7
+ exists,
8
+ match,
9
+ highlight,
10
+ snippet,
11
+ cast,
12
+ abs,
13
+ changes,
14
+ char,
15
+ coalesce,
16
+ ifnull,
17
+ instr,
18
+ last_insert_rowid,
19
+ length,
20
+ likelihood,
21
+ likely,
22
+ lower,
23
+ ltrim,
24
+ max,
25
+ min,
26
+ nullif,
27
+ prnumberf,
28
+ quote,
29
+ random,
30
+ replace,
31
+ round,
32
+ rtrim,
33
+ sign,
34
+ soundex,
35
+ sqlite_version,
36
+ substr,
37
+ total_changes,
38
+ trim,
39
+ unicode,
40
+ unlikely,
41
+ upper,
42
+ avg,
43
+ group_concat,
44
+ sum,
45
+ acos,
46
+ acosh,
47
+ asin,
48
+ asinh,
49
+ atan,
50
+ atan2,
51
+ atanh,
52
+ ceil,
53
+ cos,
54
+ cosh,
55
+ degrees,
56
+ exp,
57
+ floor,
58
+ ln,
59
+ log,
60
+ log2,
61
+ mod,
62
+ pi,
63
+ pow,
64
+ radians,
65
+ sin,
66
+ sinh,
67
+ sqrt,
68
+ tan,
69
+ tanh,
70
+ trunc,
71
+ date,
72
+ time,
73
+ datetime,
74
+ julianday,
75
+ strftime
76
+ } = SqliteFunctions;
77
+ export {
78
+ SqliteFunctions,
79
+ abs,
80
+ acos,
81
+ acosh,
82
+ asin,
83
+ asinh,
84
+ atan,
85
+ atan2,
86
+ atanh,
87
+ avg,
88
+ cast,
89
+ ceil,
90
+ changes,
91
+ char,
92
+ coalesce,
93
+ cos,
94
+ cosh,
95
+ count,
96
+ date,
97
+ datetime,
98
+ degrees,
99
+ exists,
100
+ exp,
101
+ floor,
102
+ group_concat,
103
+ highlight,
104
+ ifnull,
105
+ iif,
106
+ instr,
107
+ julianday,
108
+ last_insert_rowid,
109
+ length,
110
+ likelihood,
111
+ likely,
112
+ ln,
113
+ log,
114
+ log2,
115
+ lower,
116
+ ltrim,
117
+ match,
118
+ max,
119
+ min,
120
+ mod,
121
+ nullif,
122
+ pi,
123
+ pow,
124
+ prnumberf,
125
+ quote,
126
+ radians,
127
+ random,
128
+ replace,
129
+ round,
130
+ rtrim,
131
+ sign,
132
+ sin,
133
+ sinh,
134
+ snippet,
135
+ soundex,
136
+ sqlite_version,
137
+ sqrt,
138
+ strftime,
139
+ substr,
140
+ sum,
141
+ tan,
142
+ tanh,
143
+ time,
144
+ total_changes,
145
+ trim,
146
+ trunc,
147
+ unicode,
148
+ unlikely,
149
+ upper
150
+ };
@@ -0,0 +1,47 @@
1
+ // src/sqlite/SqliteSchema.ts
2
+ import { Cursor } from "../define/Cursor.ts";
3
+ import { Statement } from "../lib/Statement.ts";
4
+ import { SqliteFormatter } from "./SqliteFormatter.ts";
5
+ var SqliteSchema;
6
+ ((SqliteSchema2) => {
7
+ const formatter = new SqliteFormatter();
8
+ function tableData(tableName) {
9
+ return Cursor.all`select * from pragma_table_info(${tableName}) order by cid`;
10
+ }
11
+ SqliteSchema2.tableData = tableData;
12
+ function indexData(tableName) {
13
+ return Cursor.all`select * from sqlite_master where type='index' and tbl_name=${tableName}`;
14
+ }
15
+ SqliteSchema2.indexData = indexData;
16
+ function createInstructions(columnData, indexData2) {
17
+ if (columnData.length === 0 && indexData2.length === 0)
18
+ return void 0;
19
+ const columns = columnData.map(columnInstruction);
20
+ const indexes = indexData2.map(indexInstruction).filter((row) => row[1]);
21
+ return {
22
+ columns: Object.fromEntries(columns),
23
+ indexes: Object.fromEntries(indexes)
24
+ };
25
+ }
26
+ SqliteSchema2.createInstructions = createInstructions;
27
+ function columnInstruction(column) {
28
+ const stmt = new Statement(formatter);
29
+ stmt.identifier(column.name).add(column.type);
30
+ if (column.pk === 1)
31
+ stmt.add("PRIMARY KEY");
32
+ if (column.notnull === 1)
33
+ stmt.add("NOT NULL");
34
+ if (column.dflt_value !== null) {
35
+ stmt.add("DEFAULT").space().openParenthesis().raw(column.dflt_value).closeParenthesis();
36
+ }
37
+ return [column.name, stmt.sql];
38
+ }
39
+ SqliteSchema2.columnInstruction = columnInstruction;
40
+ function indexInstruction(index) {
41
+ return [index.name, index.sql];
42
+ }
43
+ SqliteSchema2.indexInstruction = indexInstruction;
44
+ })(SqliteSchema || (SqliteSchema = {}));
45
+ export {
46
+ SqliteSchema
47
+ };
@@ -0,0 +1,3 @@
1
+ // src/sqlite.ts
2
+ export * from "./sqlite/SqliteFormatter.ts";
3
+ export * from "./sqlite/SqliteFunctions.ts";
@@ -0,0 +1,15 @@
1
+ // src/util/Callable.ts
2
+ function callable(target, call) {
3
+ return new Proxy(call, {
4
+ set(_, prop, value) {
5
+ target[prop] = value;
6
+ return true;
7
+ },
8
+ get(_, prop) {
9
+ return target[prop];
10
+ }
11
+ });
12
+ }
13
+ export {
14
+ callable
15
+ };
@@ -13,7 +13,10 @@ export declare class D1Driver extends Driver.Async {
13
13
  executeQuery(query: QueryData, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<unknown>;
14
14
  prepareStatement(stmt: Statement): Driver.Async.PreparedStatement;
15
15
  schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
16
- isolate(): [connection: Driver.Async, release: () => Promise<void>];
16
+ isolate(): Promise<[
17
+ connection: Driver.Async,
18
+ release: () => Promise<void>
19
+ ]>;
17
20
  close(): Promise<void>;
18
21
  }
19
22
  export declare function connect(db: D1Database, options?: DriverOptions): D1Driver;
package/dist/driver/d1.js CHANGED
@@ -48,12 +48,14 @@ class D1Driver extends Driver.Async {
48
48
  const indexData = await this.indexData(tableName);
49
49
  return SqliteSchema.createInstructions(columnData, indexData);
50
50
  }
51
- isolate() {
51
+ async isolate() {
52
+ const currentLock = this.lock;
52
53
  const connection = new D1Driver(this.db);
53
54
  let release, trigger = new Promise((resolve) => {
54
55
  release = async () => resolve();
55
56
  });
56
- this.lock = Promise.resolve(this.lock).then(() => trigger);
57
+ this.lock = Promise.resolve(currentLock).then(() => trigger);
58
+ await currentLock;
57
59
  return [connection, release];
58
60
  }
59
61
  async close() {
@@ -13,7 +13,10 @@ export declare class Sqlite3Driver extends Driver.Async {
13
13
  executeQuery(query: QueryData, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<unknown>;
14
14
  prepareStatement(stmt: Statement): Driver.Async.PreparedStatement;
15
15
  schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
16
- isolate(): [connection: Driver.Async, release: () => Promise<void>];
16
+ isolate(): Promise<[
17
+ connection: Driver.Async,
18
+ release: () => Promise<void>
19
+ ]>;
17
20
  close(): Promise<void>;
18
21
  }
19
22
  export declare function connect(db: Database, options?: DriverOptions): Sqlite3Driver;
@@ -101,12 +101,14 @@ class Sqlite3Driver extends Driver.Async {
101
101
  const indexData = await this.indexData(tableName);
102
102
  return SqliteSchema.createInstructions(columnData, indexData);
103
103
  }
104
- isolate() {
104
+ async isolate() {
105
+ const currentLock = this.lock;
105
106
  const connection = new Sqlite3Driver(this.db);
106
107
  let release, trigger = new Promise((resolve) => {
107
108
  release = async () => resolve();
108
109
  });
109
- this.lock = Promise.resolve(this.lock).then(() => trigger);
110
+ this.lock = Promise.resolve(currentLock).then(() => trigger);
111
+ await currentLock;
110
112
  return [connection, release];
111
113
  }
112
114
  async close() {
@@ -59,7 +59,10 @@ declare abstract class AsyncDriver extends DriverBase {
59
59
  transactionId: number;
60
60
  constructor(formatter: Formatter, options?: DriverOptions);
61
61
  abstract close(): Promise<void>;
62
- abstract isolate(): [connection: AsyncDriver, release: () => Promise<void>];
62
+ abstract isolate(): Promise<[
63
+ connection: AsyncDriver,
64
+ release: () => Promise<void>
65
+ ]>;
63
66
  abstract prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
64
67
  abstract schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
65
68
  createStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
@@ -78,7 +81,10 @@ declare class SyncWrapper extends AsyncDriver {
78
81
  executeQuery(query: QueryData, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<unknown>;
79
82
  prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
80
83
  schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
81
- isolate(): [connection: AsyncDriver, release: () => Promise<void>];
84
+ isolate(): Promise<[
85
+ connection: AsyncDriver,
86
+ release: () => Promise<void>
87
+ ]>;
82
88
  }
83
89
  interface AsyncPreparedStatement {
84
90
  run(params: Array<any>): Promise<{
@@ -308,7 +308,7 @@ class AsyncDriver extends DriverBase {
308
308
  }
309
309
  async transaction(run) {
310
310
  const id = `t${this.transactionId++}`;
311
- const [connection, release] = this.isolate();
311
+ const [connection, release] = await this.isolate();
312
312
  await connection.executeQuery(
313
313
  new QueryData.Transaction({ op: QueryData.TransactionOperation.Begin, id })
314
314
  );
@@ -327,7 +327,8 @@ class AsyncDriver extends DriverBase {
327
327
  op: QueryData.TransactionOperation.Rollback,
328
328
  id
329
329
  })
330
- );
330
+ ).catch(() => {
331
+ });
331
332
  throw e;
332
333
  } finally {
333
334
  await release();
@@ -376,12 +377,14 @@ class SyncWrapper extends AsyncDriver {
376
377
  async schemaInstructions(tableName) {
377
378
  return this.sync.schemaInstructions(tableName);
378
379
  }
379
- isolate() {
380
+ async isolate() {
381
+ const currentLock = this.lock;
380
382
  const connection = new SyncWrapper(this.sync);
381
383
  let release, trigger = new Promise((resolve) => {
382
384
  release = async () => resolve();
383
385
  });
384
- this.lock = Promise.resolve(this.lock).then(() => trigger);
386
+ this.lock = Promise.resolve(currentLock).then(() => trigger);
387
+ await currentLock;
385
388
  return [connection, release];
386
389
  }
387
390
  }
@@ -0,0 +1,2 @@
1
+ export * from './SqliteFormatter';
2
+ export * from './SqliteFunctions';
@@ -0,0 +1,3 @@
1
+ // src/sqlite/index.ts
2
+ export * from "./SqliteFormatter.js";
3
+ export * from "./SqliteFunctions.js";
@@ -0,0 +1,49 @@
1
+ // src/driver/better-sqlite3.ts
2
+ import { Driver } from "../lib/Driver.js";
3
+ import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
4
+ import { SqliteSchema } from "../sqlite/SqliteSchema.js";
5
+ var PreparedStatement = class {
6
+ constructor(stmt) {
7
+ this.stmt = stmt;
8
+ }
9
+ all(params = []) {
10
+ return this.stmt.all(...params);
11
+ }
12
+ run(params = []) {
13
+ return { rowsAffected: this.stmt.run(...params).changes };
14
+ }
15
+ get(params = []) {
16
+ return this.stmt.get(...params);
17
+ }
18
+ execute(params = []) {
19
+ this.stmt.run(...params);
20
+ }
21
+ };
22
+ var BetterSqlite3Driver = class extends Driver.Sync {
23
+ constructor(db) {
24
+ super(new SqliteFormatter());
25
+ this.db = db;
26
+ this.tableData = this.prepare(SqliteSchema.tableData);
27
+ this.indexData = this.prepare(SqliteSchema.indexData);
28
+ }
29
+ tableData;
30
+ indexData;
31
+ prepareStatement(stmt) {
32
+ return new PreparedStatement(this.db.prepare(stmt.sql));
33
+ }
34
+ schemaInstructions(tableName) {
35
+ const columnData = this.tableData(tableName);
36
+ const indexData = this.indexData(tableName);
37
+ return SqliteSchema.createInstructions(columnData, indexData);
38
+ }
39
+ export() {
40
+ return this.db.serialize();
41
+ }
42
+ };
43
+ function connect(db) {
44
+ return new BetterSqlite3Driver(db);
45
+ }
46
+ export {
47
+ BetterSqlite3Driver,
48
+ connect
49
+ };
@@ -0,0 +1,66 @@
1
+ // src/driver/sql.js.ts
2
+ import { Driver } from "../lib/Driver.js";
3
+ import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
4
+ import { SqliteSchema } from "../sqlite/SqliteSchema.js";
5
+ var PreparedStatement = class {
6
+ constructor(db, stmt, discardAfter) {
7
+ this.db = db;
8
+ this.stmt = stmt;
9
+ this.discardAfter = discardAfter;
10
+ }
11
+ all(params) {
12
+ this.stmt.bind(params);
13
+ const res = [];
14
+ while (this.stmt.step())
15
+ res.push(this.stmt.getAsObject());
16
+ if (this.discardAfter)
17
+ this.stmt.free();
18
+ return res;
19
+ }
20
+ run(params) {
21
+ this.stmt.run(params);
22
+ if (this.discardAfter)
23
+ this.stmt.free();
24
+ return { rowsAffected: this.db.getRowsModified() };
25
+ }
26
+ get(params) {
27
+ return this.all(params)[0];
28
+ }
29
+ execute(params) {
30
+ this.stmt.run(params);
31
+ if (this.discardAfter)
32
+ this.stmt.free();
33
+ }
34
+ };
35
+ var SqlJsDriver = class extends Driver.Sync {
36
+ constructor(db) {
37
+ super(new SqliteFormatter());
38
+ this.db = db;
39
+ this.tableData = this.prepare(SqliteSchema.tableData);
40
+ this.indexData = this.prepare(SqliteSchema.indexData);
41
+ }
42
+ tableData;
43
+ indexData;
44
+ prepareStatement(stmt, discardAfter) {
45
+ return new PreparedStatement(
46
+ this.db,
47
+ this.db.prepare(stmt.sql),
48
+ discardAfter
49
+ );
50
+ }
51
+ schemaInstructions(tableName) {
52
+ const columnData = this.tableData(tableName);
53
+ const indexData = this.indexData(tableName);
54
+ return SqliteSchema.createInstructions(columnData, indexData);
55
+ }
56
+ export() {
57
+ return this.db.export();
58
+ }
59
+ };
60
+ function connect(db) {
61
+ return new SqlJsDriver(db);
62
+ }
63
+ export {
64
+ SqlJsDriver,
65
+ connect
66
+ };