@simplysm/orm-node 13.0.93 → 13.0.96
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 +22 -39
- 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
|
-
- `NodeDbContextExecutor` -- `QueryDef`
|
|
33
|
-
- `createDbConn` --
|
|
34
|
-
- `PooledDbConn` -- 풀에서 빌린 물리 연결을 감싸는 래퍼 (반환 시 자동 롤백)
|
|
31
|
+
- `NodeDbContextExecutor` -- `QueryDef` -> SQL 변환 및 실행을 담당하는 어댑터
|
|
32
|
+
- `createDbConn` -- DB 연결 인스턴스를 생성하는 팩토리
|
|
35
33
|
- `MysqlDbConn` / `PostgresqlDbConn` / `MssqlDbConn` -- 각 DBMS별 실제 연결 구현
|
|
36
34
|
|
|
37
35
|
## 주요 사용법
|
|
@@ -56,6 +54,7 @@ const MyDb = defineDbContext({
|
|
|
56
54
|
});
|
|
57
55
|
|
|
58
56
|
// 2. ORM 인스턴스 생성
|
|
57
|
+
// database는 필수 -- config 또는 options 중 하나에 반드시 지정해야 한다.
|
|
59
58
|
const orm = createOrm(MyDb, {
|
|
60
59
|
dialect: "mysql",
|
|
61
60
|
host: "localhost",
|
|
@@ -97,6 +96,7 @@ const orm = createOrm(MyDb, config, {
|
|
|
97
96
|
```typescript
|
|
98
97
|
import { createDbConn } from "@simplysm/orm-node";
|
|
99
98
|
|
|
99
|
+
// createDbConn은 연결 객체만 생성한다. connect()를 호출해야 실제 연결이 수립된다.
|
|
100
100
|
const conn = await createDbConn(config);
|
|
101
101
|
await conn.connect();
|
|
102
102
|
|
|
@@ -140,6 +140,8 @@ function createOrm<TDef extends DbContextDef<any, any, any>>(
|
|
|
140
140
|
): Orm<TDef>;
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
+
`database`는 `options.database` -> `config.database` 순서로 결정되며, 둘 다 없으면 에러가 발생한다. `schema`도 같은 우선순위로 결정된다.
|
|
144
|
+
|
|
143
145
|
**`Orm<TDef>` 인터페이스:**
|
|
144
146
|
|
|
145
147
|
| 속성/메서드 | 타입 | 설명 |
|
|
@@ -159,7 +161,7 @@ function createOrm<TDef extends DbContextDef<any, any, any>>(
|
|
|
159
161
|
|
|
160
162
|
### `createDbConn(config): Promise<DbConn>`
|
|
161
163
|
|
|
162
|
-
|
|
164
|
+
DB 연결 인스턴스를 생성하여 반환한다. 반환된 객체에 `connect()`를 호출해야 실제 연결이 수립된다. 드라이버 모듈은 호출 시 lazy import된다.
|
|
163
165
|
|
|
164
166
|
```typescript
|
|
165
167
|
function createDbConn(config: DbConnConfig): Promise<DbConn>;
|
|
@@ -209,7 +211,6 @@ type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConf
|
|
|
209
211
|
| `password` | `string` | 비밀번호 |
|
|
210
212
|
| `database?` | `string` | 데이터베이스명 |
|
|
211
213
|
| `defaultIsolationLevel?` | `IsolationLevel` | 기본 격리 수준 |
|
|
212
|
-
| `pool?` | `DbPoolConfig` | 커넥션 풀 설정 |
|
|
213
214
|
|
|
214
215
|
**MSSQL/PostgreSQL 전용:**
|
|
215
216
|
|
|
@@ -220,17 +221,6 @@ type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConf
|
|
|
220
221
|
**MSSQL 특수 dialect:**
|
|
221
222
|
- `"mssql-azure"`: Azure SQL용. `encrypt: true`가 자동 적용됨.
|
|
222
223
|
|
|
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
224
|
### `NodeDbContextExecutor`
|
|
235
225
|
|
|
236
226
|
`@simplysm/orm-common`의 `DbContextExecutor` 인터페이스 구현체. `DbContext`가 내부적으로 사용한다.
|
|
@@ -252,23 +242,8 @@ class NodeDbContextExecutor implements DbContextExecutor {
|
|
|
252
242
|
|
|
253
243
|
**`executeDefs` 동작:**
|
|
254
244
|
- `QueryDef`를 dialect에 맞는 SQL로 변환 (`createQueryBuilder`)
|
|
255
|
-
- `resultMetas`가 모두 `undefined`이면
|
|
256
|
-
- `ResultMeta`가 있으면
|
|
257
|
-
|
|
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` 이벤트 자동 전파
|
|
245
|
+
- `resultMetas`가 모두 `undefined`이면 -> 결과 없는 쿼리로 판단하여 단일 배치 실행
|
|
246
|
+
- `ResultMeta`가 있으면 -> `parseQueryResult`로 타입 변환 적용
|
|
272
247
|
|
|
273
248
|
### DB 연결 구현 클래스
|
|
274
249
|
|
|
@@ -280,9 +255,15 @@ class PooledDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
|
280
255
|
|
|
281
256
|
모두 `EventEmitter<{ close: void }>`를 상속하고 `DbConn`을 구현한다. 드라이버 모듈은 `createDbConn` 호출 시 lazy import된다.
|
|
282
257
|
|
|
258
|
+
**DBMS별 참고 사항:**
|
|
259
|
+
- MySQL: `username`이 `"root"`인 경우 특정 database에 바인딩하지 않고 연결한다 (관리 작업용).
|
|
260
|
+
- MySQL: `charset`은 `utf8mb4`로 고정, `multipleStatements`가 활성화되어 있다.
|
|
261
|
+
- PostgreSQL: 기본 포트 `5432`가 자동 적용된다.
|
|
262
|
+
- MSSQL: `trustServerCertificate: true`로 설정된다.
|
|
263
|
+
|
|
283
264
|
### `getDialectFromConfig(config): Dialect`
|
|
284
265
|
|
|
285
|
-
config에서 `Dialect`를 추출한다. `"mssql-azure"`
|
|
266
|
+
config에서 `Dialect`를 추출한다. `"mssql-azure"` -> `"mssql"`로 변환된다.
|
|
286
267
|
|
|
287
268
|
```typescript
|
|
288
269
|
function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
@@ -297,9 +278,11 @@ function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
|
297
278
|
| `DB_CONN_ERRORS.NOT_CONNECTED` | `"'Connection' is not connected."` | 미연결 에러 메시지 |
|
|
298
279
|
| `DB_CONN_ERRORS.ALREADY_CONNECTED` | `"'Connection' is already connected."` | 중복 연결 에러 메시지 |
|
|
299
280
|
|
|
281
|
+
연결 유휴 시 자동 종료: 마지막 쿼리 실행 후 `DB_CONN_DEFAULT_TIMEOUT * 2` (20분) 동안 활동이 없으면 연결이 자동으로 닫힌다.
|
|
282
|
+
|
|
300
283
|
### IsolationLevel 타입
|
|
301
284
|
|
|
302
|
-
`@simplysm/orm-common`에서 제공하는 트랜잭션 격리 수준이다.
|
|
285
|
+
`@simplysm/orm-common`에서 제공하는 트랜잭션 격리 수준이다. `isolationLevel`을 지정하지 않으면 `config.defaultIsolationLevel`이 사용되고, 이것도 없으면 `READ_UNCOMMITTED`가 기본값이다.
|
|
303
286
|
|
|
304
287
|
```typescript
|
|
305
288
|
type IsolationLevel = "READ_UNCOMMITTED" | "READ_COMMITTED" | "REPEATABLE_READ" | "SERIALIZABLE";
|
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":"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"}
|
|
@@ -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.96",
|
|
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.93"
|
|
23
|
+
"@simplysm/core-common": "13.0.96",
|
|
24
|
+
"@simplysm/orm-common": "13.0.96"
|
|
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
|
-
}
|