rado 0.0.0 → 0.1.0

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.
@@ -1,62 +1,67 @@
1
1
  // src/driver/sqlite3.ts
2
2
  import { Driver } from "../Driver.js";
3
- import { QueryType } from "../Query.js";
4
3
  import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
4
+ import { SqliteSchema } from "../sqlite/SqliteSchema.js";
5
5
  var Sqlite3Driver = class extends Driver.Async {
6
6
  constructor(db) {
7
- super();
7
+ super(new SqliteFormatter());
8
8
  this.db = db;
9
9
  }
10
- formatter = new SqliteFormatter();
11
10
  lock;
12
- async execute(query) {
11
+ async executeQuery(query) {
13
12
  await this.lock;
13
+ return super.executeQuery(query);
14
+ }
15
+ rows([sql, params]) {
16
+ return new Promise((resolve, reject) => {
17
+ const stmt = this.db.prepare(sql);
18
+ stmt.all(params, (err, rows) => {
19
+ if (err)
20
+ reject(err);
21
+ else
22
+ resolve(rows);
23
+ });
24
+ });
25
+ }
26
+ async values(stmt) {
27
+ const rows = await this.rows(stmt);
28
+ return rows.map(Object.values);
29
+ }
30
+ execute([sql, params]) {
14
31
  return new Promise((resolve, reject) => {
15
- const [sql, params] = this.formatter.compile(query);
16
32
  const stmt = this.db.prepare(sql);
17
- if ("selection" in query) {
18
- stmt.all(params, (err, rows) => {
19
- const res = rows.map((row) => JSON.parse(row.result).result);
20
- if (err)
21
- reject(err);
22
- else
23
- resolve(query.singleResult ? res[0] : res);
24
- });
25
- } else if (query.type === QueryType.Raw) {
26
- switch (query.expectedReturn) {
27
- case "row":
28
- return stmt.get(params, (err, row) => {
29
- if (err)
30
- reject(err);
31
- else
32
- resolve(row);
33
- });
34
- case "rows":
35
- return stmt.all(params, (err, rows) => {
36
- if (err)
37
- reject(err);
38
- else
39
- resolve(rows);
40
- });
41
- default:
42
- stmt.run(params, (err) => {
43
- if (err)
44
- reject(err);
45
- else
46
- resolve(void 0);
47
- });
48
- return void 0;
49
- }
50
- } else {
51
- stmt.run(params, function(err) {
52
- if (err)
53
- reject(err);
54
- else
55
- resolve({ rowsAffected: this.changes });
56
- });
57
- }
33
+ stmt.run(params, (err) => {
34
+ if (err)
35
+ reject(err);
36
+ else
37
+ resolve();
38
+ });
58
39
  });
59
40
  }
41
+ mutate([sql, params]) {
42
+ return new Promise((resolve, reject) => {
43
+ const stmt = this.db.prepare(sql);
44
+ stmt.run(params, function(err) {
45
+ if (err)
46
+ reject(err);
47
+ else
48
+ resolve({ rowsAffected: this.changes });
49
+ });
50
+ });
51
+ }
52
+ async schemaInstructions(tableName) {
53
+ try {
54
+ const columnData = await this.rows(
55
+ SqliteSchema.tableData(tableName).compile(this.formatter)
56
+ );
57
+ const indexData = await this.rows(
58
+ SqliteSchema.indexData(tableName).compile(this.formatter)
59
+ );
60
+ return SqliteSchema.createInstructions(columnData, indexData);
61
+ } catch (e) {
62
+ return void 0;
63
+ }
64
+ }
60
65
  isolate() {
61
66
  const connection = new Sqlite3Driver(this.db);
62
67
  let release, trigger = new Promise((resolve) => {
@@ -2,7 +2,7 @@ import { Formatter } from '../Formatter';
2
2
  import { Statement } from '../Statement';
3
3
  export declare class SqliteFormatter extends Formatter {
4
4
  escapeValue(value: any): string;
5
- escapeIdent(input: string): string;
5
+ escapeIdentifier(input: string): string;
6
6
  escapeString(input: string): string;
7
7
  formatSqlAccess(on: Statement, field: string): Statement;
8
8
  formatJsonAccess(on: Statement, field: string): Statement;
@@ -23,7 +23,7 @@ var SqliteFormatter = class extends Formatter {
23
23
  return this.escapeString(value);
24
24
  return "json(" + this.escapeString(JSON.stringify(value)) + ")";
25
25
  }
26
- escapeIdent(input) {
26
+ escapeIdentifier(input) {
27
27
  return escapeWithin(input, "`");
28
28
  }
29
29
  escapeString(input) {
@@ -0,0 +1,24 @@
1
+ import { SchemaInstructions } from '../Schema';
2
+ import { Statement } from '../Statement';
3
+ export declare namespace SqliteSchema {
4
+ type Column = {
5
+ cid: number;
6
+ name: string;
7
+ type: string;
8
+ notnull: number;
9
+ dflt_value: string | null;
10
+ pk: number;
11
+ };
12
+ interface Index {
13
+ type: 'index';
14
+ name: string;
15
+ tbl_name: string;
16
+ rootpage: number;
17
+ sql: string;
18
+ }
19
+ function tableData(tableName: string): Statement;
20
+ function indexData(tableName: string): Statement;
21
+ function createInstructions(columnData: Array<Column>, indexData: Array<Index>): SchemaInstructions;
22
+ function columnInstruction(column: Column): [string, string];
23
+ function indexInstruction(index: Index): [string, string];
24
+ }
@@ -0,0 +1,38 @@
1
+ // src/sqlite/SqliteSchema.ts
2
+ import { Statement, identifier } from "../Statement.js";
3
+ import { SqliteFormatter } from "./SqliteFormatter.js";
4
+ var SqliteSchema;
5
+ ((SqliteSchema2) => {
6
+ const formatter = new SqliteFormatter();
7
+ function tableData(tableName) {
8
+ return Statement.tag`select * from pragma_table_info(${tableName}) order by cid`;
9
+ }
10
+ SqliteSchema2.tableData = tableData;
11
+ function indexData(tableName) {
12
+ return Statement.tag`select * from sqlite_master where type='index' and tbl_name=${tableName}`;
13
+ }
14
+ SqliteSchema2.indexData = indexData;
15
+ function createInstructions(columnData, indexData2) {
16
+ const columns = columnData.map(columnInstruction);
17
+ const indexes = indexData2.map(indexInstruction);
18
+ return {
19
+ columns: Object.fromEntries(columns),
20
+ indexes: Object.fromEntries(indexes)
21
+ };
22
+ }
23
+ SqliteSchema2.createInstructions = createInstructions;
24
+ function columnInstruction(column) {
25
+ return [
26
+ column.name,
27
+ identifier(column.name).add(column.type.toLowerCase()).addIf(column.pk === 1, "primary key").addIf(column.notnull === 1, "not null").addIf(column.dflt_value !== null, column.dflt_value).compile(formatter)[0]
28
+ ];
29
+ }
30
+ SqliteSchema2.columnInstruction = columnInstruction;
31
+ function indexInstruction(index) {
32
+ return [index.name, index.sql];
33
+ }
34
+ SqliteSchema2.indexInstruction = indexInstruction;
35
+ })(SqliteSchema || (SqliteSchema = {}));
36
+ export {
37
+ SqliteSchema
38
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rado",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {