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
package/dist/define/Table.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Callable } from '../util/Callable.js';
|
|
2
2
|
import { Column, ColumnData, OptionalColumn, PrimaryColumn } from './Column.js';
|
|
3
|
-
import { EV, Expr } from './Expr.js';
|
|
3
|
+
import { EV, Expr, ExprData } from './Expr.js';
|
|
4
4
|
import type { Fields } from './Fields.js';
|
|
5
5
|
import { Index, IndexData } from './Index.js';
|
|
6
|
+
import { SelectFirst, TableSelect } from './Query.js';
|
|
6
7
|
import type { Selection } from './Selection.js';
|
|
7
|
-
import { SelectFirst } from './query/Select.js';
|
|
8
|
-
import { TableSelect } from './query/TableSelect.js';
|
|
9
8
|
export declare class TableData {
|
|
10
9
|
name: string;
|
|
11
10
|
alias?: string;
|
|
12
11
|
definition: {};
|
|
13
12
|
columns: Record<string, ColumnData>;
|
|
14
13
|
meta: () => {
|
|
14
|
+
primaryKey?: Array<ExprData>;
|
|
15
15
|
indexes: Record<string, IndexData>;
|
|
16
16
|
};
|
|
17
17
|
constructor(data: TableData);
|
|
@@ -43,6 +43,7 @@ type UpdateOf<Definition> = Partial<{
|
|
|
43
43
|
export declare namespace Table {
|
|
44
44
|
export const Data: unique symbol;
|
|
45
45
|
export const Indexes: unique symbol;
|
|
46
|
+
export const PrimaryKey: unique symbol;
|
|
46
47
|
export type Of<Row> = TableOf<Row>;
|
|
47
48
|
export type Select<Definition> = RowOf<Definition>;
|
|
48
49
|
export type Update<Definition> = UpdateOf<Definition>;
|
|
@@ -65,8 +66,10 @@ export declare function createTable<Definition>(data: TableData): Table<Definiti
|
|
|
65
66
|
export declare function table<T extends {}, Indexes extends Record<string, Index>>(define: {
|
|
66
67
|
[key: string]: T | Define<T>;
|
|
67
68
|
[Table.Indexes]?: (this: T) => Indexes;
|
|
69
|
+
[Table.PrimaryKey]?: (this: T) => Array<Column<any>>;
|
|
68
70
|
}): {} extends Indexes ? Table<T> : IndexedTable<T, keyof Indexes>;
|
|
69
71
|
export declare namespace table {
|
|
70
72
|
const indexes: typeof Table.Indexes;
|
|
73
|
+
const primaryKey: typeof Table.PrimaryKey;
|
|
71
74
|
}
|
|
72
75
|
export {};
|
package/dist/define/Table.js
CHANGED
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
ColumnType
|
|
4
4
|
} from "./Column.js";
|
|
5
5
|
import { BinOpType, Expr, ExprData } from "./Expr.js";
|
|
6
|
+
import { TableSelect } from "./Query.js";
|
|
6
7
|
import { Target } from "./Target.js";
|
|
7
|
-
import { TableSelect } from "./query/TableSelect.js";
|
|
8
8
|
const {
|
|
9
9
|
assign,
|
|
10
10
|
keys,
|
|
@@ -24,6 +24,7 @@ var Table;
|
|
|
24
24
|
((Table2) => {
|
|
25
25
|
Table2.Data = Symbol("Table.Data");
|
|
26
26
|
Table2.Indexes = Symbol("Table.Indexes");
|
|
27
|
+
Table2.PrimaryKey = Symbol("Table.PrimaryKey");
|
|
27
28
|
})(Table || (Table = {}));
|
|
28
29
|
function createTable(data) {
|
|
29
30
|
const target = new Target.Table(data);
|
|
@@ -109,7 +110,10 @@ function table(define) {
|
|
|
109
110
|
meta() {
|
|
110
111
|
const createIndexes = define[Table.Indexes];
|
|
111
112
|
const indexes = createIndexes ? createIndexes.apply(res) : {};
|
|
113
|
+
const createPrimaryKey = define[Table.PrimaryKey];
|
|
114
|
+
const primaryKey = createPrimaryKey ? createPrimaryKey.apply(res).map(ExprData.create) : void 0;
|
|
112
115
|
return {
|
|
116
|
+
primaryKey,
|
|
113
117
|
indexes: fromEntries(
|
|
114
118
|
entries(indexes || {}).map(([key, index]) => {
|
|
115
119
|
const indexName = `${name}.${key}`;
|
|
@@ -124,6 +128,7 @@ function table(define) {
|
|
|
124
128
|
}
|
|
125
129
|
((table2) => {
|
|
126
130
|
table2.indexes = Table.Indexes;
|
|
131
|
+
table2.primaryKey = Table.PrimaryKey;
|
|
127
132
|
})(table || (table = {}));
|
|
128
133
|
export {
|
|
129
134
|
Table,
|
|
@@ -2,10 +2,10 @@ import { Callable } from '../util/Callable.js';
|
|
|
2
2
|
import { Column } from './Column.js';
|
|
3
3
|
import { EV, Expr } from './Expr.js';
|
|
4
4
|
import { Fields } from './Fields.js';
|
|
5
|
+
import { Select } from './Query.js';
|
|
5
6
|
import { Selection } from './Selection.js';
|
|
6
7
|
import { Table } from './Table.js';
|
|
7
8
|
import { Target } from './Target.js';
|
|
8
|
-
import { Select } from './query/Select.js';
|
|
9
9
|
export interface VirtualTableInstance<Definition> extends Callable {
|
|
10
10
|
(conditions: {
|
|
11
11
|
[K in keyof Definition]?: Definition[K] extends Expr<infer V> ? EV<V> : never;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { EV } from '../Expr.js';
|
|
2
|
-
import { OrderBy } from '../OrderBy.js';
|
|
3
2
|
import { Query, QueryData } from '../Query.js';
|
|
4
3
|
export declare class Delete extends Query<{
|
|
5
4
|
rowsAffected: number;
|
|
@@ -7,7 +6,6 @@ export declare class Delete extends Query<{
|
|
|
7
6
|
[Query.Data]: QueryData.Delete;
|
|
8
7
|
constructor(query: QueryData.Delete);
|
|
9
8
|
where(...where: Array<EV<boolean>>): Delete;
|
|
10
|
-
orderBy(...orderBy: Array<OrderBy>): Delete;
|
|
11
9
|
take(limit: number | undefined): Delete;
|
|
12
10
|
skip(offset: number | undefined): Delete;
|
|
13
11
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { EV, Expr } from '../Expr.js';
|
|
2
|
-
import { IndexData } from '../Index.js';
|
|
3
2
|
import { OrderBy } from '../OrderBy.js';
|
|
4
3
|
import { Query, QueryData } from '../Query.js';
|
|
5
4
|
import { Selection } from '../Selection.js';
|
|
@@ -10,7 +9,6 @@ export declare class Select<Row> extends Union<Row> {
|
|
|
10
9
|
[Query.Data]: QueryData.Select;
|
|
11
10
|
constructor(query: QueryData.Select);
|
|
12
11
|
from(table: Table<any> | VirtualTable<any>): Select<Row>;
|
|
13
|
-
indexedBy(index: IndexData): Select<unknown>;
|
|
14
12
|
leftJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
|
|
15
13
|
innerJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
|
|
16
14
|
select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
|
|
@@ -2,7 +2,7 @@ import { Expr, ExprData } from "../Expr.js";
|
|
|
2
2
|
import { Functions } from "../Functions.js";
|
|
3
3
|
import { Query } from "../Query.js";
|
|
4
4
|
import { Table } from "../Table.js";
|
|
5
|
-
import { Target
|
|
5
|
+
import { Target } from "../Target.js";
|
|
6
6
|
import { VirtualTable } from "../VirtualTable.js";
|
|
7
7
|
import { Union } from "./Union.js";
|
|
8
8
|
function joinTarget(joinType, query, to, on) {
|
|
@@ -33,19 +33,6 @@ class Select extends Union {
|
|
|
33
33
|
this[Query.Data].with({ from: virtual?.target || new Target.Table(table) })
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
|
-
indexedBy(index) {
|
|
37
|
-
const from = this[Query.Data].from;
|
|
38
|
-
switch (from?.type) {
|
|
39
|
-
case TargetType.Table:
|
|
40
|
-
return new Select(
|
|
41
|
-
this[Query.Data].with({
|
|
42
|
-
from: new Target.Table(from.table, index)
|
|
43
|
-
})
|
|
44
|
-
);
|
|
45
|
-
default:
|
|
46
|
-
throw new Error("Cannot index by without table target");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
36
|
leftJoin(that, ...on) {
|
|
50
37
|
const query = this[Query.Data];
|
|
51
38
|
return new Select(
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/driver/better-sqlite3.ts
|
|
2
|
+
import { Driver } from "../lib/Driver.ts";
|
|
3
|
+
import { SqlError } from "../lib/SqlError.ts";
|
|
4
|
+
import { SqliteFormatter } from "../sqlite/SqliteFormatter.ts";
|
|
5
|
+
import { SqliteSchema } from "../sqlite/SqliteSchema.ts";
|
|
6
|
+
var PreparedStatement = class {
|
|
7
|
+
constructor(stmt) {
|
|
8
|
+
this.stmt = stmt;
|
|
9
|
+
}
|
|
10
|
+
iterate(params = []) {
|
|
11
|
+
return this.stmt.iterate(...params);
|
|
12
|
+
}
|
|
13
|
+
all(params = []) {
|
|
14
|
+
return this.stmt.all(...params);
|
|
15
|
+
}
|
|
16
|
+
run(params = []) {
|
|
17
|
+
return { rowsAffected: this.stmt.run(...params).changes };
|
|
18
|
+
}
|
|
19
|
+
get(params = []) {
|
|
20
|
+
return this.stmt.get(...params);
|
|
21
|
+
}
|
|
22
|
+
execute(params = []) {
|
|
23
|
+
this.stmt.run(...params);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var BetterSqlite3Driver = class extends Driver.Sync {
|
|
27
|
+
constructor(db) {
|
|
28
|
+
super(new SqliteFormatter());
|
|
29
|
+
this.db = db;
|
|
30
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
31
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
32
|
+
}
|
|
33
|
+
tableData;
|
|
34
|
+
indexData;
|
|
35
|
+
prepareStatement(stmt) {
|
|
36
|
+
try {
|
|
37
|
+
return new PreparedStatement(this.db.prepare(stmt.sql));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
throw new SqlError(e, stmt.sql);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
schemaInstructions(tableName) {
|
|
43
|
+
const columnData = this.tableData(tableName);
|
|
44
|
+
const indexData = this.indexData(tableName);
|
|
45
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
46
|
+
}
|
|
47
|
+
export() {
|
|
48
|
+
return this.db.serialize();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
function connect(db) {
|
|
52
|
+
return new BetterSqlite3Driver(db);
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
BetterSqlite3Driver,
|
|
56
|
+
connect
|
|
57
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// src/driver/bun-sqlite.ts
|
|
2
|
+
import { Cursor } from "../define/Cursor.ts";
|
|
3
|
+
import { Query } from "../define/Query.ts";
|
|
4
|
+
import { Driver } from "../lib/Driver.ts";
|
|
5
|
+
import { SqlError } from "../lib/SqlError.ts";
|
|
6
|
+
import { SqliteFormatter } from "../sqlite/SqliteFormatter.ts";
|
|
7
|
+
import { SqliteSchema } from "../sqlite/SqliteSchema.ts";
|
|
8
|
+
var PreparedStatement = class {
|
|
9
|
+
constructor(lastChanges, stmt) {
|
|
10
|
+
this.lastChanges = lastChanges;
|
|
11
|
+
this.stmt = stmt;
|
|
12
|
+
}
|
|
13
|
+
*iterate(params = []) {
|
|
14
|
+
for (const row of this.stmt.all(...params))
|
|
15
|
+
yield row;
|
|
16
|
+
}
|
|
17
|
+
all(params = []) {
|
|
18
|
+
return this.stmt.all(...params);
|
|
19
|
+
}
|
|
20
|
+
run(params = []) {
|
|
21
|
+
this.stmt.run(...params);
|
|
22
|
+
return this.lastChanges();
|
|
23
|
+
}
|
|
24
|
+
get(params = []) {
|
|
25
|
+
return this.stmt.get(...params);
|
|
26
|
+
}
|
|
27
|
+
execute(params = []) {
|
|
28
|
+
this.stmt.run(...params);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var BunSqliteDriver = class extends Driver.Sync {
|
|
32
|
+
constructor(db) {
|
|
33
|
+
super(new SqliteFormatter());
|
|
34
|
+
this.db = db;
|
|
35
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
36
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
37
|
+
this.lastChanges = this.prepare(() => {
|
|
38
|
+
return new Cursor.SelectSingle(
|
|
39
|
+
Query.Raw({
|
|
40
|
+
expectedReturn: "row",
|
|
41
|
+
strings: ["SELECT changes() as rowsAffected"],
|
|
42
|
+
params: []
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
tableData;
|
|
48
|
+
indexData;
|
|
49
|
+
lastChanges;
|
|
50
|
+
prepareStatement(stmt) {
|
|
51
|
+
try {
|
|
52
|
+
return new PreparedStatement(this.lastChanges, this.db.prepare(stmt.sql));
|
|
53
|
+
} catch (e) {
|
|
54
|
+
throw new SqlError(e, stmt.sql);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
schemaInstructions(tableName) {
|
|
58
|
+
const columnData = this.tableData(tableName);
|
|
59
|
+
const indexData = this.indexData(tableName);
|
|
60
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
function connect(db) {
|
|
64
|
+
return new BunSqliteDriver(db);
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
BunSqliteDriver,
|
|
68
|
+
connect
|
|
69
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/driver/sql.js.ts
|
|
2
|
+
import { Driver } from "../lib/Driver.ts";
|
|
3
|
+
import { SqlError } from "../lib/SqlError.ts";
|
|
4
|
+
import { SqliteFormatter } from "../sqlite/SqliteFormatter.ts";
|
|
5
|
+
import { SqliteSchema } from "../sqlite/SqliteSchema.ts";
|
|
6
|
+
var PreparedStatement = class {
|
|
7
|
+
constructor(db, stmt, discardAfter) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.stmt = stmt;
|
|
10
|
+
this.discardAfter = discardAfter;
|
|
11
|
+
}
|
|
12
|
+
*iterate(params) {
|
|
13
|
+
this.stmt.bind(params);
|
|
14
|
+
while (this.stmt.step())
|
|
15
|
+
yield this.stmt.getAsObject();
|
|
16
|
+
if (this.discardAfter)
|
|
17
|
+
this.stmt.free();
|
|
18
|
+
}
|
|
19
|
+
all(params) {
|
|
20
|
+
return Array.from(this.iterate(params));
|
|
21
|
+
}
|
|
22
|
+
run(params) {
|
|
23
|
+
this.stmt.run(params);
|
|
24
|
+
if (this.discardAfter)
|
|
25
|
+
this.stmt.free();
|
|
26
|
+
return { rowsAffected: this.db.getRowsModified() };
|
|
27
|
+
}
|
|
28
|
+
get(params) {
|
|
29
|
+
return this.all(params)[0];
|
|
30
|
+
}
|
|
31
|
+
execute(params) {
|
|
32
|
+
this.stmt.run(params);
|
|
33
|
+
if (this.discardAfter)
|
|
34
|
+
this.stmt.free();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var SqlJsDriver = class extends Driver.Sync {
|
|
38
|
+
constructor(db) {
|
|
39
|
+
super(new SqliteFormatter());
|
|
40
|
+
this.db = db;
|
|
41
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
42
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
43
|
+
}
|
|
44
|
+
tableData;
|
|
45
|
+
indexData;
|
|
46
|
+
prepareStatement(stmt, discardAfter) {
|
|
47
|
+
try {
|
|
48
|
+
return new PreparedStatement(
|
|
49
|
+
this.db,
|
|
50
|
+
this.db.prepare(stmt.sql),
|
|
51
|
+
discardAfter
|
|
52
|
+
);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
throw new SqlError(e, stmt.sql);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
schemaInstructions(tableName) {
|
|
58
|
+
const columnData = this.tableData(tableName);
|
|
59
|
+
const indexData = this.indexData(tableName);
|
|
60
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
61
|
+
}
|
|
62
|
+
export() {
|
|
63
|
+
return this.db.export();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
function connect(db) {
|
|
67
|
+
return new SqlJsDriver(db);
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
SqlJsDriver,
|
|
71
|
+
connect
|
|
72
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// src/driver/sqlite3.ts
|
|
2
|
+
import { Driver } from "../lib/Driver.ts";
|
|
3
|
+
import { SqlError } from "../lib/SqlError.ts";
|
|
4
|
+
import { SqliteFormatter } from "../sqlite/SqliteFormatter.ts";
|
|
5
|
+
import { SqliteSchema } from "../sqlite/SqliteSchema.ts";
|
|
6
|
+
var PreparedStatement = class {
|
|
7
|
+
constructor(stmt) {
|
|
8
|
+
this.stmt = stmt;
|
|
9
|
+
}
|
|
10
|
+
async *iterate(params) {
|
|
11
|
+
let rows = [], done = false, error;
|
|
12
|
+
let resolve;
|
|
13
|
+
let promise = new Promise((r) => resolve = r);
|
|
14
|
+
this.stmt.each(
|
|
15
|
+
params,
|
|
16
|
+
(err, row) => {
|
|
17
|
+
if (err)
|
|
18
|
+
error = err;
|
|
19
|
+
else
|
|
20
|
+
rows.push(row);
|
|
21
|
+
resolve();
|
|
22
|
+
},
|
|
23
|
+
() => {
|
|
24
|
+
done = true;
|
|
25
|
+
resolve();
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
while (true) {
|
|
29
|
+
const mustWait = !(rows.length || error || done);
|
|
30
|
+
if (mustWait)
|
|
31
|
+
await promise;
|
|
32
|
+
promise = new Promise((r) => resolve = r);
|
|
33
|
+
if (error)
|
|
34
|
+
throw error;
|
|
35
|
+
if (rows.length)
|
|
36
|
+
yield rows.shift();
|
|
37
|
+
if (done)
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
all(params) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
this.stmt.all(params, (err, rows) => {
|
|
44
|
+
if (err)
|
|
45
|
+
reject(err);
|
|
46
|
+
else
|
|
47
|
+
resolve(rows);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
run(params) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
this.stmt.run(params, function(err) {
|
|
54
|
+
if (err)
|
|
55
|
+
reject(err);
|
|
56
|
+
else
|
|
57
|
+
resolve({ rowsAffected: this.changes });
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
get(params) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
this.stmt.get(params, (err, row) => {
|
|
64
|
+
if (err)
|
|
65
|
+
reject(err);
|
|
66
|
+
else
|
|
67
|
+
resolve(row);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
execute(params) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
this.stmt.run(params, (err) => {
|
|
74
|
+
if (err)
|
|
75
|
+
reject(err);
|
|
76
|
+
else
|
|
77
|
+
resolve();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var Sqlite3Driver = class extends Driver.Async {
|
|
83
|
+
constructor(db) {
|
|
84
|
+
super(new SqliteFormatter());
|
|
85
|
+
this.db = db;
|
|
86
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
87
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
88
|
+
}
|
|
89
|
+
lock;
|
|
90
|
+
tableData;
|
|
91
|
+
indexData;
|
|
92
|
+
async executeQuery(query, stmt, params) {
|
|
93
|
+
await this.lock;
|
|
94
|
+
return super.executeQuery(query, stmt, params);
|
|
95
|
+
}
|
|
96
|
+
prepareStatement(stmt) {
|
|
97
|
+
try {
|
|
98
|
+
return new PreparedStatement(this.db.prepare(stmt.sql));
|
|
99
|
+
} catch (e) {
|
|
100
|
+
throw new SqlError(e, stmt.sql);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async schemaInstructions(tableName) {
|
|
104
|
+
const columnData = await this.tableData(tableName);
|
|
105
|
+
const indexData = await this.indexData(tableName);
|
|
106
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
107
|
+
}
|
|
108
|
+
isolate() {
|
|
109
|
+
const connection = new Sqlite3Driver(this.db);
|
|
110
|
+
let release, trigger = new Promise((resolve) => {
|
|
111
|
+
release = async () => resolve();
|
|
112
|
+
});
|
|
113
|
+
this.lock = Promise.resolve(this.lock).then(() => trigger);
|
|
114
|
+
return [connection, release];
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
function connect(db) {
|
|
118
|
+
return new Sqlite3Driver(db);
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
Sqlite3Driver,
|
|
122
|
+
connect
|
|
123
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
export * from "./define/Column.ts";
|
|
3
|
+
export * from "./define/Cursor.ts";
|
|
4
|
+
export * from "./define/Expr.ts";
|
|
5
|
+
export * from "./define/Functions.ts";
|
|
6
|
+
export * from "./define/Index.ts";
|
|
7
|
+
export * from "./define/Ops.ts";
|
|
8
|
+
export * from "./define/OrderBy.ts";
|
|
9
|
+
export * from "./define/Param.ts";
|
|
10
|
+
export * from "./define/Query.ts";
|
|
11
|
+
export * from "./define/Schema.ts";
|
|
12
|
+
export * from "./define/Table.ts";
|
|
13
|
+
export * from "./define/Target.ts";
|
|
14
|
+
export * from "./lib/SqlError.ts";
|