taon-type-sql 21.0.21 → 21.0.22
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/browser/package.json +1 -1
- package/browser-prod/package.json +1 -1
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/package.json +1 -1
- package/lib-prod/build-info._auto-generated_.ts +27 -0
- package/lib-prod/builder/column/basic-column.ts +17 -0
- package/lib-prod/builder/column/boolean-column.ts +19 -0
- package/lib-prod/builder/column/comparable-column.ts +56 -0
- package/lib-prod/builder/column/date-column.ts +19 -0
- package/lib-prod/builder/column/number-column.ts +25 -0
- package/lib-prod/builder/column/query-column.ts +34 -0
- package/lib-prod/builder/column/string-column.ts +47 -0
- package/lib-prod/builder/column/value-column.ts +39 -0
- package/lib-prod/builder/condition/{query-column-condition.d.ts → query-column-condition.ts} +20 -5
- package/lib-prod/builder/condition/query-condition-chain.ts +42 -0
- package/lib-prod/builder/condition/{query-condition.d.ts → query-condition.ts} +8 -2
- package/lib-prod/builder/condition/{query-join-condition.d.ts → query-join-condition.ts} +19 -4
- package/lib-prod/builder/helpers/generics-helper.ts +2 -0
- package/lib-prod/builder/helpers/{internal-types.d.ts → internal-types.ts} +25 -9
- package/lib-prod/builder/join/joined-tables-chain.ts +17 -0
- package/lib-prod/builder/join/joined-tables.ts +28 -0
- package/lib-prod/builder/other/{query-ordering.d.ts → query-ordering.ts} +20 -4
- package/lib-prod/builder/query/select-query.ts +68 -0
- package/lib-prod/builder/query/table-condition-query.ts +35 -0
- package/lib-prod/builder/query/table-query.ts +72 -0
- package/lib-prod/builder/{query-source.d.ts → query-source.ts} +19 -8
- package/lib-prod/builder/query-table.ts +34 -0
- package/lib-prod/client/mysql.ts +9 -0
- package/lib-prod/client/pg.ts +9 -0
- package/lib-prod/client/query-processor.ts +89 -0
- package/lib-prod/converter/{param-converter.js → param-converter.ts} +8 -16
- package/lib-prod/converter/parameterized-converter.ts +20 -0
- package/lib-prod/converter/{query-converter.js → query-converter.ts} +113 -101
- package/lib-prod/converter/result-converter.ts +88 -0
- package/lib-prod/converter/sql-converter.ts +7 -0
- package/lib-prod/converter/type-converter.ts +29 -0
- package/lib-prod/converter/{types.d.ts → types.ts} +4 -3
- package/lib-prod/env/env.angular-node-app.ts +66 -0
- package/lib-prod/env/env.docs-webapp.ts +66 -0
- package/lib-prod/env/env.electron-app.ts +66 -0
- package/lib-prod/env/env.mobile-app.ts +66 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.ts +66 -0
- package/lib-prod/env/env.vscode-plugin.ts +66 -0
- package/lib-prod/{index._auto-generated_.js → index._auto-generated_.ts} +0 -1
- package/lib-prod/{index.d.ts → index.ts} +15 -3
- package/lib-prod/lib-info.md +8 -0
- package/lib-prod/migrations/index.ts +2 -0
- package/lib-prod/migrations/migrations-info.md +6 -0
- package/lib-prod/migrations/{migrations_index._auto-generated_.js → migrations_index._auto-generated_.ts} +2 -1
- package/lib-prod/package.json +1 -1
- package/package.json +1 -1
- package/websql/package.json +1 -1
- package/websql-prod/package.json +1 -1
- package/lib-prod/build-info._auto-generated_.d.ts +0 -24
- package/lib-prod/build-info._auto-generated_.js +0 -30
- package/lib-prod/build-info._auto-generated_.js.map +0 -1
- package/lib-prod/builder/column/basic-column.d.ts +0 -8
- package/lib-prod/builder/column/basic-column.js +0 -15
- package/lib-prod/builder/column/basic-column.js.map +0 -1
- package/lib-prod/builder/column/boolean-column.d.ts +0 -9
- package/lib-prod/builder/column/boolean-column.js +0 -15
- package/lib-prod/builder/column/boolean-column.js.map +0 -1
- package/lib-prod/builder/column/comparable-column.d.ts +0 -18
- package/lib-prod/builder/column/comparable-column.js +0 -42
- package/lib-prod/builder/column/comparable-column.js.map +0 -1
- package/lib-prod/builder/column/date-column.d.ts +0 -9
- package/lib-prod/builder/column/date-column.js +0 -15
- package/lib-prod/builder/column/date-column.js.map +0 -1
- package/lib-prod/builder/column/number-column.d.ts +0 -10
- package/lib-prod/builder/column/number-column.js +0 -20
- package/lib-prod/builder/column/number-column.js.map +0 -1
- package/lib-prod/builder/column/query-column.d.ts +0 -18
- package/lib-prod/builder/column/query-column.js +0 -26
- package/lib-prod/builder/column/query-column.js.map +0 -1
- package/lib-prod/builder/column/string-column.d.ts +0 -17
- package/lib-prod/builder/column/string-column.js +0 -37
- package/lib-prod/builder/column/string-column.js.map +0 -1
- package/lib-prod/builder/column/value-column.d.ts +0 -15
- package/lib-prod/builder/column/value-column.js +0 -30
- package/lib-prod/builder/column/value-column.js.map +0 -1
- package/lib-prod/builder/condition/query-column-condition.js +0 -23
- package/lib-prod/builder/condition/query-column-condition.js.map +0 -1
- package/lib-prod/builder/condition/query-condition-chain.d.ts +0 -17
- package/lib-prod/builder/condition/query-condition-chain.js +0 -34
- package/lib-prod/builder/condition/query-condition-chain.js.map +0 -1
- package/lib-prod/builder/condition/query-condition.js +0 -7
- package/lib-prod/builder/condition/query-condition.js.map +0 -1
- package/lib-prod/builder/condition/query-join-condition.js +0 -23
- package/lib-prod/builder/condition/query-join-condition.js.map +0 -1
- package/lib-prod/builder/helpers/generics-helper.d.ts +0 -2
- package/lib-prod/builder/helpers/generics-helper.js +0 -7
- package/lib-prod/builder/helpers/generics-helper.js.map +0 -1
- package/lib-prod/builder/helpers/internal-types.js +0 -4
- package/lib-prod/builder/helpers/internal-types.js.map +0 -1
- package/lib-prod/builder/join/joined-tables-chain.d.ts +0 -11
- package/lib-prod/builder/join/joined-tables-chain.js +0 -18
- package/lib-prod/builder/join/joined-tables-chain.js.map +0 -1
- package/lib-prod/builder/join/joined-tables.d.ts +0 -12
- package/lib-prod/builder/join/joined-tables.js +0 -25
- package/lib-prod/builder/join/joined-tables.js.map +0 -1
- package/lib-prod/builder/other/query-ordering.js +0 -21
- package/lib-prod/builder/other/query-ordering.js.map +0 -1
- package/lib-prod/builder/query/select-query.d.ts +0 -29
- package/lib-prod/builder/query/select-query.js +0 -54
- package/lib-prod/builder/query/select-query.js.map +0 -1
- package/lib-prod/builder/query/table-condition-query.d.ts +0 -16
- package/lib-prod/builder/query/table-condition-query.js +0 -31
- package/lib-prod/builder/query/table-condition-query.js.map +0 -1
- package/lib-prod/builder/query/table-query.d.ts +0 -23
- package/lib-prod/builder/query/table-query.js +0 -60
- package/lib-prod/builder/query/table-query.js.map +0 -1
- package/lib-prod/builder/query-source.js +0 -22
- package/lib-prod/builder/query-source.js.map +0 -1
- package/lib-prod/builder/query-table.d.ts +0 -15
- package/lib-prod/builder/query-table.js +0 -28
- package/lib-prod/builder/query-table.js.map +0 -1
- package/lib-prod/client/mysql.d.ts +0 -5
- package/lib-prod/client/mysql.js +0 -11
- package/lib-prod/client/mysql.js.map +0 -1
- package/lib-prod/client/pg.d.ts +0 -5
- package/lib-prod/client/pg.js +0 -11
- package/lib-prod/client/pg.js.map +0 -1
- package/lib-prod/client/query-processor.d.ts +0 -10
- package/lib-prod/client/query-processor.js +0 -73
- package/lib-prod/client/query-processor.js.map +0 -1
- package/lib-prod/converter/param-converter.d.ts +0 -2
- package/lib-prod/converter/param-converter.js.map +0 -1
- package/lib-prod/converter/parameterized-converter.d.ts +0 -5
- package/lib-prod/converter/parameterized-converter.js +0 -18
- package/lib-prod/converter/parameterized-converter.js.map +0 -1
- package/lib-prod/converter/query-converter.d.ts +0 -2
- package/lib-prod/converter/query-converter.js.map +0 -1
- package/lib-prod/converter/result-converter.d.ts +0 -2
- package/lib-prod/converter/result-converter.js +0 -89
- package/lib-prod/converter/result-converter.js.map +0 -1
- package/lib-prod/converter/sql-converter.d.ts +0 -2
- package/lib-prod/converter/sql-converter.js +0 -9
- package/lib-prod/converter/sql-converter.js.map +0 -1
- package/lib-prod/converter/type-converter.d.ts +0 -4
- package/lib-prod/converter/type-converter.js +0 -43
- package/lib-prod/converter/type-converter.js.map +0 -1
- package/lib-prod/converter/types.js +0 -3
- package/lib-prod/converter/types.js.map +0 -1
- package/lib-prod/env/env.angular-node-app.d.ts +0 -64
- package/lib-prod/env/env.angular-node-app.js +0 -71
- package/lib-prod/env/env.angular-node-app.js.map +0 -1
- package/lib-prod/env/env.docs-webapp.d.ts +0 -64
- package/lib-prod/env/env.docs-webapp.js +0 -71
- package/lib-prod/env/env.docs-webapp.js.map +0 -1
- package/lib-prod/env/env.electron-app.d.ts +0 -64
- package/lib-prod/env/env.electron-app.js +0 -71
- package/lib-prod/env/env.electron-app.js.map +0 -1
- package/lib-prod/env/env.mobile-app.d.ts +0 -64
- package/lib-prod/env/env.mobile-app.js +0 -71
- package/lib-prod/env/env.mobile-app.js.map +0 -1
- package/lib-prod/env/env.npm-lib-and-cli-tool.d.ts +0 -64
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +0 -71
- package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +0 -1
- package/lib-prod/env/env.vscode-plugin.d.ts +0 -64
- package/lib-prod/env/env.vscode-plugin.js +0 -71
- package/lib-prod/env/env.vscode-plugin.js.map +0 -1
- package/lib-prod/env/index.js +0 -23
- package/lib-prod/env/index.js.map +0 -1
- package/lib-prod/index._auto-generated_.d.ts +0 -0
- package/lib-prod/index._auto-generated_.js.map +0 -1
- package/lib-prod/index.js +0 -48
- package/lib-prod/index.js.map +0 -1
- package/lib-prod/migrations/index.d.ts +0 -1
- package/lib-prod/migrations/index.js +0 -19
- package/lib-prod/migrations/index.js.map +0 -1
- package/lib-prod/migrations/migrations_index._auto-generated_.d.ts +0 -0
- package/lib-prod/migrations/migrations_index._auto-generated_.js.map +0 -1
- /package/lib-prod/env/{index.d.ts → index.ts} +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import QueryTable from "../query-table";
|
|
2
|
+
import QueryCondition from "../condition/query-condition";
|
|
3
|
+
import QueryColumn from "../column/query-column";
|
|
4
|
+
import { QueryProcessor, QueryAction } from "../helpers/internal-types";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export default class TableConditionQuery<Entity, Table extends QueryTable<Entity, any>> {
|
|
8
|
+
|
|
9
|
+
constructor(
|
|
10
|
+
protected _queryProcessor: QueryProcessor,
|
|
11
|
+
protected _table: Table,
|
|
12
|
+
protected _conditions: QueryCondition<Table>[]
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
protected _columns: QueryColumn<Table, any>[] = [];
|
|
16
|
+
protected _action: QueryAction;
|
|
17
|
+
protected _entity: Entity | Partial<Entity>;
|
|
18
|
+
|
|
19
|
+
update(entity: Partial<Entity>): Promise<number> {
|
|
20
|
+
this._entity = entity;
|
|
21
|
+
this._action = 'update';
|
|
22
|
+
return this._queryProcessor(this);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
delete(): Promise<number> {
|
|
26
|
+
this._action = 'delete';
|
|
27
|
+
return this._queryProcessor(this);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
count(): Promise<number> {
|
|
31
|
+
this._columns = [this._table.$all.count()];
|
|
32
|
+
this._action = 'select';
|
|
33
|
+
return this._queryProcessor(this).then((rows: number[]) => rows[0]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import QueryTable from "../query-table";
|
|
2
|
+
import TableConditionQuery from "./table-condition-query";
|
|
3
|
+
import QueryCondition from "../condition/query-condition";
|
|
4
|
+
import ValueColumn from "../column/value-column";
|
|
5
|
+
import QueryColumn from "../column/query-column";
|
|
6
|
+
import { QueryProcessor, QueryAction } from "../helpers/internal-types";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export default class TableQuery<Entity, Id, Table extends QueryTable<Entity, Id>> {
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
protected _queryProcessor: QueryProcessor,
|
|
13
|
+
protected _table: Table
|
|
14
|
+
) {}
|
|
15
|
+
|
|
16
|
+
protected _entity: Entity | Entity[] | Partial<Entity>;
|
|
17
|
+
protected _action: QueryAction;
|
|
18
|
+
protected _columns: QueryColumn<Table, any>[] = [];
|
|
19
|
+
|
|
20
|
+
where(...conditions: QueryCondition<Table>[]) {
|
|
21
|
+
return new TableConditionQuery<Entity, Table>(this._queryProcessor, this._table, conditions);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
insert(entity: Entity): Promise<any> // returns the generated ID, but not other kinds of IDs, so the type is unknown (mysql limitations)
|
|
25
|
+
insert(entities: Entity[]): Promise<void>
|
|
26
|
+
insert(param: any): Promise<any> {
|
|
27
|
+
this._entity = param;
|
|
28
|
+
this._action = 'insert';
|
|
29
|
+
return this._queryProcessor(this);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
deleteAll(): Promise<number> {
|
|
33
|
+
this._action = 'delete';
|
|
34
|
+
return this._queryProcessor(this);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
updateAll(entity: Partial<Entity>): Promise<number> {
|
|
38
|
+
this._entity = entity;
|
|
39
|
+
this._action = 'update';
|
|
40
|
+
return this._queryProcessor(this);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
countAll(): Promise<number> {
|
|
44
|
+
this._columns = [this._table.$all.count()];
|
|
45
|
+
this._action = 'select';
|
|
46
|
+
return this._queryProcessor(this).then((rows: any[]) => rows[0]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
delete(id: Id): Promise<boolean> {
|
|
50
|
+
return this._whereId(id).delete().then(count => count > 0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
update(id: Id, entity: Partial<Entity>): Promise<boolean> {
|
|
54
|
+
return this._whereId(id).update(entity).then(count => count > 0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get(id: Id): Promise<Entity | undefined> {
|
|
58
|
+
let query = this._whereId(id);
|
|
59
|
+
return this._queryProcessor({ _action: 'select', ...query })
|
|
60
|
+
.then((rows: Entity[]) => rows[0]);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
_whereId(id: Id): TableConditionQuery<Entity, Table> {
|
|
64
|
+
// TODO remove assertions if $id typing is fixed
|
|
65
|
+
let $id = (this._table as any).$id;
|
|
66
|
+
if ($id instanceof ValueColumn) {
|
|
67
|
+
return this.where($id.eq(id));
|
|
68
|
+
} else {
|
|
69
|
+
return this.where(...Object.keys($id).map(key => ((this._table as any)[key] as ValueColumn<Table, any>).eq((id as any)[key] as any)));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -3,12 +3,23 @@ import SelectQuery from './query/select-query';
|
|
|
3
3
|
import { QueryProcessor } from "./helpers/internal-types";
|
|
4
4
|
import JoinedTables from "./join/joined-tables";
|
|
5
5
|
import TableQuery from "./query/table-query";
|
|
6
|
+
|
|
7
|
+
|
|
6
8
|
export default class QuerySource {
|
|
7
|
-
|
|
8
|
-
constructor(_queryProcessor: QueryProcessor)
|
|
9
|
-
|
|
10
|
-
from<
|
|
11
|
-
from<
|
|
12
|
-
from<Table1 extends QueryTable<any, any>, Table2 extends QueryTable<any, any
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
|
|
10
|
+
constructor(protected _queryProcessor: QueryProcessor) {}
|
|
11
|
+
|
|
12
|
+
from<Entity, Table1 extends QueryTable<Entity, any>>(table1: Table1 & QueryTable<Entity, any>): SelectQuery<Entity, Table1>
|
|
13
|
+
from<Tables extends QueryTable<any, any>>(tables: JoinedTables<Tables>): SelectQuery<any, Tables>
|
|
14
|
+
from<Table1 extends QueryTable<any, any>, Table2 extends QueryTable<any, any>>(table1: Table1, table2: Table2): SelectQuery<any, Table1 | Table2>
|
|
15
|
+
from<Table1 extends QueryTable<any, any>, Table2 extends QueryTable<any, any>, Table3 extends QueryTable<any, any>>(table1: Table1, table2: Table2, table3: Table3): SelectQuery<any, Table1 | Table2 | Table3>
|
|
16
|
+
from<Entity, Table1 extends QueryTable<any, any>, Table2 extends QueryTable<any, any>, Table3 extends QueryTable<any, any>>(table1: any, table2?: any, table3?: any) {
|
|
17
|
+
if (table3 != null) return new SelectQuery<any, Table1 | Table2 | Table3>(this._queryProcessor, [table1, table2, table3]);
|
|
18
|
+
else if (table2 != null) return new SelectQuery<any, Table1 | Table2>(this._queryProcessor, [table1, table2]);
|
|
19
|
+
return new SelectQuery<Entity, Table1>(this._queryProcessor, [table1]);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
table<Entity, Id, Table extends QueryTable<Entity, Id>>(table: Table & QueryTable<Entity, Id>): TableQuery<Entity, Id, Table> {
|
|
23
|
+
return new TableQuery<Entity, Id, Table>(this._queryProcessor, table);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import BasicColumn from "./column/basic-column";
|
|
2
|
+
import GenericsHelper from "./helpers/generics-helper";
|
|
3
|
+
import JoinedTablesChain from "./join/joined-tables-chain";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
abstract class QueryTable<Entity, Id> {
|
|
7
|
+
|
|
8
|
+
constructor(protected _$name: string) {}
|
|
9
|
+
|
|
10
|
+
protected _$type: GenericsHelper<Entity>;
|
|
11
|
+
protected _$idType: GenericsHelper<Id>;
|
|
12
|
+
|
|
13
|
+
// abstract readonly $id; // FIXME I got a dozen incomprehensible type errors
|
|
14
|
+
|
|
15
|
+
$all = new BasicColumn<this, Entity>(this, '*');
|
|
16
|
+
|
|
17
|
+
innerJoin<JoinTable extends QueryTable<any, any>>(table: JoinTable): JoinedTablesChain<this | JoinTable> {
|
|
18
|
+
return new JoinedTablesChain<this | JoinTable>(table, 'inner', this);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
leftJoin<JoinTable extends QueryTable<any, any>>(table: JoinTable): JoinedTablesChain<this | JoinTable> {
|
|
22
|
+
return new JoinedTablesChain<this | JoinTable>(table, 'left', this);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
rightJoin<JoinTable extends QueryTable<any, any>>(table: JoinTable): JoinedTablesChain<this | JoinTable> {
|
|
26
|
+
return new JoinedTablesChain<this | JoinTable>(table, 'right', this);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fullJoin<JoinTable extends QueryTable<any, any>>(table: JoinTable): JoinedTablesChain<this | JoinTable> {
|
|
30
|
+
return new JoinedTablesChain<this | JoinTable>(table, 'full', this);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default QueryTable;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import QuerySource from "../builder/query-source";
|
|
2
|
+
import {QueryProcessorOptions, createQueryProcessor} from "./query-processor";
|
|
3
|
+
|
|
4
|
+
export default class MySqlQuerySource extends QuerySource {
|
|
5
|
+
|
|
6
|
+
constructor(client: any, options: QueryProcessorOptions = {}) {
|
|
7
|
+
super(createQueryProcessor(client, options, 'mysql'));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import QuerySource from "../builder/query-source";
|
|
2
|
+
import {QueryProcessorOptions, createQueryProcessor} from "./query-processor";
|
|
3
|
+
|
|
4
|
+
export default class PgQuerySource extends QuerySource {
|
|
5
|
+
|
|
6
|
+
constructor(client: any, options: QueryProcessorOptions = {}) {
|
|
7
|
+
super(createQueryProcessor(client, options, 'pg'));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Log, Level } from 'ng2-logger/lib-prod';
|
|
2
|
+
import { convertQueryToParameterizedSQL } from '../converter/parameterized-converter';
|
|
3
|
+
import { convertQueryToSQL } from '../converter/sql-converter';
|
|
4
|
+
import { convertResult } from "../converter/result-converter";
|
|
5
|
+
import { QueryEngine, ConverterOptions } from '../converter/types';
|
|
6
|
+
import { QueryProcessor } from '../builder/helpers/internal-types';
|
|
7
|
+
import { Helpers__NS___fixCommand, Helpers__NS__bigMaxBuffer, Helpers__NS__checkProcess, Helpers__NS__cleanExit, Helpers__NS__clearConsole, Helpers__NS__command, Helpers__NS__commandOutputAsString, Helpers__NS__commandOutputAsStringAsync, Helpers__NS__compilationWrapper, Helpers__NS__contain, Helpers__NS__createFolder, Helpers__NS__createSymLink, Helpers__NS__error, Helpers__NS__execute, Helpers__NS__exists, Helpers__NS__filesFrom, Helpers__NS__foldersFrom, Helpers__NS__getFilesFrom, Helpers__NS__getFoldersFrom, Helpers__NS__getIsBrowser, Helpers__NS__getIsElectron, Helpers__NS__getIsNode, Helpers__NS__getIsRunningInGitBash, Helpers__NS__getIsSupportedTaonTerminal, Helpers__NS__getIsVerboseMode, Helpers__NS__getIsWebSQL, Helpers__NS__getIsWsl, Helpers__NS__getStdio, Helpers__NS__hideNodeWarnings, Helpers__NS__info, Helpers__NS__isBlob, Helpers__NS__isBuffer, Helpers__NS__isClass, Helpers__NS__isExistedSymlink, Helpers__NS__isFile, Helpers__NS__isFolder, Helpers__NS__isRunningInDocker, Helpers__NS__isRunningInLinuxGraphicsCapableEnvironment, Helpers__NS__isSymlinkFileExitedOrUnexisted, Helpers__NS__isSymlinkThatMatchesUrl, Helpers__NS__isUnexistedLink, Helpers__NS__killOnPort, Helpers__NS__killProcess, Helpers__NS__killProcessByPort, Helpers__NS__linksToFolderFrom, Helpers__NS__linksToFoldersFrom, Helpers__NS__log, Helpers__NS__logError, Helpers__NS__logInfo, Helpers__NS__logProc, Helpers__NS__logSuccess, Helpers__NS__logWarn, Helpers__NS__mediaTypeFromSrc, Helpers__NS__mkdirp, Helpers__NS__modifyLineByLine, Helpers__NS__msgCacheClear, Helpers__NS__openFolderInFileExplorer, Helpers__NS__parse, Helpers__NS__pathContainLink, Helpers__NS__questionYesNo, Helpers__NS__readFile, Helpers__NS__readJson, Helpers__NS__readJson5, Helpers__NS__readJsonC, Helpers__NS__relative, Helpers__NS__remove, Helpers__NS__removeEmptyLineFromString, Helpers__NS__removeFileIfExists, Helpers__NS__removeFolderIfExists, Helpers__NS__removeIfExists, Helpers__NS__removeSlashAtBegin, Helpers__NS__removeSlashAtEnd, Helpers__NS__removeSymlinks, Helpers__NS__renderError, Helpers__NS__replaceLinesInFile, Helpers__NS__run, Helpers__NS__runAsyncIn, Helpers__NS__runSyncIn, Helpers__NS__runSyncOrAsync, Helpers__NS__sleep, Helpers__NS__stopApplication, Helpers__NS__stringify, Helpers__NS__success, Helpers__NS__taskDone, Helpers__NS__taskStarted, Helpers__NS__throwError, Helpers__NS__timeout, Helpers__NS__tryCatchError, Helpers__NS__tryReadFile, Helpers__NS__tryRemoveDir, Helpers__NS__values, Helpers__NS__wait, Helpers__NS__warn, Helpers__NS__writeFile, Helpers__NS__writeJson, Helpers__NS__writeJson5, Helpers__NS__writeJsonC } from 'tnp-core/lib-prod';
|
|
8
|
+
|
|
9
|
+
const log = Log.create('query processor',
|
|
10
|
+
// Level.__NOTHING
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
export interface QueryProcessorOptions {
|
|
14
|
+
lineBreaks?: boolean,
|
|
15
|
+
parameterized?: boolean,
|
|
16
|
+
logging?: boolean,
|
|
17
|
+
logger?: (sql: string, params?: any[]) => void,
|
|
18
|
+
identifierQuote?: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const DEFAULT_OPTIONS: QueryProcessorOptions = {
|
|
22
|
+
lineBreaks: false,
|
|
23
|
+
parameterized: true,
|
|
24
|
+
logging: true,
|
|
25
|
+
identifierQuote: '"'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function mySqlTypeCast(field: any, next: any) {
|
|
29
|
+
if (field.type == 'TINY' && field.length == 1) { // Boolean
|
|
30
|
+
let value = field.string();
|
|
31
|
+
if (value == '1') return true;
|
|
32
|
+
if (value == '0') return false;
|
|
33
|
+
return null;
|
|
34
|
+
} else if (field.type == 'JSON') {
|
|
35
|
+
let value = field.string();
|
|
36
|
+
return value == null ? null : JSON.parse(value);
|
|
37
|
+
}
|
|
38
|
+
return next();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function createQueryProcessor(client: any, _options: QueryProcessorOptions = {}, engine: QueryEngine = 'pg'): QueryProcessor {
|
|
42
|
+
|
|
43
|
+
let options: QueryProcessorOptions = Object.assign({}, DEFAULT_OPTIONS, _options);
|
|
44
|
+
|
|
45
|
+
let queryOptions: ConverterOptions = {
|
|
46
|
+
lineBreak: options.lineBreaks ? '\n' : ' ',
|
|
47
|
+
nameEscape: _options.identifierQuote || (engine === 'mysql' ? '`' : '"')
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// function processSql(query: any, sql: string, params: any[] | undefined, callback: any): Promise<any> {
|
|
51
|
+
// if (options.logging) log.i(sql);
|
|
52
|
+
// if (options.logger) options.logger(sql, params);
|
|
53
|
+
|
|
54
|
+
// return new Promise((resolve, reject) => {
|
|
55
|
+
// callback(sql, params, (err: any, result: any) => {
|
|
56
|
+
// if (err) reject(err);
|
|
57
|
+
// else resolve(convertResult(query, result, engine));
|
|
58
|
+
// });
|
|
59
|
+
// });
|
|
60
|
+
// }
|
|
61
|
+
|
|
62
|
+
// function executeSql(sql: string, params: any[] | undefined, cb: any) {
|
|
63
|
+
// if (engine === 'pg') {
|
|
64
|
+
// client.query(sql, params || cb, params ? cb : undefined);
|
|
65
|
+
// } else if (engine === 'mysql') {
|
|
66
|
+
// client.query({
|
|
67
|
+
// sql,
|
|
68
|
+
// values: params,
|
|
69
|
+
// typeCast: mySqlTypeCast
|
|
70
|
+
// }, cb);
|
|
71
|
+
// } else throw new Error('Unknown DB engine: ' + engine);
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
return (query: any) => {
|
|
75
|
+
if (options.parameterized) {
|
|
76
|
+
let { sql, params } = convertQueryToParameterizedSQL(query, queryOptions, engine);
|
|
77
|
+
// if (Helpers.isWebSQL || Helpers.isNode) {
|
|
78
|
+
return client.query(sql, params);
|
|
79
|
+
// }
|
|
80
|
+
// return processSql(query, sql, params, (sql: string, params: any[], cb: any) => executeSql(sql, params, cb));
|
|
81
|
+
} else {
|
|
82
|
+
let sql = convertQueryToSQL(query, queryOptions, engine);
|
|
83
|
+
// if (Helpers.isWebSQL || Helpers.isNode) {
|
|
84
|
+
return client.query(sql, undefined);
|
|
85
|
+
// }
|
|
86
|
+
// return processSql(query, sql, undefined, (sql: string, params: undefined, cb: any) => executeSql(sql, undefined, cb));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -1,31 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.convertSubstitutionParam = convertSubstitutionParam;
|
|
4
|
-
exports.convertEscapedParam = convertEscapedParam;
|
|
5
|
-
function convertSubstitutionParam(param) {
|
|
6
|
-
if (param == null)
|
|
7
|
-
return 'NULL';
|
|
1
|
+
export function convertSubstitutionParam(param: any): string {
|
|
2
|
+
if (param == null) return 'NULL';
|
|
8
3
|
if (typeof param === 'string' || param instanceof String) {
|
|
9
4
|
return `'${String(param)}'`;
|
|
10
|
-
}
|
|
11
|
-
else if (typeof param === 'boolean' || param instanceof Boolean) {
|
|
5
|
+
} else if (typeof param === 'boolean' || param instanceof Boolean) {
|
|
12
6
|
return String(param).toUpperCase();
|
|
13
|
-
}
|
|
14
|
-
else if (param instanceof Date) {
|
|
7
|
+
} else if (param instanceof Date) {
|
|
15
8
|
return `'${param.toISOString()}'`;
|
|
16
|
-
}
|
|
17
|
-
else if (typeof param === 'number' || param instanceof Number) {
|
|
9
|
+
} else if (typeof param === 'number' || param instanceof Number) {
|
|
18
10
|
return String(param);
|
|
19
11
|
}
|
|
20
12
|
return `'${JSON.stringify(param)}'`;
|
|
21
13
|
}
|
|
14
|
+
|
|
22
15
|
// node mysql doesn't have an typeCast equivalent solution for the other direction
|
|
23
16
|
// node-postgres: https://github.com/brianc/node-postgres/issues/442
|
|
24
|
-
function convertEscapedParam(param) {
|
|
17
|
+
export function convertEscapedParam(param: any) {
|
|
25
18
|
if (typeof param === 'object' && !(param == null || param instanceof String || param instanceof Number ||
|
|
26
19
|
param instanceof Boolean || param instanceof Date)) {
|
|
27
20
|
return JSON.stringify(param);
|
|
28
21
|
}
|
|
29
22
|
return param;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=param-converter.js.map
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {createQueryConverter} from "./query-converter";
|
|
2
|
+
import {convertEscapedParam} from './param-converter';
|
|
3
|
+
import {QueryEngine, ConverterOptions} from "./types";
|
|
4
|
+
|
|
5
|
+
let pgParamConverter = (index: number) => '$' + index;
|
|
6
|
+
let mySqlParamConverter = (index: number) => '?';
|
|
7
|
+
|
|
8
|
+
function convertSingleParam(param: any, params: any[], paramConverter: (param: any) => string): string {
|
|
9
|
+
params.push(convertEscapedParam(param));
|
|
10
|
+
return paramConverter(params.length);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function convertQueryToParameterizedSQL(query: any, options: ConverterOptions, engine: QueryEngine) {
|
|
14
|
+
let params: any[] = [];
|
|
15
|
+
|
|
16
|
+
let paramConverter = engine === 'mysql' ? mySqlParamConverter : pgParamConverter;
|
|
17
|
+
let sql = createQueryConverter((param: any) => convertSingleParam(param, params, paramConverter), options, engine)(query);
|
|
18
|
+
|
|
19
|
+
return { sql, params };
|
|
20
|
+
}
|