@simplysm/orm-node 13.0.0-beta.6
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/.cache/typecheck-node.tsbuildinfo +1 -0
- 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 +50 -0
- package/src/connections/mssql-db-conn.ts +483 -0
- package/src/connections/mysql-db-conn.ts +299 -0
- package/src/connections/postgresql-db-conn.ts +254 -0
- package/src/db-conn-factory.ts +114 -0
- package/src/index.ts +13 -0
- package/src/node-db-context-executor.ts +162 -0
- package/src/pooled-db-conn.ts +175 -0
- package/src/sd-orm.ts +102 -0
- package/src/types/db-conn.ts +196 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XML 변환 유틸리티
|
|
3
|
+
*/
|
|
4
|
+
import type { XmlBuilderOptions } from "fast-xml-parser";
|
|
5
|
+
/**
|
|
6
|
+
* XML 문자열을 객체로 파싱
|
|
7
|
+
* @param str XML 문자열
|
|
8
|
+
* @param options 옵션
|
|
9
|
+
* @param options.stripTagPrefix 태그 prefix 제거 여부 (namespace)
|
|
10
|
+
* @returns 파싱된 객체. 구조:
|
|
11
|
+
* - 속성: `$` 객체에 그룹화
|
|
12
|
+
* - 텍스트 노드: `_` 키에 저장
|
|
13
|
+
* - 자식 요소: 배열로 변환 (루트 요소 제외)
|
|
14
|
+
* @example
|
|
15
|
+
* xmlParse('<root id="1"><item>hello</item></root>');
|
|
16
|
+
* // { root: { $: { id: "1" }, item: [{ _: "hello" }] } }
|
|
17
|
+
*/
|
|
18
|
+
export declare function xmlParse(str: string, options?: {
|
|
19
|
+
stripTagPrefix?: boolean;
|
|
20
|
+
}): unknown;
|
|
21
|
+
/**
|
|
22
|
+
* 객체를 XML 문자열로 직렬화
|
|
23
|
+
* @param obj 직렬화할 객체
|
|
24
|
+
* @param options fast-xml-parser XmlBuilderOptions (선택)
|
|
25
|
+
* @returns XML 문자열
|
|
26
|
+
* @example
|
|
27
|
+
* xmlStringify({
|
|
28
|
+
* root: {
|
|
29
|
+
* $: { id: "1" },
|
|
30
|
+
* item: [{ _: "hello" }, { _: "world" }],
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* // '<root id="1"><item>hello</item><item>world</item></root>'
|
|
34
|
+
*/
|
|
35
|
+
export declare function xmlStringify(obj: unknown, options?: XmlBuilderOptions): string;
|
|
36
|
+
//# sourceMappingURL=xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/utils/xml.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAKzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAarF;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAS9E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Bytes } from "../common.types";
|
|
2
|
+
export interface ZipArchiveProgress {
|
|
3
|
+
fileName: string;
|
|
4
|
+
totalSize: number;
|
|
5
|
+
extractedSize: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* ZIP 아카이브 처리 클래스
|
|
9
|
+
*
|
|
10
|
+
* ZIP 파일의 읽기, 쓰기, 압축/해제를 처리합니다.
|
|
11
|
+
* 내부 캐시를 사용하여 동일 파일의 중복 압축 해제를 방지합니다.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // ZIP 파일 읽기
|
|
15
|
+
* await using archive = new ZipArchive(zipBytes);
|
|
16
|
+
* const content = await archive.get("file.txt");
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // ZIP 파일 생성
|
|
20
|
+
* await using archive = new ZipArchive();
|
|
21
|
+
* archive.write("file.txt", textBytes);
|
|
22
|
+
* archive.write("data.json", jsonBytes);
|
|
23
|
+
* const zipBytes = await archive.compress();
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // 전체 압축 해제 (진행률 표시)
|
|
27
|
+
* await using archive = new ZipArchive(zipBytes);
|
|
28
|
+
* const files = await archive.extractAll((progress) => {
|
|
29
|
+
* console.log(`${progress.fileName}: ${progress.extractedSize}/${progress.totalSize}`);
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
export declare class ZipArchive {
|
|
33
|
+
private readonly _reader?;
|
|
34
|
+
private readonly _cache;
|
|
35
|
+
private _entries?;
|
|
36
|
+
/**
|
|
37
|
+
* ZipArchive 생성
|
|
38
|
+
* @param data ZIP 데이터 (생략 시 새 아카이브 생성)
|
|
39
|
+
*/
|
|
40
|
+
constructor(data?: Blob | Bytes);
|
|
41
|
+
private _getEntries;
|
|
42
|
+
/**
|
|
43
|
+
* 모든 파일을 압축 해제
|
|
44
|
+
* @param progressCallback 진행률 콜백
|
|
45
|
+
*/
|
|
46
|
+
extractAll(progressCallback?: (progress: ZipArchiveProgress) => void): Promise<Map<string, Bytes | undefined>>;
|
|
47
|
+
/**
|
|
48
|
+
* 특정 파일 압축 해제
|
|
49
|
+
* @param fileName 파일 이름
|
|
50
|
+
*/
|
|
51
|
+
get(fileName: string): Promise<Bytes | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* 파일 존재 여부 확인
|
|
54
|
+
* @param fileName 파일 이름
|
|
55
|
+
*/
|
|
56
|
+
exists(fileName: string): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* 파일 쓰기 (캐시에 저장)
|
|
59
|
+
* @param fileName 파일 이름
|
|
60
|
+
* @param bytes 파일 내용
|
|
61
|
+
*/
|
|
62
|
+
write(fileName: string, bytes: Bytes): void;
|
|
63
|
+
/**
|
|
64
|
+
* 캐시된 파일들을 ZIP으로 압축
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* 내부적으로 `extractAll()`을 호출하여 모든 파일을 메모리에 로드한 후 압축합니다.
|
|
68
|
+
* 대용량 ZIP 파일의 경우 메모리 사용량에 주의가 필요합니다.
|
|
69
|
+
*/
|
|
70
|
+
compress(): Promise<Bytes>;
|
|
71
|
+
/**
|
|
72
|
+
* 리더 닫기 및 캐시 정리
|
|
73
|
+
*/
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* await using 지원
|
|
77
|
+
*/
|
|
78
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sd-zip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sd-zip.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/zip/sd-zip.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,CAA6D;IAE9E;;;OAGG;gBACS,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK;YAUjB,WAAW;IAQzB;;;OAGG;IACG,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IAkDpH;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAwBvD;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3C;;;;;;OAMG;IACG,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAiBhC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createPool } from "generic-pool";
|
|
2
|
+
import { PooledDbConn } from "./pooled-db-conn";
|
|
3
|
+
import { MysqlDbConn } from "./connections/mysql-db-conn";
|
|
4
|
+
import { MssqlDbConn } from "./connections/mssql-db-conn";
|
|
5
|
+
import { PostgresqlDbConn } from "./connections/postgresql-db-conn";
|
|
6
|
+
class DbConnFactory {
|
|
7
|
+
// 설정별 커넥션 풀 캐싱
|
|
8
|
+
static _poolMap = /* @__PURE__ */ new Map();
|
|
9
|
+
/**
|
|
10
|
+
* DB 연결 생성
|
|
11
|
+
*
|
|
12
|
+
* 커넥션 풀에서 연결을 획득하여 반환한다.
|
|
13
|
+
* 풀이 없는 경우 새로 생성한다.
|
|
14
|
+
*
|
|
15
|
+
* @param config - 데이터베이스 연결 설정
|
|
16
|
+
* @returns 풀링된 DB 연결 객체
|
|
17
|
+
*/
|
|
18
|
+
static create(config) {
|
|
19
|
+
const pool = this._getOrCreatePool(config);
|
|
20
|
+
return Promise.resolve(new PooledDbConn(pool, config));
|
|
21
|
+
}
|
|
22
|
+
static _getOrCreatePool(config) {
|
|
23
|
+
const configKey = JSON.stringify(
|
|
24
|
+
config,
|
|
25
|
+
(_, value) => value != null && typeof value === "object" && !Array.isArray(value) ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))) : value
|
|
26
|
+
);
|
|
27
|
+
if (!this._poolMap.has(configKey)) {
|
|
28
|
+
const pool = createPool(
|
|
29
|
+
{
|
|
30
|
+
create: async () => {
|
|
31
|
+
const conn = await this._createRawConnection(config);
|
|
32
|
+
await conn.connect();
|
|
33
|
+
return conn;
|
|
34
|
+
},
|
|
35
|
+
destroy: async (conn) => {
|
|
36
|
+
await conn.close();
|
|
37
|
+
},
|
|
38
|
+
validate: (conn) => {
|
|
39
|
+
return Promise.resolve(conn.isConnected);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
min: config.pool?.min ?? 1,
|
|
44
|
+
max: config.pool?.max ?? 10,
|
|
45
|
+
acquireTimeoutMillis: config.pool?.acquireTimeoutMillis ?? 3e4,
|
|
46
|
+
idleTimeoutMillis: config.pool?.idleTimeoutMillis ?? 3e4,
|
|
47
|
+
testOnBorrow: true
|
|
48
|
+
// [중요] 빌려줄 때 validate 실행 여부
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
this._poolMap.set(configKey, pool);
|
|
52
|
+
}
|
|
53
|
+
return this._poolMap.get(configKey);
|
|
54
|
+
}
|
|
55
|
+
static async _createRawConnection(config) {
|
|
56
|
+
if (config.dialect === "mysql") {
|
|
57
|
+
const mysql = await this._ensureModule("mysql");
|
|
58
|
+
return new MysqlDbConn(mysql, config);
|
|
59
|
+
} else if (config.dialect === "postgresql") {
|
|
60
|
+
const pg = await this._ensureModule("pg");
|
|
61
|
+
const pgCopyStreams = await this._ensureModule("pgCopyStreams");
|
|
62
|
+
return new PostgresqlDbConn(pg, pgCopyStreams.from, config);
|
|
63
|
+
} else {
|
|
64
|
+
const tedious = await this._ensureModule("tedious");
|
|
65
|
+
return new MssqlDbConn(tedious, config);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 지연 로딩 모듈 캐시
|
|
69
|
+
static _modules = {};
|
|
70
|
+
static async _ensureModule(name) {
|
|
71
|
+
if (this._modules[name] == null) {
|
|
72
|
+
if (name === "mysql") {
|
|
73
|
+
this._modules.mysql = await import("mysql2/promise");
|
|
74
|
+
} else if (name === "pg") {
|
|
75
|
+
this._modules.pg = await import("pg");
|
|
76
|
+
} else if (name === "pgCopyStreams") {
|
|
77
|
+
this._modules.pgCopyStreams = await import("pg-copy-streams");
|
|
78
|
+
} else {
|
|
79
|
+
this._modules.tedious = await import("tedious");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return this._modules[name];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
DbConnFactory
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=db-conn-factory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/db-conn-factory.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Pool } from \"generic-pool\";\nimport { createPool } from \"generic-pool\";\nimport type { DbConn, DbConnConfig } from \"./types/db-conn\";\nimport { PooledDbConn } from \"./pooled-db-conn\";\nimport { MysqlDbConn } from \"./connections/mysql-db-conn\";\nimport { MssqlDbConn } from \"./connections/mssql-db-conn\";\nimport { PostgresqlDbConn } from \"./connections/postgresql-db-conn\";\n\n/**\n * DB \uC5F0\uACB0 \uD329\uD1A0\uB9AC\n *\n * \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC5F0\uACB0 \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD558\uACE0 \uD480\uB9C1\uC744 \uAD00\uB9AC\uD55C\uB2E4.\n * MSSQL, MySQL, PostgreSQL\uC744 \uC9C0\uC6D0\uD55C\uB2E4.\n */\nexport class DbConnFactory {\n // \uC124\uC815\uBCC4 \uCEE4\uB125\uC158 \uD480 \uCE90\uC2F1\n private static readonly _poolMap = new Map<string, Pool<DbConn>>();\n\n /**\n * DB \uC5F0\uACB0 \uC0DD\uC131\n *\n * \uCEE4\uB125\uC158 \uD480\uC5D0\uC11C \uC5F0\uACB0\uC744 \uD68D\uB4DD\uD558\uC5EC \uBC18\uD658\uD55C\uB2E4.\n * \uD480\uC774 \uC5C6\uB294 \uACBD\uC6B0 \uC0C8\uB85C \uC0DD\uC131\uD55C\uB2E4.\n *\n * @param config - \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC5F0\uACB0 \uC124\uC815\n * @returns \uD480\uB9C1\uB41C DB \uC5F0\uACB0 \uAC1D\uCCB4\n */\n static create(config: DbConnConfig): Promise<DbConn> {\n // 1. \uD480 \uAC00\uC838\uC624\uAE30 (\uC5C6\uC73C\uBA74 \uC0DD\uC131)\n const pool = this._getOrCreatePool(config);\n\n // 2. \uB798\uD37C \uAC1D\uCCB4 \uBC18\uD658\n return Promise.resolve(new PooledDbConn(pool, config));\n }\n\n private static _getOrCreatePool(config: DbConnConfig): Pool<DbConn> {\n // \uAC1D\uCCB4\uB97C \uD0A4\uB85C \uC4F0\uAE30 \uC704\uD574 \uBB38\uC790\uC5F4 \uBCC0\uD658 (\uC911\uCCA9 \uAC1D\uCCB4\uB3C4 \uC815\uB82C\uD558\uC5EC \uB3D9\uC77C \uC124\uC815\uC758 \uC77C\uAD00\uB41C \uD0A4 \uBCF4\uC7A5)\n const configKey = JSON.stringify(config, (_, value: unknown) =>\n value != null && typeof value === \"object\" && !Array.isArray(value)\n ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)))\n : value,\n );\n\n if (!this._poolMap.has(configKey)) {\n const pool = createPool<DbConn>(\n {\n create: async () => {\n const conn = await this._createRawConnection(config);\n await conn.connect();\n return conn;\n },\n destroy: async (conn) => {\n await conn.close(); // \uD480\uC5D0\uC11C \uC81C\uAC70\uB420 \uB54C \uC2E4\uC81C \uC5F0\uACB0 \uC885\uB8CC\n },\n validate: (conn) => {\n // \uD68D\uB4DD \uC2DC \uC5F0\uACB0 \uC0C1\uD0DC \uD655\uC778 (\uB04A\uACA8\uC788\uC73C\uBA74 Pool\uC774 \uD3D0\uAE30\uD558\uACE0 \uC0C8\uB85C \uB9CC\uB4E6)\n return Promise.resolve(conn.isConnected);\n },\n },\n {\n min: config.pool?.min ?? 1,\n max: config.pool?.max ?? 10,\n acquireTimeoutMillis: config.pool?.acquireTimeoutMillis ?? 30000,\n idleTimeoutMillis: config.pool?.idleTimeoutMillis ?? 30000,\n testOnBorrow: true, // [\uC911\uC694] \uBE4C\uB824\uC904 \uB54C validate \uC2E4\uD589 \uC5EC\uBD80\n },\n );\n\n this._poolMap.set(configKey, pool);\n }\n\n return this._poolMap.get(configKey)!;\n }\n\n private static async _createRawConnection(config: DbConnConfig): Promise<DbConn> {\n if (config.dialect === \"mysql\") {\n const mysql = await this._ensureModule(\"mysql\");\n return new MysqlDbConn(mysql, config);\n } else if (config.dialect === \"postgresql\") {\n const pg = await this._ensureModule(\"pg\");\n const pgCopyStreams = await this._ensureModule(\"pgCopyStreams\");\n return new PostgresqlDbConn(pg, pgCopyStreams.from, config);\n } else {\n // mssql, mssql-azure\n const tedious = await this._ensureModule(\"tedious\");\n return new MssqlDbConn(tedious, config);\n }\n }\n\n // \uC9C0\uC5F0 \uB85C\uB529 \uBAA8\uB4C8 \uCE90\uC2DC\n private static readonly _modules: {\n tedious?: typeof import(\"tedious\");\n mysql?: typeof import(\"mysql2/promise\");\n pg?: typeof import(\"pg\");\n pgCopyStreams?: typeof import(\"pg-copy-streams\");\n } = {};\n\n private static async _ensureModule<K extends keyof typeof this._modules>(\n name: K,\n ): Promise<NonNullable<(typeof this._modules)[K]>> {\n if (this._modules[name] == null) {\n if (name === \"mysql\") {\n this._modules.mysql = await import(\"mysql2/promise\");\n } else if (name === \"pg\") {\n this._modules.pg = await import(\"pg\");\n } else if (name === \"pgCopyStreams\") {\n this._modules.pgCopyStreams = await import(\"pg-copy-streams\");\n } else {\n this._modules.tedious = await import(\"tedious\");\n }\n }\n return this._modules[name]!;\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,kBAAkB;AAE3B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AAQ1B,MAAM,cAAc;AAAA;AAAA,EAEzB,OAAwB,WAAW,oBAAI,IAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjE,OAAO,OAAO,QAAuC;AAEnD,UAAM,OAAO,KAAK,iBAAiB,MAAM;AAGzC,WAAO,QAAQ,QAAQ,IAAI,aAAa,MAAM,MAAM,CAAC;AAAA,EACvD;AAAA,EAEA,OAAe,iBAAiB,QAAoC;AAElE,UAAM,YAAY,KAAK;AAAA,MAAU;AAAA,MAAQ,CAAC,GAAG,UAC3C,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC9D,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,IAC/E;AAAA,IACN;AAEA,QAAI,CAAC,KAAK,SAAS,IAAI,SAAS,GAAG;AACjC,YAAM,OAAO;AAAA,QACX;AAAA,UACE,QAAQ,YAAY;AAClB,kBAAM,OAAO,MAAM,KAAK,qBAAqB,MAAM;AACnD,kBAAM,KAAK,QAAQ;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,SAAS,OAAO,SAAS;AACvB,kBAAM,KAAK,MAAM;AAAA,UACnB;AAAA,UACA,UAAU,CAAC,SAAS;AAElB,mBAAO,QAAQ,QAAQ,KAAK,WAAW;AAAA,UACzC;AAAA,QACF;AAAA,QACA;AAAA,UACE,KAAK,OAAO,MAAM,OAAO;AAAA,UACzB,KAAK,OAAO,MAAM,OAAO;AAAA,UACzB,sBAAsB,OAAO,MAAM,wBAAwB;AAAA,UAC3D,mBAAmB,OAAO,MAAM,qBAAqB;AAAA,UACrD,cAAc;AAAA;AAAA,QAChB;AAAA,MACF;AAEA,WAAK,SAAS,IAAI,WAAW,IAAI;AAAA,IACnC;AAEA,WAAO,KAAK,SAAS,IAAI,SAAS;AAAA,EACpC;AAAA,EAEA,aAAqB,qBAAqB,QAAuC;AAC/E,QAAI,OAAO,YAAY,SAAS;AAC9B,YAAM,QAAQ,MAAM,KAAK,cAAc,OAAO;AAC9C,aAAO,IAAI,YAAY,OAAO,MAAM;AAAA,IACtC,WAAW,OAAO,YAAY,cAAc;AAC1C,YAAM,KAAK,MAAM,KAAK,cAAc,IAAI;AACxC,YAAM,gBAAgB,MAAM,KAAK,cAAc,eAAe;AAC9D,aAAO,IAAI,iBAAiB,IAAI,cAAc,MAAM,MAAM;AAAA,IAC5D,OAAO;AAEL,YAAM,UAAU,MAAM,KAAK,cAAc,SAAS;AAClD,aAAO,IAAI,YAAY,SAAS,MAAM;AAAA,IACxC;AAAA,EACF;AAAA;AAAA,EAGA,OAAwB,WAKpB,CAAC;AAAA,EAEL,aAAqB,cACnB,MACiD;AACjD,QAAI,KAAK,SAAS,IAAI,KAAK,MAAM;AAC/B,UAAI,SAAS,SAAS;AACpB,aAAK,SAAS,QAAQ,MAAM,OAAO,gBAAgB;AAAA,MACrD,WAAW,SAAS,MAAM;AACxB,aAAK,SAAS,KAAK,MAAM,OAAO,IAAI;AAAA,MACtC,WAAW,SAAS,iBAAiB;AACnC,aAAK,SAAS,gBAAgB,MAAM,OAAO,iBAAiB;AAAA,MAC9D,OAAO;AACL,aAAK,SAAS,UAAU,MAAM,OAAO,SAAS;AAAA,MAChD;AAAA,IACF;AACA,WAAO,KAAK,SAAS,IAAI;AAAA,EAC3B;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./types/db-conn";
|
|
2
|
+
export * from "./connections/mssql-db-conn";
|
|
3
|
+
export * from "./connections/mysql-db-conn";
|
|
4
|
+
export * from "./connections/postgresql-db-conn";
|
|
5
|
+
export * from "./db-conn-factory";
|
|
6
|
+
export * from "./node-db-context-executor";
|
|
7
|
+
export * from "./pooled-db-conn";
|
|
8
|
+
export * from "./sd-orm";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Types\nexport * from \"./types/db-conn\";\n\n// Connections\nexport * from \"./connections/mssql-db-conn\";\nexport * from \"./connections/mysql-db-conn\";\nexport * from \"./connections/postgresql-db-conn\";\n\n// Core\nexport * from \"./db-conn-factory\";\nexport * from \"./node-db-context-executor\";\nexport * from \"./pooled-db-conn\";\nexport * from \"./sd-orm\";\n"],
|
|
5
|
+
"mappings": "AACA,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { SdError } from "@simplysm/core-common";
|
|
2
|
+
import { createQueryBuilder, parseQueryResult } from "@simplysm/orm-common";
|
|
3
|
+
import { DB_CONN_ERRORS, getDialectFromConfig } from "./types/db-conn";
|
|
4
|
+
import { DbConnFactory } from "./db-conn-factory";
|
|
5
|
+
class NodeDbContextExecutor {
|
|
6
|
+
constructor(_config) {
|
|
7
|
+
this._config = _config;
|
|
8
|
+
this._dialect = getDialectFromConfig(_config);
|
|
9
|
+
}
|
|
10
|
+
_conn;
|
|
11
|
+
_dialect;
|
|
12
|
+
/**
|
|
13
|
+
* DB 연결 수립
|
|
14
|
+
*
|
|
15
|
+
* 커넥션 풀에서 연결을 획득하고 연결 상태를 활성화한다.
|
|
16
|
+
*/
|
|
17
|
+
async connect() {
|
|
18
|
+
this._conn = await DbConnFactory.create(this._config);
|
|
19
|
+
await this._conn.connect();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* DB 연결 종료
|
|
23
|
+
*
|
|
24
|
+
* 커넥션 풀에 연결을 반환한다.
|
|
25
|
+
*
|
|
26
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
27
|
+
*/
|
|
28
|
+
async close() {
|
|
29
|
+
const conn = this._requireConn();
|
|
30
|
+
await conn.close();
|
|
31
|
+
this._conn = void 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 트랜잭션 시작
|
|
35
|
+
*
|
|
36
|
+
* @param isolationLevel - 트랜잭션 격리 수준
|
|
37
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
38
|
+
*/
|
|
39
|
+
async beginTransaction(isolationLevel) {
|
|
40
|
+
const conn = this._requireConn();
|
|
41
|
+
await conn.beginTransaction(isolationLevel);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 트랜잭션 커밋
|
|
45
|
+
*
|
|
46
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
47
|
+
*/
|
|
48
|
+
async commitTransaction() {
|
|
49
|
+
const conn = this._requireConn();
|
|
50
|
+
await conn.commitTransaction();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 트랜잭션 롤백
|
|
54
|
+
*
|
|
55
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
56
|
+
*/
|
|
57
|
+
async rollbackTransaction() {
|
|
58
|
+
const conn = this._requireConn();
|
|
59
|
+
await conn.rollbackTransaction();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 파라미터화된 쿼리 실행
|
|
63
|
+
*
|
|
64
|
+
* @param query - SQL 쿼리 문자열
|
|
65
|
+
* @param params - 쿼리 파라미터 배열
|
|
66
|
+
* @returns 쿼리 결과 배열
|
|
67
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
68
|
+
*/
|
|
69
|
+
async executeParametrized(query, params) {
|
|
70
|
+
const conn = this._requireConn();
|
|
71
|
+
return conn.executeParametrized(query, params);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 대량 데이터 삽입 (네이티브 벌크 API 사용)
|
|
75
|
+
*
|
|
76
|
+
* @param tableName - 대상 테이블명
|
|
77
|
+
* @param columnMetas - 컬럼 메타데이터
|
|
78
|
+
* @param records - 삽입할 레코드 배열
|
|
79
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
80
|
+
*/
|
|
81
|
+
async bulkInsert(tableName, columnMetas, records) {
|
|
82
|
+
const conn = this._requireConn();
|
|
83
|
+
await conn.bulkInsert(tableName, columnMetas, records);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* QueryDef 배열 실행
|
|
87
|
+
*
|
|
88
|
+
* QueryDef를 SQL로 변환하여 실행하고, ResultMeta를 사용하여 결과를 파싱한다.
|
|
89
|
+
*
|
|
90
|
+
* @param defs - 실행할 QueryDef 배열
|
|
91
|
+
* @param resultMetas - 결과 파싱용 메타데이터 배열 (타입 변환에 사용)
|
|
92
|
+
* @returns 각 QueryDef의 실행 결과 배열
|
|
93
|
+
* @throws {Error} 연결되지 않은 상태일 때
|
|
94
|
+
*/
|
|
95
|
+
async executeDefs(defs, resultMetas) {
|
|
96
|
+
const conn = this._requireConn();
|
|
97
|
+
const builder = createQueryBuilder(this._dialect);
|
|
98
|
+
if (resultMetas != null && resultMetas.every((item) => item == null)) {
|
|
99
|
+
const combinedSql = defs.map((def) => builder.build(def).sql).join("\n");
|
|
100
|
+
await conn.execute([combinedSql]);
|
|
101
|
+
return defs.map(() => []);
|
|
102
|
+
}
|
|
103
|
+
const results = [];
|
|
104
|
+
for (let i = 0; i < defs.length; i++) {
|
|
105
|
+
const def = defs[i];
|
|
106
|
+
const meta = resultMetas?.[i];
|
|
107
|
+
const buildResult = builder.build(def);
|
|
108
|
+
const rawResults = await conn.execute([buildResult.sql]);
|
|
109
|
+
const targetResultSet = buildResult.resultSetIndex != null ? rawResults[buildResult.resultSetIndex] : rawResults[0];
|
|
110
|
+
if (meta != null) {
|
|
111
|
+
const parsed = await parseQueryResult(targetResultSet, meta);
|
|
112
|
+
results.push(parsed ?? []);
|
|
113
|
+
} else {
|
|
114
|
+
results.push(targetResultSet);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return results;
|
|
118
|
+
}
|
|
119
|
+
_requireConn() {
|
|
120
|
+
if (this._conn == null) {
|
|
121
|
+
throw new SdError(DB_CONN_ERRORS.NOT_CONNECTED);
|
|
122
|
+
}
|
|
123
|
+
return this._conn;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
NodeDbContextExecutor
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=node-db-context-executor.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/node-db-context-executor.ts"],
|
|
4
|
+
"sourcesContent": ["import { SdError } from \"@simplysm/core-common\";\nimport type {\n DbContextExecutor,\n IsolationLevel,\n QueryDef,\n ResultMeta,\n Dialect,\n ColumnMeta,\n DataRecord,\n} from \"@simplysm/orm-common\";\nimport { createQueryBuilder, parseQueryResult } from \"@simplysm/orm-common\";\nimport type { DbConn, DbConnConfig } from \"./types/db-conn\";\nimport { DB_CONN_ERRORS, getDialectFromConfig } from \"./types/db-conn\";\nimport { DbConnFactory } from \"./db-conn-factory\";\n\n/**\n * Node.js \uD658\uACBD\uC6A9 DbContextExecutor\n *\n * DbContext\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uC2E4\uD589\uAE30\uB85C, \uC2E4\uC81C DB \uC5F0\uACB0\uC744 \uB2F4\uB2F9\uD55C\uB2E4.\n */\nexport class NodeDbContextExecutor implements DbContextExecutor {\n private _conn?: DbConn;\n private readonly _dialect: Dialect;\n\n constructor(private readonly _config: DbConnConfig) {\n this._dialect = getDialectFromConfig(_config);\n }\n\n /**\n * DB \uC5F0\uACB0 \uC218\uB9BD\n *\n * \uCEE4\uB125\uC158 \uD480\uC5D0\uC11C \uC5F0\uACB0\uC744 \uD68D\uB4DD\uD558\uACE0 \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD65C\uC131\uD654\uD55C\uB2E4.\n */\n async connect(): Promise<void> {\n this._conn = await DbConnFactory.create(this._config);\n await this._conn.connect();\n }\n\n /**\n * DB \uC5F0\uACB0 \uC885\uB8CC\n *\n * \uCEE4\uB125\uC158 \uD480\uC5D0 \uC5F0\uACB0\uC744 \uBC18\uD658\uD55C\uB2E4.\n *\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async close(): Promise<void> {\n const conn = this._requireConn();\n await conn.close();\n this._conn = undefined;\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791\n *\n * @param isolationLevel - \uD2B8\uB79C\uC7AD\uC158 \uACA9\uB9AC \uC218\uC900\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {\n const conn = this._requireConn();\n await conn.beginTransaction(isolationLevel);\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uCEE4\uBC0B\n *\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async commitTransaction(): Promise<void> {\n const conn = this._requireConn();\n await conn.commitTransaction();\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uB864\uBC31\n *\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async rollbackTransaction(): Promise<void> {\n const conn = this._requireConn();\n await conn.rollbackTransaction();\n }\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 - \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130 \uBC30\uC5F4\n * @returns \uCFFC\uB9AC \uACB0\uACFC \uBC30\uC5F4\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]> {\n const conn = this._requireConn();\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 {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: DataRecord[]): Promise<void> {\n const conn = this._requireConn();\n await conn.bulkInsert(tableName, columnMetas, records);\n }\n\n /**\n * QueryDef \uBC30\uC5F4 \uC2E4\uD589\n *\n * QueryDef\uB97C SQL\uB85C \uBCC0\uD658\uD558\uC5EC \uC2E4\uD589\uD558\uACE0, ResultMeta\uB97C \uC0AC\uC6A9\uD558\uC5EC \uACB0\uACFC\uB97C \uD30C\uC2F1\uD55C\uB2E4.\n *\n * @param defs - \uC2E4\uD589\uD560 QueryDef \uBC30\uC5F4\n * @param resultMetas - \uACB0\uACFC \uD30C\uC2F1\uC6A9 \uBA54\uD0C0\uB370\uC774\uD130 \uBC30\uC5F4 (\uD0C0\uC785 \uBCC0\uD658\uC5D0 \uC0AC\uC6A9)\n * @returns \uAC01 QueryDef\uC758 \uC2E4\uD589 \uACB0\uACFC \uBC30\uC5F4\n * @throws {Error} \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC740 \uC0C1\uD0DC\uC77C \uB54C\n */\n async executeDefs<T = DataRecord>(defs: QueryDef[], resultMetas?: (ResultMeta | undefined)[]): Promise<T[][]> {\n const conn = this._requireConn();\n\n const builder = createQueryBuilder(this._dialect);\n\n // \uAC00\uC838\uC62C \uB370\uC774\uD130\uAC00 \uC5C6\uB294 \uAC83\uC73C\uB85C \uC635\uC158 \uC124\uC815\uC744 \uD588\uC744 \uB54C, \uD558\uB098\uC758 \uCFFC\uB9AC\uB85C \uD55C\uBC88\uC758 \uC694\uCCAD \uBCF4\uB0C4\n // \uACB0\uACFC\uAC00 \uD544\uC694 \uC5C6\uC73C\uBBC0\uB85C defs.length\uAC1C\uC758 \uBE48 \uBC30\uC5F4\uC744 \uBC18\uD658\uD558\uC5EC \uC778\uD130\uD398\uC774\uC2A4 \uACC4\uC57D \uC720\uC9C0\n if (resultMetas != null && resultMetas.every((item) => item == null)) {\n const combinedSql = defs.map((def) => builder.build(def).sql).join(\"\\n\");\n await conn.execute([combinedSql]);\n return defs.map(() => []) as T[][];\n }\n\n // \uAC01 def\uB97C \uAC1C\uBCC4 \uC2E4\uD589\n const results: T[][] = [];\n for (let i = 0; i < defs.length; i++) {\n const def = defs[i];\n const meta = resultMetas?.[i];\n const buildResult = builder.build(def);\n\n const rawResults = await conn.execute([buildResult.sql]);\n\n // resultSetIndex\uAC00 \uC9C0\uC815\uB41C \uACBD\uC6B0 \uD574\uB2F9 \uC778\uB371\uC2A4\uC758 \uACB0\uACFC\uC14B \uC0AC\uC6A9\n const targetResultSet =\n buildResult.resultSetIndex != null ? rawResults[buildResult.resultSetIndex] : rawResults[0];\n\n if (meta != null) {\n const parsed = await parseQueryResult<T>(targetResultSet as Record<string, unknown>[], meta);\n results.push(parsed ?? []);\n } else {\n results.push(targetResultSet as T[]);\n }\n }\n\n return results;\n }\n\n private _requireConn(): DbConn {\n if (this._conn == null) {\n throw new SdError(DB_CONN_ERRORS.NOT_CONNECTED);\n }\n return this._conn;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,eAAe;AAUxB,SAAS,oBAAoB,wBAAwB;AAErD,SAAS,gBAAgB,4BAA4B;AACrD,SAAS,qBAAqB;AAOvB,MAAM,sBAAmD;AAAA,EAI9D,YAA6B,SAAuB;AAAvB;AAC3B,SAAK,WAAW,qBAAqB,OAAO;AAAA,EAC9C;AAAA,EALQ;AAAA,EACS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWjB,MAAM,UAAyB;AAC7B,SAAK,QAAQ,MAAM,cAAc,OAAO,KAAK,OAAO;AACpD,UAAM,KAAK,MAAM,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAuB;AAC3B,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,KAAK,MAAM;AACjB,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,gBAAgD;AACrE,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,KAAK,iBAAiB,cAAc;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAmC;AACvC,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAqC;AACzC,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,KAAK,oBAAoB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAoB,OAAe,QAA0C;AACjF,UAAM,OAAO,KAAK,aAAa;AAC/B,WAAO,KAAK,oBAAoB,OAAO,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,WAAmB,aAAyC,SAAsC;AACjH,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,KAAK,WAAW,WAAW,aAAa,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,YAA4B,MAAkB,aAA0D;AAC5G,UAAM,OAAO,KAAK,aAAa;AAE/B,UAAM,UAAU,mBAAmB,KAAK,QAAQ;AAIhD,QAAI,eAAe,QAAQ,YAAY,MAAM,CAAC,SAAS,QAAQ,IAAI,GAAG;AACpE,YAAM,cAAc,KAAK,IAAI,CAAC,QAAQ,QAAQ,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI;AACvE,YAAM,KAAK,QAAQ,CAAC,WAAW,CAAC;AAChC,aAAO,KAAK,IAAI,MAAM,CAAC,CAAC;AAAA,IAC1B;AAGA,UAAM,UAAiB,CAAC;AACxB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,MAAM,KAAK,CAAC;AAClB,YAAM,OAAO,cAAc,CAAC;AAC5B,YAAM,cAAc,QAAQ,MAAM,GAAG;AAErC,YAAM,aAAa,MAAM,KAAK,QAAQ,CAAC,YAAY,GAAG,CAAC;AAGvD,YAAM,kBACJ,YAAY,kBAAkB,OAAO,WAAW,YAAY,cAAc,IAAI,WAAW,CAAC;AAE5F,UAAI,QAAQ,MAAM;AAChB,cAAM,SAAS,MAAM,iBAAoB,iBAA8C,IAAI;AAC3F,gBAAQ,KAAK,UAAU,CAAC,CAAC;AAAA,MAC3B,OAAO;AACL,gBAAQ,KAAK,eAAsB;AAAA,MACrC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAuB;AAC7B,QAAI,KAAK,SAAS,MAAM;AACtB,YAAM,IAAI,QAAQ,eAAe,aAAa;AAAA,IAChD;AACA,WAAO,KAAK;AAAA,EACd;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|