rado 0.3.2 → 0.3.4
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.
- package/README.md +2 -0
- package/dist/define/CTE.d.ts +2 -0
- package/dist/define/CTE.js +51 -0
- package/dist/define/Cursor.d.ts +65 -42
- package/dist/define/Cursor.js +170 -88
- package/dist/define/Expr.d.ts +2 -2
- package/dist/define/Expr.js +4 -1
- package/dist/define/Ops.d.ts +1 -6
- package/dist/define/Ops.js +10 -7
- package/dist/define/Query.d.ts +117 -2
- package/dist/define/Query.js +472 -17
- package/dist/define/Selection.d.ts +1 -1
- package/dist/define/Table.d.ts +6 -3
- package/dist/define/Table.js +6 -1
- package/dist/define/VirtualTable.d.ts +1 -1
- package/dist/define/query/Delete.d.ts +0 -2
- package/dist/define/query/Delete.js +0 -3
- package/dist/define/query/Select.d.ts +0 -2
- package/dist/define/query/Select.js +1 -14
- package/dist/deno/driver/better-sqlite3.js +57 -0
- package/dist/deno/driver/bun-sqlite.js +69 -0
- package/dist/deno/driver/sql.js.js +72 -0
- package/dist/deno/driver/sqlite3.js +123 -0
- package/dist/deno/index.js +14 -0
- package/dist/deno/lib/Driver.js +330 -0
- package/dist/deno/lib/Formatter.js +715 -0
- package/dist/deno/lib/SqlError.js +11 -0
- package/dist/deno/lib/Statement.js +108 -0
- package/dist/deno/sqlite/SqliteFormatter.js +70 -0
- package/dist/deno/sqlite/SqliteFunctions.js +150 -0
- package/dist/deno/sqlite/SqliteSchema.js +47 -0
- package/dist/deno/sqlite.js +3 -0
- package/dist/deno/util/Callable.js +15 -0
- package/dist/driver/bun-sqlite.js +1 -2
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -8
- package/dist/lib/Driver.d.ts +1 -2
- package/dist/lib/Formatter.js +17 -3
- package/dist/sqlite/index.d.ts +2 -0
- package/dist/sqlite/index.js +3 -0
- package/dist/src/driver/better-sqlite3.js +49 -0
- package/dist/src/driver/sql.js.js +66 -0
- package/dist/src/driver/sqlite3.js +87 -0
- package/dist/src/index.js +24 -0
- package/dist/{lib → src/lib}/Column.js +1 -6
- package/dist/{lib → src/lib}/Cursor.js +25 -50
- package/dist/src/lib/Driver.js +316 -0
- package/dist/{lib → src/lib}/Expr.js +4 -4
- package/dist/src/lib/Formatter.js +625 -0
- package/dist/{lib → src/lib}/Ops.js +14 -5
- package/dist/src/lib/Sanitizer.js +0 -0
- package/dist/src/lib/Statement.js +103 -0
- package/dist/{lib → src/lib}/Table.js +1 -1
- package/dist/{lib → src/lib}/Target.js +4 -9
- package/dist/src/lib/Update.js +0 -0
- package/dist/src/sqlite/SqliteFormatter.js +67 -0
- package/dist/src/sqlite/SqliteFunctions.js +146 -0
- package/dist/src/sqlite/SqliteSchema.js +47 -0
- package/dist/src/sqlite.js +3 -0
- package/dist/test/DbSuite.js +28 -0
- package/dist/test/TSTestTypes.js +6 -0
- package/dist/test/TestBasic.js +172 -0
- package/dist/test/TestExtend.js +68 -0
- package/dist/test/TestFts5.js +34 -0
- package/dist/test/TestFunctions.js +28 -0
- package/dist/test/TestJoins.js +34 -0
- package/dist/test/TestJson.js +33 -0
- package/dist/test/TestPrepare.js +27 -0
- package/dist/test/TestRawSql.js +31 -0
- package/dist/test/TestSchema.js +69 -0
- package/dist/test/TestSubQueries.js +79 -0
- package/dist/test/TestTransaction.js +54 -0
- package/dist/test/TestUpdate.js +95 -0
- package/dist/test/index.js +14 -0
- package/package.json +1 -1
- package/dist/lib/Column.d.ts +0 -57
- package/dist/lib/Cursor.d.ts +0 -85
- package/dist/lib/Expr.d.ts +0 -154
- package/dist/lib/Fields.d.ts +0 -13
- package/dist/lib/Functions.d.ts +0 -5
- package/dist/lib/Id.d.ts +0 -3
- package/dist/lib/Index.d.ts +0 -17
- package/dist/lib/Ops.d.ts +0 -7
- package/dist/lib/OrderBy.d.ts +0 -9
- package/dist/lib/Param.d.ts +0 -20
- package/dist/lib/Query.d.ts +0 -109
- package/dist/lib/Schema.d.ts +0 -18
- package/dist/lib/Selection.d.ts +0 -20
- package/dist/lib/Table.d.ts +0 -62
- package/dist/lib/Target.d.ts +0 -38
- package/dist/lib/Update.d.ts +0 -4
- /package/dist/{lib/Fields.js → deno/lib/Sanitizer.js} +0 -0
- /package/dist/{lib/Id.js → src/lib/Fields.js} +0 -0
- /package/dist/{lib → src/lib}/Functions.js +0 -0
- /package/dist/{lib/Update.js → src/lib/Id.js} +0 -0
- /package/dist/{lib → src/lib}/Index.js +0 -0
- /package/dist/{lib → src/lib}/OrderBy.js +0 -0
- /package/dist/{lib → src/lib}/Param.js +0 -0
- /package/dist/{lib → src/lib}/Query.js +0 -0
- /package/dist/{lib → src/lib}/Schema.js +0 -0
- /package/dist/{lib → src/lib}/Selection.js +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/driver/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 new Promise((resolve, reject) => {
|
|
11
|
+
this.stmt.all(params, (err, rows) => {
|
|
12
|
+
if (err)
|
|
13
|
+
reject(err);
|
|
14
|
+
else
|
|
15
|
+
resolve(rows);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
run(params) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
this.stmt.run(params, function(err) {
|
|
22
|
+
if (err)
|
|
23
|
+
reject(err);
|
|
24
|
+
else
|
|
25
|
+
resolve({ rowsAffected: this.changes });
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
get(params) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
this.stmt.get(params, (err, row) => {
|
|
32
|
+
if (err)
|
|
33
|
+
reject(err);
|
|
34
|
+
else
|
|
35
|
+
resolve(row);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
execute(params) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.stmt.run(params, (err) => {
|
|
42
|
+
if (err)
|
|
43
|
+
reject(err);
|
|
44
|
+
else
|
|
45
|
+
resolve();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var Sqlite3Driver = class extends Driver.Async {
|
|
51
|
+
constructor(db) {
|
|
52
|
+
super(new SqliteFormatter());
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
55
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
56
|
+
}
|
|
57
|
+
lock;
|
|
58
|
+
tableData;
|
|
59
|
+
indexData;
|
|
60
|
+
async executeQuery(query, stmt, params) {
|
|
61
|
+
await this.lock;
|
|
62
|
+
return super.executeQuery(query, stmt, params);
|
|
63
|
+
}
|
|
64
|
+
prepareStatement(stmt) {
|
|
65
|
+
return new PreparedStatement(this.db.prepare(stmt.sql));
|
|
66
|
+
}
|
|
67
|
+
async schemaInstructions(tableName) {
|
|
68
|
+
const columnData = await this.tableData(tableName);
|
|
69
|
+
const indexData = await this.indexData(tableName);
|
|
70
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
71
|
+
}
|
|
72
|
+
isolate() {
|
|
73
|
+
const connection = new Sqlite3Driver(this.db);
|
|
74
|
+
let release, trigger = new Promise((resolve) => {
|
|
75
|
+
release = async () => resolve();
|
|
76
|
+
});
|
|
77
|
+
this.lock = Promise.resolve(this.lock).then(() => trigger);
|
|
78
|
+
return [connection, release];
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
function connect(db) {
|
|
82
|
+
return new Sqlite3Driver(db);
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
Sqlite3Driver,
|
|
86
|
+
connect
|
|
87
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
export * from "./lib/Column.js";
|
|
3
|
+
export * from "./lib/Cursor.js";
|
|
4
|
+
export * from "./lib/Driver.js";
|
|
5
|
+
export * from "./lib/Expr.js";
|
|
6
|
+
export * from "./lib/Fields.js";
|
|
7
|
+
export * from "./lib/Formatter.js";
|
|
8
|
+
import { Functions } from "./lib/Functions.js";
|
|
9
|
+
export * from "./lib/Id.js";
|
|
10
|
+
export * from "./lib/Index.js";
|
|
11
|
+
export * from "./lib/Ops.js";
|
|
12
|
+
export * from "./lib/OrderBy.js";
|
|
13
|
+
export * from "./lib/Param.js";
|
|
14
|
+
export * from "./lib/Query.js";
|
|
15
|
+
export * from "./lib/Sanitizer.js";
|
|
16
|
+
export * from "./lib/Schema.js";
|
|
17
|
+
export * from "./lib/Selection.js";
|
|
18
|
+
export * from "./lib/Statement.js";
|
|
19
|
+
export * from "./lib/Table.js";
|
|
20
|
+
export * from "./lib/Target.js";
|
|
21
|
+
export * from "./lib/Update.js";
|
|
22
|
+
export {
|
|
23
|
+
Functions
|
|
24
|
+
};
|
|
@@ -25,12 +25,7 @@ var Column = class {
|
|
|
25
25
|
return new Column({ ...this.data, primaryKey: true });
|
|
26
26
|
}
|
|
27
27
|
references(column2) {
|
|
28
|
-
return new Column({
|
|
29
|
-
...this.data,
|
|
30
|
-
get references() {
|
|
31
|
-
return ExprData.create(typeof column2 === "function" ? column2() : column2);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
28
|
+
return new Column({ ...this.data, references: ExprData.create(column2) });
|
|
34
29
|
}
|
|
35
30
|
unique() {
|
|
36
31
|
return new Column({ ...this.data, unique: true });
|
|
@@ -21,54 +21,41 @@ var Cursor = class {
|
|
|
21
21
|
query() {
|
|
22
22
|
throw new Error("Not implemented");
|
|
23
23
|
}
|
|
24
|
-
on(driver) {
|
|
25
|
-
return driver.executeQuery(this.query());
|
|
26
|
-
}
|
|
27
24
|
toJSON() {
|
|
28
25
|
return this.query();
|
|
29
26
|
}
|
|
30
27
|
};
|
|
31
|
-
function addWhere(query, where) {
|
|
32
|
-
const conditions = where.slice();
|
|
33
|
-
if (query.where)
|
|
34
|
-
conditions.push(query.where);
|
|
35
|
-
return {
|
|
36
|
-
...query,
|
|
37
|
-
where: Expr.and(...conditions).expr
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
28
|
((Cursor2) => {
|
|
41
|
-
class
|
|
42
|
-
query() {
|
|
43
|
-
return super.query();
|
|
44
|
-
}
|
|
45
|
-
where(...where) {
|
|
46
|
-
return new Delete(addWhere(this.query(), where));
|
|
47
|
-
}
|
|
29
|
+
class Limitable extends Cursor2 {
|
|
48
30
|
take(limit) {
|
|
49
|
-
return new
|
|
31
|
+
return new Limitable({ ...this.query(), limit });
|
|
50
32
|
}
|
|
51
33
|
skip(offset) {
|
|
52
|
-
return new
|
|
34
|
+
return new Limitable({ ...this.query(), offset });
|
|
53
35
|
}
|
|
54
36
|
}
|
|
55
|
-
Cursor2.
|
|
56
|
-
class
|
|
37
|
+
Cursor2.Limitable = Limitable;
|
|
38
|
+
class Filterable extends Limitable {
|
|
39
|
+
where(...where) {
|
|
40
|
+
const condition = Expr.and(...where);
|
|
41
|
+
const query = this.query();
|
|
42
|
+
return new Filterable({
|
|
43
|
+
...query,
|
|
44
|
+
where: (query.where ? condition.and(new Expr(query.where)) : condition).expr
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
Cursor2.Filterable = Filterable;
|
|
49
|
+
class Delete extends Filterable {
|
|
57
50
|
query() {
|
|
58
51
|
return super.query();
|
|
59
52
|
}
|
|
53
|
+
}
|
|
54
|
+
Cursor2.Delete = Delete;
|
|
55
|
+
class Update extends Filterable {
|
|
60
56
|
set(set) {
|
|
61
57
|
return new Update({ ...this.query(), set });
|
|
62
58
|
}
|
|
63
|
-
where(...where) {
|
|
64
|
-
return new Update(addWhere(this.query(), where));
|
|
65
|
-
}
|
|
66
|
-
take(limit) {
|
|
67
|
-
return new Update({ ...this.query(), limit });
|
|
68
|
-
}
|
|
69
|
-
skip(offset) {
|
|
70
|
-
return new Update({ ...this.query(), offset });
|
|
71
|
-
}
|
|
72
59
|
}
|
|
73
60
|
Cursor2.Update = Update;
|
|
74
61
|
class InsertValuesReturning extends Cursor2 {
|
|
@@ -94,13 +81,13 @@ function addWhere(query, where) {
|
|
|
94
81
|
}
|
|
95
82
|
}
|
|
96
83
|
Cursor2.Insert = Insert;
|
|
97
|
-
class
|
|
84
|
+
class Create extends Cursor2 {
|
|
98
85
|
constructor(table) {
|
|
99
86
|
super(Schema.create(table));
|
|
100
87
|
this.table = table;
|
|
101
88
|
}
|
|
102
89
|
}
|
|
103
|
-
Cursor2.
|
|
90
|
+
Cursor2.Create = Create;
|
|
104
91
|
class Batch extends Cursor2 {
|
|
105
92
|
constructor(queries) {
|
|
106
93
|
super(Query.Batch({ queries }));
|
|
@@ -108,7 +95,7 @@ function addWhere(query, where) {
|
|
|
108
95
|
}
|
|
109
96
|
}
|
|
110
97
|
Cursor2.Batch = Batch;
|
|
111
|
-
class SelectMultiple extends
|
|
98
|
+
class SelectMultiple extends Filterable {
|
|
112
99
|
query() {
|
|
113
100
|
return super.query();
|
|
114
101
|
}
|
|
@@ -174,20 +161,14 @@ function addWhere(query, where) {
|
|
|
174
161
|
});
|
|
175
162
|
}
|
|
176
163
|
where(...where) {
|
|
177
|
-
return new SelectMultiple(
|
|
178
|
-
}
|
|
179
|
-
take(limit) {
|
|
180
|
-
return new SelectMultiple({ ...this.query(), limit });
|
|
181
|
-
}
|
|
182
|
-
skip(offset) {
|
|
183
|
-
return new SelectMultiple({ ...this.query(), offset });
|
|
164
|
+
return new SelectMultiple(super.where(...where).query());
|
|
184
165
|
}
|
|
185
166
|
toExpr() {
|
|
186
167
|
return new Expr(ExprData.Query(this.query()));
|
|
187
168
|
}
|
|
188
169
|
}
|
|
189
170
|
Cursor2.SelectMultiple = SelectMultiple;
|
|
190
|
-
class SelectSingle extends
|
|
171
|
+
class SelectSingle extends Filterable {
|
|
191
172
|
query() {
|
|
192
173
|
return super.query();
|
|
193
174
|
}
|
|
@@ -234,13 +215,7 @@ function addWhere(query, where) {
|
|
|
234
215
|
});
|
|
235
216
|
}
|
|
236
217
|
where(...where) {
|
|
237
|
-
return new SelectSingle(
|
|
238
|
-
}
|
|
239
|
-
take(limit) {
|
|
240
|
-
return new SelectSingle({ ...this.query(), limit });
|
|
241
|
-
}
|
|
242
|
-
skip(offset) {
|
|
243
|
-
return new SelectSingle({ ...this.query(), offset });
|
|
218
|
+
return new SelectSingle(super.where(...where).query());
|
|
244
219
|
}
|
|
245
220
|
all() {
|
|
246
221
|
return new SelectMultiple({ ...this.query(), singleResult: false });
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
// src/lib/Driver.ts
|
|
2
|
+
import { Cursor } from "./Cursor.js";
|
|
3
|
+
import { Expr, ExprData } from "./Expr.js";
|
|
4
|
+
import { ParamData } from "./Param.js";
|
|
5
|
+
import { Query, QueryType } from "./Query.js";
|
|
6
|
+
import { Schema } from "./Schema.js";
|
|
7
|
+
var Callable = class extends Function {
|
|
8
|
+
constructor(fn) {
|
|
9
|
+
super();
|
|
10
|
+
return new Proxy(this, {
|
|
11
|
+
apply(_, thisArg, input) {
|
|
12
|
+
return fn.apply(thisArg, input);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
function isTemplateStringsArray(input) {
|
|
18
|
+
return Boolean(Array.isArray(input) && input.raw);
|
|
19
|
+
}
|
|
20
|
+
var DriverBase = class extends Callable {
|
|
21
|
+
constructor(formatter) {
|
|
22
|
+
super((...args) => {
|
|
23
|
+
const [input, ...rest] = args;
|
|
24
|
+
if (input instanceof Cursor && rest.length === 0)
|
|
25
|
+
return this.executeQuery(input.query());
|
|
26
|
+
if (isTemplateStringsArray(input))
|
|
27
|
+
return this.executeTemplate(void 0, input, ...rest);
|
|
28
|
+
return this.executeQuery(
|
|
29
|
+
Query.Batch({
|
|
30
|
+
queries: args.filter((arg) => arg instanceof Cursor).map((arg) => arg.query())
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
this.formatter = formatter;
|
|
35
|
+
}
|
|
36
|
+
compile(create) {
|
|
37
|
+
const { length } = create;
|
|
38
|
+
const paramNames = Array.from({ length }, (_, i) => `p${i}`);
|
|
39
|
+
const params = paramNames.map(
|
|
40
|
+
(name) => new Expr(ExprData.Param(ParamData.Named(name)))
|
|
41
|
+
);
|
|
42
|
+
const cursor = create(...params);
|
|
43
|
+
const query = cursor.query();
|
|
44
|
+
return [query, this.formatter.compile(query)];
|
|
45
|
+
}
|
|
46
|
+
all(...args) {
|
|
47
|
+
const [input, ...rest] = args;
|
|
48
|
+
if (input instanceof Cursor.SelectSingle)
|
|
49
|
+
return this.executeQuery(input.all().query());
|
|
50
|
+
if (input instanceof Cursor)
|
|
51
|
+
return this.executeQuery(input.query());
|
|
52
|
+
return this.executeTemplate("rows", input, ...rest);
|
|
53
|
+
}
|
|
54
|
+
get(...args) {
|
|
55
|
+
const [input, ...rest] = args;
|
|
56
|
+
if (input instanceof Cursor.SelectMultiple)
|
|
57
|
+
return this.executeQuery(input.first().query());
|
|
58
|
+
if (input instanceof Cursor)
|
|
59
|
+
return this.executeQuery(input.query());
|
|
60
|
+
return this.executeTemplate("row", input, ...rest);
|
|
61
|
+
}
|
|
62
|
+
sql(strings, ...params) {
|
|
63
|
+
return new Cursor(Query.Raw({ strings, params }));
|
|
64
|
+
}
|
|
65
|
+
executeTemplate(expectedReturn, strings, ...params) {
|
|
66
|
+
return this.executeQuery(Query.Raw({ strings, params, expectedReturn }));
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var SyncDriver = class extends DriverBase {
|
|
70
|
+
transactionId = 0;
|
|
71
|
+
prepare(create) {
|
|
72
|
+
const [query, compiled] = this.compile(create);
|
|
73
|
+
const prepared = this.prepareStatement(compiled, false);
|
|
74
|
+
return (...params) => {
|
|
75
|
+
const namedParams = Object.fromEntries(
|
|
76
|
+
params.map((value, i) => [`p${i}`, value])
|
|
77
|
+
);
|
|
78
|
+
return this.executeQuery(query, prepared, compiled.params(namedParams));
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
migrateSchema(...tables) {
|
|
82
|
+
const queries = [];
|
|
83
|
+
for (const table of Object.values(tables)) {
|
|
84
|
+
const schema = table.schema();
|
|
85
|
+
const localSchema = this.schemaInstructions(schema.name);
|
|
86
|
+
if (!localSchema) {
|
|
87
|
+
queries.push(...Schema.create(schema).queries);
|
|
88
|
+
} else {
|
|
89
|
+
const changes = Schema.upgrade(this.formatter, localSchema, schema);
|
|
90
|
+
if (changes.length)
|
|
91
|
+
queries.push(...changes);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return this.executeQuery(Query.Batch({ queries }));
|
|
95
|
+
}
|
|
96
|
+
executeQuery(query, stmt, params) {
|
|
97
|
+
switch (query.type) {
|
|
98
|
+
case QueryType.Batch:
|
|
99
|
+
let result;
|
|
100
|
+
const stmts = query.queries;
|
|
101
|
+
if (stmts.length === 0)
|
|
102
|
+
return void 0;
|
|
103
|
+
if (stmts.length === 1)
|
|
104
|
+
return this.executeQuery(stmts[0]);
|
|
105
|
+
return this.transaction((cnx) => {
|
|
106
|
+
for (const query2 of stmts)
|
|
107
|
+
result = cnx.executeQuery(query2);
|
|
108
|
+
return result;
|
|
109
|
+
});
|
|
110
|
+
default:
|
|
111
|
+
const compiled = stmt ? void 0 : this.formatter.compile(query);
|
|
112
|
+
stmt = stmt || this.prepareStatement(compiled, true);
|
|
113
|
+
params = params || compiled.params();
|
|
114
|
+
if ("selection" in query) {
|
|
115
|
+
const res = stmt.all(params).map((row) => JSON.parse(row.result).result);
|
|
116
|
+
if (query.singleResult) {
|
|
117
|
+
const row = res[0];
|
|
118
|
+
if (query.validate && !row)
|
|
119
|
+
throw new Error("No row found");
|
|
120
|
+
return row;
|
|
121
|
+
}
|
|
122
|
+
return res;
|
|
123
|
+
} else if (query.type === QueryType.Raw) {
|
|
124
|
+
switch (query.expectedReturn) {
|
|
125
|
+
case "row":
|
|
126
|
+
return stmt.all(params)[0];
|
|
127
|
+
case "rows":
|
|
128
|
+
return stmt.all(params);
|
|
129
|
+
default:
|
|
130
|
+
stmt.execute(params);
|
|
131
|
+
return void 0;
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
return stmt.run(params);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
all(...args) {
|
|
139
|
+
return super.all(...args);
|
|
140
|
+
}
|
|
141
|
+
get(...args) {
|
|
142
|
+
return super.get(...args);
|
|
143
|
+
}
|
|
144
|
+
transaction(run) {
|
|
145
|
+
const id = `t${this.transactionId++}`;
|
|
146
|
+
this.executeQuery(
|
|
147
|
+
Query.Transaction({ op: Query.TransactionOperation.Begin, id })
|
|
148
|
+
);
|
|
149
|
+
try {
|
|
150
|
+
const res = run(this);
|
|
151
|
+
this.executeQuery(
|
|
152
|
+
Query.Transaction({ op: Query.TransactionOperation.Commit, id })
|
|
153
|
+
);
|
|
154
|
+
return res;
|
|
155
|
+
} catch (e) {
|
|
156
|
+
this.executeQuery(
|
|
157
|
+
Query.Transaction({ op: Query.TransactionOperation.Rollback, id })
|
|
158
|
+
);
|
|
159
|
+
throw e;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
toAsync() {
|
|
163
|
+
return new SyncWrapper(this);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
var AsyncDriver = class extends DriverBase {
|
|
167
|
+
transactionId = 0;
|
|
168
|
+
prepare(create) {
|
|
169
|
+
const [query, compiled] = this.compile(create);
|
|
170
|
+
const prepared = this.prepareStatement(compiled, false);
|
|
171
|
+
return (...params) => {
|
|
172
|
+
const namedParams = Object.fromEntries(
|
|
173
|
+
params.map((value, i) => [`p${i}`, value])
|
|
174
|
+
);
|
|
175
|
+
return this.executeQuery(query, prepared, compiled.params(namedParams));
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async migrateSchema(...tables) {
|
|
179
|
+
const queries = [];
|
|
180
|
+
for (const table of Object.values(tables)) {
|
|
181
|
+
const schema = table.schema();
|
|
182
|
+
const localSchema = await this.schemaInstructions(schema.name);
|
|
183
|
+
if (!localSchema) {
|
|
184
|
+
queries.push(...Schema.create(schema).queries);
|
|
185
|
+
} else {
|
|
186
|
+
const changes = Schema.upgrade(this.formatter, localSchema, schema);
|
|
187
|
+
if (changes.length)
|
|
188
|
+
queries.push(...changes);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return this.executeQuery(Query.Batch({ queries }));
|
|
192
|
+
}
|
|
193
|
+
async executeQuery(query, stmt, params) {
|
|
194
|
+
switch (query.type) {
|
|
195
|
+
case QueryType.Batch:
|
|
196
|
+
let result;
|
|
197
|
+
const stmts = query.queries;
|
|
198
|
+
if (stmts.length === 0)
|
|
199
|
+
return void 0;
|
|
200
|
+
if (stmts.length === 1)
|
|
201
|
+
return this.executeQuery(stmts[0]);
|
|
202
|
+
return this.transaction(async (cnx) => {
|
|
203
|
+
for (const query2 of stmts)
|
|
204
|
+
result = await cnx.executeQuery(query2);
|
|
205
|
+
return result;
|
|
206
|
+
});
|
|
207
|
+
default:
|
|
208
|
+
const compiled = stmt ? void 0 : this.formatter.compile(query);
|
|
209
|
+
stmt = stmt || this.prepareStatement(compiled, true);
|
|
210
|
+
params = params || compiled.params();
|
|
211
|
+
if ("selection" in query) {
|
|
212
|
+
const res = (await stmt.all(params)).map(
|
|
213
|
+
(item) => JSON.parse(item.result).result
|
|
214
|
+
);
|
|
215
|
+
if (query.singleResult) {
|
|
216
|
+
const row = res[0];
|
|
217
|
+
if (query.validate && !row)
|
|
218
|
+
throw new Error("No row found");
|
|
219
|
+
return row;
|
|
220
|
+
}
|
|
221
|
+
return res;
|
|
222
|
+
} else if (query.type === QueryType.Raw) {
|
|
223
|
+
switch (query.expectedReturn) {
|
|
224
|
+
case "row":
|
|
225
|
+
return (await stmt.all(params))[0];
|
|
226
|
+
case "rows":
|
|
227
|
+
return await stmt.all(params);
|
|
228
|
+
default:
|
|
229
|
+
await stmt.execute(params);
|
|
230
|
+
return void 0;
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
return await stmt.run(params);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
all(...args) {
|
|
238
|
+
return super.all(...args);
|
|
239
|
+
}
|
|
240
|
+
get(...args) {
|
|
241
|
+
return super.get(...args);
|
|
242
|
+
}
|
|
243
|
+
async transaction(run) {
|
|
244
|
+
const id = `t${this.transactionId++}`;
|
|
245
|
+
const [connection, release] = this.isolate();
|
|
246
|
+
await connection.executeQuery(
|
|
247
|
+
Query.Transaction({ op: Query.TransactionOperation.Begin, id })
|
|
248
|
+
);
|
|
249
|
+
try {
|
|
250
|
+
const res = await run(connection);
|
|
251
|
+
await connection.executeQuery(
|
|
252
|
+
Query.Transaction({ op: Query.TransactionOperation.Commit, id })
|
|
253
|
+
);
|
|
254
|
+
return res;
|
|
255
|
+
} catch (e) {
|
|
256
|
+
await connection.executeQuery(
|
|
257
|
+
Query.Transaction({ op: Query.TransactionOperation.Rollback, id })
|
|
258
|
+
);
|
|
259
|
+
throw e;
|
|
260
|
+
} finally {
|
|
261
|
+
await release();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
var SyncPreparedStatementWrapper = class {
|
|
266
|
+
constructor(stmt) {
|
|
267
|
+
this.stmt = stmt;
|
|
268
|
+
}
|
|
269
|
+
async run(params) {
|
|
270
|
+
return this.stmt.run(params);
|
|
271
|
+
}
|
|
272
|
+
async all(params) {
|
|
273
|
+
return this.stmt.all(params);
|
|
274
|
+
}
|
|
275
|
+
async get(params) {
|
|
276
|
+
return this.stmt.get(params);
|
|
277
|
+
}
|
|
278
|
+
async execute(params) {
|
|
279
|
+
return this.stmt.execute(params);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
var SyncWrapper = class extends AsyncDriver {
|
|
283
|
+
constructor(sync) {
|
|
284
|
+
super(sync.formatter);
|
|
285
|
+
this.sync = sync;
|
|
286
|
+
}
|
|
287
|
+
lock;
|
|
288
|
+
async executeQuery(query, stmt, params) {
|
|
289
|
+
await this.lock;
|
|
290
|
+
return super.executeQuery(query, stmt, params);
|
|
291
|
+
}
|
|
292
|
+
prepareStatement(stmt, discardAfter) {
|
|
293
|
+
return new SyncPreparedStatementWrapper(
|
|
294
|
+
this.sync.prepareStatement(stmt, discardAfter)
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
async schemaInstructions(tableName) {
|
|
298
|
+
return this.sync.schemaInstructions(tableName);
|
|
299
|
+
}
|
|
300
|
+
isolate() {
|
|
301
|
+
const connection = new SyncWrapper(this.sync);
|
|
302
|
+
let release, trigger = new Promise((resolve) => {
|
|
303
|
+
release = async () => resolve();
|
|
304
|
+
});
|
|
305
|
+
this.lock = Promise.resolve(this.lock).then(() => trigger);
|
|
306
|
+
return [connection, release];
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
var Driver;
|
|
310
|
+
((Driver2) => {
|
|
311
|
+
Driver2.Sync = SyncDriver;
|
|
312
|
+
Driver2.Async = AsyncDriver;
|
|
313
|
+
})(Driver || (Driver = {}));
|
|
314
|
+
export {
|
|
315
|
+
Driver
|
|
316
|
+
};
|
|
@@ -187,10 +187,10 @@ var _Expr = class {
|
|
|
187
187
|
return this.isNull();
|
|
188
188
|
return binop(this, "Equals" /* Equals */, that);
|
|
189
189
|
}
|
|
190
|
-
|
|
190
|
+
isIn(that) {
|
|
191
191
|
return binop(this, "In" /* In */, that);
|
|
192
192
|
}
|
|
193
|
-
|
|
193
|
+
isNotIn(that) {
|
|
194
194
|
return binop(this, "NotIn" /* NotIn */, that);
|
|
195
195
|
}
|
|
196
196
|
add(that) {
|
|
@@ -242,7 +242,7 @@ var _Expr = class {
|
|
|
242
242
|
}
|
|
243
243
|
filter(fn) {
|
|
244
244
|
const alias = `__${Math.random().toString(36).slice(2, 9)}`;
|
|
245
|
-
const target = Target.
|
|
245
|
+
const target = Target.Each(this.expr, alias);
|
|
246
246
|
return new _Expr(
|
|
247
247
|
ExprData.Filter(
|
|
248
248
|
target,
|
|
@@ -252,7 +252,7 @@ var _Expr = class {
|
|
|
252
252
|
}
|
|
253
253
|
map(fn) {
|
|
254
254
|
const alias = `__${Math.random().toString(36).slice(2, 9)}`;
|
|
255
|
-
const target = Target.
|
|
255
|
+
const target = Target.Each(this.expr, alias);
|
|
256
256
|
return new _Expr(
|
|
257
257
|
ExprData.Map(
|
|
258
258
|
target,
|