@simplysm/orm-node 13.0.0-beta.11
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 +418 -0
- package/dist/connections/mssql-db-conn.js +386 -0
- package/dist/connections/mssql-db-conn.js.map +7 -0
- package/dist/connections/mysql-db-conn.js +227 -0
- package/dist/connections/mysql-db-conn.js.map +7 -0
- package/dist/connections/postgresql-db-conn.js +191 -0
- package/dist/connections/postgresql-db-conn.js.map +7 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/db-conn-factory.js +88 -0
- package/dist/db-conn-factory.js.map +7 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +7 -0
- package/dist/node-db-context-executor.js +129 -0
- package/dist/node-db-context-executor.js.map +7 -0
- package/dist/orm-common/src/db-context.d.ts +669 -0
- package/dist/orm-common/src/db-context.d.ts.map +1 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
- package/dist/orm-common/src/exec/executable.d.ts +79 -0
- package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/queryable.d.ts +708 -0
- package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
- package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr.d.ts +1369 -0
- package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
- package/dist/orm-common/src/index.d.ts +32 -0
- package/dist/orm-common/src/index.d.ts.map +1 -0
- package/dist/orm-common/src/models/system-migration.d.ts +10 -0
- package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
- package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
- package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
- package/dist/orm-common/src/types/column.d.ts +172 -0
- package/dist/orm-common/src/types/column.d.ts.map +1 -0
- package/dist/orm-common/src/types/db.d.ts +175 -0
- package/dist/orm-common/src/types/db.d.ts.map +1 -0
- package/dist/orm-common/src/types/expr.d.ts +474 -0
- package/dist/orm-common/src/types/expr.d.ts.map +1 -0
- package/dist/orm-common/src/types/query-def.d.ts +351 -0
- package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
- package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
- package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts +44 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts +38 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +39 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/db-conn-factory.d.ts +25 -0
- package/dist/orm-node/src/db-conn-factory.d.ts.map +1 -0
- package/dist/orm-node/src/index.d.ts +9 -0
- package/dist/orm-node/src/index.d.ts.map +1 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts +77 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts.map +1 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts +79 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/sd-orm.d.ts +78 -0
- package/dist/orm-node/src/sd-orm.d.ts.map +1 -0
- package/dist/orm-node/src/types/db-conn.d.ts +159 -0
- package/dist/orm-node/src/types/db-conn.d.ts.map +1 -0
- package/dist/pooled-db-conn.js +134 -0
- package/dist/pooled-db-conn.js.map +7 -0
- package/dist/sd-orm.js +44 -0
- package/dist/sd-orm.js.map +7 -0
- package/dist/types/db-conn.js +17 -0
- package/dist/types/db-conn.js.map +7 -0
- package/package.json +53 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { EventEmitter } from "@simplysm/core-common";
|
|
2
|
+
import type { Pool } from "generic-pool";
|
|
3
|
+
import type { ColumnMeta, IsolationLevel } from "@simplysm/orm-common";
|
|
4
|
+
import { type DbConn, type DbConnConfig } from "./types/db-conn";
|
|
5
|
+
/**
|
|
6
|
+
* 커넥션 풀에서 관리되는 DB 연결 래퍼
|
|
7
|
+
*
|
|
8
|
+
* generic-pool 라이브러리를 사용하여 커넥션 풀링을 지원한다.
|
|
9
|
+
* 실제 물리 연결은 풀에서 획득하고 반환한다.
|
|
10
|
+
*/
|
|
11
|
+
export declare class PooledDbConn extends EventEmitter<{
|
|
12
|
+
close: void;
|
|
13
|
+
}> implements DbConn {
|
|
14
|
+
private readonly _pool;
|
|
15
|
+
private readonly _initialConfig;
|
|
16
|
+
private _rawConn?;
|
|
17
|
+
constructor(_pool: Pool<DbConn>, _initialConfig: DbConnConfig);
|
|
18
|
+
get config(): DbConnConfig;
|
|
19
|
+
get isConnected(): boolean;
|
|
20
|
+
get isOnTransaction(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 풀에서 DB 연결을 획득한다.
|
|
23
|
+
*
|
|
24
|
+
* @throws {SdError} 이미 연결된 상태일 때
|
|
25
|
+
*/
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* 풀에 DB 연결을 반환한다. (실제 연결을 종료하지 않음)
|
|
29
|
+
*/
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
private readonly _onRawConnClose;
|
|
32
|
+
/**
|
|
33
|
+
* 트랜잭션 시작
|
|
34
|
+
*
|
|
35
|
+
* @param isolationLevel - 트랜잭션 격리 수준
|
|
36
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
37
|
+
*/
|
|
38
|
+
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* 트랜잭션 커밋
|
|
41
|
+
*
|
|
42
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
43
|
+
*/
|
|
44
|
+
commitTransaction(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* 트랜잭션 롤백
|
|
47
|
+
*
|
|
48
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
49
|
+
*/
|
|
50
|
+
rollbackTransaction(): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* SQL 쿼리 실행
|
|
53
|
+
*
|
|
54
|
+
* @param queries - 실행할 SQL 쿼리 배열
|
|
55
|
+
* @returns 각 쿼리의 결과 배열
|
|
56
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
57
|
+
*/
|
|
58
|
+
execute(queries: string[]): Promise<unknown[][]>;
|
|
59
|
+
/**
|
|
60
|
+
* 파라미터화된 SQL 쿼리 실행
|
|
61
|
+
*
|
|
62
|
+
* @param query - SQL 쿼리 문자열
|
|
63
|
+
* @param params - 쿼리 파라미터 배열
|
|
64
|
+
* @returns 쿼리 결과 배열
|
|
65
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
66
|
+
*/
|
|
67
|
+
executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]>;
|
|
68
|
+
/**
|
|
69
|
+
* 대량 데이터 삽입 (네이티브 벌크 API 사용)
|
|
70
|
+
*
|
|
71
|
+
* @param tableName - 대상 테이블명
|
|
72
|
+
* @param columnMetas - 컬럼 메타데이터
|
|
73
|
+
* @param records - 삽입할 레코드 배열
|
|
74
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
75
|
+
*/
|
|
76
|
+
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
77
|
+
private _requireRawConn;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=pooled-db-conn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pooled-db-conn.d.ts","sourceRoot":"","sources":["../../../src/pooled-db-conn.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAkB,KAAK,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIjF;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,YAAY,CAAC;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAE,YAAW,MAAM;IAK7E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAGP,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EACnB,cAAc,EAAE,YAAY;IAM/C,IAAI,MAAM,IAAI,YAAY,CAEzB;IAGD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAGD,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAK9B;IAIF;;;;;OAKG;IACG,gBAAgB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;OAIG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C;;;;;;OAMG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAKtD;;;;;;;OAOG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAKlF;;;;;;;OAOG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC;IAKhB,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { DbContext, IsolationLevel } from "@simplysm/orm-common";
|
|
2
|
+
import type { Type } from "@simplysm/core-common";
|
|
3
|
+
import type { DbConnConfig } from "./types/db-conn";
|
|
4
|
+
/**
|
|
5
|
+
* SdOrm 옵션
|
|
6
|
+
*
|
|
7
|
+
* DbConnConfig보다 우선 적용되는 DbContext 옵션
|
|
8
|
+
*/
|
|
9
|
+
export interface SdOrmOptions {
|
|
10
|
+
/**
|
|
11
|
+
* 데이터베이스 이름 (DbConnConfig의 database 대신 사용)
|
|
12
|
+
*/
|
|
13
|
+
database?: string;
|
|
14
|
+
/**
|
|
15
|
+
* 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
16
|
+
*/
|
|
17
|
+
schema?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Node.js ORM 클래스
|
|
21
|
+
*
|
|
22
|
+
* DbContext와 DB 연결을 관리하는 최상위 클래스입니다.
|
|
23
|
+
* DbContext 타입과 연결 설정을 받아 트랜잭션을 관리합니다.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* class MyDb extends DbContext {
|
|
28
|
+
* readonly user = queryable(this, User);
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* const orm = new SdOrm(MyDb, {
|
|
32
|
+
* dialect: "mysql",
|
|
33
|
+
* host: "localhost",
|
|
34
|
+
* port: 3306,
|
|
35
|
+
* username: "root",
|
|
36
|
+
* password: "password",
|
|
37
|
+
* database: "mydb",
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // 트랜잭션 내에서 실행
|
|
41
|
+
* await orm.connect(async (db) => {
|
|
42
|
+
* const users = await db.user().result();
|
|
43
|
+
* return users;
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // 트랜잭션 없이 실행
|
|
47
|
+
* await orm.connectWithoutTransaction(async (db) => {
|
|
48
|
+
* const users = await db.user().result();
|
|
49
|
+
* return users;
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare class SdOrm<T extends DbContext> {
|
|
54
|
+
readonly dbContextType: Type<T>;
|
|
55
|
+
readonly config: DbConnConfig;
|
|
56
|
+
readonly options?: SdOrmOptions | undefined;
|
|
57
|
+
constructor(dbContextType: Type<T>, config: DbConnConfig, options?: SdOrmOptions | undefined);
|
|
58
|
+
/**
|
|
59
|
+
* 트랜잭션 내에서 콜백 실행
|
|
60
|
+
*
|
|
61
|
+
* @param callback - DB 연결 후 실행할 콜백
|
|
62
|
+
* @param isolationLevel - 트랜잭션 격리 수준
|
|
63
|
+
* @returns 콜백 결과
|
|
64
|
+
*/
|
|
65
|
+
connect<R>(callback: (conn: T) => Promise<R>, isolationLevel?: IsolationLevel): Promise<R>;
|
|
66
|
+
/**
|
|
67
|
+
* 트랜잭션 없이 콜백 실행
|
|
68
|
+
*
|
|
69
|
+
* @param callback - DB 연결 후 실행할 콜백
|
|
70
|
+
* @returns 콜백 결과
|
|
71
|
+
*/
|
|
72
|
+
connectWithoutTransaction<R>(callback: (conn: T) => Promise<R>): Promise<R>;
|
|
73
|
+
/**
|
|
74
|
+
* DbContext 인스턴스 생성
|
|
75
|
+
*/
|
|
76
|
+
private _createDbContext;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sd-orm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-orm.d.ts","sourceRoot":"","sources":["../../../src/sd-orm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,SAAS;IAElC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,YAAY;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY;gBAFtB,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,YAAY,YAAA;IAGjC;;;;;;OAMG;IACG,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAKhG;;;;;OAKG;IACG,yBAAyB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKjF;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { EventEmitter } from "@simplysm/core-common";
|
|
2
|
+
import type { ColumnMeta, Dialect, IsolationLevel } from "@simplysm/orm-common";
|
|
3
|
+
/**
|
|
4
|
+
* DB 연결 기본 타임아웃 (10분)
|
|
5
|
+
*/
|
|
6
|
+
export declare const DB_CONN_DEFAULT_TIMEOUT: number;
|
|
7
|
+
/**
|
|
8
|
+
* DB 연결 에러 메시지
|
|
9
|
+
*/
|
|
10
|
+
export declare const DB_CONN_ERRORS: {
|
|
11
|
+
readonly NOT_CONNECTED: "'Connection'이 연결되어있지 않습니다.";
|
|
12
|
+
readonly ALREADY_CONNECTED: "이미 'Connection'이 연결되어있습니다.";
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* 저수준 DB 연결 인터페이스
|
|
16
|
+
*
|
|
17
|
+
* 각 DBMS별 구현체가 이 인터페이스를 구현합니다.
|
|
18
|
+
* - {@link MysqlDbConn} - MySQL 연결
|
|
19
|
+
* - {@link MssqlDbConn} - MSSQL 연결
|
|
20
|
+
* - {@link PostgresqlDbConn} - PostgreSQL 연결
|
|
21
|
+
*
|
|
22
|
+
* @remarks
|
|
23
|
+
* SdEventEmitter를 상속하여 'close' 이벤트를 발생시킵니다.
|
|
24
|
+
*/
|
|
25
|
+
export interface DbConn extends EventEmitter<{
|
|
26
|
+
close: void;
|
|
27
|
+
}> {
|
|
28
|
+
/**
|
|
29
|
+
* 연결 설정
|
|
30
|
+
*/
|
|
31
|
+
config: DbConnConfig;
|
|
32
|
+
/**
|
|
33
|
+
* 연결 여부
|
|
34
|
+
*/
|
|
35
|
+
isConnected: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* 트랜잭션 진행 여부
|
|
38
|
+
*/
|
|
39
|
+
isOnTransaction: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* DB 연결 수립
|
|
42
|
+
*/
|
|
43
|
+
connect(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* DB 연결 종료
|
|
46
|
+
*/
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* 트랜잭션 시작
|
|
50
|
+
*
|
|
51
|
+
* @param isolationLevel - 격리 수준 (선택)
|
|
52
|
+
*/
|
|
53
|
+
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* 트랜잭션 커밋
|
|
56
|
+
*/
|
|
57
|
+
commitTransaction(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* 트랜잭션 롤백
|
|
60
|
+
*/
|
|
61
|
+
rollbackTransaction(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* SQL 쿼리 배열 실행
|
|
64
|
+
*
|
|
65
|
+
* @param queries - 실행할 SQL 문자열 배열
|
|
66
|
+
* @returns 각 쿼리별 결과 배열의 배열
|
|
67
|
+
*/
|
|
68
|
+
execute(queries: string[]): Promise<unknown[][]>;
|
|
69
|
+
/**
|
|
70
|
+
* 파라미터화된 쿼리 실행
|
|
71
|
+
*
|
|
72
|
+
* @param query - SQL 쿼리 문자열
|
|
73
|
+
* @param params - 바인딩 파라미터 (선택)
|
|
74
|
+
* @returns 결과 배열의 배열
|
|
75
|
+
*/
|
|
76
|
+
executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]>;
|
|
77
|
+
/**
|
|
78
|
+
* 대량 INSERT (네이티브 벌크 API 사용)
|
|
79
|
+
*
|
|
80
|
+
* - MSSQL: tedious BulkLoad
|
|
81
|
+
* - MySQL: LOAD DATA LOCAL INFILE (임시 파일)
|
|
82
|
+
* - PostgreSQL: COPY FROM STDIN
|
|
83
|
+
*
|
|
84
|
+
* @param tableName - 테이블명 (database.table 또는 database.schema.table)
|
|
85
|
+
* @param columnMetas - 컬럼명 → ColumnMeta 매핑
|
|
86
|
+
* @param records - 삽입할 레코드 배열
|
|
87
|
+
*/
|
|
88
|
+
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 커넥션 풀 설정
|
|
92
|
+
*
|
|
93
|
+
* @remarks
|
|
94
|
+
* 각 값의 기본값:
|
|
95
|
+
* - min: 1 (최소 연결 수)
|
|
96
|
+
* - max: 10 (최대 연결 수)
|
|
97
|
+
* - acquireTimeoutMillis: 30000 (연결 획득 타임아웃)
|
|
98
|
+
* - idleTimeoutMillis: 30000 (유휴 연결 타임아웃)
|
|
99
|
+
*/
|
|
100
|
+
export interface DbPoolConfig {
|
|
101
|
+
/** 최소 연결 수 (기본: 1) */
|
|
102
|
+
min?: number;
|
|
103
|
+
/** 최대 연결 수 (기본: 10) */
|
|
104
|
+
max?: number;
|
|
105
|
+
/** 연결 획득 타임아웃 (밀리초, 기본: 30000) */
|
|
106
|
+
acquireTimeoutMillis?: number;
|
|
107
|
+
/** 유휴 연결 타임아웃 (밀리초, 기본: 30000) */
|
|
108
|
+
idleTimeoutMillis?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* DB 연결 설정 타입 (dialect별 분기)
|
|
112
|
+
*/
|
|
113
|
+
export type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConfig;
|
|
114
|
+
/**
|
|
115
|
+
* MySQL 연결 설정
|
|
116
|
+
*/
|
|
117
|
+
export interface MysqlDbConnConfig {
|
|
118
|
+
dialect: "mysql";
|
|
119
|
+
host: string;
|
|
120
|
+
port?: number;
|
|
121
|
+
username: string;
|
|
122
|
+
password: string;
|
|
123
|
+
database?: string;
|
|
124
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
125
|
+
pool?: DbPoolConfig;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* MSSQL 연결 설정
|
|
129
|
+
*/
|
|
130
|
+
export interface MssqlDbConnConfig {
|
|
131
|
+
dialect: "mssql" | "mssql-azure";
|
|
132
|
+
host: string;
|
|
133
|
+
port?: number;
|
|
134
|
+
username: string;
|
|
135
|
+
password: string;
|
|
136
|
+
database?: string;
|
|
137
|
+
schema?: string;
|
|
138
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
139
|
+
pool?: DbPoolConfig;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* PostgreSQL 연결 설정
|
|
143
|
+
*/
|
|
144
|
+
export interface PostgresqlDbConnConfig {
|
|
145
|
+
dialect: "postgresql";
|
|
146
|
+
host: string;
|
|
147
|
+
port?: number;
|
|
148
|
+
username: string;
|
|
149
|
+
password: string;
|
|
150
|
+
database?: string;
|
|
151
|
+
schema?: string;
|
|
152
|
+
defaultIsolationLevel?: IsolationLevel;
|
|
153
|
+
pool?: DbPoolConfig;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* DbConnConfig에서 Dialect 추출
|
|
157
|
+
*/
|
|
158
|
+
export declare function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
159
|
+
//# sourceMappingURL=db-conn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-conn.d.ts","sourceRoot":"","sources":["../../../../src/types/db-conn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createConsola } from "consola";
|
|
2
|
+
import { SdError, EventEmitter } from "@simplysm/core-common";
|
|
3
|
+
import { DB_CONN_ERRORS } from "./types/db-conn";
|
|
4
|
+
const logger = createConsola().withTag("pooled-db-conn");
|
|
5
|
+
class PooledDbConn extends EventEmitter {
|
|
6
|
+
constructor(_pool, _initialConfig) {
|
|
7
|
+
super();
|
|
8
|
+
this._pool = _pool;
|
|
9
|
+
this._initialConfig = _initialConfig;
|
|
10
|
+
}
|
|
11
|
+
// 풀에서 빌려온 실제 물리 커넥션
|
|
12
|
+
_rawConn;
|
|
13
|
+
// [Property] config
|
|
14
|
+
get config() {
|
|
15
|
+
return this._rawConn?.config ?? this._initialConfig;
|
|
16
|
+
}
|
|
17
|
+
// [Property] isConnected
|
|
18
|
+
get isConnected() {
|
|
19
|
+
return this._rawConn?.isConnected ?? false;
|
|
20
|
+
}
|
|
21
|
+
// [Property] isOnTransaction
|
|
22
|
+
get isOnTransaction() {
|
|
23
|
+
return this._rawConn?.isOnTransaction ?? false;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 풀에서 DB 연결을 획득한다.
|
|
27
|
+
*
|
|
28
|
+
* @throws {SdError} 이미 연결된 상태일 때
|
|
29
|
+
*/
|
|
30
|
+
async connect() {
|
|
31
|
+
if (this._rawConn != null) {
|
|
32
|
+
throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);
|
|
33
|
+
}
|
|
34
|
+
this._rawConn = await this._pool.acquire();
|
|
35
|
+
this._rawConn.on("close", this._onRawConnClose);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 풀에 DB 연결을 반환한다. (실제 연결을 종료하지 않음)
|
|
39
|
+
*/
|
|
40
|
+
async close() {
|
|
41
|
+
if (this._rawConn != null) {
|
|
42
|
+
if (this._rawConn.isOnTransaction) {
|
|
43
|
+
try {
|
|
44
|
+
await this._rawConn.rollbackTransaction();
|
|
45
|
+
} catch (err) {
|
|
46
|
+
logger.warn("\uD480 \uBC18\uD658 \uC2DC \uB864\uBC31 \uC2E4\uD328", err instanceof Error ? err.message : String(err));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this._rawConn.off("close", this._onRawConnClose);
|
|
50
|
+
await this._pool.release(this._rawConn);
|
|
51
|
+
this._rawConn = void 0;
|
|
52
|
+
this.emit("close");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 물리 연결이 끊겼을 때 처리 핸들러
|
|
56
|
+
_onRawConnClose = () => {
|
|
57
|
+
this._rawConn = void 0;
|
|
58
|
+
this.emit("close");
|
|
59
|
+
};
|
|
60
|
+
// --- 아래는 위임(Delegation) 메소드 ---
|
|
61
|
+
/**
|
|
62
|
+
* 트랜잭션 시작
|
|
63
|
+
*
|
|
64
|
+
* @param isolationLevel - 트랜잭션 격리 수준
|
|
65
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
66
|
+
*/
|
|
67
|
+
async beginTransaction(isolationLevel) {
|
|
68
|
+
const conn = this._requireRawConn();
|
|
69
|
+
await conn.beginTransaction(isolationLevel);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 트랜잭션 커밋
|
|
73
|
+
*
|
|
74
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
75
|
+
*/
|
|
76
|
+
async commitTransaction() {
|
|
77
|
+
const conn = this._requireRawConn();
|
|
78
|
+
await conn.commitTransaction();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 트랜잭션 롤백
|
|
82
|
+
*
|
|
83
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
84
|
+
*/
|
|
85
|
+
async rollbackTransaction() {
|
|
86
|
+
const conn = this._requireRawConn();
|
|
87
|
+
await conn.rollbackTransaction();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SQL 쿼리 실행
|
|
91
|
+
*
|
|
92
|
+
* @param queries - 실행할 SQL 쿼리 배열
|
|
93
|
+
* @returns 각 쿼리의 결과 배열
|
|
94
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
95
|
+
*/
|
|
96
|
+
async execute(queries) {
|
|
97
|
+
const conn = this._requireRawConn();
|
|
98
|
+
return conn.execute(queries);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 파라미터화된 SQL 쿼리 실행
|
|
102
|
+
*
|
|
103
|
+
* @param query - SQL 쿼리 문자열
|
|
104
|
+
* @param params - 쿼리 파라미터 배열
|
|
105
|
+
* @returns 쿼리 결과 배열
|
|
106
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
107
|
+
*/
|
|
108
|
+
async executeParametrized(query, params) {
|
|
109
|
+
const conn = this._requireRawConn();
|
|
110
|
+
return conn.executeParametrized(query, params);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 대량 데이터 삽입 (네이티브 벌크 API 사용)
|
|
114
|
+
*
|
|
115
|
+
* @param tableName - 대상 테이블명
|
|
116
|
+
* @param columnMetas - 컬럼 메타데이터
|
|
117
|
+
* @param records - 삽입할 레코드 배열
|
|
118
|
+
* @throws {SdError} 연결이 획득되지 않은 상태일 때
|
|
119
|
+
*/
|
|
120
|
+
async bulkInsert(tableName, columnMetas, records) {
|
|
121
|
+
const conn = this._requireRawConn();
|
|
122
|
+
await conn.bulkInsert(tableName, columnMetas, records);
|
|
123
|
+
}
|
|
124
|
+
_requireRawConn() {
|
|
125
|
+
if (this._rawConn == null) {
|
|
126
|
+
throw new SdError(`${DB_CONN_ERRORS.NOT_CONNECTED} (Pool Connection is not acquired)`);
|
|
127
|
+
}
|
|
128
|
+
return this._rawConn;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export {
|
|
132
|
+
PooledDbConn
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=pooled-db-conn.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/pooled-db-conn.ts"],
|
|
4
|
+
"sourcesContent": ["import { createConsola } from \"consola\";\nimport { SdError, EventEmitter } from \"@simplysm/core-common\";\nimport type { Pool } from \"generic-pool\";\nimport type { ColumnMeta, IsolationLevel } from \"@simplysm/orm-common\";\nimport { DB_CONN_ERRORS, type DbConn, type DbConnConfig } from \"./types/db-conn\";\n\nconst logger = createConsola().withTag(\"pooled-db-conn\");\n\n/**\n * \uCEE4\uB125\uC158 \uD480\uC5D0\uC11C \uAD00\uB9AC\uB418\uB294 DB \uC5F0\uACB0 \uB798\uD37C\n *\n * generic-pool \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD558\uC5EC \uCEE4\uB125\uC158 \uD480\uB9C1\uC744 \uC9C0\uC6D0\uD55C\uB2E4.\n * \uC2E4\uC81C \uBB3C\uB9AC \uC5F0\uACB0\uC740 \uD480\uC5D0\uC11C \uD68D\uB4DD\uD558\uACE0 \uBC18\uD658\uD55C\uB2E4.\n */\nexport class PooledDbConn extends EventEmitter<{ close: void }> implements DbConn {\n // \uD480\uC5D0\uC11C \uBE4C\uB824\uC628 \uC2E4\uC81C \uBB3C\uB9AC \uCEE4\uB125\uC158\n private _rawConn?: DbConn;\n\n constructor(\n private readonly _pool: Pool<DbConn>,\n private readonly _initialConfig: DbConnConfig,\n ) {\n super();\n }\n\n // [Property] config\n get config(): DbConnConfig {\n return this._rawConn?.config ?? this._initialConfig;\n }\n\n // [Property] isConnected\n get isConnected(): boolean {\n return this._rawConn?.isConnected ?? false;\n }\n\n // [Property] isOnTransaction\n get isOnTransaction(): boolean {\n return this._rawConn?.isOnTransaction ?? false;\n }\n\n /**\n * \uD480\uC5D0\uC11C DB \uC5F0\uACB0\uC744 \uD68D\uB4DD\uD55C\uB2E4.\n *\n * @throws {SdError} \uC774\uBBF8 \uC5F0\uACB0\uB41C \uC0C1\uD0DC\uC77C \uB54C\n */\n async connect(): Promise<void> {\n if (this._rawConn != null) {\n throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);\n }\n\n // 1. \uD480\uC5D0\uC11C \uCEE4\uB125\uC158 \uD68D\uB4DD\n this._rawConn = await this._pool.acquire();\n\n // 2. \uBB3C\uB9AC \uC5F0\uACB0\uC774 (\uD0C0\uC784\uC544\uC6C3 \uB4F1\uC73C\uB85C) \uB04A\uC5B4\uC9C8 \uACBD\uC6B0\uB97C \uB300\uBE44\uD574 \uB9AC\uC2A4\uB108 \uB4F1\uB85D\n // \uB9CC\uC57D \uC0AC\uC6A9 \uC911\uC5D0 \uB04A\uAE30\uBA74 PooledDbConn\uB3C4 close \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uCF1C\uC57C \uD568\n this._rawConn.on(\"close\", this._onRawConnClose);\n }\n\n /**\n * \uD480\uC5D0 DB \uC5F0\uACB0\uC744 \uBC18\uD658\uD55C\uB2E4. (\uC2E4\uC81C \uC5F0\uACB0\uC744 \uC885\uB8CC\uD558\uC9C0 \uC54A\uC74C)\n */\n async close(): Promise<void> {\n if (this._rawConn != null) {\n // 1. \uD2B8\uB79C\uC7AD\uC158 \uC9C4\uD589 \uC911\uC774\uBA74 \uB864\uBC31\uD558\uC5EC \uAE68\uB057\uD55C \uC0C1\uD0DC\uB85C \uD480\uC5D0 \uBC18\uD658\n if (this._rawConn.isOnTransaction) {\n try {\n await this._rawConn.rollbackTransaction();\n } catch (err) {\n // \uB864\uBC31 \uC2E4\uD328 \uC2DC \uB85C\uADF8\uB9CC \uB0A8\uAE30\uACE0 \uACC4\uC18D \uC9C4\uD589 (\uC5F0\uACB0\uC774 \uC774\uBBF8 \uB04A\uAE34 \uACBD\uC6B0 \uB4F1)\n logger.warn(\"\uD480 \uBC18\uD658 \uC2DC \uB864\uBC31 \uC2E4\uD328\", err instanceof Error ? err.message : String(err));\n }\n }\n\n // 2. \uB9AC\uC2A4\uB108 \uD574\uC81C (Pool\uC5D0 \uB3CC\uC544\uAC00\uC11C \uB2E4\uB978 \uB798\uD37C\uC5D0 \uC758\uD574 \uC7AC\uC0AC\uC6A9\uB420 \uB54C \uC601\uD5A5 \uC8FC\uC9C0 \uC54A\uB3C4\uB85D)\n this._rawConn.off(\"close\", this._onRawConnClose);\n\n // 3. \uD480\uC5D0 \uCEE4\uB125\uC158 \uBC18\uD658 (\uC2E4\uC81C\uB85C \uB04A\uC9C0 \uC54A\uC74C)\n await this._pool.release(this._rawConn);\n this._rawConn = undefined;\n\n // 4. \uC18C\uBE44\uC790\uC5D0\uAC8C \uB17C\uB9AC\uC801\uC73C\uB85C \uC5F0\uACB0\uC774 \uB2EB\uD614\uC74C\uC744 \uC54C\uB9BC\n this.emit(\"close\");\n }\n }\n\n // \uBB3C\uB9AC \uC5F0\uACB0\uC774 \uB04A\uACBC\uC744 \uB54C \uCC98\uB9AC \uD578\uB4E4\uB7EC\n private readonly _onRawConnClose = () => {\n // \uBB3C\uB9AC \uC5F0\uACB0\uC774 \uB04A\uACBC\uC73C\uBBC0\uB85C \uCC38\uC870 \uC81C\uAC70 (Pool\uC5D0\uC11C\uB294 validate \uC2DC\uC810\uC5D0 \uAC78\uB7EC\uB0BC \uAC83\uC784)\n this._rawConn = undefined;\n // \uC18C\uBE44\uC790\uC5D0\uAC8C \uC54C\uB9BC\n this.emit(\"close\");\n };\n\n // --- \uC544\uB798\uB294 \uC704\uC784(Delegation) \uBA54\uC18C\uB4DC ---\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791\n *\n * @param isolationLevel - \uD2B8\uB79C\uC7AD\uC158 \uACA9\uB9AC \uC218\uC900\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {\n const conn = this._requireRawConn();\n await conn.beginTransaction(isolationLevel);\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uCEE4\uBC0B\n *\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async commitTransaction(): Promise<void> {\n const conn = this._requireRawConn();\n await conn.commitTransaction();\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uB864\uBC31\n *\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async rollbackTransaction(): Promise<void> {\n const conn = this._requireRawConn();\n await conn.rollbackTransaction();\n }\n\n /**\n * SQL \uCFFC\uB9AC \uC2E4\uD589\n *\n * @param queries - \uC2E4\uD589\uD560 SQL \uCFFC\uB9AC \uBC30\uC5F4\n * @returns \uAC01 \uCFFC\uB9AC\uC758 \uACB0\uACFC \uBC30\uC5F4\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async execute(queries: string[]): Promise<unknown[][]> {\n const conn = this._requireRawConn();\n return conn.execute(queries);\n }\n\n /**\n * \uD30C\uB77C\uBBF8\uD130\uD654\uB41C SQL \uCFFC\uB9AC \uC2E4\uD589\n *\n * @param query - SQL \uCFFC\uB9AC \uBB38\uC790\uC5F4\n * @param params - \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130 \uBC30\uC5F4\n * @returns \uCFFC\uB9AC \uACB0\uACFC \uBC30\uC5F4\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]> {\n const conn = this._requireRawConn();\n return conn.executeParametrized(query, params);\n }\n\n /**\n * \uB300\uB7C9 \uB370\uC774\uD130 \uC0BD\uC785 (\uB124\uC774\uD2F0\uBE0C \uBC8C\uD06C API \uC0AC\uC6A9)\n *\n * @param tableName - \uB300\uC0C1 \uD14C\uC774\uBE14\uBA85\n * @param columnMetas - \uCEEC\uB7FC \uBA54\uD0C0\uB370\uC774\uD130\n * @param records - \uC0BD\uC785\uD560 \uB808\uCF54\uB4DC \uBC30\uC5F4\n * @throws {SdError} \uC5F0\uACB0\uC774 \uD68D\uB4DD\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async bulkInsert(\n tableName: string,\n columnMetas: Record<string, ColumnMeta>,\n records: Record<string, unknown>[],\n ): Promise<void> {\n const conn = this._requireRawConn();\n await conn.bulkInsert(tableName, columnMetas, records);\n }\n\n private _requireRawConn(): DbConn {\n if (this._rawConn == null) {\n throw new SdError(`${DB_CONN_ERRORS.NOT_CONNECTED} (Pool Connection is not acquired)`);\n }\n return this._rawConn;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,qBAAqB;AAC9B,SAAS,SAAS,oBAAoB;AAGtC,SAAS,sBAAsD;AAE/D,MAAM,SAAS,cAAc,EAAE,QAAQ,gBAAgB;AAQhD,MAAM,qBAAqB,aAAgD;AAAA,EAIhF,YACmB,OACA,gBACjB;AACA,UAAM;AAHW;AACA;AAAA,EAGnB;AAAA;AAAA,EAPQ;AAAA;AAAA,EAUR,IAAI,SAAuB;AACzB,WAAO,KAAK,UAAU,UAAU,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACzB,WAAO,KAAK,UAAU,eAAe;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,kBAA2B;AAC7B,WAAO,KAAK,UAAU,mBAAmB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAyB;AAC7B,QAAI,KAAK,YAAY,MAAM;AACzB,YAAM,IAAI,QAAQ,eAAe,iBAAiB;AAAA,IACpD;AAGA,SAAK,WAAW,MAAM,KAAK,MAAM,QAAQ;AAIzC,SAAK,SAAS,GAAG,SAAS,KAAK,eAAe;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,YAAY,MAAM;AAEzB,UAAI,KAAK,SAAS,iBAAiB;AACjC,YAAI;AACF,gBAAM,KAAK,SAAS,oBAAoB;AAAA,QAC1C,SAAS,KAAK;AAEZ,iBAAO,KAAK,wDAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC9E;AAAA,MACF;AAGA,WAAK,SAAS,IAAI,SAAS,KAAK,eAAe;AAG/C,YAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ;AACtC,WAAK,WAAW;AAGhB,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGiB,kBAAkB,MAAM;AAEvC,SAAK,WAAW;AAEhB,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,iBAAiB,gBAAgD;AACrE,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,KAAK,iBAAiB,cAAc;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAmC;AACvC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAqC;AACzC,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,KAAK,oBAAoB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,SAAyC;AACrD,UAAM,OAAO,KAAK,gBAAgB;AAClC,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAoB,OAAe,QAA0C;AACjF,UAAM,OAAO,KAAK,gBAAgB;AAClC,WAAO,KAAK,oBAAoB,OAAO,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WACJ,WACA,aACA,SACe;AACf,UAAM,OAAO,KAAK,gBAAgB;AAClC,UAAM,KAAK,WAAW,WAAW,aAAa,OAAO;AAAA,EACvD;AAAA,EAEQ,kBAA0B;AAChC,QAAI,KAAK,YAAY,MAAM;AACzB,YAAM,IAAI,QAAQ,GAAG,eAAe,aAAa,oCAAoC;AAAA,IACvF;AACA,WAAO,KAAK;AAAA,EACd;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/sd-orm.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { NodeDbContextExecutor } from "./node-db-context-executor";
|
|
2
|
+
class SdOrm {
|
|
3
|
+
constructor(dbContextType, config, options) {
|
|
4
|
+
this.dbContextType = dbContextType;
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 트랜잭션 내에서 콜백 실행
|
|
10
|
+
*
|
|
11
|
+
* @param callback - DB 연결 후 실행할 콜백
|
|
12
|
+
* @param isolationLevel - 트랜잭션 격리 수준
|
|
13
|
+
* @returns 콜백 결과
|
|
14
|
+
*/
|
|
15
|
+
async connect(callback, isolationLevel) {
|
|
16
|
+
const db = this._createDbContext();
|
|
17
|
+
return db.connect(async () => callback(db), isolationLevel);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 트랜잭션 없이 콜백 실행
|
|
21
|
+
*
|
|
22
|
+
* @param callback - DB 연결 후 실행할 콜백
|
|
23
|
+
* @returns 콜백 결과
|
|
24
|
+
*/
|
|
25
|
+
async connectWithoutTransaction(callback) {
|
|
26
|
+
const db = this._createDbContext();
|
|
27
|
+
return db.connectWithoutTransaction(async () => callback(db));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* DbContext 인스턴스 생성
|
|
31
|
+
*/
|
|
32
|
+
_createDbContext() {
|
|
33
|
+
const database = this.options?.database ?? ("database" in this.config ? this.config.database : void 0);
|
|
34
|
+
const schema = this.options?.schema ?? ("schema" in this.config ? this.config.schema : void 0);
|
|
35
|
+
return new this.dbContextType(new NodeDbContextExecutor(this.config), {
|
|
36
|
+
database,
|
|
37
|
+
schema
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
SdOrm
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=sd-orm.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sd-orm.ts"],
|
|
4
|
+
"sourcesContent": ["import type { DbContext, IsolationLevel } from \"@simplysm/orm-common\";\nimport type { Type } from \"@simplysm/core-common\";\nimport type { DbConnConfig } from \"./types/db-conn\";\nimport { NodeDbContextExecutor } from \"./node-db-context-executor\";\n\n/**\n * SdOrm \uC635\uC158\n *\n * DbConnConfig\uBCF4\uB2E4 \uC6B0\uC120 \uC801\uC6A9\uB418\uB294 DbContext \uC635\uC158\n */\nexport interface SdOrmOptions {\n /**\n * \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB984 (DbConnConfig\uC758 database \uB300\uC2E0 \uC0AC\uC6A9)\n */\n database?: string;\n\n /**\n * \uC2A4\uD0A4\uB9C8 \uC774\uB984 (MSSQL: dbo, PostgreSQL: public)\n */\n schema?: string;\n}\n\n/**\n * Node.js ORM \uD074\uB798\uC2A4\n *\n * DbContext\uC640 DB \uC5F0\uACB0\uC744 \uAD00\uB9AC\uD558\uB294 \uCD5C\uC0C1\uC704 \uD074\uB798\uC2A4\uC785\uB2C8\uB2E4.\n * DbContext \uD0C0\uC785\uACFC \uC5F0\uACB0 \uC124\uC815\uC744 \uBC1B\uC544 \uD2B8\uB79C\uC7AD\uC158\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.\n *\n * @example\n * ```typescript\n * class MyDb extends DbContext {\n * readonly user = queryable(this, User);\n * }\n *\n * const orm = new SdOrm(MyDb, {\n * dialect: \"mysql\",\n * host: \"localhost\",\n * port: 3306,\n * username: \"root\",\n * password: \"password\",\n * database: \"mydb\",\n * });\n *\n * // \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC2E4\uD589\n * await orm.connect(async (db) => {\n * const users = await db.user().result();\n * return users;\n * });\n *\n * // \uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC774 \uC2E4\uD589\n * await orm.connectWithoutTransaction(async (db) => {\n * const users = await db.user().result();\n * return users;\n * });\n * ```\n */\nexport class SdOrm<T extends DbContext> {\n constructor(\n readonly dbContextType: Type<T>,\n readonly config: DbConnConfig,\n readonly options?: SdOrmOptions,\n ) {}\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uCF5C\uBC31 \uC2E4\uD589\n *\n * @param callback - DB \uC5F0\uACB0 \uD6C4 \uC2E4\uD589\uD560 \uCF5C\uBC31\n * @param isolationLevel - \uD2B8\uB79C\uC7AD\uC158 \uACA9\uB9AC \uC218\uC900\n * @returns \uCF5C\uBC31 \uACB0\uACFC\n */\n async connect<R>(callback: (conn: T) => Promise<R>, isolationLevel?: IsolationLevel): Promise<R> {\n const db = this._createDbContext();\n return db.connect(async () => callback(db), isolationLevel);\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC774 \uCF5C\uBC31 \uC2E4\uD589\n *\n * @param callback - DB \uC5F0\uACB0 \uD6C4 \uC2E4\uD589\uD560 \uCF5C\uBC31\n * @returns \uCF5C\uBC31 \uACB0\uACFC\n */\n async connectWithoutTransaction<R>(callback: (conn: T) => Promise<R>): Promise<R> {\n const db = this._createDbContext();\n return db.connectWithoutTransaction(async () => callback(db));\n }\n\n /**\n * DbContext \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131\n */\n private _createDbContext(): T {\n // database\uB294 options\uC5D0\uC11C \uC6B0\uC120, \uC5C6\uC73C\uBA74 config\uC5D0\uC11C\n const database = this.options?.database ?? (\"database\" in this.config ? this.config.database : undefined);\n\n // schema\uB294 options\uC5D0\uC11C \uC6B0\uC120, \uC5C6\uC73C\uBA74 config\uC5D0\uC11C\n const schema = this.options?.schema ?? (\"schema\" in this.config ? this.config.schema : undefined);\n\n return new this.dbContextType(new NodeDbContextExecutor(this.config), {\n database,\n schema,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,6BAA6B;AAqD/B,MAAM,MAA2B;AAAA,EACtC,YACW,eACA,QACA,SACT;AAHS;AACA;AACA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,MAAM,QAAW,UAAmC,gBAA6C;AAC/F,UAAM,KAAK,KAAK,iBAAiB;AACjC,WAAO,GAAG,QAAQ,YAAY,SAAS,EAAE,GAAG,cAAc;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BAA6B,UAA+C;AAChF,UAAM,KAAK,KAAK,iBAAiB;AACjC,WAAO,GAAG,0BAA0B,YAAY,SAAS,EAAE,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAsB;AAE5B,UAAM,WAAW,KAAK,SAAS,aAAa,cAAc,KAAK,SAAS,KAAK,OAAO,WAAW;AAG/F,UAAM,SAAS,KAAK,SAAS,WAAW,YAAY,KAAK,SAAS,KAAK,OAAO,SAAS;AAEvF,WAAO,IAAI,KAAK,cAAc,IAAI,sBAAsB,KAAK,MAAM,GAAG;AAAA,MACpE;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const DB_CONN_DEFAULT_TIMEOUT = 10 * 60 * 1e3;
|
|
2
|
+
const DB_CONN_ERRORS = {
|
|
3
|
+
NOT_CONNECTED: "'Connection'\uC774 \uC5F0\uACB0\uB418\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
|
|
4
|
+
ALREADY_CONNECTED: "\uC774\uBBF8 'Connection'\uC774 \uC5F0\uACB0\uB418\uC5B4\uC788\uC2B5\uB2C8\uB2E4."
|
|
5
|
+
};
|
|
6
|
+
function getDialectFromConfig(config) {
|
|
7
|
+
if (config.dialect === "mssql-azure") {
|
|
8
|
+
return "mssql";
|
|
9
|
+
}
|
|
10
|
+
return config.dialect;
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
DB_CONN_DEFAULT_TIMEOUT,
|
|
14
|
+
DB_CONN_ERRORS,
|
|
15
|
+
getDialectFromConfig
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=db-conn.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/types/db-conn.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EventEmitter } from \"@simplysm/core-common\";\nimport type { ColumnMeta, Dialect, IsolationLevel } from \"@simplysm/orm-common\";\n\n// ============================================\n// \uACF5\uD1B5 \uC0C1\uC218\n// ============================================\n\n/**\n * DB \uC5F0\uACB0 \uAE30\uBCF8 \uD0C0\uC784\uC544\uC6C3 (10\uBD84)\n */\nexport const DB_CONN_DEFAULT_TIMEOUT = 10 * 60 * 1000;\n\n/**\n * DB \uC5F0\uACB0 \uC5D0\uB7EC \uBA54\uC2DC\uC9C0\n */\nexport const DB_CONN_ERRORS = {\n NOT_CONNECTED: \"'Connection'\uC774 \uC5F0\uACB0\uB418\uC5B4\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\",\n ALREADY_CONNECTED: \"\uC774\uBBF8 'Connection'\uC774 \uC5F0\uACB0\uB418\uC5B4\uC788\uC2B5\uB2C8\uB2E4.\",\n} as const;\n\n// ============================================\n// IDbConn Interface\n// ============================================\n\n/**\n * \uC800\uC218\uC900 DB \uC5F0\uACB0 \uC778\uD130\uD398\uC774\uC2A4\n *\n * \uAC01 DBMS\uBCC4 \uAD6C\uD604\uCCB4\uAC00 \uC774 \uC778\uD130\uD398\uC774\uC2A4\uB97C \uAD6C\uD604\uD569\uB2C8\uB2E4.\n * - {@link MysqlDbConn} - MySQL \uC5F0\uACB0\n * - {@link MssqlDbConn} - MSSQL \uC5F0\uACB0\n * - {@link PostgresqlDbConn} - PostgreSQL \uC5F0\uACB0\n *\n * @remarks\n * SdEventEmitter\uB97C \uC0C1\uC18D\uD558\uC5EC 'close' \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD\uC2DC\uD0B5\uB2C8\uB2E4.\n */\nexport interface DbConn extends EventEmitter<{ close: void }> {\n /**\n * \uC5F0\uACB0 \uC124\uC815\n */\n config: DbConnConfig;\n\n /**\n * \uC5F0\uACB0 \uC5EC\uBD80\n */\n isConnected: boolean;\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC9C4\uD589 \uC5EC\uBD80\n */\n isOnTransaction: boolean;\n\n /**\n * DB \uC5F0\uACB0 \uC218\uB9BD\n */\n connect(): Promise<void>;\n\n /**\n * DB \uC5F0\uACB0 \uC885\uB8CC\n */\n close(): Promise<void>;\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791\n *\n * @param isolationLevel - \uACA9\uB9AC \uC218\uC900 (\uC120\uD0DD)\n */\n beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uCEE4\uBC0B\n */\n commitTransaction(): Promise<void>;\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uB864\uBC31\n */\n rollbackTransaction(): Promise<void>;\n\n /**\n * SQL \uCFFC\uB9AC \uBC30\uC5F4 \uC2E4\uD589\n *\n * @param queries - \uC2E4\uD589\uD560 SQL \uBB38\uC790\uC5F4 \uBC30\uC5F4\n * @returns \uAC01 \uCFFC\uB9AC\uBCC4 \uACB0\uACFC \uBC30\uC5F4\uC758 \uBC30\uC5F4\n */\n execute(queries: string[]): Promise<unknown[][]>;\n\n /**\n * \uD30C\uB77C\uBBF8\uD130\uD654\uB41C \uCFFC\uB9AC \uC2E4\uD589\n *\n * @param query - SQL \uCFFC\uB9AC \uBB38\uC790\uC5F4\n * @param params - \uBC14\uC778\uB529 \uD30C\uB77C\uBBF8\uD130 (\uC120\uD0DD)\n * @returns \uACB0\uACFC \uBC30\uC5F4\uC758 \uBC30\uC5F4\n */\n executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]>;\n\n /**\n * \uB300\uB7C9 INSERT (\uB124\uC774\uD2F0\uBE0C \uBC8C\uD06C API \uC0AC\uC6A9)\n *\n * - MSSQL: tedious BulkLoad\n * - MySQL: LOAD DATA LOCAL INFILE (\uC784\uC2DC \uD30C\uC77C)\n * - PostgreSQL: COPY FROM STDIN\n *\n * @param tableName - \uD14C\uC774\uBE14\uBA85 (database.table \uB610\uB294 database.schema.table)\n * @param columnMetas - \uCEEC\uB7FC\uBA85 \u2192 ColumnMeta \uB9E4\uD551\n * @param records - \uC0BD\uC785\uD560 \uB808\uCF54\uB4DC \uBC30\uC5F4\n */\n bulkInsert(\n tableName: string,\n columnMetas: Record<string, ColumnMeta>,\n records: Record<string, unknown>[],\n ): Promise<void>;\n}\n\n// ============================================\n// DbConnConfig Types\n// ============================================\n\n/**\n * \uCEE4\uB125\uC158 \uD480 \uC124\uC815\n *\n * @remarks\n * \uAC01 \uAC12\uC758 \uAE30\uBCF8\uAC12:\n * - min: 1 (\uCD5C\uC18C \uC5F0\uACB0 \uC218)\n * - max: 10 (\uCD5C\uB300 \uC5F0\uACB0 \uC218)\n * - acquireTimeoutMillis: 30000 (\uC5F0\uACB0 \uD68D\uB4DD \uD0C0\uC784\uC544\uC6C3)\n * - idleTimeoutMillis: 30000 (\uC720\uD734 \uC5F0\uACB0 \uD0C0\uC784\uC544\uC6C3)\n */\nexport interface DbPoolConfig {\n /** \uCD5C\uC18C \uC5F0\uACB0 \uC218 (\uAE30\uBCF8: 1) */\n min?: number;\n /** \uCD5C\uB300 \uC5F0\uACB0 \uC218 (\uAE30\uBCF8: 10) */\n max?: number;\n /** \uC5F0\uACB0 \uD68D\uB4DD \uD0C0\uC784\uC544\uC6C3 (\uBC00\uB9AC\uCD08, \uAE30\uBCF8: 30000) */\n acquireTimeoutMillis?: number;\n /** \uC720\uD734 \uC5F0\uACB0 \uD0C0\uC784\uC544\uC6C3 (\uBC00\uB9AC\uCD08, \uAE30\uBCF8: 30000) */\n idleTimeoutMillis?: number;\n}\n\n/**\n * DB \uC5F0\uACB0 \uC124\uC815 \uD0C0\uC785 (dialect\uBCC4 \uBD84\uAE30)\n */\nexport type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConfig;\n\n/**\n * MySQL \uC5F0\uACB0 \uC124\uC815\n */\nexport interface MysqlDbConnConfig {\n dialect: \"mysql\";\n host: string;\n port?: number;\n username: string;\n password: string;\n database?: string;\n defaultIsolationLevel?: IsolationLevel;\n pool?: DbPoolConfig;\n}\n\n/**\n * MSSQL \uC5F0\uACB0 \uC124\uC815\n */\nexport interface MssqlDbConnConfig {\n dialect: \"mssql\" | \"mssql-azure\";\n host: string;\n port?: number;\n username: string;\n password: string;\n database?: string;\n schema?: string;\n defaultIsolationLevel?: IsolationLevel;\n pool?: DbPoolConfig;\n}\n\n/**\n * PostgreSQL \uC5F0\uACB0 \uC124\uC815\n */\nexport interface PostgresqlDbConnConfig {\n dialect: \"postgresql\";\n host: string;\n port?: number;\n username: string;\n password: string;\n database?: string;\n schema?: string;\n defaultIsolationLevel?: IsolationLevel;\n pool?: DbPoolConfig;\n}\n\n/**\n * DbConnConfig\uC5D0\uC11C Dialect \uCD94\uCD9C\n */\nexport function getDialectFromConfig(config: DbConnConfig): Dialect {\n if (config.dialect === \"mssql-azure\") {\n return \"mssql\";\n }\n return config.dialect;\n}\n"],
|
|
5
|
+
"mappings": "AAUO,MAAM,0BAA0B,KAAK,KAAK;AAK1C,MAAM,iBAAiB;AAAA,EAC5B,eAAe;AAAA,EACf,mBAAmB;AACrB;AA4KO,SAAS,qBAAqB,QAA+B;AAClE,MAAI,OAAO,YAAY,eAAe;AACpC,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAChB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@simplysm/orm-node",
|
|
3
|
+
"sideEffects": false,
|
|
4
|
+
"version": "13.0.0-beta.11",
|
|
5
|
+
"description": "심플리즘 패키지 - ORM 모듈 (node)",
|
|
6
|
+
"author": "김석래",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/kslhunter/simplysm.git",
|
|
10
|
+
"directory": "packages/orm-node"
|
|
11
|
+
},
|
|
12
|
+
"license": "Apache-2.0",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"consola": "^3.4.2",
|
|
21
|
+
"generic-pool": "^3.9.0",
|
|
22
|
+
"@simplysm/core-common": "13.0.0-beta.11",
|
|
23
|
+
"@simplysm/orm-common": "13.0.0-beta.11"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/pg": "^8.16.0",
|
|
27
|
+
"@types/pg-copy-streams": "^1.2.5",
|
|
28
|
+
"mysql2": "^3.17.0",
|
|
29
|
+
"pg": "^8.18.0",
|
|
30
|
+
"pg-copy-streams": "^7.0.0",
|
|
31
|
+
"tedious": "^19.2.1"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"mysql2": "^3.16.0",
|
|
35
|
+
"pg": "^8.16.3",
|
|
36
|
+
"pg-copy-streams": "^7.0.0",
|
|
37
|
+
"tedious": "^19.2.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependenciesMeta": {
|
|
40
|
+
"mysql2": {
|
|
41
|
+
"optional": true
|
|
42
|
+
},
|
|
43
|
+
"pg": {
|
|
44
|
+
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"pg-copy-streams": {
|
|
47
|
+
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"tedious": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|