@simplysm/orm-node 13.0.69 → 13.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -476
- package/dist/connections/mssql-db-conn.d.ts +5 -5
- package/dist/connections/mssql-db-conn.js +12 -12
- package/dist/connections/mssql-db-conn.js.map +1 -1
- package/dist/connections/mysql-db-conn.d.ts +3 -3
- package/dist/connections/mysql-db-conn.js +9 -9
- package/dist/connections/mysql-db-conn.js.map +1 -1
- package/dist/connections/postgresql-db-conn.d.ts +3 -3
- package/dist/connections/postgresql-db-conn.js +6 -6
- package/dist/connections/postgresql-db-conn.js.map +1 -1
- package/dist/create-db-conn.d.ts +5 -5
- package/dist/create-db-conn.js +1 -1
- package/dist/create-orm.d.ts +18 -18
- package/dist/node-db-context-executor.d.ts +30 -30
- package/dist/node-db-context-executor.js +28 -28
- package/dist/pooled-db-conn.d.ts +27 -27
- package/dist/pooled-db-conn.js +29 -29
- package/dist/pooled-db-conn.js.map +1 -1
- package/dist/types/db-conn.d.ts +47 -47
- package/dist/types/db-conn.d.ts.map +1 -1
- package/dist/types/db-conn.js +2 -2
- package/package.json +5 -5
- package/src/connections/mssql-db-conn.ts +18 -18
- package/src/connections/mysql-db-conn.ts +25 -25
- package/src/connections/postgresql-db-conn.ts +14 -14
- package/src/create-db-conn.ts +17 -17
- package/src/create-orm.ts +20 -20
- package/src/node-db-context-executor.ts +34 -34
- package/src/pooled-db-conn.ts +42 -42
- package/src/types/db-conn.ts +48 -48
package/dist/pooled-db-conn.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ import type { Pool } from "generic-pool";
|
|
|
3
3
|
import type { ColumnMeta, IsolationLevel } from "@simplysm/orm-common";
|
|
4
4
|
import { type DbConn, type DbConnConfig } from "./types/db-conn";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* DB connection wrapper managed by connection pool
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Supports connection pooling using the generic-pool library.
|
|
9
|
+
* Acquires and returns actual physical connections from/to the pool.
|
|
10
10
|
*/
|
|
11
11
|
export declare class PooledDbConn extends EventEmitter<{
|
|
12
12
|
close: void;
|
|
@@ -20,59 +20,59 @@ export declare class PooledDbConn extends EventEmitter<{
|
|
|
20
20
|
get isConnected(): boolean;
|
|
21
21
|
get isInTransaction(): boolean;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Acquire DB connection from pool
|
|
24
24
|
*
|
|
25
|
-
* @throws {SdError}
|
|
25
|
+
* @throws {SdError} When already connected
|
|
26
26
|
*/
|
|
27
27
|
connect(): Promise<void>;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* Return DB connection to pool (does not terminate actual connection)
|
|
30
30
|
*/
|
|
31
31
|
close(): Promise<void>;
|
|
32
32
|
private readonly _onRawConnClose;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
34
|
+
* Begin transaction
|
|
35
35
|
*
|
|
36
|
-
* @param isolationLevel -
|
|
37
|
-
* @throws {SdError}
|
|
36
|
+
* @param isolationLevel - Transaction isolation level
|
|
37
|
+
* @throws {SdError} When connection is not acquired
|
|
38
38
|
*/
|
|
39
39
|
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* Commit transaction
|
|
42
42
|
*
|
|
43
|
-
* @throws {SdError}
|
|
43
|
+
* @throws {SdError} When connection is not acquired
|
|
44
44
|
*/
|
|
45
45
|
commitTransaction(): Promise<void>;
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* Rollback transaction
|
|
48
48
|
*
|
|
49
|
-
* @throws {SdError}
|
|
49
|
+
* @throws {SdError} When connection is not acquired
|
|
50
50
|
*/
|
|
51
51
|
rollbackTransaction(): Promise<void>;
|
|
52
52
|
/**
|
|
53
|
-
* SQL
|
|
53
|
+
* Execute SQL query
|
|
54
54
|
*
|
|
55
|
-
* @param queries -
|
|
56
|
-
* @returns
|
|
57
|
-
* @throws {SdError}
|
|
55
|
+
* @param queries - SQL query array to execute
|
|
56
|
+
* @returns Result array for each query
|
|
57
|
+
* @throws {SdError} When connection is not acquired
|
|
58
58
|
*/
|
|
59
59
|
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* Execute parameterized SQL query
|
|
62
62
|
*
|
|
63
|
-
* @param query - SQL
|
|
64
|
-
* @param params -
|
|
65
|
-
* @returns
|
|
66
|
-
* @throws {SdError}
|
|
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
67
|
*/
|
|
68
68
|
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
69
69
|
/**
|
|
70
|
-
*
|
|
70
|
+
* Bulk insert data (using native bulk API)
|
|
71
71
|
*
|
|
72
|
-
* @param tableName -
|
|
73
|
-
* @param columnMetas -
|
|
74
|
-
* @param records -
|
|
75
|
-
* @throws {SdError}
|
|
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
76
|
*/
|
|
77
77
|
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
78
78
|
private _requireRawConn;
|
package/dist/pooled-db-conn.js
CHANGED
|
@@ -9,7 +9,7 @@ class PooledDbConn extends EventEmitter {
|
|
|
9
9
|
this._initialConfig = _initialConfig;
|
|
10
10
|
this._getLastCreateError = _getLastCreateError;
|
|
11
11
|
}
|
|
12
|
-
//
|
|
12
|
+
// Actual physical connection borrowed from pool
|
|
13
13
|
_rawConn;
|
|
14
14
|
// [Property] config
|
|
15
15
|
get config() {
|
|
@@ -24,9 +24,9 @@ class PooledDbConn extends EventEmitter {
|
|
|
24
24
|
return this._rawConn?.isInTransaction ?? false;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Acquire DB connection from pool
|
|
28
28
|
*
|
|
29
|
-
* @throws {SdError}
|
|
29
|
+
* @throws {SdError} When already connected
|
|
30
30
|
*/
|
|
31
31
|
async connect() {
|
|
32
32
|
if (this._rawConn != null) {
|
|
@@ -39,13 +39,13 @@ class PooledDbConn extends EventEmitter {
|
|
|
39
39
|
const cause = this._getLastCreateError?.() ?? (err instanceof Error ? err : void 0);
|
|
40
40
|
throw new SdError(
|
|
41
41
|
...cause != null ? [cause] : [],
|
|
42
|
-
`DB
|
|
42
|
+
`DB connection failed [${dialect}://${host}:${port ?? ""}/${database ?? ""}]`
|
|
43
43
|
);
|
|
44
44
|
}
|
|
45
45
|
this._rawConn.on("close", this._onRawConnClose);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Return DB connection to pool (does not terminate actual connection)
|
|
49
49
|
*/
|
|
50
50
|
async close() {
|
|
51
51
|
if (this._rawConn != null) {
|
|
@@ -53,7 +53,7 @@ class PooledDbConn extends EventEmitter {
|
|
|
53
53
|
try {
|
|
54
54
|
await this._rawConn.rollbackTransaction();
|
|
55
55
|
} catch (err) {
|
|
56
|
-
logger.warn("
|
|
56
|
+
logger.warn("Rollback failed when returning to pool", err instanceof Error ? err.message : String(err));
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
this._rawConn.off("close", this._onRawConnClose);
|
|
@@ -62,70 +62,70 @@ class PooledDbConn extends EventEmitter {
|
|
|
62
62
|
this.emit("close");
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
//
|
|
65
|
+
// Handler for physical connection loss
|
|
66
66
|
_onRawConnClose = () => {
|
|
67
67
|
this._rawConn = void 0;
|
|
68
68
|
this.emit("close");
|
|
69
69
|
};
|
|
70
|
-
// ---
|
|
70
|
+
// --- Below are delegation methods ---
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* Begin transaction
|
|
73
73
|
*
|
|
74
|
-
* @param isolationLevel -
|
|
75
|
-
* @throws {SdError}
|
|
74
|
+
* @param isolationLevel - Transaction isolation level
|
|
75
|
+
* @throws {SdError} When connection is not acquired
|
|
76
76
|
*/
|
|
77
77
|
async beginTransaction(isolationLevel) {
|
|
78
78
|
const conn = this._requireRawConn();
|
|
79
79
|
await conn.beginTransaction(isolationLevel);
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* Commit transaction
|
|
83
83
|
*
|
|
84
|
-
* @throws {SdError}
|
|
84
|
+
* @throws {SdError} When connection is not acquired
|
|
85
85
|
*/
|
|
86
86
|
async commitTransaction() {
|
|
87
87
|
const conn = this._requireRawConn();
|
|
88
88
|
await conn.commitTransaction();
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
|
-
*
|
|
91
|
+
* Rollback transaction
|
|
92
92
|
*
|
|
93
|
-
* @throws {SdError}
|
|
93
|
+
* @throws {SdError} When connection is not acquired
|
|
94
94
|
*/
|
|
95
95
|
async rollbackTransaction() {
|
|
96
96
|
const conn = this._requireRawConn();
|
|
97
97
|
await conn.rollbackTransaction();
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
|
-
* SQL
|
|
100
|
+
* Execute SQL query
|
|
101
101
|
*
|
|
102
|
-
* @param queries -
|
|
103
|
-
* @returns
|
|
104
|
-
* @throws {SdError}
|
|
102
|
+
* @param queries - SQL query array to execute
|
|
103
|
+
* @returns Result array for each query
|
|
104
|
+
* @throws {SdError} When connection is not acquired
|
|
105
105
|
*/
|
|
106
106
|
async execute(queries) {
|
|
107
107
|
const conn = this._requireRawConn();
|
|
108
108
|
return conn.execute(queries);
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
|
-
*
|
|
111
|
+
* Execute parameterized SQL query
|
|
112
112
|
*
|
|
113
|
-
* @param query - SQL
|
|
114
|
-
* @param params -
|
|
115
|
-
* @returns
|
|
116
|
-
* @throws {SdError}
|
|
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
117
|
*/
|
|
118
118
|
async executeParametrized(query, params) {
|
|
119
119
|
const conn = this._requireRawConn();
|
|
120
120
|
return conn.executeParametrized(query, params);
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
|
-
*
|
|
123
|
+
* Bulk insert data (using native bulk API)
|
|
124
124
|
*
|
|
125
|
-
* @param tableName -
|
|
126
|
-
* @param columnMetas -
|
|
127
|
-
* @param records -
|
|
128
|
-
* @throws {SdError}
|
|
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
129
|
*/
|
|
130
130
|
async bulkInsert(tableName, columnMetas, records) {
|
|
131
131
|
const conn = this._requireRawConn();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/pooled-db-conn.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,aAAa;AACpB,SAAS,SAAS,oBAAoB;AAGtC,SAAS,sBAAsD;AAE/D,MAAM,SAAS,QAAQ,QAAQ,gBAAgB;AAQxC,MAAM,qBAAqB,aAAgD;AAAA,EAIhF,YACmB,OACA,gBACA,qBACjB;AACA,UAAM;AAJW;AACA;AACA;AAAA,EAGnB;AAAA;AAAA,EARQ;AAAA;AAAA,EAWR,IAAI,SAAuB;AACzB,WAAO,KAAK,UAAU,UAAU,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACzB,WAAO,KAAK,UAAU,eAAe;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,kBAA2B;AAC7B,WAAO,KAAK,UAAU,mBAAmB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAyB;AAC7B,QAAI,KAAK,YAAY,MAAM;AACzB,YAAM,IAAI,QAAQ,eAAe,iBAAiB;AAAA,IACpD;AAGA,QAAI;AACF,WAAK,WAAW,MAAM,KAAK,MAAM,QAAQ;AAAA,IAC3C,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,MAAM,MAAM,SAAS,IAAI,KAAK;AAC/C,YAAM,QAAQ,KAAK,sBAAsB,MAAM,eAAe,QAAQ,MAAM;AAC5E,YAAM,IAAI;AAAA,QACR,GAAI,SAAS,OAAO,CAAC,KAAK,IAAI,CAAC;AAAA,QAC/B,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/types/db-conn.d.ts
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
1
|
import type { EventEmitter } from "@simplysm/core-common";
|
|
2
2
|
import type { ColumnMeta, Dialect, IsolationLevel } from "@simplysm/orm-common";
|
|
3
3
|
/**
|
|
4
|
-
* DB
|
|
4
|
+
* DB connection establishment timeout (10 seconds)
|
|
5
5
|
*/
|
|
6
6
|
export declare const DB_CONN_CONNECT_TIMEOUT: number;
|
|
7
7
|
/**
|
|
8
|
-
* DB
|
|
8
|
+
* DB query default timeout (10 minutes)
|
|
9
9
|
*/
|
|
10
10
|
export declare const DB_CONN_DEFAULT_TIMEOUT: number;
|
|
11
11
|
/**
|
|
12
|
-
* DB
|
|
12
|
+
* DB connection error messages
|
|
13
13
|
*/
|
|
14
14
|
export declare const DB_CONN_ERRORS: {
|
|
15
|
-
readonly NOT_CONNECTED: "'Connection'
|
|
16
|
-
readonly ALREADY_CONNECTED: "
|
|
15
|
+
readonly NOT_CONNECTED: "'Connection' is not connected.";
|
|
16
|
+
readonly ALREADY_CONNECTED: "'Connection' is already connected.";
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Low-level DB connection interface
|
|
20
20
|
*
|
|
21
|
-
*
|
|
22
|
-
* - {@link MysqlDbConn} - MySQL
|
|
23
|
-
* - {@link MssqlDbConn} - MSSQL
|
|
24
|
-
* - {@link PostgresqlDbConn} - PostgreSQL
|
|
21
|
+
* Implementations for each DBMS implement this interface.
|
|
22
|
+
* - {@link MysqlDbConn} - MySQL connection
|
|
23
|
+
* - {@link MssqlDbConn} - MSSQL connection
|
|
24
|
+
* - {@link PostgresqlDbConn} - PostgreSQL connection
|
|
25
25
|
*
|
|
26
26
|
* @remarks
|
|
27
|
-
*
|
|
27
|
+
* Inherits from EventEmitter and emits 'close' events.
|
|
28
28
|
*/
|
|
29
29
|
export interface DbConn extends EventEmitter<{
|
|
30
30
|
close: void;
|
|
31
31
|
}> {
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Connection configuration
|
|
34
34
|
*/
|
|
35
35
|
config: DbConnConfig;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Whether connected
|
|
38
38
|
*/
|
|
39
39
|
isConnected: boolean;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* Whether transaction is in progress
|
|
42
42
|
*/
|
|
43
43
|
isInTransaction: boolean;
|
|
44
44
|
/**
|
|
45
|
-
* DB
|
|
45
|
+
* Establish DB connection
|
|
46
46
|
*/
|
|
47
47
|
connect(): Promise<void>;
|
|
48
48
|
/**
|
|
49
|
-
* DB
|
|
49
|
+
* Close DB connection
|
|
50
50
|
*/
|
|
51
51
|
close(): Promise<void>;
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
53
|
+
* Begin transaction
|
|
54
54
|
*
|
|
55
|
-
* @param isolationLevel -
|
|
55
|
+
* @param isolationLevel - Isolation level (optional)
|
|
56
56
|
*/
|
|
57
57
|
beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
|
|
58
58
|
/**
|
|
59
|
-
*
|
|
59
|
+
* Commit transaction
|
|
60
60
|
*/
|
|
61
61
|
commitTransaction(): Promise<void>;
|
|
62
62
|
/**
|
|
63
|
-
*
|
|
63
|
+
* Rollback transaction
|
|
64
64
|
*/
|
|
65
65
|
rollbackTransaction(): Promise<void>;
|
|
66
66
|
/**
|
|
67
|
-
* SQL
|
|
67
|
+
* Execute SQL query array
|
|
68
68
|
*
|
|
69
|
-
* @param queries -
|
|
70
|
-
* @returns
|
|
69
|
+
* @param queries - SQL string array to execute
|
|
70
|
+
* @returns Array of result arrays for each query
|
|
71
71
|
*/
|
|
72
72
|
execute(queries: string[]): Promise<Record<string, unknown>[][]>;
|
|
73
73
|
/**
|
|
74
|
-
*
|
|
74
|
+
* Execute parameterized query
|
|
75
75
|
*
|
|
76
|
-
* @param query - SQL
|
|
77
|
-
* @param params -
|
|
78
|
-
* @returns
|
|
76
|
+
* @param query - SQL query string
|
|
77
|
+
* @param params - Binding parameters (optional)
|
|
78
|
+
* @returns Array of result arrays
|
|
79
79
|
*/
|
|
80
80
|
executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>;
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* Bulk INSERT (using native bulk API)
|
|
83
83
|
*
|
|
84
84
|
* - MSSQL: tedious BulkLoad
|
|
85
|
-
* - MySQL: LOAD DATA LOCAL INFILE (
|
|
85
|
+
* - MySQL: LOAD DATA LOCAL INFILE (temporary file)
|
|
86
86
|
* - PostgreSQL: COPY FROM STDIN
|
|
87
87
|
*
|
|
88
|
-
* @param tableName -
|
|
89
|
-
* @param columnMetas -
|
|
90
|
-
* @param records -
|
|
88
|
+
* @param tableName - Table name (database.table or database.schema.table)
|
|
89
|
+
* @param columnMetas - Column name → ColumnMeta mapping
|
|
90
|
+
* @param records - Record array to insert
|
|
91
91
|
*/
|
|
92
92
|
bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>;
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
|
-
*
|
|
95
|
+
* Connection pool configuration
|
|
96
96
|
*
|
|
97
97
|
* @remarks
|
|
98
|
-
*
|
|
99
|
-
* - min: 1 (
|
|
100
|
-
* - max: 10 (
|
|
101
|
-
* - acquireTimeoutMillis: 30000 (
|
|
102
|
-
* - idleTimeoutMillis: 30000 (
|
|
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
103
|
*/
|
|
104
104
|
export interface DbPoolConfig {
|
|
105
|
-
/**
|
|
105
|
+
/** Minimum connection count (default: 1) */
|
|
106
106
|
min?: number;
|
|
107
|
-
/**
|
|
107
|
+
/** Maximum connection count (default: 10) */
|
|
108
108
|
max?: number;
|
|
109
|
-
/**
|
|
109
|
+
/** Connection acquisition timeout (milliseconds, default: 30000) */
|
|
110
110
|
acquireTimeoutMillis?: number;
|
|
111
|
-
/**
|
|
111
|
+
/** Idle connection timeout (milliseconds, default: 30000) */
|
|
112
112
|
idleTimeoutMillis?: number;
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
|
-
* DB
|
|
115
|
+
* DB connection configuration type (branching by dialect)
|
|
116
116
|
*/
|
|
117
117
|
export type DbConnConfig = MysqlDbConnConfig | MssqlDbConnConfig | PostgresqlDbConnConfig;
|
|
118
118
|
/**
|
|
119
|
-
* MySQL
|
|
119
|
+
* MySQL connection configuration
|
|
120
120
|
*/
|
|
121
121
|
export interface MysqlDbConnConfig {
|
|
122
122
|
dialect: "mysql";
|
|
@@ -129,7 +129,7 @@ export interface MysqlDbConnConfig {
|
|
|
129
129
|
pool?: DbPoolConfig;
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
|
-
* MSSQL
|
|
132
|
+
* MSSQL connection configuration
|
|
133
133
|
*/
|
|
134
134
|
export interface MssqlDbConnConfig {
|
|
135
135
|
dialect: "mssql" | "mssql-azure";
|
|
@@ -143,7 +143,7 @@ export interface MssqlDbConnConfig {
|
|
|
143
143
|
pool?: DbPoolConfig;
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
146
|
-
* PostgreSQL
|
|
146
|
+
* PostgreSQL connection configuration
|
|
147
147
|
*/
|
|
148
148
|
export interface PostgresqlDbConnConfig {
|
|
149
149
|
dialect: "postgresql";
|
|
@@ -157,7 +157,7 @@ export interface PostgresqlDbConnConfig {
|
|
|
157
157
|
pool?: DbPoolConfig;
|
|
158
158
|
}
|
|
159
159
|
/**
|
|
160
|
-
*
|
|
160
|
+
* Extract Dialect from DbConnConfig
|
|
161
161
|
*/
|
|
162
162
|
export declare function getDialectFromConfig(config: DbConnConfig): Dialect;
|
|
163
163
|
//# sourceMappingURL=db-conn.d.ts.map
|
|
@@ -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;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,
|
|
1
|
+
{"version":3,"file":"db-conn.d.ts","sourceRoot":"","sources":["..\\..\\src\\types\\db-conn.ts"],"names":[],"mappings":"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"}
|
package/dist/types/db-conn.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const DB_CONN_CONNECT_TIMEOUT = 10 * 1e3;
|
|
2
2
|
const DB_CONN_DEFAULT_TIMEOUT = 10 * 60 * 1e3;
|
|
3
3
|
const DB_CONN_ERRORS = {
|
|
4
|
-
NOT_CONNECTED: "'Connection'
|
|
5
|
-
ALREADY_CONNECTED: "
|
|
4
|
+
NOT_CONNECTED: "'Connection' is not connected.",
|
|
5
|
+
ALREADY_CONNECTED: "'Connection' is already connected."
|
|
6
6
|
};
|
|
7
7
|
function getDialectFromConfig(config) {
|
|
8
8
|
if (config.dialect === "mssql-azure") {
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/orm-node",
|
|
3
|
-
"version": "13.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "
|
|
3
|
+
"version": "13.0.70",
|
|
4
|
+
"description": "Simplysm package - ORM module (node)",
|
|
5
|
+
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"consola": "^3.4.2",
|
|
22
22
|
"generic-pool": "^3.9.0",
|
|
23
|
-
"@simplysm/core-common": "13.0.
|
|
24
|
-
"@simplysm/orm-common": "13.0.
|
|
23
|
+
"@simplysm/core-common": "13.0.70",
|
|
24
|
+
"@simplysm/orm-common": "13.0.70"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/pg": "^8.16.0",
|
|
@@ -24,9 +24,9 @@ import type { DataType as TediousDataType } from "tedious/lib/data-type";
|
|
|
24
24
|
const logger = consola.withTag("mssql-db-conn");
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* MSSQL
|
|
27
|
+
* MSSQL database connection class
|
|
28
28
|
*
|
|
29
|
-
*
|
|
29
|
+
* Manages MSSQL/Azure SQL connections using the tedious library.
|
|
30
30
|
*/
|
|
31
31
|
export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn {
|
|
32
32
|
private readonly _timeout = DB_CONN_DEFAULT_TIMEOUT;
|
|
@@ -114,11 +114,11 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
114
114
|
|
|
115
115
|
const conn = this._conn;
|
|
116
116
|
|
|
117
|
-
//
|
|
117
|
+
// Cancel in-progress requests
|
|
118
118
|
conn.cancel();
|
|
119
119
|
await waitUntil(() => this._requests.length < 1, 30000, 100);
|
|
120
120
|
|
|
121
|
-
//
|
|
121
|
+
// Wait for connection termination
|
|
122
122
|
await new Promise<void>((resolve) => {
|
|
123
123
|
conn.on("end", () => {
|
|
124
124
|
waitUntil(() => this._conn == null, 30000, 100)
|
|
@@ -213,7 +213,7 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
213
213
|
|
|
214
214
|
const results: Record<string, unknown>[][] = [];
|
|
215
215
|
|
|
216
|
-
logger.debug("
|
|
216
|
+
logger.debug("Query execution", { queryLength: query.length, params });
|
|
217
217
|
await new Promise<void>((resolve, reject) => {
|
|
218
218
|
let rejected = false;
|
|
219
219
|
const queryRequest = new this._tedious.Request(query, (err) => {
|
|
@@ -223,17 +223,17 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
223
223
|
|
|
224
224
|
const errRec = err as unknown as Record<string, unknown>;
|
|
225
225
|
if (errRec["code"] === "ECANCEL") {
|
|
226
|
-
reject(new SdError(err, "
|
|
226
|
+
reject(new SdError(err, "Query was cancelled."));
|
|
227
227
|
} else {
|
|
228
228
|
const lineNumber = errRec["lineNumber"] as number | undefined;
|
|
229
229
|
if (lineNumber != null && lineNumber > 0) {
|
|
230
230
|
const splitQuery = query.split("\n");
|
|
231
231
|
splitQuery[lineNumber - 1] = "==> " + splitQuery[lineNumber - 1];
|
|
232
232
|
reject(
|
|
233
|
-
new SdError(err,
|
|
233
|
+
new SdError(err, `Error executing query\n-- query\n${splitQuery.join("\n")}\n--`),
|
|
234
234
|
);
|
|
235
235
|
} else {
|
|
236
|
-
reject(new SdError(err,
|
|
236
|
+
reject(new SdError(err, `Error executing query\n-- query\n${query}\n--`));
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
}
|
|
@@ -267,7 +267,7 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
267
267
|
|
|
268
268
|
rejected = true;
|
|
269
269
|
this._requests = this._requests.filter((r) => r !== queryRequest);
|
|
270
|
-
reject(new SdError(err,
|
|
270
|
+
reject(new SdError(err, `Error executing query\n-- query\n${query}\n--`));
|
|
271
271
|
})
|
|
272
272
|
.on("requestCompleted", () => {
|
|
273
273
|
this._startTimeout();
|
|
@@ -320,7 +320,7 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
320
320
|
reject(
|
|
321
321
|
new SdError(
|
|
322
322
|
err,
|
|
323
|
-
`Bulk Insert
|
|
323
|
+
`Bulk Insert error\n${jsonStringify(tediousColumnDefs)}\n-- data\n${jsonStringify(records).substring(0, 10000)}...\n--`,
|
|
324
324
|
),
|
|
325
325
|
);
|
|
326
326
|
return;
|
|
@@ -334,12 +334,12 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
334
334
|
bulkLoad.addColumn(tediousColumnDef.name, tediousColumnDef.type, tediousColumnDef.options);
|
|
335
335
|
}
|
|
336
336
|
|
|
337
|
-
//
|
|
337
|
+
// Convert records to row arrays (maintain column order, include value conversion)
|
|
338
338
|
const rows = records.map((record) =>
|
|
339
339
|
colNames.map((colName) => {
|
|
340
340
|
const val = record[colName];
|
|
341
341
|
if (val instanceof Uuid) return val.toString();
|
|
342
|
-
// eslint-disable-next-line no-restricted-globals -- tedious
|
|
342
|
+
// eslint-disable-next-line no-restricted-globals -- tedious library requires Buffer
|
|
343
343
|
if (val instanceof Uint8Array) return Buffer.from(val);
|
|
344
344
|
if (val instanceof DateTime) return val.date;
|
|
345
345
|
if (val instanceof DateOnly) return val.date;
|
|
@@ -457,19 +457,19 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
457
457
|
case "uuid":
|
|
458
458
|
return { type: this._tedious.TYPES.UniqueIdentifier };
|
|
459
459
|
default:
|
|
460
|
-
throw new SdError(
|
|
460
|
+
throw new SdError(`Unsupported DataType: ${JSON.stringify(dataType)}`);
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
|
|
464
464
|
/**
|
|
465
|
-
*
|
|
465
|
+
* Infer the type of a value and return Tedious data type
|
|
466
466
|
*
|
|
467
|
-
* @param value -
|
|
468
|
-
* @throws null/undefined
|
|
467
|
+
* @param value - Value whose type is to be inferred (error if null/undefined is passed)
|
|
468
|
+
* @throws Error if null/undefined is passed
|
|
469
469
|
*/
|
|
470
470
|
private _guessTediousType(value: unknown): TediousDataType {
|
|
471
471
|
if (value == null) {
|
|
472
|
-
throw new SdError("_guessTediousType: null/undefined
|
|
472
|
+
throw new SdError("_guessTediousType: null/undefined values are not supported.");
|
|
473
473
|
}
|
|
474
474
|
if (typeof value === "string") {
|
|
475
475
|
return this._tedious.TYPES.NVarChar;
|
|
@@ -484,7 +484,7 @@ export class MssqlDbConn extends EventEmitter<{ close: void }> implements DbConn
|
|
|
484
484
|
if (value instanceof Uuid) return this._tedious.TYPES.UniqueIdentifier;
|
|
485
485
|
if (value instanceof Uint8Array) return this._tedious.TYPES.VarBinary;
|
|
486
486
|
|
|
487
|
-
throw new SdError(
|
|
487
|
+
throw new SdError(`Unknown value type: ${typeof value}`);
|
|
488
488
|
}
|
|
489
489
|
}
|
|
490
490
|
|