rado 0.1.39 → 0.1.41
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/dist/driver/better-sqlite3.d.ts +2 -2
- package/dist/driver/better-sqlite3.js +3 -0
- package/dist/driver/bun-sqlite.d.ts +18 -0
- package/dist/driver/bun-sqlite.js +64 -0
- package/dist/driver/sql.js.d.ts +2 -2
- package/dist/driver/sql.js.js +19 -7
- package/dist/driver/sqlite3.d.ts +2 -2
- package/dist/driver/sqlite3.js +31 -0
- package/dist/lib/Column.d.ts +1 -1
- package/dist/lib/Column.js +6 -1
- package/dist/lib/Cursor.d.ts +3 -3
- package/dist/lib/Cursor.js +4 -1
- package/dist/lib/Driver.d.ts +9 -5
- package/dist/lib/Driver.js +30 -6
- package/dist/lib/Formatter.d.ts +5 -3
- package/dist/lib/Formatter.js +30 -37
- package/dist/lib/Id.d.ts +2 -2
- package/dist/lib/Schema.js +4 -5
- package/dist/lib/Statement.d.ts +6 -36
- package/dist/lib/Statement.js +21 -93
- package/dist/sqlite/SqliteFormatter.js +9 -14
- package/dist/sqlite/SqliteSchema.js +2 -2
- package/package.json +9 -9
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { Database } from 'better-sqlite3';
|
|
2
2
|
import { Driver } from '../lib/Driver';
|
|
3
3
|
import { SchemaInstructions } from '../lib/Schema';
|
|
4
|
-
import {
|
|
4
|
+
import { Statement } from '../lib/Statement';
|
|
5
5
|
import { SqliteSchema } from '../sqlite/SqliteSchema';
|
|
6
6
|
export declare class BetterSqlite3Driver extends Driver.Sync {
|
|
7
7
|
db: Database;
|
|
8
8
|
tableData: (tableName: string) => Array<SqliteSchema.Column>;
|
|
9
9
|
indexData: (tableName: string) => Array<SqliteSchema.Index>;
|
|
10
10
|
constructor(db: Database);
|
|
11
|
-
prepareStatement(stmt:
|
|
11
|
+
prepareStatement(stmt: Statement): Driver.Sync.PreparedStatement;
|
|
12
12
|
schemaInstructions(tableName: string): SchemaInstructions | undefined;
|
|
13
13
|
export(): Uint8Array;
|
|
14
14
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="bun-types" />
|
|
2
|
+
import type { Database } from 'bun:sqlite';
|
|
3
|
+
import { Driver } from '../lib/Driver';
|
|
4
|
+
import { SchemaInstructions } from '../lib/Schema';
|
|
5
|
+
import { Statement } from '../lib/Statement';
|
|
6
|
+
import { SqliteSchema } from '../sqlite/SqliteSchema';
|
|
7
|
+
export declare class BunSqliteDriver extends Driver.Sync {
|
|
8
|
+
db: Database;
|
|
9
|
+
tableData: (tableName: string) => Array<SqliteSchema.Column>;
|
|
10
|
+
indexData: (tableName: string) => Array<SqliteSchema.Index>;
|
|
11
|
+
lastChanges: () => {
|
|
12
|
+
rowsAffected: number;
|
|
13
|
+
};
|
|
14
|
+
constructor(db: Database);
|
|
15
|
+
prepareStatement(stmt: Statement): Driver.Sync.PreparedStatement;
|
|
16
|
+
schemaInstructions(tableName: string): SchemaInstructions | undefined;
|
|
17
|
+
}
|
|
18
|
+
export declare function connect(db: Database): BunSqliteDriver;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// src/driver/bun-sqlite.ts
|
|
2
|
+
import { Cursor } from "../lib/Cursor.js";
|
|
3
|
+
import { Driver } from "../lib/Driver.js";
|
|
4
|
+
import { Query } from "../lib/Query.js";
|
|
5
|
+
import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
|
|
6
|
+
import { SqliteSchema } from "../sqlite/SqliteSchema.js";
|
|
7
|
+
var PreparedStatement = class {
|
|
8
|
+
constructor(lastChanges, stmt) {
|
|
9
|
+
this.lastChanges = lastChanges;
|
|
10
|
+
this.stmt = stmt;
|
|
11
|
+
}
|
|
12
|
+
*iterate(params = []) {
|
|
13
|
+
for (const row of this.stmt.all(...params))
|
|
14
|
+
yield row;
|
|
15
|
+
}
|
|
16
|
+
all(params = []) {
|
|
17
|
+
return this.stmt.all(...params);
|
|
18
|
+
}
|
|
19
|
+
run(params = []) {
|
|
20
|
+
this.stmt.run(...params);
|
|
21
|
+
return this.lastChanges();
|
|
22
|
+
}
|
|
23
|
+
get(params = []) {
|
|
24
|
+
return this.stmt.get(...params);
|
|
25
|
+
}
|
|
26
|
+
execute(params = []) {
|
|
27
|
+
this.stmt.run(...params);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var BunSqliteDriver = class extends Driver.Sync {
|
|
31
|
+
constructor(db) {
|
|
32
|
+
super(new SqliteFormatter());
|
|
33
|
+
this.db = db;
|
|
34
|
+
this.tableData = this.prepare(SqliteSchema.tableData);
|
|
35
|
+
this.indexData = this.prepare(SqliteSchema.indexData);
|
|
36
|
+
this.lastChanges = this.prepare(() => {
|
|
37
|
+
return new Cursor.SelectSingle(
|
|
38
|
+
Query.Raw({
|
|
39
|
+
expectedReturn: "row",
|
|
40
|
+
strings: ["SELECT changes() as rowsAffected"],
|
|
41
|
+
params: []
|
|
42
|
+
})
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
tableData;
|
|
47
|
+
indexData;
|
|
48
|
+
lastChanges;
|
|
49
|
+
prepareStatement(stmt) {
|
|
50
|
+
return new PreparedStatement(this.lastChanges, this.db.prepare(stmt.sql));
|
|
51
|
+
}
|
|
52
|
+
schemaInstructions(tableName) {
|
|
53
|
+
const columnData = this.tableData(tableName);
|
|
54
|
+
const indexData = this.indexData(tableName);
|
|
55
|
+
return SqliteSchema.createInstructions(columnData, indexData);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
function connect(db) {
|
|
59
|
+
return new BunSqliteDriver(db);
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
BunSqliteDriver,
|
|
63
|
+
connect
|
|
64
|
+
};
|
package/dist/driver/sql.js.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { Database } from 'sql.js';
|
|
2
2
|
import { Driver } from '../lib/Driver';
|
|
3
3
|
import { SchemaInstructions } from '../lib/Schema';
|
|
4
|
-
import {
|
|
4
|
+
import { Statement } from '../lib/Statement';
|
|
5
5
|
import { SqliteSchema } from '../sqlite/SqliteSchema';
|
|
6
6
|
export declare class SqlJsDriver extends Driver.Sync {
|
|
7
7
|
db: Database;
|
|
8
8
|
tableData: (tableName: string) => Array<SqliteSchema.Column>;
|
|
9
9
|
indexData: (tableName: string) => Array<SqliteSchema.Index>;
|
|
10
10
|
constructor(db: Database);
|
|
11
|
-
prepareStatement(stmt:
|
|
11
|
+
prepareStatement(stmt: Statement, discardAfter: boolean): Driver.Sync.PreparedStatement;
|
|
12
12
|
schemaInstructions(tableName: string): SchemaInstructions | undefined;
|
|
13
13
|
export(): Uint8Array;
|
|
14
14
|
}
|
package/dist/driver/sql.js.js
CHANGED
|
@@ -3,19 +3,25 @@ import { Driver } from "../lib/Driver.js";
|
|
|
3
3
|
import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
|
|
4
4
|
import { SqliteSchema } from "../sqlite/SqliteSchema.js";
|
|
5
5
|
var PreparedStatement = class {
|
|
6
|
-
constructor(db, stmt) {
|
|
6
|
+
constructor(db, stmt, discardAfter) {
|
|
7
7
|
this.db = db;
|
|
8
8
|
this.stmt = stmt;
|
|
9
|
+
this.discardAfter = discardAfter;
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
+
*iterate(params) {
|
|
11
12
|
this.stmt.bind(params);
|
|
12
|
-
const res = [];
|
|
13
13
|
while (this.stmt.step())
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
yield this.stmt.getAsObject();
|
|
15
|
+
if (this.discardAfter)
|
|
16
|
+
this.stmt.free();
|
|
17
|
+
}
|
|
18
|
+
all(params) {
|
|
19
|
+
return Array.from(this.iterate(params));
|
|
16
20
|
}
|
|
17
21
|
run(params) {
|
|
18
22
|
this.stmt.run(params);
|
|
23
|
+
if (this.discardAfter)
|
|
24
|
+
this.stmt.free();
|
|
19
25
|
return { rowsAffected: this.db.getRowsModified() };
|
|
20
26
|
}
|
|
21
27
|
get(params) {
|
|
@@ -23,6 +29,8 @@ var PreparedStatement = class {
|
|
|
23
29
|
}
|
|
24
30
|
execute(params) {
|
|
25
31
|
this.stmt.run(params);
|
|
32
|
+
if (this.discardAfter)
|
|
33
|
+
this.stmt.free();
|
|
26
34
|
}
|
|
27
35
|
};
|
|
28
36
|
var SqlJsDriver = class extends Driver.Sync {
|
|
@@ -34,8 +42,12 @@ var SqlJsDriver = class extends Driver.Sync {
|
|
|
34
42
|
}
|
|
35
43
|
tableData;
|
|
36
44
|
indexData;
|
|
37
|
-
prepareStatement(stmt) {
|
|
38
|
-
return new PreparedStatement(
|
|
45
|
+
prepareStatement(stmt, discardAfter) {
|
|
46
|
+
return new PreparedStatement(
|
|
47
|
+
this.db,
|
|
48
|
+
this.db.prepare(stmt.sql),
|
|
49
|
+
discardAfter
|
|
50
|
+
);
|
|
39
51
|
}
|
|
40
52
|
schemaInstructions(tableName) {
|
|
41
53
|
const columnData = this.tableData(tableName);
|
package/dist/driver/sqlite3.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { Database } from 'sqlite3';
|
|
|
2
2
|
import { Driver } from '../lib/Driver';
|
|
3
3
|
import { Query } from '../lib/Query';
|
|
4
4
|
import { SchemaInstructions } from '../lib/Schema';
|
|
5
|
-
import {
|
|
5
|
+
import { Statement } from '../lib/Statement';
|
|
6
6
|
import { SqliteSchema } from '../sqlite/SqliteSchema';
|
|
7
7
|
export declare class Sqlite3Driver extends Driver.Async {
|
|
8
8
|
private db;
|
|
@@ -11,7 +11,7 @@ export declare class Sqlite3Driver extends Driver.Async {
|
|
|
11
11
|
indexData: (tableName: string) => Promise<Array<SqliteSchema.Index>>;
|
|
12
12
|
constructor(db: Database);
|
|
13
13
|
executeQuery<T>(query: Query<T>, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<T>;
|
|
14
|
-
prepareStatement(stmt:
|
|
14
|
+
prepareStatement(stmt: Statement): Driver.Async.PreparedStatement;
|
|
15
15
|
schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
|
|
16
16
|
isolate(): [connection: Driver.Async, release: () => Promise<void>];
|
|
17
17
|
}
|
package/dist/driver/sqlite3.js
CHANGED
|
@@ -6,6 +6,37 @@ var PreparedStatement = class {
|
|
|
6
6
|
constructor(stmt) {
|
|
7
7
|
this.stmt = stmt;
|
|
8
8
|
}
|
|
9
|
+
async *iterate(params) {
|
|
10
|
+
let rows = [], done = false, error;
|
|
11
|
+
let resolve;
|
|
12
|
+
let promise = new Promise((r) => resolve = r);
|
|
13
|
+
this.stmt.each(
|
|
14
|
+
params,
|
|
15
|
+
(err, row) => {
|
|
16
|
+
if (err)
|
|
17
|
+
error = err;
|
|
18
|
+
else
|
|
19
|
+
rows.push(row);
|
|
20
|
+
resolve();
|
|
21
|
+
},
|
|
22
|
+
() => {
|
|
23
|
+
done = true;
|
|
24
|
+
resolve();
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
while (true) {
|
|
28
|
+
const mustWait = !(rows.length || error || done);
|
|
29
|
+
if (mustWait)
|
|
30
|
+
await promise;
|
|
31
|
+
promise = new Promise((r) => resolve = r);
|
|
32
|
+
if (error)
|
|
33
|
+
throw error;
|
|
34
|
+
if (rows.length)
|
|
35
|
+
yield rows.shift();
|
|
36
|
+
if (done)
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
9
40
|
all(params) {
|
|
10
41
|
return new Promise((resolve, reject) => {
|
|
11
42
|
this.stmt.all(params, (err, rows) => {
|
package/dist/lib/Column.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare class Column<T> {
|
|
|
27
27
|
nullable(): Column<T | null>;
|
|
28
28
|
autoIncrement(): Column<Column.IsOptional<T>>;
|
|
29
29
|
primaryKey<K extends string>(): Column<Column.IsPrimary<T, K>>;
|
|
30
|
-
references<X extends T>(column: Expr<X>): Column<X>;
|
|
30
|
+
references<X extends T>(column: Expr<X> | (() => Expr<X>)): Column<X>;
|
|
31
31
|
unique(): Column<T>;
|
|
32
32
|
defaultValue(value: EV<T>): Column<Column.IsOptional<T>>;
|
|
33
33
|
}
|
package/dist/lib/Column.js
CHANGED
|
@@ -25,7 +25,12 @@ var Column = class {
|
|
|
25
25
|
return new Column({ ...this.data, primaryKey: true });
|
|
26
26
|
}
|
|
27
27
|
references(column2) {
|
|
28
|
-
return new Column({
|
|
28
|
+
return new Column({
|
|
29
|
+
...this.data,
|
|
30
|
+
get references() {
|
|
31
|
+
return ExprData.create(typeof column2 === "function" ? column2() : column2);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
29
34
|
}
|
|
30
35
|
unique() {
|
|
31
36
|
return new Column({ ...this.data, unique: true });
|
package/dist/lib/Cursor.d.ts
CHANGED
|
@@ -11,8 +11,8 @@ export declare class Cursor<T> {
|
|
|
11
11
|
constructor(query: Query<T>);
|
|
12
12
|
static all(strings: TemplateStringsArray, ...params: Array<any>): Cursor<any>;
|
|
13
13
|
query(): Query<T>;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
on(driver: Driver.Sync): T;
|
|
15
|
+
on(driver: Driver.Async): Promise<T>;
|
|
16
16
|
toJSON(): Query<T>;
|
|
17
17
|
}
|
|
18
18
|
export declare namespace Cursor {
|
|
@@ -27,7 +27,7 @@ export declare namespace Cursor {
|
|
|
27
27
|
class Update<T> extends Cursor<{
|
|
28
28
|
rowsAffected: number;
|
|
29
29
|
}> {
|
|
30
|
-
query
|
|
30
|
+
query(): Query.Update;
|
|
31
31
|
set(set: UpdateSet<T>): Update<T>;
|
|
32
32
|
where(...where: Array<EV<boolean>>): Update<T>;
|
|
33
33
|
take(limit: number | undefined): Update<T>;
|
package/dist/lib/Cursor.js
CHANGED
|
@@ -21,7 +21,7 @@ var Cursor = class {
|
|
|
21
21
|
query() {
|
|
22
22
|
throw new Error("Not implemented");
|
|
23
23
|
}
|
|
24
|
-
|
|
24
|
+
on(driver) {
|
|
25
25
|
return driver.executeQuery(this.query());
|
|
26
26
|
}
|
|
27
27
|
toJSON() {
|
|
@@ -54,6 +54,9 @@ function addWhere(query, where) {
|
|
|
54
54
|
}
|
|
55
55
|
Cursor2.Delete = Delete;
|
|
56
56
|
class Update extends Cursor2 {
|
|
57
|
+
query() {
|
|
58
|
+
return super.query();
|
|
59
|
+
}
|
|
57
60
|
set(set) {
|
|
58
61
|
return new Update({ ...this.query(), set });
|
|
59
62
|
}
|
package/dist/lib/Driver.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Expr } from './Expr';
|
|
|
3
3
|
import { Formatter } from './Formatter';
|
|
4
4
|
import { Query } from './Query';
|
|
5
5
|
import { SchemaInstructions } from './Schema';
|
|
6
|
-
import {
|
|
6
|
+
import { Statement } from './Statement';
|
|
7
7
|
import { Table } from './Table';
|
|
8
8
|
declare class Callable extends Function {
|
|
9
9
|
constructor(fn: Function);
|
|
@@ -11,7 +11,7 @@ declare class Callable extends Function {
|
|
|
11
11
|
declare abstract class DriverBase extends Callable {
|
|
12
12
|
formatter: Formatter;
|
|
13
13
|
constructor(formatter: Formatter);
|
|
14
|
-
compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): [Query<T>,
|
|
14
|
+
compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): [Query<T>, Statement];
|
|
15
15
|
all(...args: Array<any>): any;
|
|
16
16
|
get(...args: Array<any>): any;
|
|
17
17
|
sql(strings: TemplateStringsArray, ...params: Array<any>): Cursor<unknown>;
|
|
@@ -30,7 +30,7 @@ interface SyncDriver {
|
|
|
30
30
|
}
|
|
31
31
|
declare abstract class SyncDriver extends DriverBase {
|
|
32
32
|
transactionId: number;
|
|
33
|
-
abstract prepareStatement(stmt:
|
|
33
|
+
abstract prepareStatement(stmt: Statement, discardAfter: boolean): SyncPreparedStatement;
|
|
34
34
|
abstract schemaInstructions(tableName: string): SchemaInstructions | undefined;
|
|
35
35
|
prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => R;
|
|
36
36
|
migrateSchema(...tables: Array<Table<any>>): unknown;
|
|
@@ -41,6 +41,7 @@ declare abstract class SyncDriver extends DriverBase {
|
|
|
41
41
|
get<T>(cursor: Cursor.SelectMultiple<T>): T | null;
|
|
42
42
|
get<T>(cursor: Cursor<T>): T;
|
|
43
43
|
get<T>(strings: TemplateStringsArray, ...params: Array<any>): T;
|
|
44
|
+
iterate<T>(cursor: Cursor.SelectMultiple<T>): Iterable<T>;
|
|
44
45
|
transaction<T>(run: (query: SyncDriver) => T): T;
|
|
45
46
|
toAsync(): SyncWrapper;
|
|
46
47
|
}
|
|
@@ -48,6 +49,7 @@ interface SyncPreparedStatement {
|
|
|
48
49
|
run(params?: Array<any>): {
|
|
49
50
|
rowsAffected: number;
|
|
50
51
|
};
|
|
52
|
+
iterate<T>(params?: Array<any>): Iterable<T>;
|
|
51
53
|
all<T>(params?: Array<any>): Array<T>;
|
|
52
54
|
get<T>(params?: Array<any>): T;
|
|
53
55
|
execute(params?: Array<any>): void;
|
|
@@ -60,7 +62,7 @@ interface AsyncDriver {
|
|
|
60
62
|
declare abstract class AsyncDriver extends DriverBase {
|
|
61
63
|
transactionId: number;
|
|
62
64
|
abstract isolate(): [connection: AsyncDriver, release: () => Promise<void>];
|
|
63
|
-
abstract prepareStatement(stmt:
|
|
65
|
+
abstract prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
|
|
64
66
|
abstract schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
|
|
65
67
|
prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => Promise<R>;
|
|
66
68
|
migrateSchema(...tables: Array<Table<any>>): Promise<unknown>;
|
|
@@ -71,6 +73,7 @@ declare abstract class AsyncDriver extends DriverBase {
|
|
|
71
73
|
get<T>(cursor: Cursor.SelectMultiple<T>): Promise<T | null>;
|
|
72
74
|
get<T>(cursor: Cursor<T>): Promise<T>;
|
|
73
75
|
get<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<T>;
|
|
76
|
+
iterate<T>(cursor: Cursor.SelectMultiple<T>): AsyncIterable<T>;
|
|
74
77
|
transaction<T>(run: (query: AsyncDriver) => T): Promise<T>;
|
|
75
78
|
}
|
|
76
79
|
declare class SyncWrapper extends AsyncDriver {
|
|
@@ -78,7 +81,7 @@ declare class SyncWrapper extends AsyncDriver {
|
|
|
78
81
|
lock: Promise<void> | undefined;
|
|
79
82
|
constructor(sync: SyncDriver);
|
|
80
83
|
executeQuery<T>(query: Query<T>, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<T>;
|
|
81
|
-
prepareStatement(stmt:
|
|
84
|
+
prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
|
|
82
85
|
schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
|
|
83
86
|
isolate(): [connection: AsyncDriver, release: () => Promise<void>];
|
|
84
87
|
}
|
|
@@ -86,6 +89,7 @@ interface AsyncPreparedStatement {
|
|
|
86
89
|
run(params?: Array<any>): Promise<{
|
|
87
90
|
rowsAffected: number;
|
|
88
91
|
}>;
|
|
92
|
+
iterate<T>(params?: Array<any>): AsyncIterable<T>;
|
|
89
93
|
all<T>(params?: Array<any>): Promise<Array<T>>;
|
|
90
94
|
get<T>(params?: Array<any>): Promise<T>;
|
|
91
95
|
execute(params?: Array<any>): Promise<void>;
|
package/dist/lib/Driver.js
CHANGED
|
@@ -70,7 +70,7 @@ var SyncDriver = class extends DriverBase {
|
|
|
70
70
|
transactionId = 0;
|
|
71
71
|
prepare(create) {
|
|
72
72
|
const [query, compiled] = this.compile(create);
|
|
73
|
-
const prepared = this.prepareStatement(compiled);
|
|
73
|
+
const prepared = this.prepareStatement(compiled, false);
|
|
74
74
|
return (...params) => {
|
|
75
75
|
const namedParams = Object.fromEntries(
|
|
76
76
|
params.map((value, i) => [`p${i}`, value])
|
|
@@ -109,7 +109,7 @@ var SyncDriver = class extends DriverBase {
|
|
|
109
109
|
});
|
|
110
110
|
default:
|
|
111
111
|
const compiled = stmt ? void 0 : this.formatter.compile(query);
|
|
112
|
-
stmt = stmt || this.prepareStatement(compiled);
|
|
112
|
+
stmt = stmt || this.prepareStatement(compiled, true);
|
|
113
113
|
params = params || compiled.params();
|
|
114
114
|
if ("selection" in query) {
|
|
115
115
|
const res = stmt.all(params).map((row) => JSON.parse(row.result).result);
|
|
@@ -141,6 +141,15 @@ var SyncDriver = class extends DriverBase {
|
|
|
141
141
|
get(...args) {
|
|
142
142
|
return super.get(...args);
|
|
143
143
|
}
|
|
144
|
+
*iterate(cursor) {
|
|
145
|
+
const stmt = this.prepareStatement(
|
|
146
|
+
this.formatter.compile(cursor.query()),
|
|
147
|
+
true
|
|
148
|
+
);
|
|
149
|
+
for (const row of stmt.iterate()) {
|
|
150
|
+
yield JSON.parse(row.result).result;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
144
153
|
transaction(run) {
|
|
145
154
|
const id = `t${this.transactionId++}`;
|
|
146
155
|
this.executeQuery(
|
|
@@ -167,7 +176,7 @@ var AsyncDriver = class extends DriverBase {
|
|
|
167
176
|
transactionId = 0;
|
|
168
177
|
prepare(create) {
|
|
169
178
|
const [query, compiled] = this.compile(create);
|
|
170
|
-
const prepared = this.prepareStatement(compiled);
|
|
179
|
+
const prepared = this.prepareStatement(compiled, false);
|
|
171
180
|
return (...params) => {
|
|
172
181
|
const namedParams = Object.fromEntries(
|
|
173
182
|
params.map((value, i) => [`p${i}`, value])
|
|
@@ -206,7 +215,7 @@ var AsyncDriver = class extends DriverBase {
|
|
|
206
215
|
});
|
|
207
216
|
default:
|
|
208
217
|
const compiled = stmt ? void 0 : this.formatter.compile(query);
|
|
209
|
-
stmt = stmt || this.prepareStatement(compiled);
|
|
218
|
+
stmt = stmt || this.prepareStatement(compiled, true);
|
|
210
219
|
params = params || compiled.params();
|
|
211
220
|
if ("selection" in query) {
|
|
212
221
|
const res = (await stmt.all(params)).map(
|
|
@@ -240,6 +249,15 @@ var AsyncDriver = class extends DriverBase {
|
|
|
240
249
|
get(...args) {
|
|
241
250
|
return super.get(...args);
|
|
242
251
|
}
|
|
252
|
+
async *iterate(cursor) {
|
|
253
|
+
const stmt = this.prepareStatement(
|
|
254
|
+
this.formatter.compile(cursor.query()),
|
|
255
|
+
true
|
|
256
|
+
);
|
|
257
|
+
for await (const row of stmt.iterate()) {
|
|
258
|
+
yield JSON.parse(row.result).result;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
243
261
|
async transaction(run) {
|
|
244
262
|
const id = `t${this.transactionId++}`;
|
|
245
263
|
const [connection, release] = this.isolate();
|
|
@@ -266,6 +284,10 @@ var SyncPreparedStatementWrapper = class {
|
|
|
266
284
|
constructor(stmt) {
|
|
267
285
|
this.stmt = stmt;
|
|
268
286
|
}
|
|
287
|
+
async *iterate(params) {
|
|
288
|
+
for (const row of this.stmt.iterate(params))
|
|
289
|
+
yield row;
|
|
290
|
+
}
|
|
269
291
|
async run(params) {
|
|
270
292
|
return this.stmt.run(params);
|
|
271
293
|
}
|
|
@@ -289,8 +311,10 @@ var SyncWrapper = class extends AsyncDriver {
|
|
|
289
311
|
await this.lock;
|
|
290
312
|
return super.executeQuery(query, stmt, params);
|
|
291
313
|
}
|
|
292
|
-
prepareStatement(stmt) {
|
|
293
|
-
return new SyncPreparedStatementWrapper(
|
|
314
|
+
prepareStatement(stmt, discardAfter) {
|
|
315
|
+
return new SyncPreparedStatementWrapper(
|
|
316
|
+
this.sync.prepareStatement(stmt, discardAfter)
|
|
317
|
+
);
|
|
294
318
|
}
|
|
295
319
|
async schemaInstructions(tableName) {
|
|
296
320
|
return this.sync.schemaInstructions(tableName);
|
package/dist/lib/Formatter.d.ts
CHANGED
|
@@ -19,15 +19,16 @@ export interface FormatContext {
|
|
|
19
19
|
/** Inline all parameters */
|
|
20
20
|
forceInline?: boolean;
|
|
21
21
|
formatAsJson?: boolean;
|
|
22
|
-
|
|
22
|
+
topLevel?: boolean;
|
|
23
23
|
}
|
|
24
|
+
type FormatSubject = (stmt: Statement, mkSubject: () => void) => void;
|
|
24
25
|
export declare abstract class Formatter implements Sanitizer {
|
|
25
26
|
constructor();
|
|
26
27
|
abstract escapeValue(value: any): string;
|
|
27
28
|
abstract escapeIdentifier(ident: string): string;
|
|
28
29
|
abstract formatParamValue(paramValue: any): any;
|
|
29
30
|
abstract formatAccess(ctx: FormatContext, mkSubject: () => void, field: string): Statement;
|
|
30
|
-
compile<T>(query: Query<T
|
|
31
|
+
compile<T>(query: Query<T>): Statement;
|
|
31
32
|
format<T>(ctx: FormatContext, query: Query<T>): Statement;
|
|
32
33
|
formatSelect(ctx: FormatContext, query: Query.Select): Statement;
|
|
33
34
|
formatInsert(ctx: FormatContext, query: Query.Insert): Statement;
|
|
@@ -51,7 +52,7 @@ export declare abstract class Formatter implements Sanitizer {
|
|
|
51
52
|
formatGroupBy(ctx: FormatContext, groupBy: Array<ExprData> | undefined): Statement;
|
|
52
53
|
formatOrderBy(ctx: FormatContext, orderBy: Array<OrderBy> | undefined): Statement;
|
|
53
54
|
formatLimit(ctx: FormatContext, { limit, offset, singleResult }: Query.QueryBase): Statement;
|
|
54
|
-
formatSelection(ctx: FormatContext, selection: ExprData): Statement;
|
|
55
|
+
formatSelection(ctx: FormatContext, selection: ExprData, formatSubject?: FormatSubject): Statement;
|
|
55
56
|
formatExprJson(ctx: FormatContext, expr: ExprData): Statement;
|
|
56
57
|
formatExprValue(ctx: FormatContext, expr: ExprData): Statement;
|
|
57
58
|
formatIn(ctx: FormatContext, expr: ExprData): Statement;
|
|
@@ -62,3 +63,4 @@ export declare abstract class Formatter implements Sanitizer {
|
|
|
62
63
|
formatValue(ctx: FormatContext, rawValue: any): Statement;
|
|
63
64
|
formatExpr(ctx: FormatContext, expr: ExprData): Statement;
|
|
64
65
|
}
|
|
66
|
+
export {};
|
package/dist/lib/Formatter.js
CHANGED
|
@@ -31,23 +31,17 @@ var joins = {
|
|
|
31
31
|
left: "left",
|
|
32
32
|
inner: "inner"
|
|
33
33
|
};
|
|
34
|
+
function formatAsResultObject(stmt, mkSubject) {
|
|
35
|
+
stmt.raw("json_object('result', ");
|
|
36
|
+
mkSubject();
|
|
37
|
+
stmt.raw(")");
|
|
38
|
+
}
|
|
34
39
|
var Formatter = class {
|
|
35
40
|
constructor() {
|
|
36
41
|
}
|
|
37
|
-
compile(query
|
|
38
|
-
const stmt = new Statement();
|
|
39
|
-
const result = this.format(
|
|
40
|
-
{
|
|
41
|
-
stmt,
|
|
42
|
-
formatSubject: (mkSubject) => {
|
|
43
|
-
stmt.raw("json_object('result', ");
|
|
44
|
-
mkSubject();
|
|
45
|
-
stmt.raw(")");
|
|
46
|
-
},
|
|
47
|
-
nameResult: "result"
|
|
48
|
-
},
|
|
49
|
-
query
|
|
50
|
-
).compile(this, formatInline);
|
|
42
|
+
compile(query) {
|
|
43
|
+
const stmt = new Statement(this);
|
|
44
|
+
const result = this.format({ stmt, topLevel: true }, query);
|
|
51
45
|
return result;
|
|
52
46
|
}
|
|
53
47
|
format(ctx, query) {
|
|
@@ -77,9 +71,13 @@ var Formatter = class {
|
|
|
77
71
|
}
|
|
78
72
|
}
|
|
79
73
|
formatSelect(ctx, query) {
|
|
80
|
-
const { stmt } = ctx;
|
|
74
|
+
const { stmt, topLevel } = ctx;
|
|
81
75
|
stmt.add("SELECT").space();
|
|
82
|
-
this.formatSelection(
|
|
76
|
+
this.formatSelection(
|
|
77
|
+
{ ...ctx, topLevel: false },
|
|
78
|
+
query.selection,
|
|
79
|
+
topLevel ? formatAsResultObject : void 0
|
|
80
|
+
);
|
|
83
81
|
stmt.addLine("FROM").space();
|
|
84
82
|
this.formatTarget(ctx, query.from);
|
|
85
83
|
this.formatWhere(ctx, query.where);
|
|
@@ -102,7 +100,7 @@ var Formatter = class {
|
|
|
102
100
|
this.formatInsertRow(ctx, query.into.columns, row);
|
|
103
101
|
if (query.selection) {
|
|
104
102
|
stmt.add("RETURNING").space();
|
|
105
|
-
this.formatSelection(ctx, query.selection);
|
|
103
|
+
this.formatSelection(ctx, query.selection, formatAsResultObject);
|
|
106
104
|
}
|
|
107
105
|
return stmt;
|
|
108
106
|
}
|
|
@@ -341,7 +339,7 @@ var Formatter = class {
|
|
|
341
339
|
const { stmt } = ctx;
|
|
342
340
|
if (!expr)
|
|
343
341
|
return stmt;
|
|
344
|
-
stmt.newline().raw("WHERE");
|
|
342
|
+
stmt.newline().raw("WHERE").space();
|
|
345
343
|
this.formatExprValue(ctx, expr);
|
|
346
344
|
return stmt;
|
|
347
345
|
}
|
|
@@ -382,22 +380,20 @@ var Formatter = class {
|
|
|
382
380
|
stmt.raw("OFFSET").addValue(offset);
|
|
383
381
|
return stmt;
|
|
384
382
|
}
|
|
385
|
-
formatSelection(ctx, selection) {
|
|
386
|
-
const { stmt
|
|
383
|
+
formatSelection(ctx, selection, formatSubject) {
|
|
384
|
+
const { stmt } = ctx;
|
|
387
385
|
const mkSubject = () => this.formatExpr(
|
|
388
386
|
{
|
|
389
387
|
...ctx,
|
|
390
|
-
formatSubject: void 0,
|
|
391
388
|
formatAsJson: true
|
|
392
389
|
},
|
|
393
390
|
selection
|
|
394
391
|
);
|
|
395
392
|
if (formatSubject)
|
|
396
|
-
formatSubject(mkSubject);
|
|
393
|
+
formatSubject(stmt, mkSubject);
|
|
397
394
|
else
|
|
398
395
|
mkSubject();
|
|
399
|
-
|
|
400
|
-
stmt.add("AS").addIdentifier(ctx.nameResult);
|
|
396
|
+
stmt.add("AS").addIdentifier("result");
|
|
401
397
|
return stmt;
|
|
402
398
|
}
|
|
403
399
|
formatExprJson(ctx, expr) {
|
|
@@ -562,11 +558,11 @@ var Formatter = class {
|
|
|
562
558
|
}
|
|
563
559
|
if (expr.query.singleResult) {
|
|
564
560
|
stmt.raw("json").openParenthesis().openParenthesis();
|
|
565
|
-
this.format(
|
|
561
|
+
this.format(ctx, expr.query);
|
|
566
562
|
return stmt.closeParenthesis().closeParenthesis();
|
|
567
563
|
}
|
|
568
564
|
stmt.openParenthesis().raw("SELECT json_group_array(json(result))").newline().raw("FROM").openParenthesis();
|
|
569
|
-
this.format(
|
|
565
|
+
this.format(ctx, expr.query);
|
|
570
566
|
return stmt.closeParenthesis().closeParenthesis();
|
|
571
567
|
case ExprType.Row:
|
|
572
568
|
switch (expr.target.type) {
|
|
@@ -576,17 +572,14 @@ var Formatter = class {
|
|
|
576
572
|
throw new Error(`Cannot select empty target`);
|
|
577
573
|
if (ctx.tableAsExpr)
|
|
578
574
|
return stmt.identifier(table.alias || table.name);
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
)
|
|
588
|
-
)
|
|
589
|
-
);
|
|
575
|
+
stmt.identifier("json_object");
|
|
576
|
+
for (const [key, column] of stmt.call(
|
|
577
|
+
Object.entries(table.columns)
|
|
578
|
+
)) {
|
|
579
|
+
this.formatString(ctx, key).raw(", ");
|
|
580
|
+
this.formatField(ctx, expr, column.name);
|
|
581
|
+
}
|
|
582
|
+
return stmt;
|
|
590
583
|
case TargetType.Query:
|
|
591
584
|
case TargetType.Expr:
|
|
592
585
|
return stmt.identifier(expr.target.alias).raw(".value");
|
package/dist/lib/Id.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type Id<T extends {
|
|
1
|
+
export type Id<T> = T extends {
|
|
2
2
|
id: any;
|
|
3
|
-
}
|
|
3
|
+
} ? T['id'] : never;
|
package/dist/lib/Schema.js
CHANGED
|
@@ -29,9 +29,9 @@ var Schema;
|
|
|
29
29
|
res.push(Query.AlterTable({ table: schema, dropColumn: columnName }));
|
|
30
30
|
} else {
|
|
31
31
|
const { sql: instruction } = formatter.formatColumn(
|
|
32
|
-
{ stmt: new Statement() },
|
|
32
|
+
{ stmt: new Statement(formatter) },
|
|
33
33
|
{ ...schemaCol, references: void 0 }
|
|
34
|
-
)
|
|
34
|
+
);
|
|
35
35
|
if (removeLeadingWhitespace(localInstruction) !== removeLeadingWhitespace(instruction)) {
|
|
36
36
|
res.push(Query.AlterTable({ table: schema, alterColumn: schemaCol }));
|
|
37
37
|
}
|
|
@@ -49,10 +49,9 @@ var Schema;
|
|
|
49
49
|
} else if (!schemaIndex) {
|
|
50
50
|
res.unshift(Query.DropIndex({ table: schema, name: indexName }));
|
|
51
51
|
} else {
|
|
52
|
-
const { sql: instruction } = formatter.
|
|
53
|
-
{ stmt: new Statement() },
|
|
52
|
+
const { sql: instruction } = formatter.compile(
|
|
54
53
|
Query.CreateIndex({ table: schema, index: schemaIndex })
|
|
55
|
-
)
|
|
54
|
+
);
|
|
56
55
|
if (removeLeadingWhitespace(localInstruction) !== removeLeadingWhitespace(instruction)) {
|
|
57
56
|
res.unshift(Query.DropIndex({ table: schema, name: indexName }));
|
|
58
57
|
res.push(Query.CreateIndex({ table: schema, index: schemaIndex }));
|
package/dist/lib/Statement.d.ts
CHANGED
|
@@ -1,39 +1,17 @@
|
|
|
1
1
|
import { ParamData } from './Param';
|
|
2
2
|
import { Sanitizer } from './Sanitizer';
|
|
3
|
-
declare enum TokenType {
|
|
4
|
-
Raw = "Raw",
|
|
5
|
-
Identifier = "Identifier",
|
|
6
|
-
Value = "Value",
|
|
7
|
-
Param = "Param",
|
|
8
|
-
Indent = "Indent",
|
|
9
|
-
Dedent = "Dedent"
|
|
10
|
-
}
|
|
11
|
-
declare class Token {
|
|
12
|
-
type: TokenType;
|
|
13
|
-
data: any;
|
|
14
|
-
constructor(type: TokenType, data: any);
|
|
15
|
-
static Raw(data: string): Token;
|
|
16
|
-
static Indent(): Token;
|
|
17
|
-
static Dedent(): Token;
|
|
18
|
-
static Identifier(data: string): Token;
|
|
19
|
-
static Value(data: any): Token;
|
|
20
|
-
static Param(name: string): Token;
|
|
21
|
-
}
|
|
22
|
-
export interface CompileOptions {
|
|
23
|
-
formatInline?: boolean;
|
|
24
|
-
spaces?: number;
|
|
25
|
-
}
|
|
26
3
|
export declare class Statement {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
4
|
+
sanitizer: Sanitizer;
|
|
5
|
+
sql: string;
|
|
6
|
+
private paramData;
|
|
7
|
+
currentIndent: string;
|
|
8
|
+
constructor(sanitizer: Sanitizer, sql?: string, paramData?: Array<ParamData>);
|
|
31
9
|
space(): this;
|
|
32
10
|
add(addition: undefined | string): this;
|
|
33
11
|
addLine(addition: undefined | string): this;
|
|
34
12
|
indent(): this;
|
|
35
13
|
dedent(): this;
|
|
36
|
-
newline(
|
|
14
|
+
newline(): this;
|
|
37
15
|
identifier(name: string): this;
|
|
38
16
|
addIdentifier(name: string): this;
|
|
39
17
|
value(value: any): this;
|
|
@@ -46,14 +24,6 @@ export declare class Statement {
|
|
|
46
24
|
call<T>(parts: Array<T>, separator?: string): Generator<T, this | undefined, unknown>;
|
|
47
25
|
separate<T>(parts: Array<T>, separator?: string): Generator<T, void, unknown>;
|
|
48
26
|
isEmpty(): boolean;
|
|
49
|
-
compile(sanitizer: Sanitizer, formatInline?: boolean): CompiledStatement;
|
|
50
|
-
}
|
|
51
|
-
export declare class CompiledStatement {
|
|
52
|
-
sanitizer: Sanitizer;
|
|
53
|
-
sql: string;
|
|
54
|
-
private paramData;
|
|
55
|
-
constructor(sanitizer: Sanitizer, sql: string, paramData: Array<ParamData>);
|
|
56
27
|
params(input?: Record<string, any>): Array<any>;
|
|
57
28
|
toString(): string;
|
|
58
29
|
}
|
|
59
|
-
export {};
|
package/dist/lib/Statement.js
CHANGED
|
@@ -1,50 +1,18 @@
|
|
|
1
1
|
// src/lib/Statement.ts
|
|
2
2
|
import { ParamData, ParamType } from "./Param.js";
|
|
3
|
-
var Token = class {
|
|
4
|
-
constructor(type, data) {
|
|
5
|
-
this.type = type;
|
|
6
|
-
this.data = data;
|
|
7
|
-
}
|
|
8
|
-
static Raw(data) {
|
|
9
|
-
return new Token("Raw" /* Raw */, data);
|
|
10
|
-
}
|
|
11
|
-
static Indent() {
|
|
12
|
-
return new Token("Indent" /* Indent */, null);
|
|
13
|
-
}
|
|
14
|
-
static Dedent() {
|
|
15
|
-
return new Token("Dedent" /* Dedent */, null);
|
|
16
|
-
}
|
|
17
|
-
static Identifier(data) {
|
|
18
|
-
return new Token("Identifier" /* Identifier */, data);
|
|
19
|
-
}
|
|
20
|
-
static Value(data) {
|
|
21
|
-
return new Token("Value" /* Value */, data);
|
|
22
|
-
}
|
|
23
|
-
static Param(name) {
|
|
24
|
-
return new Token("Param" /* Param */, name);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
3
|
var SEPARATE = ", ";
|
|
28
4
|
var WHITESPACE = " ";
|
|
29
5
|
var NEWLINE = "\n";
|
|
6
|
+
var INSERT_PARAM = "?";
|
|
30
7
|
var Statement = class {
|
|
31
|
-
constructor(
|
|
32
|
-
this.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.tokens.push(...tokens);
|
|
36
|
-
return this;
|
|
37
|
-
}
|
|
38
|
-
static tag(strings, params) {
|
|
39
|
-
return new Statement(
|
|
40
|
-
strings.flatMap((s, i) => {
|
|
41
|
-
const param = params[i];
|
|
42
|
-
return [Token.Raw(s)].concat(param ? param.tokens : []);
|
|
43
|
-
})
|
|
44
|
-
);
|
|
8
|
+
constructor(sanitizer, sql = "", paramData = []) {
|
|
9
|
+
this.sanitizer = sanitizer;
|
|
10
|
+
this.sql = sql;
|
|
11
|
+
this.paramData = paramData;
|
|
45
12
|
}
|
|
13
|
+
currentIndent = "";
|
|
46
14
|
space() {
|
|
47
|
-
if (this.
|
|
15
|
+
if (this.sql === "")
|
|
48
16
|
return this;
|
|
49
17
|
return this.raw(WHITESPACE);
|
|
50
18
|
}
|
|
@@ -59,30 +27,32 @@ var Statement = class {
|
|
|
59
27
|
return this.newline().add(addition);
|
|
60
28
|
}
|
|
61
29
|
indent() {
|
|
62
|
-
|
|
30
|
+
this.currentIndent = this.currentIndent + " ";
|
|
31
|
+
return this;
|
|
63
32
|
}
|
|
64
33
|
dedent() {
|
|
65
|
-
|
|
34
|
+
this.currentIndent = this.currentIndent.slice(0, -2);
|
|
35
|
+
return this;
|
|
66
36
|
}
|
|
67
|
-
newline(
|
|
68
|
-
|
|
69
|
-
return this;
|
|
70
|
-
return this.raw(NEWLINE);
|
|
37
|
+
newline() {
|
|
38
|
+
return this.raw(NEWLINE + this.currentIndent);
|
|
71
39
|
}
|
|
72
40
|
identifier(name) {
|
|
73
|
-
return this.
|
|
41
|
+
return this.raw(this.sanitizer.escapeIdentifier(name));
|
|
74
42
|
}
|
|
75
43
|
addIdentifier(name) {
|
|
76
44
|
return this.space().identifier(name);
|
|
77
45
|
}
|
|
78
46
|
value(value) {
|
|
79
|
-
|
|
47
|
+
this.paramData.push(ParamData.Value(value));
|
|
48
|
+
return this.raw(INSERT_PARAM);
|
|
80
49
|
}
|
|
81
50
|
addValue(value) {
|
|
82
51
|
return this.space().value(value);
|
|
83
52
|
}
|
|
84
53
|
param(name) {
|
|
85
|
-
|
|
54
|
+
this.paramData.push(ParamData.Named(name));
|
|
55
|
+
return this.raw(INSERT_PARAM);
|
|
86
56
|
}
|
|
87
57
|
addParam(name) {
|
|
88
58
|
return this.space().param(name);
|
|
@@ -90,7 +60,8 @@ var Statement = class {
|
|
|
90
60
|
raw(query) {
|
|
91
61
|
if (!query)
|
|
92
62
|
return this;
|
|
93
|
-
|
|
63
|
+
this.sql += query;
|
|
64
|
+
return this;
|
|
94
65
|
}
|
|
95
66
|
openParenthesis() {
|
|
96
67
|
return this.raw("(").indent().newline();
|
|
@@ -113,49 +84,7 @@ var Statement = class {
|
|
|
113
84
|
}
|
|
114
85
|
}
|
|
115
86
|
isEmpty() {
|
|
116
|
-
return this.
|
|
117
|
-
}
|
|
118
|
-
compile(sanitizer, formatInline = false) {
|
|
119
|
-
let sql = "", paramData = [], indent = "";
|
|
120
|
-
for (const token of this.tokens) {
|
|
121
|
-
switch (token.type) {
|
|
122
|
-
case "Raw" /* Raw */:
|
|
123
|
-
if (token.data === NEWLINE)
|
|
124
|
-
sql += NEWLINE + indent;
|
|
125
|
-
else
|
|
126
|
-
sql += token.data;
|
|
127
|
-
break;
|
|
128
|
-
case "Identifier" /* Identifier */:
|
|
129
|
-
sql += sanitizer.escapeIdentifier(token.data);
|
|
130
|
-
break;
|
|
131
|
-
case "Value" /* Value */:
|
|
132
|
-
if (formatInline) {
|
|
133
|
-
sql += sanitizer.escapeValue(token.data);
|
|
134
|
-
} else {
|
|
135
|
-
sql += "?";
|
|
136
|
-
paramData.push(ParamData.Value(token.data));
|
|
137
|
-
}
|
|
138
|
-
break;
|
|
139
|
-
case "Param" /* Param */:
|
|
140
|
-
sql += "?";
|
|
141
|
-
paramData.push(ParamData.Named(token.data));
|
|
142
|
-
break;
|
|
143
|
-
case "Indent" /* Indent */:
|
|
144
|
-
indent += " ";
|
|
145
|
-
break;
|
|
146
|
-
case "Dedent" /* Dedent */:
|
|
147
|
-
indent = indent.slice(0, -2);
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return new CompiledStatement(sanitizer, sql, paramData);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
var CompiledStatement = class {
|
|
155
|
-
constructor(sanitizer, sql, paramData) {
|
|
156
|
-
this.sanitizer = sanitizer;
|
|
157
|
-
this.sql = sql;
|
|
158
|
-
this.paramData = paramData;
|
|
87
|
+
return this.sql === "";
|
|
159
88
|
}
|
|
160
89
|
params(input) {
|
|
161
90
|
return this.paramData.map((param) => {
|
|
@@ -172,6 +101,5 @@ var CompiledStatement = class {
|
|
|
172
101
|
}
|
|
173
102
|
};
|
|
174
103
|
export {
|
|
175
|
-
CompiledStatement,
|
|
176
104
|
Statement
|
|
177
105
|
};
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
// src/sqlite/SqliteFormatter.ts
|
|
2
2
|
import { ExprType } from "../lib/Expr.js";
|
|
3
3
|
import { Formatter } from "../lib/Formatter.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
buf += char;
|
|
11
|
-
}
|
|
12
|
-
buf += outer;
|
|
13
|
-
return buf;
|
|
14
|
-
}
|
|
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;
|
|
15
10
|
var SqliteFormatter = class extends Formatter {
|
|
16
11
|
formatParamValue(paramValue) {
|
|
17
12
|
if (paramValue === null || paramValue === void 0)
|
|
@@ -26,7 +21,7 @@ var SqliteFormatter = class extends Formatter {
|
|
|
26
21
|
}
|
|
27
22
|
escapeValue(value) {
|
|
28
23
|
if (value === null || value === void 0)
|
|
29
|
-
return "
|
|
24
|
+
return "NULL";
|
|
30
25
|
if (typeof value === "boolean")
|
|
31
26
|
return value ? "1" : "0";
|
|
32
27
|
if (typeof value === "number")
|
|
@@ -36,10 +31,10 @@ var SqliteFormatter = class extends Formatter {
|
|
|
36
31
|
return "json(" + this.escapeString(JSON.stringify(value)) + ")";
|
|
37
32
|
}
|
|
38
33
|
escapeIdentifier(input) {
|
|
39
|
-
return
|
|
34
|
+
return BACKTICK + input.replace(MATCH_BACKTICK, ESCAPE_BACKTICK) + BACKTICK;
|
|
40
35
|
}
|
|
41
36
|
escapeString(input) {
|
|
42
|
-
return
|
|
37
|
+
return SINGLE_QUOTE + input.replace(MATCH_SINGLE_QUOTE, ESCAPE_SINGLE_QUOTE) + SINGLE_QUOTE;
|
|
43
38
|
}
|
|
44
39
|
formatAccess(ctx, mkSubject, field) {
|
|
45
40
|
const { stmt, formatAsJson } = ctx;
|
|
@@ -25,7 +25,7 @@ var SqliteSchema;
|
|
|
25
25
|
}
|
|
26
26
|
SqliteSchema2.createInstructions = createInstructions;
|
|
27
27
|
function columnInstruction(column) {
|
|
28
|
-
const stmt = new Statement();
|
|
28
|
+
const stmt = new Statement(formatter);
|
|
29
29
|
stmt.identifier(column.name).add(column.type);
|
|
30
30
|
if (column.pk === 1)
|
|
31
31
|
stmt.add("PRIMARY KEY");
|
|
@@ -34,7 +34,7 @@ var SqliteSchema;
|
|
|
34
34
|
if (column.dflt_value !== null) {
|
|
35
35
|
stmt.add("DEFAULT").space().openParenthesis().raw(column.dflt_value).closeParenthesis();
|
|
36
36
|
}
|
|
37
|
-
return [column.name, stmt.
|
|
37
|
+
return [column.name, stmt.sql];
|
|
38
38
|
}
|
|
39
39
|
SqliteSchema2.columnInstruction = columnInstruction;
|
|
40
40
|
function indexInstruction(index) {
|
package/package.json
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rado",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.41",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js",
|
|
8
|
-
"./*": "./dist/*.js"
|
|
8
|
+
"./*": "./dist/*.js",
|
|
9
|
+
"./driver/bun:sqlite": "./dist/driver/bun-sqlite.js"
|
|
9
10
|
},
|
|
10
11
|
"files": [
|
|
11
12
|
"dist"
|
|
12
13
|
],
|
|
13
14
|
"sideEffects": false,
|
|
14
|
-
"typesVersions": {
|
|
15
|
-
"*": {
|
|
16
|
-
"*": [
|
|
17
|
-
"./dist/*"
|
|
18
|
-
]
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
15
|
"scripts": {
|
|
22
16
|
"build": "tsc -p tsconfig.build.json && tsx build.ts",
|
|
23
17
|
"test": "tsx test",
|
|
18
|
+
"test:bun": "bun test/index.ts --driver=bun:sqlite",
|
|
19
|
+
"profile": "cross-env PROFILE=true tsx build.ts && cd bin && (rimraf CPU*.cpuprofile || true) && node --cpu-prof --cpu-prof-interval=100 test && speedscope CPU*.cpuprofile",
|
|
24
20
|
"prepublishOnly": "tsc -p tsconfig.build.json && tsx build.ts"
|
|
25
21
|
},
|
|
26
22
|
"devDependencies": {
|
|
@@ -28,9 +24,13 @@
|
|
|
28
24
|
"@types/glob": "^8.0.0",
|
|
29
25
|
"@types/sql.js": "^1.4.2",
|
|
30
26
|
"better-sqlite3": "^7.5.1",
|
|
27
|
+
"bun-types": "^0.5.0",
|
|
28
|
+
"cross-env": "^7.0.3",
|
|
31
29
|
"esbuild": "^0.16.16",
|
|
32
30
|
"glob": "^8.0.3",
|
|
31
|
+
"rimraf": "^4.1.2",
|
|
33
32
|
"sade": "^1.8.1",
|
|
33
|
+
"speedscope": "^1.15.0",
|
|
34
34
|
"sql.js": "^1.8.0",
|
|
35
35
|
"sqlite3": "^5.1.4",
|
|
36
36
|
"tsx": "^3.12.1",
|