@simplysm/orm-node 13.0.92 → 13.0.95
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 +5 -35
- package/dist/create-db-conn.d.ts +1 -4
- package/dist/create-db-conn.d.ts.map +1 -1
- package/dist/create-db-conn.js +1 -48
- package/dist/create-db-conn.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/node-db-context-executor.d.ts +0 -4
- package/dist/node-db-context-executor.d.ts.map +1 -1
- package/dist/node-db-context-executor.js +0 -4
- package/dist/node-db-context-executor.js.map +1 -1
- package/dist/types/db-conn.d.ts +0 -23
- package/dist/types/db-conn.d.ts.map +1 -1
- package/dist/types/db-conn.js.map +1 -1
- package/package.json +3 -4
- package/src/create-db-conn.ts +3 -72
- package/src/index.ts +0 -1
- package/src/node-db-context-executor.ts +0 -4
- package/src/types/db-conn.ts +0 -24
- package/dist/pooled-db-conn.d.ts +0 -80
- package/dist/pooled-db-conn.d.ts.map +0 -1
- package/dist/pooled-db-conn.js +0 -144
- package/dist/pooled-db-conn.js.map +0 -6
- package/src/pooled-db-conn.ts +0 -188
package/README.md
CHANGED
|
@@ -16,22 +16,20 @@ npm install pg pg-copy-streams # PostgreSQL
|
|
|
16
16
|
npm install tedious # MSSQL / Azure SQL
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
**의존성:** `@simplysm/core-common`, `@simplysm/orm-common`, `
|
|
19
|
+
**의존성:** `@simplysm/core-common`, `@simplysm/orm-common`, `consola`
|
|
20
20
|
|
|
21
21
|
## 아키텍처 개요
|
|
22
22
|
|
|
23
23
|
```
|
|
24
24
|
createOrm() -- 최상위 팩토리 (ORM 인스턴스)
|
|
25
25
|
└─ NodeDbContextExecutor -- DbContextExecutor 구현체
|
|
26
|
-
└─ createDbConn() --
|
|
27
|
-
└─
|
|
28
|
-
└─ MysqlDbConn / PostgresqlDbConn / MssqlDbConn -- 실제 연결
|
|
26
|
+
└─ createDbConn() -- DB 연결 생성
|
|
27
|
+
└─ MysqlDbConn / PostgresqlDbConn / MssqlDbConn -- 실제 연결
|
|
29
28
|
```
|
|
30
29
|
|
|
31
30
|
- `createOrm` -- `@simplysm/orm-common`의 `DbContext`와 DB 연결을 결합하는 고수준 API
|
|
32
31
|
- `NodeDbContextExecutor` -- `QueryDef` → SQL 변환 및 실행을 담당하는 어댑터
|
|
33
|
-
- `createDbConn` --
|
|
34
|
-
- `PooledDbConn` -- 풀에서 빌린 물리 연결을 감싸는 래퍼 (반환 시 자동 롤백)
|
|
32
|
+
- `createDbConn` -- DB 연결 인스턴스를 생성
|
|
35
33
|
- `MysqlDbConn` / `PostgresqlDbConn` / `MssqlDbConn` -- 각 DBMS별 실제 연결 구현
|
|
36
34
|
|
|
37
35
|
## 주요 사용법
|
|
@@ -159,7 +157,7 @@ function createOrm<TDef extends DbContextDef<any, any, any>>(
|
|
|
159
157
|
|
|
160
158
|
### `createDbConn(config): Promise<DbConn>`
|
|
161
159
|
|
|
162
|
-
|
|
160
|
+
DB 연결 인스턴스를 생성하여 반환한다. 반환된 객체에 `connect()`를 호출해야 실제 연결이 수립된다.
|
|
163
161
|
|
|
164
162
|
```typescript
|
|
165
163
|
function createDbConn(config: DbConnConfig): Promise<DbConn>;
|
|
@@ -209,8 +207,6 @@ type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConf
|
|
|
209
207
|
| `password` | `string` | 비밀번호 |
|
|
210
208
|
| `database?` | `string` | 데이터베이스명 |
|
|
211
209
|
| `defaultIsolationLevel?` | `IsolationLevel` | 기본 격리 수준 |
|
|
212
|
-
| `pool?` | `DbPoolConfig` | 커넥션 풀 설정 |
|
|
213
|
-
|
|
214
210
|
**MSSQL/PostgreSQL 전용:**
|
|
215
211
|
|
|
216
212
|
| 필드 | 타입 | 설명 |
|
|
@@ -220,17 +216,6 @@ type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConf
|
|
|
220
216
|
**MSSQL 특수 dialect:**
|
|
221
217
|
- `"mssql-azure"`: Azure SQL용. `encrypt: true`가 자동 적용됨.
|
|
222
218
|
|
|
223
|
-
### `DbPoolConfig` 인터페이스
|
|
224
|
-
|
|
225
|
-
```typescript
|
|
226
|
-
interface DbPoolConfig {
|
|
227
|
-
min?: number; // 최소 연결 수 (기본: 1)
|
|
228
|
-
max?: number; // 최대 연결 수 (기본: 10)
|
|
229
|
-
acquireTimeoutMillis?: number; // 획득 타임아웃 (기본: 30초)
|
|
230
|
-
idleTimeoutMillis?: number; // 유휴 타임아웃 (기본: 30초)
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
219
|
### `NodeDbContextExecutor`
|
|
235
220
|
|
|
236
221
|
`@simplysm/orm-common`의 `DbContextExecutor` 인터페이스 구현체. `DbContext`가 내부적으로 사용한다.
|
|
@@ -255,21 +240,6 @@ class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
255
240
|
- `resultMetas`가 모두 `undefined`이면 → 결과 없는 쿼리로 판단하여 단일 배치 실행
|
|
256
241
|
- `ResultMeta`가 있으면 → `parseQueryResult`로 타입 변환 적용
|
|
257
242
|
|
|
258
|
-
### `PooledDbConn`
|
|
259
|
-
|
|
260
|
-
`generic-pool`의 풀에서 물리 연결을 빌려 사용하는 래퍼 클래스.
|
|
261
|
-
|
|
262
|
-
```typescript
|
|
263
|
-
class PooledDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
264
|
-
constructor(pool: Pool<DbConn>, initialConfig: DbConnConfig, getLastCreateError?: () => Error | undefined);
|
|
265
|
-
}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
**특징:**
|
|
269
|
-
- `connect()`: 풀에서 물리 연결 획득
|
|
270
|
-
- `close()`: 트랜잭션 진행 중이면 자동 롤백 후 풀에 반환 (실제 연결은 닫지 않음)
|
|
271
|
-
- 물리 연결이 끊기면 `close` 이벤트 자동 전파
|
|
272
|
-
|
|
273
243
|
### DB 연결 구현 클래스
|
|
274
244
|
|
|
275
245
|
| 클래스 | 드라이버 | dialect |
|
package/dist/create-db-conn.d.ts
CHANGED
|
@@ -2,11 +2,8 @@ import type { DbConn, DbConnConfig } from "./types/db-conn";
|
|
|
2
2
|
/**
|
|
3
3
|
* Create DB connection
|
|
4
4
|
*
|
|
5
|
-
* Acquires and returns a connection from the connection pool.
|
|
6
|
-
* Creates a new pool if one does not exist.
|
|
7
|
-
*
|
|
8
5
|
* @param config - Database connection configuration
|
|
9
|
-
* @returns
|
|
6
|
+
* @returns DB connection object (not yet connected — call connect() separately)
|
|
10
7
|
*/
|
|
11
8
|
export declare function createDbConn(config: DbConnConfig): Promise<DbConn>;
|
|
12
9
|
//# sourceMappingURL=create-db-conn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-db-conn.d.ts","sourceRoot":"","sources":["..\\src\\create-db-conn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-db-conn.d.ts","sourceRoot":"","sources":["..\\src\\create-db-conn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAoB5D;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAaxE"}
|
package/dist/create-db-conn.js
CHANGED
|
@@ -1,55 +1,8 @@
|
|
|
1
|
-
import { createPool } from "generic-pool";
|
|
2
|
-
import { PooledDbConn } from "./pooled-db-conn.js";
|
|
3
1
|
import { MysqlDbConn } from "./connections/mysql-db-conn.js";
|
|
4
2
|
import { MssqlDbConn } from "./connections/mssql-db-conn.js";
|
|
5
3
|
import { PostgresqlDbConn } from "./connections/postgresql-db-conn.js";
|
|
6
|
-
const poolMap = /* @__PURE__ */ new Map();
|
|
7
|
-
const poolLastErrorMap = /* @__PURE__ */ new Map();
|
|
8
4
|
const modules = {};
|
|
9
|
-
function createDbConn(config) {
|
|
10
|
-
const { pool, getLastCreateError } = getOrCreatePool(config);
|
|
11
|
-
return Promise.resolve(new PooledDbConn(pool, config, getLastCreateError));
|
|
12
|
-
}
|
|
13
|
-
function getOrCreatePool(config) {
|
|
14
|
-
const configKey = JSON.stringify(
|
|
15
|
-
config,
|
|
16
|
-
(_, value) => value != null && typeof value === "object" && !Array.isArray(value) ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b))) : value
|
|
17
|
-
);
|
|
18
|
-
if (!poolMap.has(configKey)) {
|
|
19
|
-
const pool = createPool(
|
|
20
|
-
{
|
|
21
|
-
create: async () => {
|
|
22
|
-
const conn = await createRawConnection(config);
|
|
23
|
-
await conn.connect();
|
|
24
|
-
return conn;
|
|
25
|
-
},
|
|
26
|
-
destroy: async (conn) => {
|
|
27
|
-
await conn.close();
|
|
28
|
-
},
|
|
29
|
-
validate: (conn) => {
|
|
30
|
-
return Promise.resolve(conn.isConnected);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
min: config.pool?.min ?? 1,
|
|
35
|
-
max: config.pool?.max ?? 10,
|
|
36
|
-
acquireTimeoutMillis: config.pool?.acquireTimeoutMillis ?? 3e4,
|
|
37
|
-
idleTimeoutMillis: config.pool?.idleTimeoutMillis ?? 3e4,
|
|
38
|
-
testOnBorrow: true
|
|
39
|
-
// [IMPORTANT] Whether to run validate when borrowing
|
|
40
|
-
}
|
|
41
|
-
);
|
|
42
|
-
pool.on("factoryCreateError", (err) => {
|
|
43
|
-
poolLastErrorMap.set(configKey, err);
|
|
44
|
-
});
|
|
45
|
-
poolMap.set(configKey, pool);
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
pool: poolMap.get(configKey),
|
|
49
|
-
getLastCreateError: () => poolLastErrorMap.get(configKey)
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
async function createRawConnection(config) {
|
|
5
|
+
async function createDbConn(config) {
|
|
53
6
|
if (config.dialect === "mysql") {
|
|
54
7
|
const mysql = await ensureModule("mysql");
|
|
55
8
|
return new MysqlDbConn(mysql, config);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/create-db-conn.ts"],
|
|
4
|
-
"mappings": "AACA,SAAS,
|
|
4
|
+
"mappings": "AACA,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AAUjC,MAAM,UAKF,CAAC;AAQL,eAAsB,aAAa,QAAuC;AACxE,MAAI,OAAO,YAAY,SAAS;AAC9B,UAAM,QAAQ,MAAM,aAAa,OAAO;AACxC,WAAO,IAAI,YAAY,OAAO,MAAM;AAAA,EACtC,WAAW,OAAO,YAAY,cAAc;AAC1C,UAAM,KAAK,MAAM,aAAa,IAAI;AAClC,UAAM,gBAAgB,MAAM,aAAa,eAAe;AACxD,WAAO,IAAI,iBAAiB,IAAI,eAAe,MAAM;AAAA,EACvD,OAAO;AAEL,UAAM,UAAU,MAAM,aAAa,SAAS;AAC5C,WAAO,IAAI,YAAY,SAAS,MAAM;AAAA,EACxC;AACF;AAEA,eAAe,aACb,MAC2C;AAC3C,MAAI,QAAQ,IAAI,KAAK,MAAM;AACzB,QAAI,SAAS,SAAS;AACpB,cAAQ,QAAQ,MAAM,OAAO,gBAAgB;AAAA,IAC/C,WAAW,SAAS,MAAM;AACxB,cAAQ,KAAK,MAAM,OAAO,IAAI;AAAA,IAChC,WAAW,SAAS,iBAAiB;AACnC,cAAQ,gBAAgB,MAAM,OAAO,iBAAiB;AAAA,IACxD,OAAO;AACL,cAAQ,UAAU,MAAM,OAAO,SAAS;AAAA,IAC1C;AAAA,EACF;AACA,SAAO,QAAQ,IAAI;AACrB;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,5 @@ export * from "./connections/mysql-db-conn";
|
|
|
4
4
|
export * from "./connections/postgresql-db-conn";
|
|
5
5
|
export * from "./create-db-conn";
|
|
6
6
|
export * from "./node-db-context-executor";
|
|
7
|
-
export * from "./pooled-db-conn";
|
|
8
7
|
export * from "./create-orm";
|
|
9
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAGhC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC;AAGhC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AAGjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,5 @@ export * from "./connections/mysql-db-conn.js";
|
|
|
4
4
|
export * from "./connections/postgresql-db-conn.js";
|
|
5
5
|
export * from "./create-db-conn.js";
|
|
6
6
|
export * from "./node-db-context-executor.js";
|
|
7
|
-
export * from "./pooled-db-conn.js";
|
|
8
7
|
export * from "./create-orm.js";
|
|
9
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -12,15 +12,11 @@ export declare class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
12
12
|
constructor(_config: DbConnConfig);
|
|
13
13
|
/**
|
|
14
14
|
* Establish DB connection
|
|
15
|
-
*
|
|
16
|
-
* Acquires connection from connection pool and activates the connection state.
|
|
17
15
|
*/
|
|
18
16
|
connect(): Promise<void>;
|
|
19
17
|
/**
|
|
20
18
|
* Close DB connection
|
|
21
19
|
*
|
|
22
|
-
* Returns connection to the connection pool.
|
|
23
|
-
*
|
|
24
20
|
* @throws {Error} When not connected
|
|
25
21
|
*/
|
|
26
22
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-db-context-executor.d.ts","sourceRoot":"","sources":["..\\src\\node-db-context-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,UAAU,EAEV,UAAU,EACV,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI5D;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAIjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEN,OAAO,EAAE,YAAY;IAIlD
|
|
1
|
+
{"version":3,"file":"node-db-context-executor.d.ts","sourceRoot":"","sources":["..\\src\\node-db-context-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,UAAU,EAEV,UAAU,EACV,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI5D;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAIjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEN,OAAO,EAAE,YAAY;IAIlD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;;;;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;;;;;;;OAOG;IACG,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IAKvC;;;;;;;OAOG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvC,OAAO,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC;IAKhB;;;;;;;;;OASG;IACG,WAAW,CAAC,CAAC,GAAG,UAAU,EAC9B,IAAI,EAAE,QAAQ,EAAE,EAChB,WAAW,CAAC,EAAE,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,GACvC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;IAqCjB,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -11,8 +11,6 @@ class NodeDbContextExecutor {
|
|
|
11
11
|
_dialect;
|
|
12
12
|
/**
|
|
13
13
|
* Establish DB connection
|
|
14
|
-
*
|
|
15
|
-
* Acquires connection from connection pool and activates the connection state.
|
|
16
14
|
*/
|
|
17
15
|
async connect() {
|
|
18
16
|
this._conn = await createDbConn(this._config);
|
|
@@ -21,8 +19,6 @@ class NodeDbContextExecutor {
|
|
|
21
19
|
/**
|
|
22
20
|
* Close DB connection
|
|
23
21
|
*
|
|
24
|
-
* Returns connection to the connection pool.
|
|
25
|
-
*
|
|
26
22
|
* @throws {Error} When not connected
|
|
27
23
|
*/
|
|
28
24
|
async close() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/node-db-context-executor.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe;AAUxB,SAAS,oBAAoB,wBAAwB;AAErD,SAAS,gBAAgB,4BAA4B;AACrD,SAAS,oBAAoB;AAOtB,MAAM,sBAAmD;AAAA,EAI9D,YAA6B,SAAuB;AAAvB;AAC3B,SAAK,WAAW,qBAAqB,OAAO;AAAA,EAC9C;AAAA,EALQ;AAAA,EACS;AAAA;AAAA;AAAA;AAAA
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe;AAUxB,SAAS,oBAAoB,wBAAwB;AAErD,SAAS,gBAAgB,4BAA4B;AACrD,SAAS,oBAAoB;AAOtB,MAAM,sBAAmD;AAAA,EAI9D,YAA6B,SAAuB;AAAvB;AAC3B,SAAK,WAAW,qBAAqB,OAAO;AAAA,EAC9C;AAAA,EALQ;AAAA,EACS;AAAA;AAAA;AAAA;AAAA,EASjB,MAAM,UAAyB;AAC7B,SAAK,QAAQ,MAAM,aAAa,KAAK,OAAO;AAC5C,UAAM,KAAK,MAAM,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,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,oBACJ,OACA,QACsC;AACtC,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,WACJ,WACA,aACA,SACe;AACf,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,YACJ,MACA,aACgB;AAChB,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,iBAAiB,IAAI;AAC9D,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;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/types/db-conn.d.ts
CHANGED
|
@@ -91,26 +91,6 @@ export interface DbConn extends EventEmitter<{
|
|
|
91
91
|
*/
|
|
92
92
|
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
93
93
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Connection pool configuration
|
|
96
|
-
*
|
|
97
|
-
* @remarks
|
|
98
|
-
* Default values for each setting:
|
|
99
|
-
* - min: 1 (minimum connection count)
|
|
100
|
-
* - max: 10 (maximum connection count)
|
|
101
|
-
* - acquireTimeoutMillis: 30000 (connection acquisition timeout)
|
|
102
|
-
* - idleTimeoutMillis: 30000 (idle connection timeout)
|
|
103
|
-
*/
|
|
104
|
-
export interface DbPoolConfig {
|
|
105
|
-
/** Minimum connection count (default: 1) */
|
|
106
|
-
min?: number;
|
|
107
|
-
/** Maximum connection count (default: 10) */
|
|
108
|
-
max?: number;
|
|
109
|
-
/** Connection acquisition timeout (milliseconds, default: 30000) */
|
|
110
|
-
acquireTimeoutMillis?: number;
|
|
111
|
-
/** Idle connection timeout (milliseconds, default: 30000) */
|
|
112
|
-
idleTimeoutMillis?: number;
|
|
113
|
-
}
|
|
114
94
|
/**
|
|
115
95
|
* DB connection configuration type (branching by dialect)
|
|
116
96
|
*/
|
|
@@ -126,7 +106,6 @@ export interface MysqlDbConnConfig {
|
|
|
126
106
|
password: string;
|
|
127
107
|
database?: string;
|
|
128
108
|
defaultIsolationLevel?: IsolationLevel;
|
|
129
|
-
pool?: DbPoolConfig;
|
|
130
109
|
}
|
|
131
110
|
/**
|
|
132
111
|
* MSSQL connection configuration
|
|
@@ -140,7 +119,6 @@ export interface MssqlDbConnConfig {
|
|
|
140
119
|
database?: string;
|
|
141
120
|
schema?: string;
|
|
142
121
|
defaultIsolationLevel?: IsolationLevel;
|
|
143
|
-
pool?: DbPoolConfig;
|
|
144
122
|
}
|
|
145
123
|
/**
|
|
146
124
|
* PostgreSQL connection configuration
|
|
@@ -154,7 +132,6 @@ export interface PostgresqlDbConnConfig {
|
|
|
154
132
|
database?: string;
|
|
155
133
|
schema?: string;
|
|
156
134
|
defaultIsolationLevel?: IsolationLevel;
|
|
157
|
-
pool?: DbPoolConfig;
|
|
158
135
|
}
|
|
159
136
|
/**
|
|
160
137
|
* Extract Dialect from DbConnConfig
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-conn.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\db-conn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMhF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAMX;;;;;;;;;;GAUG;AACH,MAAM,WAAW,MAAO,SAAQ,YAAY,CAAC;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;IAC3D;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,gBAAgB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE7F;;;;;;;;;;OAUG;IACH,UAAU,CACR,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,CAAC;CAClB;AAMD
|
|
1
|
+
{"version":3,"file":"db-conn.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\db-conn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMhF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAMX;;;;;;;;;;GAUG;AACH,MAAM,WAAW,MAAO,SAAQ,YAAY,CAAC;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;IAC3D;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;OAIG;IACH,gBAAgB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE7F;;;;;;;;;;OAUG;IACH,UAAU,CACR,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,CAAC;CAClB;AAMD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,cAAc,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,cAAc,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,cAAc,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAKlE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/db-conn.ts"],
|
|
4
|
-
"mappings": "AAUO,MAAM,0BAA0B,KAAK;AAKrC,MAAM,0BAA0B,KAAK,KAAK;AAK1C,MAAM,iBAAiB;AAAA,EAC5B,eAAe;AAAA,EACf,mBAAmB;AACrB;
|
|
4
|
+
"mappings": "AAUO,MAAM,0BAA0B,KAAK;AAKrC,MAAM,0BAA0B,KAAK,KAAK;AAK1C,MAAM,iBAAiB;AAAA,EAC5B,eAAe;AAAA,EACf,mBAAmB;AACrB;AAoJO,SAAS,qBAAqB,QAA+B;AAClE,MAAI,OAAO,YAAY,eAAe;AACpC,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAChB;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/orm-node",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.95",
|
|
4
4
|
"description": "Simplysm package - ORM module (node)",
|
|
5
5
|
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -20,9 +20,8 @@
|
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"consola": "^3.4.2",
|
|
23
|
-
"
|
|
24
|
-
"@simplysm/
|
|
25
|
-
"@simplysm/orm-common": "13.0.92"
|
|
23
|
+
"@simplysm/core-common": "13.0.95",
|
|
24
|
+
"@simplysm/orm-common": "13.0.95"
|
|
26
25
|
},
|
|
27
26
|
"devDependencies": {
|
|
28
27
|
"@types/pg": "^8.18.0",
|
package/src/create-db-conn.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type { Pool } from "generic-pool";
|
|
2
|
-
import { createPool } from "generic-pool";
|
|
3
1
|
import type { DbConn, DbConnConfig } from "./types/db-conn";
|
|
4
|
-
import { PooledDbConn } from "./pooled-db-conn";
|
|
5
2
|
import { MysqlDbConn } from "./connections/mysql-db-conn";
|
|
6
3
|
import { MssqlDbConn } from "./connections/mssql-db-conn";
|
|
7
4
|
import { PostgresqlDbConn } from "./connections/postgresql-db-conn";
|
|
@@ -9,16 +6,10 @@ import { PostgresqlDbConn } from "./connections/postgresql-db-conn";
|
|
|
9
6
|
/**
|
|
10
7
|
* DB connection factory
|
|
11
8
|
*
|
|
12
|
-
* Creates database connection instances
|
|
9
|
+
* Creates database connection instances.
|
|
13
10
|
* Supports MSSQL, MySQL, and PostgreSQL.
|
|
14
11
|
*/
|
|
15
12
|
|
|
16
|
-
// Cache connection pools by configuration
|
|
17
|
-
const poolMap = new Map<string, Pool<DbConn>>();
|
|
18
|
-
|
|
19
|
-
// Cache last error when pool creation fails (by configKey)
|
|
20
|
-
const poolLastErrorMap = new Map<string, Error>();
|
|
21
|
-
|
|
22
13
|
// Lazy-loaded module cache
|
|
23
14
|
const modules: {
|
|
24
15
|
tedious?: typeof import("tedious");
|
|
@@ -30,70 +21,10 @@ const modules: {
|
|
|
30
21
|
/**
|
|
31
22
|
* Create DB connection
|
|
32
23
|
*
|
|
33
|
-
* Acquires and returns a connection from the connection pool.
|
|
34
|
-
* Creates a new pool if one does not exist.
|
|
35
|
-
*
|
|
36
24
|
* @param config - Database connection configuration
|
|
37
|
-
* @returns
|
|
25
|
+
* @returns DB connection object (not yet connected — call connect() separately)
|
|
38
26
|
*/
|
|
39
|
-
export function createDbConn(config: DbConnConfig): Promise<DbConn> {
|
|
40
|
-
// 1. Get pool (create if not exists)
|
|
41
|
-
const { pool, getLastCreateError } = getOrCreatePool(config);
|
|
42
|
-
|
|
43
|
-
// 2. Return wrapper object
|
|
44
|
-
return Promise.resolve(new PooledDbConn(pool, config, getLastCreateError));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function getOrCreatePool(config: DbConnConfig): {
|
|
48
|
-
pool: Pool<DbConn>;
|
|
49
|
-
getLastCreateError: () => Error | undefined;
|
|
50
|
-
} {
|
|
51
|
-
// Convert object to string key (sort nested objects to ensure consistent keys for identical configurations)
|
|
52
|
-
const configKey = JSON.stringify(config, (_, value: unknown) =>
|
|
53
|
-
value != null && typeof value === "object" && !Array.isArray(value)
|
|
54
|
-
? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)))
|
|
55
|
-
: value,
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
if (!poolMap.has(configKey)) {
|
|
59
|
-
const pool = createPool<DbConn>(
|
|
60
|
-
{
|
|
61
|
-
create: async () => {
|
|
62
|
-
const conn = await createRawConnection(config);
|
|
63
|
-
await conn.connect();
|
|
64
|
-
return conn;
|
|
65
|
-
},
|
|
66
|
-
destroy: async (conn) => {
|
|
67
|
-
await conn.close(); // Close actual connection when removed from pool
|
|
68
|
-
},
|
|
69
|
-
validate: (conn) => {
|
|
70
|
-
// Check connection status on acquisition (Pool will dispose and recreate if disconnected)
|
|
71
|
-
return Promise.resolve(conn.isConnected);
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
min: config.pool?.min ?? 1,
|
|
76
|
-
max: config.pool?.max ?? 10,
|
|
77
|
-
acquireTimeoutMillis: config.pool?.acquireTimeoutMillis ?? 30000,
|
|
78
|
-
idleTimeoutMillis: config.pool?.idleTimeoutMillis ?? 30000,
|
|
79
|
-
testOnBorrow: true, // [IMPORTANT] Whether to run validate when borrowing
|
|
80
|
-
},
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
pool.on("factoryCreateError", (err: Error) => {
|
|
84
|
-
poolLastErrorMap.set(configKey, err);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
poolMap.set(configKey, pool);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
pool: poolMap.get(configKey)!,
|
|
92
|
-
getLastCreateError: () => poolLastErrorMap.get(configKey),
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async function createRawConnection(config: DbConnConfig): Promise<DbConn> {
|
|
27
|
+
export async function createDbConn(config: DbConnConfig): Promise<DbConn> {
|
|
97
28
|
if (config.dialect === "mysql") {
|
|
98
29
|
const mysql = await ensureModule("mysql");
|
|
99
30
|
return new MysqlDbConn(mysql, config);
|
package/src/index.ts
CHANGED
|
@@ -28,8 +28,6 @@ export class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* Establish DB connection
|
|
31
|
-
*
|
|
32
|
-
* Acquires connection from connection pool and activates the connection state.
|
|
33
31
|
*/
|
|
34
32
|
async connect(): Promise<void> {
|
|
35
33
|
this._conn = await createDbConn(this._config);
|
|
@@ -39,8 +37,6 @@ export class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
39
37
|
/**
|
|
40
38
|
* Close DB connection
|
|
41
39
|
*
|
|
42
|
-
* Returns connection to the connection pool.
|
|
43
|
-
*
|
|
44
40
|
* @throws {Error} When not connected
|
|
45
41
|
*/
|
|
46
42
|
async close(): Promise<void> {
|
package/src/types/db-conn.ts
CHANGED
|
@@ -120,27 +120,6 @@ export interface DbConn extends EventEmitter<{ close: void }> {
|
|
|
120
120
|
// DbConnConfig Types
|
|
121
121
|
// ============================================
|
|
122
122
|
|
|
123
|
-
/**
|
|
124
|
-
* Connection pool configuration
|
|
125
|
-
*
|
|
126
|
-
* @remarks
|
|
127
|
-
* Default values for each setting:
|
|
128
|
-
* - min: 1 (minimum connection count)
|
|
129
|
-
* - max: 10 (maximum connection count)
|
|
130
|
-
* - acquireTimeoutMillis: 30000 (connection acquisition timeout)
|
|
131
|
-
* - idleTimeoutMillis: 30000 (idle connection timeout)
|
|
132
|
-
*/
|
|
133
|
-
export interface DbPoolConfig {
|
|
134
|
-
/** Minimum connection count (default: 1) */
|
|
135
|
-
min?: number;
|
|
136
|
-
/** Maximum connection count (default: 10) */
|
|
137
|
-
max?: number;
|
|
138
|
-
/** Connection acquisition timeout (milliseconds, default: 30000) */
|
|
139
|
-
acquireTimeoutMillis?: number;
|
|
140
|
-
/** Idle connection timeout (milliseconds, default: 30000) */
|
|
141
|
-
idleTimeoutMillis?: number;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
123
|
/**
|
|
145
124
|
* DB connection configuration type (branching by dialect)
|
|
146
125
|
*/
|
|
@@ -157,7 +136,6 @@ export interface MysqlDbConnConfig {
|
|
|
157
136
|
password: string;
|
|
158
137
|
database?: string;
|
|
159
138
|
defaultIsolationLevel?: IsolationLevel;
|
|
160
|
-
pool?: DbPoolConfig;
|
|
161
139
|
}
|
|
162
140
|
|
|
163
141
|
/**
|
|
@@ -172,7 +150,6 @@ export interface MssqlDbConnConfig {
|
|
|
172
150
|
database?: string;
|
|
173
151
|
schema?: string;
|
|
174
152
|
defaultIsolationLevel?: IsolationLevel;
|
|
175
|
-
pool?: DbPoolConfig;
|
|
176
153
|
}
|
|
177
154
|
|
|
178
155
|
/**
|
|
@@ -187,7 +164,6 @@ export interface PostgresqlDbConnConfig {
|
|
|
187
164
|
database?: string;
|
|
188
165
|
schema?: string;
|
|
189
166
|
defaultIsolationLevel?: IsolationLevel;
|
|
190
|
-
pool?: DbPoolConfig;
|
|
191
167
|
}
|
|
192
168
|
|
|
193
169
|
/**
|
package/dist/pooled-db-conn.d.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
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 connection wrapper managed by connection pool
|
|
7
|
-
*
|
|
8
|
-
* Supports connection pooling using the generic-pool library.
|
|
9
|
-
* Acquires and returns actual physical connections from/to the pool.
|
|
10
|
-
*/
|
|
11
|
-
export declare class PooledDbConn extends EventEmitter<{
|
|
12
|
-
close: void;
|
|
13
|
-
}> implements DbConn {
|
|
14
|
-
private readonly _pool;
|
|
15
|
-
private readonly _initialConfig;
|
|
16
|
-
private readonly _getLastCreateError?;
|
|
17
|
-
private _rawConn?;
|
|
18
|
-
constructor(_pool: Pool<DbConn>, _initialConfig: DbConnConfig, _getLastCreateError?: (() => Error | undefined) | undefined);
|
|
19
|
-
get config(): DbConnConfig;
|
|
20
|
-
get isConnected(): boolean;
|
|
21
|
-
get isInTransaction(): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Acquire DB connection from pool
|
|
24
|
-
*
|
|
25
|
-
* @throws {SdError} When already connected
|
|
26
|
-
*/
|
|
27
|
-
connect(): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Return DB connection to pool (does not terminate actual connection)
|
|
30
|
-
*/
|
|
31
|
-
close(): Promise<void>;
|
|
32
|
-
private readonly _onRawConnClose;
|
|
33
|
-
/**
|
|
34
|
-
* Begin transaction
|
|
35
|
-
*
|
|
36
|
-
* @param isolationLevel - Transaction isolation level
|
|
37
|
-
* @throws {SdError} When connection is not acquired
|
|
38
|
-
*/
|
|
39
|
-
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Commit transaction
|
|
42
|
-
*
|
|
43
|
-
* @throws {SdError} When connection is not acquired
|
|
44
|
-
*/
|
|
45
|
-
commitTransaction(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Rollback transaction
|
|
48
|
-
*
|
|
49
|
-
* @throws {SdError} When connection is not acquired
|
|
50
|
-
*/
|
|
51
|
-
rollbackTransaction(): Promise<void>;
|
|
52
|
-
/**
|
|
53
|
-
* Execute SQL query
|
|
54
|
-
*
|
|
55
|
-
* @param queries - SQL query array to execute
|
|
56
|
-
* @returns Result array for each query
|
|
57
|
-
* @throws {SdError} When connection is not acquired
|
|
58
|
-
*/
|
|
59
|
-
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
60
|
-
/**
|
|
61
|
-
* Execute parameterized SQL query
|
|
62
|
-
*
|
|
63
|
-
* @param query - SQL query string
|
|
64
|
-
* @param params - Query parameter array
|
|
65
|
-
* @returns Query result array
|
|
66
|
-
* @throws {SdError} When connection is not acquired
|
|
67
|
-
*/
|
|
68
|
-
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
69
|
-
/**
|
|
70
|
-
* Bulk insert data (using native bulk API)
|
|
71
|
-
*
|
|
72
|
-
* @param tableName - Target table name
|
|
73
|
-
* @param columnMetas - Column metadata
|
|
74
|
-
* @param records - Record array to insert
|
|
75
|
-
* @throws {SdError} When connection is not acquired
|
|
76
|
-
*/
|
|
77
|
-
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
78
|
-
private _requireRawConn;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=pooled-db-conn.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IALvC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAGP,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EACnB,cAAc,EAAE,YAAY,EAC5B,mBAAmB,CAAC,GAAE,MAAM,KAAK,GAAG,SAAS,aAAA;IAMhE,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;IAsB9B;;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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IAKtE;;;;;;;OAOG;IACG,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IAKvC;;;;;;;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"}
|
package/dist/pooled-db-conn.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import consola from "consola";
|
|
2
|
-
import { SdError, EventEmitter } from "@simplysm/core-common";
|
|
3
|
-
import { DB_CONN_ERRORS } from "./types/db-conn.js";
|
|
4
|
-
const logger = consola.withTag("pooled-db-conn");
|
|
5
|
-
class PooledDbConn extends EventEmitter {
|
|
6
|
-
constructor(_pool, _initialConfig, _getLastCreateError) {
|
|
7
|
-
super();
|
|
8
|
-
this._pool = _pool;
|
|
9
|
-
this._initialConfig = _initialConfig;
|
|
10
|
-
this._getLastCreateError = _getLastCreateError;
|
|
11
|
-
}
|
|
12
|
-
// Actual physical connection borrowed from pool
|
|
13
|
-
_rawConn;
|
|
14
|
-
// [Property] config
|
|
15
|
-
get config() {
|
|
16
|
-
return this._rawConn?.config ?? this._initialConfig;
|
|
17
|
-
}
|
|
18
|
-
// [Property] isConnected
|
|
19
|
-
get isConnected() {
|
|
20
|
-
return this._rawConn?.isConnected ?? false;
|
|
21
|
-
}
|
|
22
|
-
// [Property] isInTransaction
|
|
23
|
-
get isInTransaction() {
|
|
24
|
-
return this._rawConn?.isInTransaction ?? false;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Acquire DB connection from pool
|
|
28
|
-
*
|
|
29
|
-
* @throws {SdError} When already connected
|
|
30
|
-
*/
|
|
31
|
-
async connect() {
|
|
32
|
-
if (this._rawConn != null) {
|
|
33
|
-
throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
this._rawConn = await this._pool.acquire();
|
|
37
|
-
} catch (err) {
|
|
38
|
-
const { dialect, host, port, database } = this._initialConfig;
|
|
39
|
-
const cause = this._getLastCreateError?.() ?? (err instanceof Error ? err : void 0);
|
|
40
|
-
throw new SdError(
|
|
41
|
-
...cause != null ? [cause] : [],
|
|
42
|
-
`DB connection failed [${dialect}://${host}:${port ?? ""}/${database ?? ""}]`
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
this._rawConn.on("close", this._onRawConnClose);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Return DB connection to pool (does not terminate actual connection)
|
|
49
|
-
*/
|
|
50
|
-
async close() {
|
|
51
|
-
if (this._rawConn != null) {
|
|
52
|
-
if (this._rawConn.isInTransaction) {
|
|
53
|
-
try {
|
|
54
|
-
await this._rawConn.rollbackTransaction();
|
|
55
|
-
} catch (err) {
|
|
56
|
-
logger.warn("Rollback failed when returning to pool", err instanceof Error ? err.message : String(err));
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
this._rawConn.off("close", this._onRawConnClose);
|
|
60
|
-
await this._pool.release(this._rawConn);
|
|
61
|
-
this._rawConn = void 0;
|
|
62
|
-
this.emit("close");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Handler for physical connection loss
|
|
66
|
-
_onRawConnClose = () => {
|
|
67
|
-
this._rawConn = void 0;
|
|
68
|
-
this.emit("close");
|
|
69
|
-
};
|
|
70
|
-
// --- Below are delegation methods ---
|
|
71
|
-
/**
|
|
72
|
-
* Begin transaction
|
|
73
|
-
*
|
|
74
|
-
* @param isolationLevel - Transaction isolation level
|
|
75
|
-
* @throws {SdError} When connection is not acquired
|
|
76
|
-
*/
|
|
77
|
-
async beginTransaction(isolationLevel) {
|
|
78
|
-
const conn = this._requireRawConn();
|
|
79
|
-
await conn.beginTransaction(isolationLevel);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Commit transaction
|
|
83
|
-
*
|
|
84
|
-
* @throws {SdError} When connection is not acquired
|
|
85
|
-
*/
|
|
86
|
-
async commitTransaction() {
|
|
87
|
-
const conn = this._requireRawConn();
|
|
88
|
-
await conn.commitTransaction();
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Rollback transaction
|
|
92
|
-
*
|
|
93
|
-
* @throws {SdError} When connection is not acquired
|
|
94
|
-
*/
|
|
95
|
-
async rollbackTransaction() {
|
|
96
|
-
const conn = this._requireRawConn();
|
|
97
|
-
await conn.rollbackTransaction();
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Execute SQL query
|
|
101
|
-
*
|
|
102
|
-
* @param queries - SQL query array to execute
|
|
103
|
-
* @returns Result array for each query
|
|
104
|
-
* @throws {SdError} When connection is not acquired
|
|
105
|
-
*/
|
|
106
|
-
async execute(queries) {
|
|
107
|
-
const conn = this._requireRawConn();
|
|
108
|
-
return conn.execute(queries);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Execute parameterized SQL query
|
|
112
|
-
*
|
|
113
|
-
* @param query - SQL query string
|
|
114
|
-
* @param params - Query parameter array
|
|
115
|
-
* @returns Query result array
|
|
116
|
-
* @throws {SdError} When connection is not acquired
|
|
117
|
-
*/
|
|
118
|
-
async executeParametrized(query, params) {
|
|
119
|
-
const conn = this._requireRawConn();
|
|
120
|
-
return conn.executeParametrized(query, params);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Bulk insert data (using native bulk API)
|
|
124
|
-
*
|
|
125
|
-
* @param tableName - Target table name
|
|
126
|
-
* @param columnMetas - Column metadata
|
|
127
|
-
* @param records - Record array to insert
|
|
128
|
-
* @throws {SdError} When connection is not acquired
|
|
129
|
-
*/
|
|
130
|
-
async bulkInsert(tableName, columnMetas, records) {
|
|
131
|
-
const conn = this._requireRawConn();
|
|
132
|
-
await conn.bulkInsert(tableName, columnMetas, records);
|
|
133
|
-
}
|
|
134
|
-
_requireRawConn() {
|
|
135
|
-
if (this._rawConn == null) {
|
|
136
|
-
throw new SdError(`${DB_CONN_ERRORS.NOT_CONNECTED} (Pool Connection is not acquired)`);
|
|
137
|
-
}
|
|
138
|
-
return this._rawConn;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
export {
|
|
142
|
-
PooledDbConn
|
|
143
|
-
};
|
|
144
|
-
//# sourceMappingURL=pooled-db-conn.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/pooled-db-conn.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
package/src/pooled-db-conn.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import consola from "consola";
|
|
2
|
-
import { SdError, EventEmitter } from "@simplysm/core-common";
|
|
3
|
-
import type { Pool } from "generic-pool";
|
|
4
|
-
import type { ColumnMeta, IsolationLevel } from "@simplysm/orm-common";
|
|
5
|
-
import { DB_CONN_ERRORS, type DbConn, type DbConnConfig } from "./types/db-conn";
|
|
6
|
-
|
|
7
|
-
const logger = consola.withTag("pooled-db-conn");
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* DB connection wrapper managed by connection pool
|
|
11
|
-
*
|
|
12
|
-
* Supports connection pooling using the generic-pool library.
|
|
13
|
-
* Acquires and returns actual physical connections from/to the pool.
|
|
14
|
-
*/
|
|
15
|
-
export class PooledDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
16
|
-
// Actual physical connection borrowed from pool
|
|
17
|
-
private _rawConn?: DbConn;
|
|
18
|
-
|
|
19
|
-
constructor(
|
|
20
|
-
private readonly _pool: Pool<DbConn>,
|
|
21
|
-
private readonly _initialConfig: DbConnConfig,
|
|
22
|
-
private readonly _getLastCreateError?: () => Error | undefined,
|
|
23
|
-
) {
|
|
24
|
-
super();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// [Property] config
|
|
28
|
-
get config(): DbConnConfig {
|
|
29
|
-
return this._rawConn?.config ?? this._initialConfig;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// [Property] isConnected
|
|
33
|
-
get isConnected(): boolean {
|
|
34
|
-
return this._rawConn?.isConnected ?? false;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// [Property] isInTransaction
|
|
38
|
-
get isInTransaction(): boolean {
|
|
39
|
-
return this._rawConn?.isInTransaction ?? false;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Acquire DB connection from pool
|
|
44
|
-
*
|
|
45
|
-
* @throws {SdError} When already connected
|
|
46
|
-
*/
|
|
47
|
-
async connect(): Promise<void> {
|
|
48
|
-
if (this._rawConn != null) {
|
|
49
|
-
throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// 1. Acquire connection from pool
|
|
53
|
-
try {
|
|
54
|
-
this._rawConn = await this._pool.acquire();
|
|
55
|
-
} catch (err) {
|
|
56
|
-
const { dialect, host, port, database } = this._initialConfig;
|
|
57
|
-
const cause = this._getLastCreateError?.() ?? (err instanceof Error ? err : undefined);
|
|
58
|
-
throw new SdError(
|
|
59
|
-
...(cause != null ? [cause] : []),
|
|
60
|
-
`DB connection failed [${dialect}://${host}:${port ?? ""}/${database ?? ""}]`,
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// 2. Register listener to handle physical connection loss (timeout, etc.)
|
|
65
|
-
// If connection disconnects while in use, PooledDbConn must emit close event
|
|
66
|
-
this._rawConn.on("close", this._onRawConnClose);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Return DB connection to pool (does not terminate actual connection)
|
|
71
|
-
*/
|
|
72
|
-
async close(): Promise<void> {
|
|
73
|
-
if (this._rawConn != null) {
|
|
74
|
-
// 1. If transaction is in progress, rollback to return clean state to pool
|
|
75
|
-
if (this._rawConn.isInTransaction) {
|
|
76
|
-
try {
|
|
77
|
-
await this._rawConn.rollbackTransaction();
|
|
78
|
-
} catch (err) {
|
|
79
|
-
// Log failure and continue (connection may already be disconnected)
|
|
80
|
-
logger.warn("Rollback failed when returning to pool", err instanceof Error ? err.message : String(err));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// 2. Remove listener (so it won't affect reuse by other wrappers when returned to pool)
|
|
85
|
-
this._rawConn.off("close", this._onRawConnClose);
|
|
86
|
-
|
|
87
|
-
// 3. Return connection to pool (does not actually close it)
|
|
88
|
-
await this._pool.release(this._rawConn);
|
|
89
|
-
this._rawConn = undefined;
|
|
90
|
-
|
|
91
|
-
// 4. Notify consumer that connection is logically closed
|
|
92
|
-
this.emit("close");
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Handler for physical connection loss
|
|
97
|
-
private readonly _onRawConnClose = () => {
|
|
98
|
-
// Remove reference since physical connection is lost (will be filtered during pool validation)
|
|
99
|
-
this._rawConn = undefined;
|
|
100
|
-
// Notify consumer
|
|
101
|
-
this.emit("close");
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
// --- Below are delegation methods ---
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Begin transaction
|
|
108
|
-
*
|
|
109
|
-
* @param isolationLevel - Transaction isolation level
|
|
110
|
-
* @throws {SdError} When connection is not acquired
|
|
111
|
-
*/
|
|
112
|
-
async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {
|
|
113
|
-
const conn = this._requireRawConn();
|
|
114
|
-
await conn.beginTransaction(isolationLevel);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Commit transaction
|
|
119
|
-
*
|
|
120
|
-
* @throws {SdError} When connection is not acquired
|
|
121
|
-
*/
|
|
122
|
-
async commitTransaction(): Promise<void> {
|
|
123
|
-
const conn = this._requireRawConn();
|
|
124
|
-
await conn.commitTransaction();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Rollback transaction
|
|
129
|
-
*
|
|
130
|
-
* @throws {SdError} When connection is not acquired
|
|
131
|
-
*/
|
|
132
|
-
async rollbackTransaction(): Promise<void> {
|
|
133
|
-
const conn = this._requireRawConn();
|
|
134
|
-
await conn.rollbackTransaction();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Execute SQL query
|
|
139
|
-
*
|
|
140
|
-
* @param queries - SQL query array to execute
|
|
141
|
-
* @returns Result array for each query
|
|
142
|
-
* @throws {SdError} When connection is not acquired
|
|
143
|
-
*/
|
|
144
|
-
async execute(queries: string[]): Promise<Record<string, unknown>[][]> {
|
|
145
|
-
const conn = this._requireRawConn();
|
|
146
|
-
return conn.execute(queries);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Execute parameterized SQL query
|
|
151
|
-
*
|
|
152
|
-
* @param query - SQL query string
|
|
153
|
-
* @param params - Query parameter array
|
|
154
|
-
* @returns Query result array
|
|
155
|
-
* @throws {SdError} When connection is not acquired
|
|
156
|
-
*/
|
|
157
|
-
async executeParametrized(
|
|
158
|
-
query: string,
|
|
159
|
-
params?: unknown[],
|
|
160
|
-
): Promise<Record<string, unknown>[][]> {
|
|
161
|
-
const conn = this._requireRawConn();
|
|
162
|
-
return conn.executeParametrized(query, params);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Bulk insert data (using native bulk API)
|
|
167
|
-
*
|
|
168
|
-
* @param tableName - Target table name
|
|
169
|
-
* @param columnMetas - Column metadata
|
|
170
|
-
* @param records - Record array to insert
|
|
171
|
-
* @throws {SdError} When connection is not acquired
|
|
172
|
-
*/
|
|
173
|
-
async bulkInsert(
|
|
174
|
-
tableName: string,
|
|
175
|
-
columnMetas: Record<string, ColumnMeta>,
|
|
176
|
-
records: Record<string, unknown>[],
|
|
177
|
-
): Promise<void> {
|
|
178
|
-
const conn = this._requireRawConn();
|
|
179
|
-
await conn.bulkInsert(tableName, columnMetas, records);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
private _requireRawConn(): DbConn {
|
|
183
|
-
if (this._rawConn == null) {
|
|
184
|
-
throw new SdError(`${DB_CONN_ERRORS.NOT_CONNECTED} (Pool Connection is not acquired)`);
|
|
185
|
-
}
|
|
186
|
-
return this._rawConn;
|
|
187
|
-
}
|
|
188
|
-
}
|