@simplysm/orm-common 13.0.69 → 13.0.71
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 +54 -1447
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +9 -9
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +2 -2
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/table-ddl.d.ts +24 -24
- package/dist/ddl/table-ddl.js +4 -4
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +3 -3
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +160 -160
- package/dist/exec/queryable.js +119 -119
- package/dist/exec/queryable.js.map +1 -1
- package/dist/exec/search-parser.d.ts +37 -37
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr.d.ts +257 -257
- package/dist/expr/expr.js +265 -265
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
- package/dist/query-builder/base/expr-renderer-base.js +2 -2
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +26 -26
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +22 -22
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts +79 -79
- package/dist/schema/factory/column-builder.js +42 -42
- package/dist/schema/factory/index-builder.d.ts +39 -39
- package/dist/schema/factory/index-builder.js +26 -26
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +38 -38
- package/dist/schema/procedure-builder.d.ts +49 -49
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +33 -33
- package/dist/schema/table-builder.d.ts +59 -59
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +43 -43
- package/dist/schema/view-builder.d.ts +49 -49
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +32 -32
- package/dist/types/column.d.ts +22 -22
- package/dist/types/column.js +1 -1
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +40 -40
- package/dist/types/expr.d.ts +59 -59
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +44 -44
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +3 -3
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +5 -5
- package/src/create-db-context.ts +20 -20
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +259 -259
- package/src/ddl/relation-ddl.ts +89 -89
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +189 -189
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +2033 -2033
- package/src/exec/search-parser.ts +57 -57
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +2140 -2140
- package/src/query-builder/base/expr-renderer-base.ts +237 -237
- package/src/query-builder/base/query-builder-base.ts +213 -213
- package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
- package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
- package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
- package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
- package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
- package/src/query-builder/query-builder.ts +19 -19
- package/src/schema/factory/column-builder.ts +423 -423
- package/src/schema/factory/index-builder.ts +164 -164
- package/src/schema/factory/relation-builder.ts +453 -453
- package/src/schema/procedure-builder.ts +232 -232
- package/src/schema/table-builder.ts +319 -319
- package/src/schema/view-builder.ts +221 -221
- package/src/types/column.ts +188 -188
- package/src/types/db.ts +208 -208
- package/src/types/expr.ts +697 -697
- package/src/types/query-def.ts +513 -513
- package/src/utils/result-parser.ts +458 -458
- package/tests/db-context/create-db-context.spec.ts +224 -0
- package/tests/db-context/define-db-context.spec.ts +68 -0
- package/tests/ddl/basic.expected.ts +341 -0
- package/tests/ddl/basic.spec.ts +714 -0
- package/tests/ddl/column-builder.expected.ts +310 -0
- package/tests/ddl/column-builder.spec.ts +637 -0
- package/tests/ddl/index-builder.expected.ts +38 -0
- package/tests/ddl/index-builder.spec.ts +202 -0
- package/tests/ddl/procedure-builder.expected.ts +52 -0
- package/tests/ddl/procedure-builder.spec.ts +234 -0
- package/tests/ddl/relation-builder.expected.ts +36 -0
- package/tests/ddl/relation-builder.spec.ts +372 -0
- package/tests/ddl/table-builder.expected.ts +113 -0
- package/tests/ddl/table-builder.spec.ts +433 -0
- package/tests/ddl/view-builder.expected.ts +38 -0
- package/tests/ddl/view-builder.spec.ts +176 -0
- package/tests/dml/delete.expected.ts +96 -0
- package/tests/dml/delete.spec.ts +160 -0
- package/tests/dml/insert.expected.ts +192 -0
- package/tests/dml/insert.spec.ts +288 -0
- package/tests/dml/update.expected.ts +176 -0
- package/tests/dml/update.spec.ts +318 -0
- package/tests/dml/upsert.expected.ts +215 -0
- package/tests/dml/upsert.spec.ts +242 -0
- package/tests/errors/queryable-errors.spec.ts +177 -0
- package/tests/escape.spec.ts +100 -0
- package/tests/examples/pivot.expected.ts +211 -0
- package/tests/examples/pivot.spec.ts +533 -0
- package/tests/examples/sampling.expected.ts +69 -0
- package/tests/examples/sampling.spec.ts +105 -0
- package/tests/examples/unpivot.expected.ts +120 -0
- package/tests/examples/unpivot.spec.ts +226 -0
- package/tests/exec/search-parser.spec.ts +283 -0
- package/tests/executable/basic.expected.ts +18 -0
- package/tests/executable/basic.spec.ts +54 -0
- package/tests/expr/comparison.expected.ts +282 -0
- package/tests/expr/comparison.spec.ts +400 -0
- package/tests/expr/conditional.expected.ts +134 -0
- package/tests/expr/conditional.spec.ts +276 -0
- package/tests/expr/date.expected.ts +332 -0
- package/tests/expr/date.spec.ts +526 -0
- package/tests/expr/math.expected.ts +62 -0
- package/tests/expr/math.spec.ts +106 -0
- package/tests/expr/string.expected.ts +218 -0
- package/tests/expr/string.spec.ts +356 -0
- package/tests/expr/utility.expected.ts +147 -0
- package/tests/expr/utility.spec.ts +182 -0
- package/tests/select/basic.expected.ts +322 -0
- package/tests/select/basic.spec.ts +502 -0
- package/tests/select/filter.expected.ts +357 -0
- package/tests/select/filter.spec.ts +1068 -0
- package/tests/select/group.expected.ts +169 -0
- package/tests/select/group.spec.ts +244 -0
- package/tests/select/join.expected.ts +582 -0
- package/tests/select/join.spec.ts +805 -0
- package/tests/select/order.expected.ts +150 -0
- package/tests/select/order.spec.ts +189 -0
- package/tests/select/recursive-cte.expected.ts +244 -0
- package/tests/select/recursive-cte.spec.ts +514 -0
- package/tests/select/result-meta.spec.ts +270 -0
- package/tests/select/subquery.expected.ts +363 -0
- package/tests/select/subquery.spec.ts +537 -0
- package/tests/select/view.expected.ts +155 -0
- package/tests/select/view.spec.ts +235 -0
- package/tests/select/window.expected.ts +345 -0
- package/tests/select/window.spec.ts +618 -0
- package/tests/setup/MockExecutor.ts +18 -0
- package/tests/setup/TestDbContext.ts +59 -0
- package/tests/setup/models/Company.ts +13 -0
- package/tests/setup/models/Employee.ts +10 -0
- package/tests/setup/models/MonthlySales.ts +11 -0
- package/tests/setup/models/Post.ts +16 -0
- package/tests/setup/models/Sales.ts +10 -0
- package/tests/setup/models/User.ts +19 -0
- package/tests/setup/procedure/GetAllUsers.ts +9 -0
- package/tests/setup/procedure/GetUserById.ts +12 -0
- package/tests/setup/test-utils.ts +72 -0
- package/tests/setup/views/ActiveUsers.ts +8 -0
- package/tests/setup/views/UserSummary.ts +11 -0
- package/tests/types/nullable-queryable-record.spec.ts +145 -0
- package/tests/utils/result-parser-perf.spec.ts +210 -0
- package/tests/utils/result-parser.spec.ts +701 -0
- package/docs/expressions.md +0 -172
- package/docs/queries.md +0 -444
- package/docs/schema.md +0 -245
package/src/ddl/relation-ddl.ts
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
import type { ForeignKeyBuilder } from "../schema/factory/relation-builder";
|
|
2
|
-
import type { IndexBuilder } from "../schema/factory/index-builder";
|
|
3
|
-
import type {
|
|
4
|
-
QueryDef,
|
|
5
|
-
QueryDefObjectName,
|
|
6
|
-
AddPkQueryDef,
|
|
7
|
-
DropPkQueryDef,
|
|
8
|
-
DropFkQueryDef,
|
|
9
|
-
DropIdxQueryDef,
|
|
10
|
-
} from "../types/query-def";
|
|
11
|
-
import type { DbContextBase } from "../types/db-context-def";
|
|
12
|
-
import { getMatchedPrimaryKeys } from "../exec/queryable";
|
|
13
|
-
import { getQueryDefObjectName } from "./table-ddl";
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* DROP PRIMARY KEY QueryDef
|
|
17
|
-
*/
|
|
18
|
-
export function getDropPkQueryDef(table: QueryDefObjectName): DropPkQueryDef {
|
|
19
|
-
return { type: "dropPk", table };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* ADD PRIMARY KEY QueryDef
|
|
24
|
-
*/
|
|
25
|
-
export function getAddPkQueryDef(table: QueryDefObjectName, columns: string[]): AddPkQueryDef {
|
|
26
|
-
return { type: "addPk", table, columns };
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* ADD FOREIGN KEY QueryDef
|
|
31
|
-
*/
|
|
32
|
-
export function getAddFkQueryDef(
|
|
33
|
-
db: DbContextBase,
|
|
34
|
-
table: QueryDefObjectName,
|
|
35
|
-
relationName: string,
|
|
36
|
-
relationDef: ForeignKeyBuilder<any, any>,
|
|
37
|
-
): QueryDef {
|
|
38
|
-
const targetTable = relationDef.meta.targetFn();
|
|
39
|
-
const fkColumns = relationDef.meta.columns;
|
|
40
|
-
const pk = getMatchedPrimaryKeys(fkColumns, targetTable);
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
type: "addFk",
|
|
44
|
-
table,
|
|
45
|
-
foreignKey: {
|
|
46
|
-
name: `FK_${table.name}_${relationName}`,
|
|
47
|
-
fkColumns,
|
|
48
|
-
targetTable: getQueryDefObjectName(db, targetTable),
|
|
49
|
-
targetPkColumns: pk,
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* ADD INDEX QueryDef
|
|
56
|
-
*/
|
|
57
|
-
export function getAddIdxQueryDef(
|
|
58
|
-
table: QueryDefObjectName,
|
|
59
|
-
indexBuilder: IndexBuilder<string[]>,
|
|
60
|
-
): QueryDef {
|
|
61
|
-
const indexMeta = indexBuilder.meta;
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
type: "addIdx",
|
|
65
|
-
table,
|
|
66
|
-
index: {
|
|
67
|
-
name: indexBuilder.meta.name ?? `IDX_${table.name}_${indexMeta.columns.join("_")}`,
|
|
68
|
-
columns: indexMeta.columns.map((col, i) => ({
|
|
69
|
-
name: col,
|
|
70
|
-
orderBy: indexMeta.orderBy?.[i] ?? "ASC",
|
|
71
|
-
})),
|
|
72
|
-
unique: indexMeta.unique,
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* DROP FOREIGN KEY QueryDef
|
|
79
|
-
*/
|
|
80
|
-
export function getDropFkQueryDef(table: QueryDefObjectName, relationName: string): DropFkQueryDef {
|
|
81
|
-
return { type: "dropFk", table, foreignKey: `FK_${table.name}_${relationName}` };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* DROP INDEX QueryDef
|
|
86
|
-
*/
|
|
87
|
-
export function getDropIdxQueryDef(table: QueryDefObjectName, columns: string[]): DropIdxQueryDef {
|
|
88
|
-
return { type: "dropIdx", table, index: `IDX_${table.name}_${columns.join("_")}` };
|
|
89
|
-
}
|
|
1
|
+
import type { ForeignKeyBuilder } from "../schema/factory/relation-builder";
|
|
2
|
+
import type { IndexBuilder } from "../schema/factory/index-builder";
|
|
3
|
+
import type {
|
|
4
|
+
QueryDef,
|
|
5
|
+
QueryDefObjectName,
|
|
6
|
+
AddPkQueryDef,
|
|
7
|
+
DropPkQueryDef,
|
|
8
|
+
DropFkQueryDef,
|
|
9
|
+
DropIdxQueryDef,
|
|
10
|
+
} from "../types/query-def";
|
|
11
|
+
import type { DbContextBase } from "../types/db-context-def";
|
|
12
|
+
import { getMatchedPrimaryKeys } from "../exec/queryable";
|
|
13
|
+
import { getQueryDefObjectName } from "./table-ddl";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate DROP PRIMARY KEY QueryDef
|
|
17
|
+
*/
|
|
18
|
+
export function getDropPkQueryDef(table: QueryDefObjectName): DropPkQueryDef {
|
|
19
|
+
return { type: "dropPk", table };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Generate ADD PRIMARY KEY QueryDef
|
|
24
|
+
*/
|
|
25
|
+
export function getAddPkQueryDef(table: QueryDefObjectName, columns: string[]): AddPkQueryDef {
|
|
26
|
+
return { type: "addPk", table, columns };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Generate ADD FOREIGN KEY QueryDef
|
|
31
|
+
*/
|
|
32
|
+
export function getAddFkQueryDef(
|
|
33
|
+
db: DbContextBase,
|
|
34
|
+
table: QueryDefObjectName,
|
|
35
|
+
relationName: string,
|
|
36
|
+
relationDef: ForeignKeyBuilder<any, any>,
|
|
37
|
+
): QueryDef {
|
|
38
|
+
const targetTable = relationDef.meta.targetFn();
|
|
39
|
+
const fkColumns = relationDef.meta.columns;
|
|
40
|
+
const pk = getMatchedPrimaryKeys(fkColumns, targetTable);
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
type: "addFk",
|
|
44
|
+
table,
|
|
45
|
+
foreignKey: {
|
|
46
|
+
name: `FK_${table.name}_${relationName}`,
|
|
47
|
+
fkColumns,
|
|
48
|
+
targetTable: getQueryDefObjectName(db, targetTable),
|
|
49
|
+
targetPkColumns: pk,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* ADD INDEX QueryDef Generate
|
|
56
|
+
*/
|
|
57
|
+
export function getAddIdxQueryDef(
|
|
58
|
+
table: QueryDefObjectName,
|
|
59
|
+
indexBuilder: IndexBuilder<string[]>,
|
|
60
|
+
): QueryDef {
|
|
61
|
+
const indexMeta = indexBuilder.meta;
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
type: "addIdx",
|
|
65
|
+
table,
|
|
66
|
+
index: {
|
|
67
|
+
name: indexBuilder.meta.name ?? `IDX_${table.name}_${indexMeta.columns.join("_")}`,
|
|
68
|
+
columns: indexMeta.columns.map((col, i) => ({
|
|
69
|
+
name: col,
|
|
70
|
+
orderBy: indexMeta.orderBy?.[i] ?? "ASC",
|
|
71
|
+
})),
|
|
72
|
+
unique: indexMeta.unique,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* DROP FOREIGN KEY QueryDef Generate
|
|
79
|
+
*/
|
|
80
|
+
export function getDropFkQueryDef(table: QueryDefObjectName, relationName: string): DropFkQueryDef {
|
|
81
|
+
return { type: "dropFk", table, foreignKey: `FK_${table.name}_${relationName}` };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* DROP INDEX QueryDef Generate
|
|
86
|
+
*/
|
|
87
|
+
export function getDropIdxQueryDef(table: QueryDefObjectName, columns: string[]): DropIdxQueryDef {
|
|
88
|
+
return { type: "dropIdx", table, index: `IDX_${table.name}_${columns.join("_")}` };
|
|
89
|
+
}
|
package/src/ddl/schema-ddl.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type {
|
|
|
7
7
|
} from "../types/query-def";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* CLEAR SCHEMA QueryDef
|
|
10
|
+
* Generate CLEAR SCHEMA QueryDef
|
|
11
11
|
*/
|
|
12
12
|
export function getClearSchemaQueryDef(params: {
|
|
13
13
|
database: string;
|
|
@@ -17,21 +17,21 @@ export function getClearSchemaQueryDef(params: {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* SCHEMA EXISTS QueryDef
|
|
20
|
+
* Generate SCHEMA EXISTS QueryDef
|
|
21
21
|
*/
|
|
22
22
|
export function getSchemaExistsQueryDef(database: string, schema?: string): SchemaExistsQueryDef {
|
|
23
23
|
return { type: "schemaExists", database, schema };
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* TRUNCATE TABLE QueryDef
|
|
27
|
+
* Generate TRUNCATE TABLE QueryDef
|
|
28
28
|
*/
|
|
29
29
|
export function getTruncateQueryDef(table: QueryDefObjectName): TruncateQueryDef {
|
|
30
30
|
return { type: "truncate", table };
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* SWITCH FK QueryDef
|
|
34
|
+
* Generate SWITCH FK QueryDef
|
|
35
35
|
*/
|
|
36
36
|
export function getSwitchFkQueryDef(
|
|
37
37
|
table: QueryDefObjectName,
|
package/src/ddl/table-ddl.ts
CHANGED
|
@@ -1,189 +1,189 @@
|
|
|
1
|
-
import { TableBuilder } from "../schema/table-builder";
|
|
2
|
-
import { ViewBuilder } from "../schema/view-builder";
|
|
3
|
-
import { ProcedureBuilder } from "../schema/procedure-builder";
|
|
4
|
-
import type { ColumnBuilderRecord } from "../schema/factory/column-builder";
|
|
5
|
-
import type {
|
|
6
|
-
QueryDef,
|
|
7
|
-
QueryDefObjectName,
|
|
8
|
-
DropTableQueryDef,
|
|
9
|
-
RenameTableQueryDef,
|
|
10
|
-
DropViewQueryDef,
|
|
11
|
-
DropProcQueryDef,
|
|
12
|
-
} from "../types/query-def";
|
|
13
|
-
import type { DbContextBase } from "../types/db-context-def";
|
|
14
|
-
import { objClearUndefined } from "@simplysm/core-common";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Builder를 CREATE QueryDef로
|
|
18
|
-
*
|
|
19
|
-
* @param db - DbContext
|
|
20
|
-
* @param builder - Table/View/Procedure
|
|
21
|
-
* @returns CREATE TABLE/VIEW/PROCEDURE QueryDef
|
|
22
|
-
* @throws {Error}
|
|
23
|
-
*/
|
|
24
|
-
export function getCreateObjectQueryDef(
|
|
25
|
-
db: DbContextBase,
|
|
26
|
-
builder: TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>,
|
|
27
|
-
): QueryDef {
|
|
28
|
-
if (builder instanceof TableBuilder) {
|
|
29
|
-
return getCreateTableQueryDef(db, builder);
|
|
30
|
-
} else if (builder instanceof ViewBuilder) {
|
|
31
|
-
return getCreateViewQueryDef(db, builder);
|
|
32
|
-
} else if (builder instanceof ProcedureBuilder) {
|
|
33
|
-
return getCreateProcQueryDef(db, builder);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
throw new Error(
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* CREATE TABLE QueryDef
|
|
41
|
-
*
|
|
42
|
-
* @param db - DbContext
|
|
43
|
-
* @param table -
|
|
44
|
-
* @returns CREATE TABLE QueryDef
|
|
45
|
-
* @throws {Error}
|
|
46
|
-
*/
|
|
47
|
-
export function getCreateTableQueryDef(db: DbContextBase, table: TableBuilder<any, any>): QueryDef {
|
|
48
|
-
const columns = table.meta.columns as ColumnBuilderRecord | undefined;
|
|
49
|
-
if (columns == null) {
|
|
50
|
-
throw new Error(
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
type: "createTable",
|
|
55
|
-
table: getQueryDefObjectName(db, table),
|
|
56
|
-
columns: Object.entries(columns).map(([key, col]) => ({
|
|
57
|
-
name: key,
|
|
58
|
-
dataType: col.meta.dataType,
|
|
59
|
-
autoIncrement: col.meta.autoIncrement,
|
|
60
|
-
nullable: col.meta.nullable,
|
|
61
|
-
default: col.meta.default,
|
|
62
|
-
})),
|
|
63
|
-
primaryKey: table.meta.primaryKey,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* CREATE VIEW QueryDef
|
|
69
|
-
*
|
|
70
|
-
* @param db - DbContext
|
|
71
|
-
* @param view -
|
|
72
|
-
* @returns CREATE VIEW QueryDef
|
|
73
|
-
* @throws {Error}
|
|
74
|
-
*/
|
|
75
|
-
export function getCreateViewQueryDef(
|
|
76
|
-
db: DbContextBase,
|
|
77
|
-
view: ViewBuilder<any, any, any>,
|
|
78
|
-
): QueryDef {
|
|
79
|
-
if (view.meta.viewFn == null) {
|
|
80
|
-
throw new Error(
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const qr = view.meta.viewFn(db);
|
|
84
|
-
const selectDef = qr.getSelectQueryDef();
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
type: "createView",
|
|
88
|
-
view: {
|
|
89
|
-
database: view.meta.database ?? db.database,
|
|
90
|
-
schema: view.meta.schema ?? db.schema,
|
|
91
|
-
name: view.meta.name,
|
|
92
|
-
},
|
|
93
|
-
queryDef: selectDef,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* CREATE PROCEDURE QueryDef
|
|
99
|
-
*
|
|
100
|
-
* @param db - DbContext
|
|
101
|
-
* @param procedure -
|
|
102
|
-
* @returns CREATE PROCEDURE QueryDef
|
|
103
|
-
* @throws {Error}
|
|
104
|
-
*/
|
|
105
|
-
export function getCreateProcQueryDef(
|
|
106
|
-
db: DbContextBase,
|
|
107
|
-
procedure: ProcedureBuilder<any, any>,
|
|
108
|
-
): QueryDef {
|
|
109
|
-
if (procedure.meta.query == null) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const params = procedure.meta.params as ColumnBuilderRecord | undefined;
|
|
114
|
-
const returns = procedure.meta.returns as ColumnBuilderRecord | undefined;
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
type: "createProc",
|
|
118
|
-
procedure: {
|
|
119
|
-
database: procedure.meta.database ?? db.database,
|
|
120
|
-
schema: procedure.meta.schema ?? db.schema,
|
|
121
|
-
name: procedure.meta.name,
|
|
122
|
-
},
|
|
123
|
-
params: params
|
|
124
|
-
? Object.entries(params).map(([key, col]) => ({
|
|
125
|
-
name: key,
|
|
126
|
-
dataType: col.meta.dataType,
|
|
127
|
-
nullable: col.meta.nullable,
|
|
128
|
-
default: col.meta.default,
|
|
129
|
-
}))
|
|
130
|
-
: undefined,
|
|
131
|
-
returns: returns
|
|
132
|
-
? Object.entries(returns).map(([key, col]) => ({
|
|
133
|
-
name: key,
|
|
134
|
-
dataType: col.meta.dataType,
|
|
135
|
-
nullable: col.meta.nullable,
|
|
136
|
-
}))
|
|
137
|
-
: undefined,
|
|
138
|
-
query: procedure.meta.query,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* DROP TABLE QueryDef
|
|
144
|
-
*/
|
|
145
|
-
export function getDropTableQueryDef(table: QueryDefObjectName): DropTableQueryDef {
|
|
146
|
-
return { type: "dropTable", table };
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* RENAME TABLE QueryDef
|
|
151
|
-
*/
|
|
152
|
-
export function getRenameTableQueryDef(
|
|
153
|
-
table: QueryDefObjectName,
|
|
154
|
-
newName: string,
|
|
155
|
-
): RenameTableQueryDef {
|
|
156
|
-
return { type: "renameTable", table, newName };
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* DROP VIEW QueryDef
|
|
161
|
-
*/
|
|
162
|
-
export function getDropViewQueryDef(view: QueryDefObjectName): DropViewQueryDef {
|
|
163
|
-
return { type: "dropView", view };
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* DROP PROCEDURE QueryDef
|
|
168
|
-
*/
|
|
169
|
-
export function getDropProcQueryDef(procedure: QueryDefObjectName): DropProcQueryDef {
|
|
170
|
-
return { type: "dropProc", procedure };
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* TableBuilder/ViewBuilder
|
|
175
|
-
*
|
|
176
|
-
* @param db - DbContext
|
|
177
|
-
* @param tableOrView -
|
|
178
|
-
* @returns
|
|
179
|
-
*/
|
|
180
|
-
export function getQueryDefObjectName(
|
|
181
|
-
db: DbContextBase,
|
|
182
|
-
tableOrView: TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
183
|
-
): QueryDefObjectName {
|
|
184
|
-
return objClearUndefined({
|
|
185
|
-
database: tableOrView.meta.database ?? db.database,
|
|
186
|
-
schema: tableOrView.meta.schema ?? db.schema,
|
|
187
|
-
name: tableOrView.meta.name,
|
|
188
|
-
});
|
|
189
|
-
}
|
|
1
|
+
import { TableBuilder } from "../schema/table-builder";
|
|
2
|
+
import { ViewBuilder } from "../schema/view-builder";
|
|
3
|
+
import { ProcedureBuilder } from "../schema/procedure-builder";
|
|
4
|
+
import type { ColumnBuilderRecord } from "../schema/factory/column-builder";
|
|
5
|
+
import type {
|
|
6
|
+
QueryDef,
|
|
7
|
+
QueryDefObjectName,
|
|
8
|
+
DropTableQueryDef,
|
|
9
|
+
RenameTableQueryDef,
|
|
10
|
+
DropViewQueryDef,
|
|
11
|
+
DropProcQueryDef,
|
|
12
|
+
} from "../types/query-def";
|
|
13
|
+
import type { DbContextBase } from "../types/db-context-def";
|
|
14
|
+
import { objClearUndefined } from "@simplysm/core-common";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Builder를 CREATE QueryDef로 Transform
|
|
18
|
+
*
|
|
19
|
+
* @param db - DbContext instance
|
|
20
|
+
* @param builder - Table/View/Procedure builder
|
|
21
|
+
* @returns CREATE TABLE/VIEW/PROCEDURE QueryDef
|
|
22
|
+
* @throws {Error} When unknown builder type
|
|
23
|
+
*/
|
|
24
|
+
export function getCreateObjectQueryDef(
|
|
25
|
+
db: DbContextBase,
|
|
26
|
+
builder: TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>,
|
|
27
|
+
): QueryDef {
|
|
28
|
+
if (builder instanceof TableBuilder) {
|
|
29
|
+
return getCreateTableQueryDef(db, builder);
|
|
30
|
+
} else if (builder instanceof ViewBuilder) {
|
|
31
|
+
return getCreateViewQueryDef(db, builder);
|
|
32
|
+
} else if (builder instanceof ProcedureBuilder) {
|
|
33
|
+
return getCreateProcQueryDef(db, builder);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
throw new Error(`Unknown builder type: ${typeof builder}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* CREATE TABLE QueryDef Generate
|
|
41
|
+
*
|
|
42
|
+
* @param db - DbContext instance
|
|
43
|
+
* @param table - Table builder
|
|
44
|
+
* @returns CREATE TABLE QueryDef
|
|
45
|
+
* @throws {Error} When table has no columns
|
|
46
|
+
*/
|
|
47
|
+
export function getCreateTableQueryDef(db: DbContextBase, table: TableBuilder<any, any>): QueryDef {
|
|
48
|
+
const columns = table.meta.columns as ColumnBuilderRecord | undefined;
|
|
49
|
+
if (columns == null) {
|
|
50
|
+
throw new Error(`Table '${table.meta.name}' has no columns.`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
type: "createTable",
|
|
55
|
+
table: getQueryDefObjectName(db, table),
|
|
56
|
+
columns: Object.entries(columns).map(([key, col]) => ({
|
|
57
|
+
name: key,
|
|
58
|
+
dataType: col.meta.dataType,
|
|
59
|
+
autoIncrement: col.meta.autoIncrement,
|
|
60
|
+
nullable: col.meta.nullable,
|
|
61
|
+
default: col.meta.default,
|
|
62
|
+
})),
|
|
63
|
+
primaryKey: table.meta.primaryKey,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* CREATE VIEW QueryDef Generate
|
|
69
|
+
*
|
|
70
|
+
* @param db - DbContext instance
|
|
71
|
+
* @param view - View builder
|
|
72
|
+
* @returns CREATE VIEW QueryDef
|
|
73
|
+
* @throws {Error} When view has no viewFn
|
|
74
|
+
*/
|
|
75
|
+
export function getCreateViewQueryDef(
|
|
76
|
+
db: DbContextBase,
|
|
77
|
+
view: ViewBuilder<any, any, any>,
|
|
78
|
+
): QueryDef {
|
|
79
|
+
if (view.meta.viewFn == null) {
|
|
80
|
+
throw new Error(`View '${view.meta.name}' has no viewFn.`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const qr = view.meta.viewFn(db);
|
|
84
|
+
const selectDef = qr.getSelectQueryDef();
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
type: "createView",
|
|
88
|
+
view: {
|
|
89
|
+
database: view.meta.database ?? db.database,
|
|
90
|
+
schema: view.meta.schema ?? db.schema,
|
|
91
|
+
name: view.meta.name,
|
|
92
|
+
},
|
|
93
|
+
queryDef: selectDef,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* CREATE PROCEDURE QueryDef Generate
|
|
99
|
+
*
|
|
100
|
+
* @param db - DbContext instance
|
|
101
|
+
* @param procedure - Procedure builder
|
|
102
|
+
* @returns CREATE PROCEDURE QueryDef
|
|
103
|
+
* @throws {Error} When procedure has no body
|
|
104
|
+
*/
|
|
105
|
+
export function getCreateProcQueryDef(
|
|
106
|
+
db: DbContextBase,
|
|
107
|
+
procedure: ProcedureBuilder<any, any>,
|
|
108
|
+
): QueryDef {
|
|
109
|
+
if (procedure.meta.query == null) {
|
|
110
|
+
throw new Error(`Procedure '${procedure.meta.name}' has no body.`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const params = procedure.meta.params as ColumnBuilderRecord | undefined;
|
|
114
|
+
const returns = procedure.meta.returns as ColumnBuilderRecord | undefined;
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
type: "createProc",
|
|
118
|
+
procedure: {
|
|
119
|
+
database: procedure.meta.database ?? db.database,
|
|
120
|
+
schema: procedure.meta.schema ?? db.schema,
|
|
121
|
+
name: procedure.meta.name,
|
|
122
|
+
},
|
|
123
|
+
params: params
|
|
124
|
+
? Object.entries(params).map(([key, col]) => ({
|
|
125
|
+
name: key,
|
|
126
|
+
dataType: col.meta.dataType,
|
|
127
|
+
nullable: col.meta.nullable,
|
|
128
|
+
default: col.meta.default,
|
|
129
|
+
}))
|
|
130
|
+
: undefined,
|
|
131
|
+
returns: returns
|
|
132
|
+
? Object.entries(returns).map(([key, col]) => ({
|
|
133
|
+
name: key,
|
|
134
|
+
dataType: col.meta.dataType,
|
|
135
|
+
nullable: col.meta.nullable,
|
|
136
|
+
}))
|
|
137
|
+
: undefined,
|
|
138
|
+
query: procedure.meta.query,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* DROP TABLE QueryDef Generate
|
|
144
|
+
*/
|
|
145
|
+
export function getDropTableQueryDef(table: QueryDefObjectName): DropTableQueryDef {
|
|
146
|
+
return { type: "dropTable", table };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* RENAME TABLE QueryDef Generate
|
|
151
|
+
*/
|
|
152
|
+
export function getRenameTableQueryDef(
|
|
153
|
+
table: QueryDefObjectName,
|
|
154
|
+
newName: string,
|
|
155
|
+
): RenameTableQueryDef {
|
|
156
|
+
return { type: "renameTable", table, newName };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* DROP VIEW QueryDef Generate
|
|
161
|
+
*/
|
|
162
|
+
export function getDropViewQueryDef(view: QueryDefObjectName): DropViewQueryDef {
|
|
163
|
+
return { type: "dropView", view };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* DROP PROCEDURE QueryDef Generate
|
|
168
|
+
*/
|
|
169
|
+
export function getDropProcQueryDef(procedure: QueryDefObjectName): DropProcQueryDef {
|
|
170
|
+
return { type: "dropProc", procedure };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Transform TableBuilder/ViewBuilder to QueryDefObjectName
|
|
175
|
+
*
|
|
176
|
+
* @param db - DbContext instance
|
|
177
|
+
* @param tableOrView - Table or View builder
|
|
178
|
+
* @returns Object name information for use in QueryDef
|
|
179
|
+
*/
|
|
180
|
+
export function getQueryDefObjectName(
|
|
181
|
+
db: DbContextBase,
|
|
182
|
+
tableOrView: TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
183
|
+
): QueryDefObjectName {
|
|
184
|
+
return objClearUndefined({
|
|
185
|
+
database: tableOrView.meta.database ?? db.database,
|
|
186
|
+
schema: tableOrView.meta.schema ?? db.schema,
|
|
187
|
+
name: tableOrView.meta.name,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Transaction-related error codes
|
|
3
3
|
*
|
|
4
|
-
* DBMS
|
|
4
|
+
* Abstracts DBMS-specific native error codes for DBMS-independent error handling
|
|
5
5
|
*/
|
|
6
6
|
export enum DbErrorCode {
|
|
7
|
-
/**
|
|
7
|
+
/** No active transaction (no transaction during ROLLBACK) */
|
|
8
8
|
NO_ACTIVE_TRANSACTION = "NO_ACTIVE_TRANSACTION",
|
|
9
9
|
|
|
10
|
-
/**
|
|
10
|
+
/** Transaction already started */
|
|
11
11
|
TRANSACTION_ALREADY_STARTED = "TRANSACTION_ALREADY_STARTED",
|
|
12
12
|
|
|
13
|
-
/**
|
|
13
|
+
/** Deadlock occurred */
|
|
14
14
|
DEADLOCK = "DEADLOCK",
|
|
15
15
|
|
|
16
|
-
/**
|
|
16
|
+
/** Lock timeout */
|
|
17
17
|
LOCK_TIMEOUT = "LOCK_TIMEOUT",
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Database transaction error
|
|
22
22
|
*
|
|
23
|
-
* DBMS
|
|
24
|
-
* DBMS
|
|
23
|
+
* Wraps DBMS-specific native errors with standardized error codes for
|
|
24
|
+
* DBMS-independent error handling
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
27
|
* ```typescript
|
|
@@ -30,7 +30,7 @@ export enum DbErrorCode {
|
|
|
30
30
|
* } catch (err) {
|
|
31
31
|
* if (err instanceof DbTransactionError) {
|
|
32
32
|
* if (err.code === DbErrorCode.NO_ACTIVE_TRANSACTION) {
|
|
33
|
-
* //
|
|
33
|
+
* // Ignore if already rolled back
|
|
34
34
|
* return;
|
|
35
35
|
* }
|
|
36
36
|
* }
|
|
@@ -42,11 +42,11 @@ export class DbTransactionError extends Error {
|
|
|
42
42
|
override readonly name = "DbTransactionError";
|
|
43
43
|
|
|
44
44
|
constructor(
|
|
45
|
-
/**
|
|
45
|
+
/** Standardized error code */
|
|
46
46
|
public readonly code: DbErrorCode,
|
|
47
|
-
/**
|
|
47
|
+
/** Error message */
|
|
48
48
|
message: string,
|
|
49
|
-
/**
|
|
49
|
+
/** Original DBMS error (for debugging) */
|
|
50
50
|
public readonly originalError?: unknown,
|
|
51
51
|
) {
|
|
52
52
|
super(message);
|