@simplysm/orm-common 13.0.68 → 13.0.70
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 +104 -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/types/db.ts
CHANGED
|
@@ -1,208 +1,208 @@
|
|
|
1
|
-
import type { ColumnPrimitive, ColumnPrimitiveStr } from "./column";
|
|
2
|
-
import type { QueryDef } from "./query-def";
|
|
3
|
-
import type { DbContextBase, DbContextDdlMethods } from "./db-context-def";
|
|
4
|
-
|
|
5
|
-
// ============================================
|
|
6
|
-
// Database Types
|
|
7
|
-
// ============================================
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 지원하는
|
|
11
|
-
*
|
|
12
|
-
* - `mysql`: MySQL 8.0.14+
|
|
13
|
-
* - `mssql`: Microsoft SQL Server 2012+
|
|
14
|
-
* - `postgresql`: PostgreSQL 9.0+
|
|
15
|
-
*/
|
|
16
|
-
export type Dialect = "mysql" | "mssql" | "postgresql";
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* 지원하는 모든
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```typescript
|
|
25
|
-
* it.each(dialects)("[%s] SQL
|
|
26
|
-
* const builder = createQueryBuilder(dialect);
|
|
27
|
-
* expect(builder.build(def)).toMatchSql(expected[dialect]);
|
|
28
|
-
* });
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export const dialects: Dialect[] = ["mysql", "mssql", "postgresql"];
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* QueryBuilder.build()
|
|
35
|
-
*
|
|
36
|
-
* 빌드된 SQL 문자열과 다중 결과셋
|
|
37
|
-
*
|
|
38
|
-
* @property sql - 빌드된 SQL 문자열
|
|
39
|
-
* @property resultSetIndex -
|
|
40
|
-
* - MySQL INSERT with OUTPUT: 1 (INSERT + SELECT 중 SELECT)
|
|
41
|
-
* @property resultSetStride - 다중 결과에서 N번째마다 결과셋 추출
|
|
42
|
-
* - 예: index=1, stride=2 → 1, 3, 5, 7... 의 결과셋
|
|
43
|
-
* - MySQL 다중 INSERT: INSERT;SELECT; × N → 1, 3, 5...
|
|
44
|
-
*/
|
|
45
|
-
export interface QueryBuildResult {
|
|
46
|
-
sql: string;
|
|
47
|
-
resultSetIndex?: number;
|
|
48
|
-
resultSetStride?: number;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* - `READ_UNCOMMITTED`:
|
|
55
|
-
* - `READ_COMMITTED`:
|
|
56
|
-
* - `REPEATABLE_READ`:
|
|
57
|
-
* - `SERIALIZABLE`: 완전
|
|
58
|
-
*/
|
|
59
|
-
export type IsolationLevel =
|
|
60
|
-
| "READ_UNCOMMITTED"
|
|
61
|
-
| "READ_COMMITTED"
|
|
62
|
-
| "REPEATABLE_READ"
|
|
63
|
-
| "SERIALIZABLE";
|
|
64
|
-
|
|
65
|
-
// ============================================
|
|
66
|
-
// DataRecord -
|
|
67
|
-
// ============================================
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* 재귀적
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```typescript
|
|
76
|
-
* // 단순 레코드
|
|
77
|
-
* type User = { id: number; name: string; }
|
|
78
|
-
*
|
|
79
|
-
* // 중첩
|
|
80
|
-
* type UserWithPosts = {
|
|
81
|
-
* id: number;
|
|
82
|
-
* name: string;
|
|
83
|
-
* posts: { id: number; title: string; }[] // 1:N
|
|
84
|
-
* company: { id: number; name: string; } // N:1
|
|
85
|
-
* }
|
|
86
|
-
* ```
|
|
87
|
-
*/
|
|
88
|
-
export type DataRecord = {
|
|
89
|
-
[key: string]: ColumnPrimitive | DataRecord | DataRecord[];
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// ============================================
|
|
93
|
-
// Executor Interface
|
|
94
|
-
// ============================================
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* DbContext 실행기
|
|
98
|
-
*
|
|
99
|
-
* 실제 DB 연결과
|
|
100
|
-
* NodeDbContextExecutor (서버) 또는 SdOrmServiceClientDbContextExecutor (클라이언트) 구현
|
|
101
|
-
*
|
|
102
|
-
* @example
|
|
103
|
-
* ```typescript
|
|
104
|
-
* // 서버 측 구현 예시
|
|
105
|
-
* class NodeDbContextExecutor implements IDbContextExecutor {
|
|
106
|
-
* async connect(): Promise<void> {
|
|
107
|
-
* await this.connection.connect();
|
|
108
|
-
* }
|
|
109
|
-
* // ...
|
|
110
|
-
* }
|
|
111
|
-
* ```
|
|
112
|
-
*
|
|
113
|
-
* @see {@link DbContext}
|
|
114
|
-
*/
|
|
115
|
-
export interface DbContextExecutor {
|
|
116
|
-
/**
|
|
117
|
-
* DB 연결 수립
|
|
118
|
-
*/
|
|
119
|
-
connect(): Promise<void>;
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* DB 연결
|
|
123
|
-
*/
|
|
124
|
-
close(): Promise<void>;
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* @param isolationLevel -
|
|
130
|
-
*/
|
|
131
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
*
|
|
135
|
-
*/
|
|
136
|
-
commitTransaction(): Promise<void>;
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
*
|
|
140
|
-
*/
|
|
141
|
-
rollbackTransaction(): Promise<void>;
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* QueryDef
|
|
145
|
-
*
|
|
146
|
-
* @template T -
|
|
147
|
-
* @param defs -
|
|
148
|
-
* @param resultMetas -
|
|
149
|
-
* @returns 각 QueryDef별
|
|
150
|
-
*/
|
|
151
|
-
executeDefs<T = DataRecord>(
|
|
152
|
-
defs: QueryDef[],
|
|
153
|
-
resultMetas?: (ResultMeta | undefined)[],
|
|
154
|
-
): Promise<T[][]>;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
* SELECT 결과를 TypeScript 객체로
|
|
161
|
-
*
|
|
162
|
-
* @property columns -
|
|
163
|
-
* @property joins - JOIN 별칭 →
|
|
164
|
-
*/
|
|
165
|
-
export interface ResultMeta {
|
|
166
|
-
columns: Record<string, ColumnPrimitiveStr>;
|
|
167
|
-
joins: Record<string, { isSingle: boolean }>;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// ============================================
|
|
171
|
-
// Migration
|
|
172
|
-
// ============================================
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* @property name -
|
|
180
|
-
* @property up -
|
|
181
|
-
*
|
|
182
|
-
* @example
|
|
183
|
-
* ```typescript
|
|
184
|
-
* const migrations: Migration[] = [
|
|
185
|
-
* {
|
|
186
|
-
* name: "20260105_001_create_user_table",
|
|
187
|
-
* up: async (db) => {
|
|
188
|
-
* await db.createTable(User);
|
|
189
|
-
* },
|
|
190
|
-
* },
|
|
191
|
-
* {
|
|
192
|
-
* name: "20260105_002_add_email_column",
|
|
193
|
-
* up: async (db) => {
|
|
194
|
-
* await db.addColumn(User, "email", {
|
|
195
|
-
* type: "varchar",
|
|
196
|
-
* length: 200,
|
|
197
|
-
* });
|
|
198
|
-
* },
|
|
199
|
-
* },
|
|
200
|
-
* ];
|
|
201
|
-
* ```
|
|
202
|
-
*
|
|
203
|
-
* @see {@link DbContext.initialize}
|
|
204
|
-
*/
|
|
205
|
-
export interface Migration {
|
|
206
|
-
name: string;
|
|
207
|
-
up: (db: DbContextBase & DbContextDdlMethods) => Promise<void>;
|
|
208
|
-
}
|
|
1
|
+
import type { ColumnPrimitive, ColumnPrimitiveStr } from "./column";
|
|
2
|
+
import type { QueryDef } from "./query-def";
|
|
3
|
+
import type { DbContextBase, DbContextDdlMethods } from "./db-context-def";
|
|
4
|
+
|
|
5
|
+
// ============================================
|
|
6
|
+
// Database Types
|
|
7
|
+
// ============================================
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 지원하는 Database 방언
|
|
11
|
+
*
|
|
12
|
+
* - `mysql`: MySQL 8.0.14+
|
|
13
|
+
* - `mssql`: Microsoft SQL Server 2012+
|
|
14
|
+
* - `postgresql`: PostgreSQL 9.0+
|
|
15
|
+
*/
|
|
16
|
+
export type Dialect = "mysql" | "mssql" | "postgresql";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 지원하는 모든 Database 방언 목록
|
|
20
|
+
*
|
|
21
|
+
* testing에서 dialect별 Validation 시 사용
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* it.each(dialects)("[%s] SQL Validation", (dialect) => {
|
|
26
|
+
* const builder = createQueryBuilder(dialect);
|
|
27
|
+
* expect(builder.build(def)).toMatchSql(expected[dialect]);
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const dialects: Dialect[] = ["mysql", "mssql", "postgresql"];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* QueryBuilder.build() return type
|
|
35
|
+
*
|
|
36
|
+
* 빌드된 SQL 문자열과 다중 결과셋 processing를 위한 Metadata
|
|
37
|
+
*
|
|
38
|
+
* @property sql - 빌드된 SQL 문자열
|
|
39
|
+
* @property resultSetIndex - Result를 가져올 결과셋 Index (Basic: 0)
|
|
40
|
+
* - MySQL INSERT with OUTPUT: 1 (INSERT + SELECT 중 SELECT)
|
|
41
|
+
* @property resultSetStride - 다중 결과에서 N번째마다 결과셋 추출
|
|
42
|
+
* - 예: index=1, stride=2 → 1, 3, 5, 7... 의 결과셋 return
|
|
43
|
+
* - MySQL 다중 INSERT: INSERT;SELECT; × N → 1, 3, 5...
|
|
44
|
+
*/
|
|
45
|
+
export interface QueryBuildResult {
|
|
46
|
+
sql: string;
|
|
47
|
+
resultSetIndex?: number;
|
|
48
|
+
resultSetStride?: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Transaction isolation level
|
|
53
|
+
*
|
|
54
|
+
* - `READ_UNCOMMITTED`: commit되지 않은 data read 가능 (Dirty Read)
|
|
55
|
+
* - `READ_COMMITTED`: commit된 data만 read (default)
|
|
56
|
+
* - `REPEATABLE_READ`: Transaction 내 동일 query 동일 result 보장
|
|
57
|
+
* - `SERIALIZABLE`: 완전 serialize (가장 엄격)
|
|
58
|
+
*/
|
|
59
|
+
export type IsolationLevel =
|
|
60
|
+
| "READ_UNCOMMITTED"
|
|
61
|
+
| "READ_COMMITTED"
|
|
62
|
+
| "REPEATABLE_READ"
|
|
63
|
+
| "SERIALIZABLE";
|
|
64
|
+
|
|
65
|
+
// ============================================
|
|
66
|
+
// DataRecord - Result data type (재귀적, 중첩 allow)
|
|
67
|
+
// ============================================
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Query result data record type
|
|
71
|
+
*
|
|
72
|
+
* 재귀적 structure로 중첩 관계(include) result 표현
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* // 단순 레코드
|
|
77
|
+
* type User = { id: number; name: string; }
|
|
78
|
+
*
|
|
79
|
+
* // 중첩 relationship include
|
|
80
|
+
* type UserWithPosts = {
|
|
81
|
+
* id: number;
|
|
82
|
+
* name: string;
|
|
83
|
+
* posts: { id: number; title: string; }[] // 1:N relationship
|
|
84
|
+
* company: { id: number; name: string; } // N:1 relationship
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export type DataRecord = {
|
|
89
|
+
[key: string]: ColumnPrimitive | DataRecord | DataRecord[];
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// ============================================
|
|
93
|
+
// Executor Interface
|
|
94
|
+
// ============================================
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* DbContext 실행기 interface
|
|
98
|
+
*
|
|
99
|
+
* 실제 DB 연결과 Execute query을 담당
|
|
100
|
+
* NodeDbContextExecutor (서버) 또는 SdOrmServiceClientDbContextExecutor (클라이언트) 구현
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* // 서버 측 구현 예시
|
|
105
|
+
* class NodeDbContextExecutor implements IDbContextExecutor {
|
|
106
|
+
* async connect(): Promise<void> {
|
|
107
|
+
* await this.connection.connect();
|
|
108
|
+
* }
|
|
109
|
+
* // ...
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @see {@link DbContext} DbContextused in
|
|
114
|
+
*/
|
|
115
|
+
export interface DbContextExecutor {
|
|
116
|
+
/**
|
|
117
|
+
* DB 연결 수립
|
|
118
|
+
*/
|
|
119
|
+
connect(): Promise<void>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* DB 연결 end
|
|
123
|
+
*/
|
|
124
|
+
close(): Promise<void>;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Transaction start
|
|
128
|
+
*
|
|
129
|
+
* @param isolationLevel - isolation level (Select)
|
|
130
|
+
*/
|
|
131
|
+
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Transaction commit
|
|
135
|
+
*/
|
|
136
|
+
commitTransaction(): Promise<void>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Transaction rollback
|
|
140
|
+
*/
|
|
141
|
+
rollbackTransaction(): Promise<void>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* QueryDef array 실행
|
|
145
|
+
*
|
|
146
|
+
* @template T - Result record type
|
|
147
|
+
* @param defs - Execute할 QueryDef array
|
|
148
|
+
* @param resultMetas - Result Transform을 위한 Metadata (Select)
|
|
149
|
+
* @returns 각 QueryDef별 result 배열의 array
|
|
150
|
+
*/
|
|
151
|
+
executeDefs<T = DataRecord>(
|
|
152
|
+
defs: QueryDef[],
|
|
153
|
+
resultMetas?: (ResultMeta | undefined)[],
|
|
154
|
+
): Promise<T[][]>;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Query result Transform을 위한 Metadata
|
|
159
|
+
*
|
|
160
|
+
* SELECT 결과를 TypeScript 객체로 Transform 시 사용
|
|
161
|
+
*
|
|
162
|
+
* @property columns - Column명 → ColumnPrimitiveStr Mapping
|
|
163
|
+
* @property joins - JOIN 별칭 → 단일/array 여부
|
|
164
|
+
*/
|
|
165
|
+
export interface ResultMeta {
|
|
166
|
+
columns: Record<string, ColumnPrimitiveStr>;
|
|
167
|
+
joins: Record<string, { isSingle: boolean }>;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ============================================
|
|
171
|
+
// Migration
|
|
172
|
+
// ============================================
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Database migration definition
|
|
176
|
+
*
|
|
177
|
+
* schema 변경을 version control
|
|
178
|
+
*
|
|
179
|
+
* @property name - Migration 고유 이름 (타임스탬프 권장)
|
|
180
|
+
* @property up - Migration 실행 function
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* const migrations: Migration[] = [
|
|
185
|
+
* {
|
|
186
|
+
* name: "20260105_001_create_user_table",
|
|
187
|
+
* up: async (db) => {
|
|
188
|
+
* await db.createTable(User);
|
|
189
|
+
* },
|
|
190
|
+
* },
|
|
191
|
+
* {
|
|
192
|
+
* name: "20260105_002_add_email_column",
|
|
193
|
+
* up: async (db) => {
|
|
194
|
+
* await db.addColumn(User, "email", {
|
|
195
|
+
* type: "varchar",
|
|
196
|
+
* length: 200,
|
|
197
|
+
* });
|
|
198
|
+
* },
|
|
199
|
+
* },
|
|
200
|
+
* ];
|
|
201
|
+
* ```
|
|
202
|
+
*
|
|
203
|
+
* @see {@link DbContext.initialize} migration 실행
|
|
204
|
+
*/
|
|
205
|
+
export interface Migration {
|
|
206
|
+
name: string;
|
|
207
|
+
up: (db: DbContextBase & DbContextDdlMethods) => Promise<void>;
|
|
208
|
+
}
|