pqb 0.62.0 → 0.63.0
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/dist/index.d.ts +6790 -6281
- package/dist/index.js +11206 -10334
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10830 -10081
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +1 -10759
- package/dist/internal.js +652 -16358
- package/dist/internal.js.map +1 -1
- package/dist/internal.mjs +1 -16196
- package/dist/internal.mjs.map +1 -1
- package/dist/node-postgres.d.ts +9730 -19
- package/dist/node-postgres.js +255 -32
- package/dist/node-postgres.js.map +1 -1
- package/dist/node-postgres.mjs +255 -32
- package/dist/node-postgres.mjs.map +1 -1
- package/dist/postgres-js.d.ts +9733 -22
- package/dist/postgres-js.js +229 -19
- package/dist/postgres-js.js.map +1 -1
- package/dist/postgres-js.mjs +230 -20
- package/dist/postgres-js.mjs.map +1 -1
- package/dist/public.d.ts +1 -0
- package/dist/public.js +43 -0
- package/dist/public.js.map +1 -0
- package/dist/public.mjs +2 -0
- package/dist/public.mjs.map +1 -0
- package/package.json +23 -19
package/dist/node-postgres.mjs
CHANGED
|
@@ -30,6 +30,109 @@ const getResetLocalsSql = (parentLocals, options) => {
|
|
|
30
30
|
}, []).join("; ");
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
const quoteRoleIdentifier = (role) => {
|
|
34
|
+
return `"${role.replace(/"/g, '""')}"`;
|
|
35
|
+
};
|
|
36
|
+
const buildConfigRestoreExpression = (key, value) => {
|
|
37
|
+
const escapedKey = key.replace(/'/g, "''");
|
|
38
|
+
if (value === null || value === void 0) {
|
|
39
|
+
value = "";
|
|
40
|
+
}
|
|
41
|
+
return `set_config('${escapedKey}', '${value.replace(/'/g, "''")}', false) as "${key}"`;
|
|
42
|
+
};
|
|
43
|
+
const sqlSessionContextComputeSetup = (desired) => {
|
|
44
|
+
if (!desired) return void 0;
|
|
45
|
+
const role = desired.role;
|
|
46
|
+
const hasRole = role !== void 0;
|
|
47
|
+
const { setConfig } = desired;
|
|
48
|
+
const configKeys = setConfig && Object.keys(setConfig);
|
|
49
|
+
const hasConfig = configKeys && configKeys.length > 0;
|
|
50
|
+
if (!hasRole && !hasConfig) return void 0;
|
|
51
|
+
const result = {};
|
|
52
|
+
if (hasRole) {
|
|
53
|
+
result.roleSetupSql = `SET ROLE ${quoteRoleIdentifier(role)}`;
|
|
54
|
+
result.captureRoleSql = "SELECT current_user";
|
|
55
|
+
}
|
|
56
|
+
if (hasConfig && setConfig) {
|
|
57
|
+
result.captureConfigValues = configKeys;
|
|
58
|
+
const captureColumns = configKeys.map((key, i) => `current_setting($${i + 1}, true) as "${key}"`).join(", ");
|
|
59
|
+
result.captureConfigSql = `SELECT ${captureColumns}`;
|
|
60
|
+
const setColumns = configKeys.map((key) => {
|
|
61
|
+
const value = setConfig[key];
|
|
62
|
+
return `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value}', false) as "${key}"`;
|
|
63
|
+
}).join(", ");
|
|
64
|
+
result.configSetupSql = `SELECT ${setColumns}`;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
};
|
|
68
|
+
const sqlSessionContextBuildConfigRestoreBatchSql = (configs) => {
|
|
69
|
+
const keys = Object.keys(configs);
|
|
70
|
+
if (keys.length === 0) return void 0;
|
|
71
|
+
const expressions = keys.map((key) => buildConfigRestoreExpression(key, configs[key])).join(", ");
|
|
72
|
+
return `SELECT ${expressions}`;
|
|
73
|
+
};
|
|
74
|
+
const sqlSessionContextExecute = async (query, setup, mainQuery, release) => {
|
|
75
|
+
if (!setup) {
|
|
76
|
+
return mainQuery();
|
|
77
|
+
}
|
|
78
|
+
const captured = {};
|
|
79
|
+
const {
|
|
80
|
+
captureRoleSql,
|
|
81
|
+
roleSetupSql,
|
|
82
|
+
captureConfigSql,
|
|
83
|
+
captureConfigValues,
|
|
84
|
+
configSetupSql
|
|
85
|
+
} = setup;
|
|
86
|
+
const setupPromises = [];
|
|
87
|
+
if (captureRoleSql) {
|
|
88
|
+
setupPromises.push(
|
|
89
|
+
query(captureRoleSql).then((res) => {
|
|
90
|
+
captured.previousRole = res.rows[0]?.[0];
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
setupPromises.push(query(roleSetupSql));
|
|
94
|
+
}
|
|
95
|
+
if (captureConfigSql && captureConfigValues && configSetupSql) {
|
|
96
|
+
captured.previousConfigs = {};
|
|
97
|
+
const previousConfigs = captured.previousConfigs;
|
|
98
|
+
setupPromises.push(
|
|
99
|
+
query(captureConfigSql, captureConfigValues).then((res) => {
|
|
100
|
+
const row = res.rows[0];
|
|
101
|
+
captureConfigValues.forEach((key, i) => {
|
|
102
|
+
previousConfigs[key] = row[i];
|
|
103
|
+
});
|
|
104
|
+
})
|
|
105
|
+
);
|
|
106
|
+
setupPromises.push(query(configSetupSql));
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
await Promise.all(setupPromises);
|
|
110
|
+
return await mainQuery();
|
|
111
|
+
} finally {
|
|
112
|
+
try {
|
|
113
|
+
const cleanupPromises = [];
|
|
114
|
+
if (roleSetupSql && captured.previousRole !== void 0) {
|
|
115
|
+
cleanupPromises.push(
|
|
116
|
+
query(`SET ROLE ${quoteRoleIdentifier(captured.previousRole)}`)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
if (captured.previousConfigs) {
|
|
120
|
+
const restoreSql = sqlSessionContextBuildConfigRestoreBatchSql(
|
|
121
|
+
captured.previousConfigs
|
|
122
|
+
);
|
|
123
|
+
if (restoreSql) {
|
|
124
|
+
cleanupPromises.push(query(restoreSql));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
await Promise.all(cleanupPromises);
|
|
128
|
+
} finally {
|
|
129
|
+
if (release) {
|
|
130
|
+
await release();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
|
|
33
136
|
const createDb = ({
|
|
34
137
|
log,
|
|
35
138
|
...options
|
|
@@ -147,12 +250,32 @@ class NodePostgresAdapter {
|
|
|
147
250
|
connect() {
|
|
148
251
|
return this.pool.connect();
|
|
149
252
|
}
|
|
150
|
-
query(text, values) {
|
|
151
|
-
return
|
|
253
|
+
query(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
|
|
254
|
+
return queryWithSqlSession(
|
|
255
|
+
this,
|
|
256
|
+
void 0,
|
|
257
|
+
text,
|
|
258
|
+
values,
|
|
259
|
+
startingSavepoint,
|
|
260
|
+
releasingSavepoint,
|
|
261
|
+
false,
|
|
262
|
+
sqlSessionState,
|
|
263
|
+
true
|
|
264
|
+
);
|
|
152
265
|
}
|
|
153
266
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
-
arrays(text, values) {
|
|
155
|
-
return
|
|
267
|
+
arrays(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
|
|
268
|
+
return queryWithSqlSession(
|
|
269
|
+
this,
|
|
270
|
+
void 0,
|
|
271
|
+
text,
|
|
272
|
+
values,
|
|
273
|
+
startingSavepoint,
|
|
274
|
+
releasingSavepoint,
|
|
275
|
+
true,
|
|
276
|
+
sqlSessionState,
|
|
277
|
+
true
|
|
278
|
+
);
|
|
156
279
|
}
|
|
157
280
|
async transaction(...args) {
|
|
158
281
|
const client = await this.connect();
|
|
@@ -162,6 +285,18 @@ class NodePostgresAdapter {
|
|
|
162
285
|
client,
|
|
163
286
|
options?.options ? "BEGIN " + options.options : "BEGIN"
|
|
164
287
|
);
|
|
288
|
+
if (options?.sqlSessionState) {
|
|
289
|
+
const { role, setConfig } = options.sqlSessionState;
|
|
290
|
+
if (role) {
|
|
291
|
+
await performQueryOnClient(client, `SET ROLE ${role}`);
|
|
292
|
+
}
|
|
293
|
+
if (setConfig && Object.keys(setConfig).length > 0) {
|
|
294
|
+
const setColumns = Object.entries(setConfig).map(
|
|
295
|
+
([key, value]) => `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value}', true)`
|
|
296
|
+
).join(", ");
|
|
297
|
+
await performQueryOnClient(client, `SELECT ${setColumns}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
165
300
|
const localsSql = getSetLocalsSql(options);
|
|
166
301
|
if (localsSql) {
|
|
167
302
|
await client.query(localsSql);
|
|
@@ -222,20 +357,68 @@ const setSearchPath = (client, searchPath) => {
|
|
|
222
357
|
}
|
|
223
358
|
return;
|
|
224
359
|
};
|
|
225
|
-
const
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
360
|
+
const queryWithSqlSession = async (adapter, client, text, values, startingSavepoint, releasingSavepoint, arraysMode, sessionState, borrowConnection = false) => {
|
|
361
|
+
const setup = sqlSessionContextComputeSetup(sessionState);
|
|
362
|
+
if (!setup) {
|
|
363
|
+
if (borrowConnection) {
|
|
364
|
+
const conn2 = await adapter.connect();
|
|
365
|
+
try {
|
|
366
|
+
await setSearchPath(conn2, adapter.searchPath);
|
|
367
|
+
return await performQueryOnClient(
|
|
368
|
+
conn2,
|
|
369
|
+
text,
|
|
370
|
+
values,
|
|
371
|
+
arraysMode ? "array" : void 0,
|
|
372
|
+
startingSavepoint,
|
|
373
|
+
releasingSavepoint
|
|
374
|
+
);
|
|
375
|
+
} finally {
|
|
376
|
+
conn2.release();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return performQueryOnClient(
|
|
230
380
|
client,
|
|
231
381
|
text,
|
|
232
382
|
values,
|
|
233
|
-
|
|
234
|
-
startingSavepoint
|
|
383
|
+
arraysMode ? "array" : void 0,
|
|
384
|
+
startingSavepoint,
|
|
385
|
+
releasingSavepoint
|
|
235
386
|
);
|
|
236
|
-
} finally {
|
|
237
|
-
client.release();
|
|
238
387
|
}
|
|
388
|
+
const conn = borrowConnection ? await adapter.connect() : client;
|
|
389
|
+
const queryFn = (sql, vals) => {
|
|
390
|
+
return conn.query({ text: sql, values: vals, rowMode: "array" }).then((res) => ({
|
|
391
|
+
rows: res.rows,
|
|
392
|
+
rowCount: res.rowCount ?? 0,
|
|
393
|
+
fields: res.fields.map((f) => ({ name: f.name }))
|
|
394
|
+
}));
|
|
395
|
+
};
|
|
396
|
+
const releaseFn = borrowConnection ? async () => {
|
|
397
|
+
conn.release();
|
|
398
|
+
} : void 0;
|
|
399
|
+
const mainQuery = () => performQueryOnClient(
|
|
400
|
+
conn,
|
|
401
|
+
text,
|
|
402
|
+
values,
|
|
403
|
+
arraysMode ? "array" : void 0,
|
|
404
|
+
startingSavepoint,
|
|
405
|
+
releasingSavepoint
|
|
406
|
+
);
|
|
407
|
+
if (borrowConnection) {
|
|
408
|
+
try {
|
|
409
|
+
await setSearchPath(conn, adapter.searchPath);
|
|
410
|
+
return await sqlSessionContextExecute(
|
|
411
|
+
queryFn,
|
|
412
|
+
setup,
|
|
413
|
+
mainQuery,
|
|
414
|
+
releaseFn
|
|
415
|
+
);
|
|
416
|
+
} catch (err) {
|
|
417
|
+
conn.release();
|
|
418
|
+
throw err;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return sqlSessionContextExecute(queryFn, setup, mainQuery);
|
|
239
422
|
};
|
|
240
423
|
const performQueryOnClient = async (client, text, values, rowMode, startingSavepoint, releasingSavepoint) => {
|
|
241
424
|
const params = {
|
|
@@ -326,45 +509,85 @@ class NodePostgresTransactionAdapter {
|
|
|
326
509
|
connect() {
|
|
327
510
|
return Promise.resolve(this.client);
|
|
328
511
|
}
|
|
329
|
-
async query(text, values, startingSavepoint, releasingSavepoint) {
|
|
330
|
-
return
|
|
512
|
+
async query(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
|
|
513
|
+
return queryWithSqlSession(
|
|
514
|
+
this.adapter,
|
|
331
515
|
this.client,
|
|
332
516
|
text,
|
|
333
517
|
values,
|
|
334
|
-
void 0,
|
|
335
518
|
startingSavepoint,
|
|
336
|
-
releasingSavepoint
|
|
519
|
+
releasingSavepoint,
|
|
520
|
+
false,
|
|
521
|
+
sqlSessionState,
|
|
522
|
+
false
|
|
337
523
|
);
|
|
338
524
|
}
|
|
339
525
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
-
async arrays(text, values, startingSavepoint, releasingSavepoint) {
|
|
341
|
-
return
|
|
526
|
+
async arrays(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
|
|
527
|
+
return queryWithSqlSession(
|
|
528
|
+
this.adapter,
|
|
342
529
|
this.client,
|
|
343
530
|
text,
|
|
344
531
|
values,
|
|
345
|
-
"array",
|
|
346
532
|
startingSavepoint,
|
|
347
|
-
releasingSavepoint
|
|
533
|
+
releasingSavepoint,
|
|
534
|
+
true,
|
|
535
|
+
sqlSessionState,
|
|
536
|
+
false
|
|
348
537
|
);
|
|
349
538
|
}
|
|
350
539
|
async transaction(...args) {
|
|
351
540
|
const { cb, options } = getTransactionArgs(args);
|
|
541
|
+
let capturedRole;
|
|
542
|
+
const capturedConfigs = {};
|
|
543
|
+
const sqlSession = options?.sqlSessionState;
|
|
544
|
+
if (sqlSession) {
|
|
545
|
+
if (sqlSession.role) {
|
|
546
|
+
const roleResult = await this.query(
|
|
547
|
+
"SELECT current_role as role"
|
|
548
|
+
);
|
|
549
|
+
capturedRole = roleResult.rows[0].role;
|
|
550
|
+
}
|
|
551
|
+
if (sqlSession.setConfig && Object.keys(sqlSession.setConfig).length > 0) {
|
|
552
|
+
for (const key of Object.keys(sqlSession.setConfig)) {
|
|
553
|
+
const configResult = await this.query(
|
|
554
|
+
`SELECT current_setting('${key.replace(/'/g, "''")}', true) as val`
|
|
555
|
+
);
|
|
556
|
+
capturedConfigs[key] = configResult.rows[0].val;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
352
560
|
const localsSql = getSetLocalsSql(options);
|
|
353
561
|
if (localsSql) {
|
|
354
562
|
await this.query(localsSql);
|
|
355
563
|
}
|
|
356
564
|
const locals = mergeLocals(this.locals, options);
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
565
|
+
let res;
|
|
566
|
+
try {
|
|
567
|
+
res = await cb(
|
|
568
|
+
new NodePostgresTransactionAdapter(
|
|
569
|
+
this.adapter,
|
|
570
|
+
this.client,
|
|
571
|
+
this,
|
|
572
|
+
locals
|
|
573
|
+
)
|
|
574
|
+
);
|
|
575
|
+
} finally {
|
|
576
|
+
if (sqlSession) {
|
|
577
|
+
if (capturedRole !== void 0) {
|
|
578
|
+
await this.query(`SET ROLE ${capturedRole}`);
|
|
579
|
+
}
|
|
580
|
+
for (const [key, value] of Object.entries(capturedConfigs)) {
|
|
581
|
+
const restoreValue = value === null ? "" : value;
|
|
582
|
+
await this.query(
|
|
583
|
+
`SELECT set_config('${key.replace(/'/g, "''")}', '${restoreValue.replace(/'/g, "''")}', true)`
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
const resetLocalsSql = getResetLocalsSql(this.locals, options);
|
|
588
|
+
if (resetLocalsSql) {
|
|
589
|
+
await this.query(resetLocalsSql);
|
|
590
|
+
}
|
|
368
591
|
}
|
|
369
592
|
return res;
|
|
370
593
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-postgres.mjs","sources":["../src/adapters/adapter.utils.ts","../src/adapters/node-postgres.ts"],"sourcesContent":["import {\n AdapterTransactionOptions,\n TransactionAdapterBase,\n TransactionArgs,\n} from './adapter';\nimport { RecordStringOrNumber } from 'pqb/internal';\n\ninterface SolvedTransactionArgs {\n options: AdapterTransactionOptions | undefined;\n cb: (adapter: TransactionAdapterBase) => Promise<unknown>;\n}\n\nconst transactionArgs: SolvedTransactionArgs = {\n cb: undefined,\n options: undefined,\n} as never;\n\nexport const getTransactionArgs = (args: TransactionArgs<unknown>) => {\n if (args[1]) {\n transactionArgs.options = args[0] as AdapterTransactionOptions;\n transactionArgs.cb = args[1];\n } else {\n transactionArgs.cb = args[0] as never;\n }\n return transactionArgs;\n};\n\nexport const mergeLocals = (\n locals: RecordStringOrNumber,\n options?: AdapterTransactionOptions,\n): RecordStringOrNumber =>\n options?.locals ? { ...locals, ...options.locals } : locals;\n\nexport const getSetLocalsSql = (\n options?: AdapterTransactionOptions,\n): string | undefined => {\n if (!options?.locals) return;\n\n return Object.entries(options.locals)\n .map(([key, value]) => `SET LOCAL ${key}=${value}`)\n .join('; ');\n};\n\nexport const getResetLocalsSql = (\n parentLocals: RecordStringOrNumber,\n options?: AdapterTransactionOptions,\n): string | undefined => {\n if (!options?.locals) return;\n\n return Object.entries(options.locals)\n .reduce<string[]>((acc, [key, value]) => {\n if (parentLocals[key] !== value) {\n acc.push(`SET LOCAL ${key}=${parentLocals[key]}`);\n }\n return acc;\n }, [])\n .join('; ');\n};\n","import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n noop,\n QueryArraysResult,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n TransactionAdapterBase,\n QuerySchema,\n TransactionArgs,\n RecordStringOrNumber,\n} from 'pqb/internal';\nimport { QueryError, createDbWithAdapter } from 'pqb';\nimport {\n getResetLocalsSql,\n getSetLocalsSql,\n getTransactionArgs,\n mergeLocals,\n} from './adapter.utils';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new NodePostgresAdapter(options),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends AdapterConfigBase,\n Omit<PoolConfig, 'types' | 'connectionString'> {\n searchPath?: string;\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nexport class NodePostgresAdapter implements AdapterBase {\n pool: Pool;\n searchPath?: string;\n errorClass = DatabaseError;\n locals: RecordStringOrNumber;\n\n constructor(public config: NodePostgresAdapterOptions) {\n this.pool = this.configure(config);\n this.locals = this.searchPath\n ? { search_path: this.searchPath }\n : emptyObject;\n }\n\n isInTransaction(): boolean {\n return false;\n }\n\n private configure(config: NodePostgresAdapterOptions): Pool {\n let searchPath = config.searchPath;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!searchPath) {\n searchPath = url.searchParams.get('searchPath') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (searchPath)\n this.searchPath = searchPath === 'public' ? undefined : searchPath;\n\n const pool = new pg.Pool(config);\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.connect = wrapAdapterFnWithConnectRetry(this, () =>\n this.pool.connect(),\n );\n }\n\n return pool;\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n async updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n await this.close();\n this.configure({ ...this.config, ...config });\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n searchPath?: string;\n }): NodePostgresAdapter {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.searchPath !== undefined) {\n url.searchParams.set('searchPath', params.searchPath);\n }\n\n return new NodePostgresAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new NodePostgresAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSearchPath(): string | undefined {\n return this.searchPath;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n getSchema(): QuerySchema | undefined {\n return this.config.schema;\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n ): Promise<QueryResult<T>> {\n return performQuery(this, text, values, undefined) as never;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n ): Promise<QueryArraysResult<R>> {\n return performQuery(this, text, values, 'array') as never;\n }\n\n async transaction<Result>(...args: TransactionArgs<Result>): Promise<Result> {\n const client = await this.connect();\n\n const { cb, options } = getTransactionArgs(args);\n\n try {\n await performQueryOnClient(\n client,\n options?.options ? 'BEGIN ' + options.options : 'BEGIN',\n );\n\n const localsSql = getSetLocalsSql(options);\n if (localsSql) {\n await client.query(localsSql);\n }\n\n const locals = mergeLocals(this.locals, options);\n\n let result;\n try {\n result = await cb(\n new NodePostgresTransactionAdapter(this, client, this, locals),\n );\n } catch (err) {\n await performQueryOnClient(client, 'ROLLBACK');\n throw err;\n }\n await performQueryOnClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as DatabaseError;\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ninterface ConnectionSchema {\n connection: { searchPath?: string };\n}\n\nconst setSearchPath = (client: PoolClient, searchPath?: string) => {\n if (\n (client as unknown as ConnectionSchema).connection.searchPath !== searchPath\n ) {\n (client as unknown as ConnectionSchema).connection.searchPath = searchPath;\n return client.query(`SET search_path = ${searchPath || 'public'}`);\n }\n return;\n};\n\nconst performQuery = async (\n adapter: NodePostgresAdapter,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n startingSavepoint?: string,\n) => {\n const client = await adapter.connect();\n try {\n await setSearchPath(client, adapter.searchPath);\n return await performQueryOnClient(\n client,\n text,\n values,\n rowMode,\n startingSavepoint,\n );\n } finally {\n client.release();\n }\n};\n\nconst performQueryOnClient = async (\n client: PoolClient,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst performQueryOnClientWithSavepoint = (\n client: PoolClient,\n params: unknown,\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n let promise = startingSavepoint\n ? client\n .query(`SAVEPOINT \"${startingSavepoint}\"`)\n .then(() => client.query(params as never))\n : client.query(params as never);\n\n if (releasingSavepoint) {\n promise = promise.then(\n async (res) => {\n await client.query(`RELEASE SAVEPOINT \"${releasingSavepoint}\"`);\n return res;\n },\n async (err) => {\n await client.query(`ROLLBACK TO SAVEPOINT \"${releasingSavepoint}\"`);\n throw err;\n },\n );\n }\n\n return promise;\n};\n\nexport class NodePostgresTransactionAdapter implements TransactionAdapterBase {\n pool: Pool;\n config: PoolConfig;\n searchPath?: string;\n errorClass = DatabaseError;\n\n constructor(\n public adapter: NodePostgresAdapter,\n public client: PoolClient,\n public parent: AdapterBase,\n public locals: RecordStringOrNumber,\n ) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n this.searchPath = adapter.searchPath;\n }\n\n isInTransaction(): true {\n return true;\n }\n\n updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n return this.adapter.updateConfig(config);\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n searchPath?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSearchPath(): string | undefined {\n return this.adapter.getSearchPath();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n getSchema(): QuerySchema | undefined {\n return this.adapter.getSchema();\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\n }\n\n async query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n ): Promise<QueryResult<T>> {\n return await performQueryOnClient(\n this.client,\n text,\n values,\n undefined,\n startingSavepoint,\n releasingSavepoint,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n ): Promise<QueryArraysResult<R>> {\n return await performQueryOnClient(\n this.client,\n text,\n values,\n 'array',\n startingSavepoint,\n releasingSavepoint,\n );\n }\n\n async transaction<Result>(...args: TransactionArgs<Result>): Promise<Result> {\n const { cb, options } = getTransactionArgs(args);\n\n const localsSql = getSetLocalsSql(options);\n if (localsSql) {\n await this.query(localsSql);\n }\n\n const locals = mergeLocals(this.locals, options);\n\n const res = (await cb(\n new NodePostgresTransactionAdapter(\n this.adapter,\n this.client,\n this,\n locals,\n ),\n )) as Result;\n\n const resetLocalsSql = getResetLocalsSql(this.locals, options);\n if (resetLocalsSql) {\n await this.query(resetLocalsSql);\n }\n\n return res;\n }\n\n close() {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":["promise"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-postgres.mjs","sources":["../src/adapters/adapter.utils.ts","../src/adapters/features/sql-session-context.ts","../src/adapters/node-postgres.ts"],"sourcesContent":["import {\n AdapterTransactionOptions,\n TransactionAdapterBase,\n TransactionArgs,\n} from './adapter';\nimport { RecordStringOrNumber } from 'pqb/internal';\n\ninterface SolvedTransactionArgs {\n options: AdapterTransactionOptions | undefined;\n cb: (adapter: TransactionAdapterBase) => Promise<unknown>;\n}\n\nconst transactionArgs: SolvedTransactionArgs = {\n cb: undefined,\n options: undefined,\n} as never;\n\nexport const getTransactionArgs = (args: TransactionArgs<unknown>) => {\n if (args[1]) {\n transactionArgs.options = args[0] as AdapterTransactionOptions;\n transactionArgs.cb = args[1];\n } else {\n transactionArgs.cb = args[0] as never;\n }\n return transactionArgs;\n};\n\nexport const mergeLocals = (\n locals: RecordStringOrNumber,\n options?: AdapterTransactionOptions,\n): RecordStringOrNumber =>\n options?.locals ? { ...locals, ...options.locals } : locals;\n\nexport const getSetLocalsSql = (\n options?: AdapterTransactionOptions,\n): string | undefined => {\n if (!options?.locals) return;\n\n return Object.entries(options.locals)\n .map(([key, value]) => `SET LOCAL ${key}=${value}`)\n .join('; ');\n};\n\nexport const getResetLocalsSql = (\n parentLocals: RecordStringOrNumber,\n options?: AdapterTransactionOptions,\n): string | undefined => {\n if (!options?.locals) return;\n\n return Object.entries(options.locals)\n .reduce<string[]>((acc, [key, value]) => {\n if (parentLocals[key] !== value) {\n acc.push(`SET LOCAL ${key}=${parentLocals[key]}`);\n }\n return acc;\n }, [])\n .join('; ');\n};\n","import { type IsQuery } from '../../query';\nimport { NestedSqlSessionError } from '../../query/errors';\nimport { type PickQueryQ } from '../../query/pick-query-types';\nimport { type QueryResult, type QueryResultRow } from '../adapter';\n\nexport interface SqlSessionState {\n // Query-scoped: Postgres role to set for this callback scope (from withOptions)\n role?: string;\n // Query-scoped: Postgres custom settings to set for this callback scope (from withOptions)\n setConfig?: Record<string, string | number | boolean>;\n}\n\nexport interface SqlSessionContextSetupResult {\n roleSetupSql?: string;\n configSetupSql?: string;\n captureRoleSql?: string;\n captureConfigSql?: string;\n captureConfigValues?: string[];\n}\n\nexport interface SqlSessionContextQueryFn {\n (sql: string, values?: unknown[]): Promise<QueryResult<QueryResultRow>>;\n}\n\ninterface CapturedSessionState {\n previousRole?: string;\n previousConfigs?: Record<string, string | null>;\n}\n\nconst quoteRoleIdentifier = (role: string): string => {\n return `\"${role.replace(/\"/g, '\"\"')}\"`;\n};\n\nconst hasSqlSessionContextOptions = (options: SqlSessionState): boolean => {\n return options.role !== undefined || options.setConfig !== undefined;\n};\n\nconst hasActiveSqlSessionContext = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return state.role !== undefined || state.setConfig !== undefined;\n};\n\nconst sqlSessionContextNormalizeSetConfig = (\n setConfig: Record<string, string | number | boolean>,\n): Record<string, string> => {\n return Object.fromEntries(\n Object.entries(setConfig).map(([key, value]) => [key, String(value)]),\n );\n};\n\nconst buildConfigRestoreExpression = (\n key: string,\n value: string | null | undefined,\n): string => {\n const escapedKey = key.replace(/'/g, \"''\");\n if (value === null || value === undefined) {\n value = '';\n }\n return `set_config('${escapedKey}', '${value.replace(/'/g, \"''\")}', false) as \"${key}\"`;\n};\n\nexport const sqlSessionContextSetStorageOptions = (\n query: PickQueryQ,\n state: SqlSessionState | undefined,\n options: SqlSessionState,\n result: SqlSessionState,\n): void => {\n if (\n hasSqlSessionContextOptions(options) &&\n hasActiveSqlSessionContext(state)\n ) {\n throw new NestedSqlSessionError(query as unknown as IsQuery);\n }\n\n if (options.role !== undefined) {\n result.role = options.role;\n }\n\n if (options.setConfig) {\n result.setConfig = sqlSessionContextNormalizeSetConfig(options.setConfig);\n }\n};\n\nexport const sqlSessionContextMergeStorageState = (\n state: SqlSessionState | undefined,\n options: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n if (!options) return state;\n\n return {\n role: options.role ?? state?.role,\n setConfig: options.setConfig ?? state?.setConfig,\n };\n};\n\nexport const sqlSessionContextGetStateFromAsyncState = (\n state: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n return state?.role || state?.setConfig ? state : undefined;\n};\n\nexport const sqlSessionContextComputeSetup = (\n desired: SqlSessionState | undefined,\n): SqlSessionContextSetupResult | undefined => {\n if (!desired) return undefined;\n\n const role = desired.role;\n const hasRole = role !== undefined;\n const { setConfig } = desired;\n const configKeys = setConfig && Object.keys(setConfig);\n const hasConfig = configKeys && configKeys.length > 0;\n\n if (!hasRole && !hasConfig) return undefined;\n\n const result: SqlSessionContextSetupResult = {};\n\n if (hasRole) {\n result.roleSetupSql = `SET ROLE ${quoteRoleIdentifier(role)}`;\n result.captureRoleSql = 'SELECT current_user';\n }\n\n if (hasConfig && setConfig) {\n result.captureConfigValues = configKeys;\n const captureColumns = configKeys\n .map((key, i) => `current_setting($${i + 1}, true) as \"${key}\"`)\n .join(', ');\n result.captureConfigSql = `SELECT ${captureColumns}`;\n\n const setColumns = configKeys\n .map((key) => {\n const value = setConfig[key];\n return `set_config('${key.replace(/'/g, \"''\")}', '${typeof value === 'string' ? value.replace(/'/g, \"''\") : value}', false) as \"${key}\"`;\n })\n .join(', ');\n result.configSetupSql = `SELECT ${setColumns}`;\n }\n\n return result;\n};\n\nexport const sqlSessionContextBuildConfigRestoreBatchSql = (\n configs: Record<string, string | null | undefined>,\n): string | undefined => {\n const keys = Object.keys(configs);\n if (keys.length === 0) return undefined;\n\n const expressions = keys\n .map((key) => buildConfigRestoreExpression(key, configs[key]))\n .join(', ');\n return `SELECT ${expressions}`;\n};\n\nexport const sqlSessionContextHasState = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return (\n state.role !== undefined ||\n (state.setConfig !== undefined && Object.keys(state.setConfig).length > 0)\n );\n};\n\nexport const sqlSessionContextExecute = async <T extends QueryResultRow>(\n query: SqlSessionContextQueryFn,\n setup: SqlSessionContextSetupResult | undefined,\n mainQuery: () => Promise<QueryResult<T>>,\n release?: () => Promise<void>,\n): Promise<QueryResult<T>> => {\n if (!setup) {\n return mainQuery();\n }\n\n const captured: CapturedSessionState = {};\n const {\n captureRoleSql,\n roleSetupSql,\n captureConfigSql,\n captureConfigValues,\n configSetupSql,\n } = setup;\n\n const setupPromises: Promise<unknown>[] = [];\n\n if (captureRoleSql) {\n setupPromises.push(\n query(captureRoleSql).then((res) => {\n captured.previousRole = (res.rows[0] as unknown[])?.[0] as string;\n }),\n );\n setupPromises.push(query(roleSetupSql!));\n }\n\n if (captureConfigSql && captureConfigValues && configSetupSql) {\n captured.previousConfigs = {};\n const previousConfigs = captured.previousConfigs;\n setupPromises.push(\n query(captureConfigSql, captureConfigValues).then((res) => {\n const row = res.rows[0] as unknown[];\n captureConfigValues.forEach((key, i) => {\n previousConfigs[key] = row[i] as string | null;\n });\n }),\n );\n setupPromises.push(query(configSetupSql));\n }\n\n try {\n await Promise.all(setupPromises);\n return await mainQuery();\n } finally {\n try {\n const cleanupPromises: Promise<unknown>[] = [];\n\n if (roleSetupSql && captured.previousRole !== undefined) {\n cleanupPromises.push(\n query(`SET ROLE ${quoteRoleIdentifier(captured.previousRole)}`),\n );\n }\n\n if (captured.previousConfigs) {\n const restoreSql = sqlSessionContextBuildConfigRestoreBatchSql(\n captured.previousConfigs,\n );\n if (restoreSql) {\n cleanupPromises.push(query(restoreSql));\n }\n }\n\n await Promise.all(cleanupPromises);\n } finally {\n if (release) {\n await release();\n }\n }\n }\n};\n","import pg, { DatabaseError, Pool, PoolClient, PoolConfig } from 'pg';\nimport {\n AdapterBase,\n AdapterConfigBase,\n ColumnSchemaConfig,\n emptyObject,\n noop,\n QueryArraysResult,\n QueryResult,\n QueryResultRow,\n RecordUnknown,\n returnArg,\n setConnectRetryConfig,\n wrapAdapterFnWithConnectRetry,\n DefaultColumnTypes,\n DefaultSchemaConfig,\n DbOptions,\n DbResult,\n TransactionAdapterBase,\n TransactionArgs,\n RecordStringOrNumber,\n} from 'pqb/internal';\nimport { QueryError, createDbWithAdapter, QuerySchema } from 'pqb';\nimport {\n getResetLocalsSql,\n getSetLocalsSql,\n getTransactionArgs,\n mergeLocals,\n} from './adapter.utils';\nimport { SqlSessionState } from './adapter';\nimport {\n sqlSessionContextComputeSetup,\n sqlSessionContextExecute,\n} from './features/sql-session-context';\n\nexport const createDb = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n ...options\n}: DbOptions<SchemaConfig, ColumnTypes> &\n Omit<NodePostgresAdapterOptions, 'log'>): DbResult<ColumnTypes> => {\n return createDbWithAdapter({\n ...options,\n log,\n adapter: new NodePostgresAdapter(options),\n });\n};\n\nconst { types } = pg;\n\nexport interface TypeParsers {\n [K: number]: (input: string) => unknown;\n}\n\nconst defaultTypeParsers: TypeParsers = {};\n\nfor (const key in types.builtins) {\n const id = types.builtins[key as keyof typeof types.builtins];\n defaultTypeParsers[id] = types.getTypeParser(id);\n}\n\n[\n types.builtins.DATE,\n types.builtins.TIMESTAMP,\n types.builtins.TIMESTAMPTZ,\n types.builtins.CIRCLE,\n types.builtins.BYTEA,\n].forEach((id) => {\n delete defaultTypeParsers[id];\n});\n\nexport interface AdapterConfig\n extends AdapterConfigBase, Omit<PoolConfig, 'types' | 'connectionString'> {\n searchPath?: string;\n databaseURL?: string;\n}\n\nexport interface NodePostgresAdapterOptions extends Omit<AdapterConfig, 'log'> {\n schema?: QuerySchema;\n}\n\nexport class NodePostgresAdapter implements AdapterBase {\n pool: Pool;\n searchPath?: string;\n errorClass = DatabaseError;\n locals: RecordStringOrNumber;\n\n constructor(public config: NodePostgresAdapterOptions) {\n this.pool = this.configure(config);\n this.locals = this.searchPath\n ? { search_path: this.searchPath }\n : emptyObject;\n }\n\n isInTransaction(): boolean {\n return false;\n }\n\n private configure(config: NodePostgresAdapterOptions): Pool {\n let searchPath = config.searchPath;\n if (config.databaseURL) {\n const url = new URL(config.databaseURL);\n\n const ssl = url.searchParams.get('ssl');\n\n if (ssl === 'false') {\n url.searchParams.delete('ssl');\n } else if (!config.ssl && ssl === 'true') {\n config.ssl = true;\n }\n\n if (!searchPath) {\n searchPath = url.searchParams.get('searchPath') || undefined;\n }\n\n config.databaseURL = url.toString();\n (config as PoolConfig).connectionString = config.databaseURL;\n }\n\n if (searchPath)\n this.searchPath = searchPath === 'public' ? undefined : searchPath;\n\n const pool = new pg.Pool(config);\n\n if (config.connectRetry) {\n setConnectRetryConfig(\n this,\n config.connectRetry === true ? emptyObject : config.connectRetry,\n );\n\n this.connect = wrapAdapterFnWithConnectRetry(this, () =>\n this.pool.connect(),\n );\n }\n\n return pool;\n }\n\n private getURL(): URL | undefined {\n return this.config.databaseURL\n ? new URL(this.config.databaseURL)\n : undefined;\n }\n\n async updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n await this.close();\n this.configure({ ...this.config, ...config });\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n searchPath?: string;\n }): NodePostgresAdapter {\n const url = this.getURL();\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database}`;\n }\n\n if (params.user !== undefined) {\n url.username = params.user;\n }\n\n if (params.password !== undefined) {\n url.password = params.password;\n }\n\n if (params.searchPath !== undefined) {\n url.searchParams.set('searchPath', params.searchPath);\n }\n\n return new NodePostgresAdapter({\n ...this.config,\n databaseURL: url.toString(),\n });\n } else {\n return new NodePostgresAdapter({ ...this.config, ...params });\n }\n }\n\n getDatabase(): string {\n const url = this.getURL();\n return url ? url.pathname.slice(1) : (this.config.database as string);\n }\n\n getUser(): string {\n const url = this.getURL();\n return url ? url.username : (this.config.user as string);\n }\n\n getSearchPath(): string | undefined {\n return this.searchPath;\n }\n\n getHost(): string {\n const url = this.getURL();\n return url ? url.hostname : (this.config.host as string);\n }\n\n getSchema(): QuerySchema | undefined {\n return this.config.schema;\n }\n\n connect(): Promise<PoolClient> {\n return this.pool.connect();\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n return queryWithSqlSession(\n this,\n undefined,\n text,\n values,\n startingSavepoint,\n releasingSavepoint,\n false,\n sqlSessionState,\n true,\n ) as never;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryArraysResult<R>> {\n return queryWithSqlSession(\n this,\n undefined,\n text,\n values,\n startingSavepoint,\n releasingSavepoint,\n true,\n sqlSessionState,\n true,\n ) as never;\n }\n\n async transaction<Result>(...args: TransactionArgs<Result>): Promise<Result> {\n const client = await this.connect();\n\n const { cb, options } = getTransactionArgs(args);\n\n try {\n await performQueryOnClient(\n client,\n options?.options ? 'BEGIN ' + options.options : 'BEGIN',\n );\n\n // Apply transaction-scoped SQL session state (role and setConfig) once at transaction start\n if (options?.sqlSessionState) {\n const { role, setConfig } = options.sqlSessionState;\n if (role) {\n await performQueryOnClient(client, `SET ROLE ${role}`);\n }\n if (setConfig && Object.keys(setConfig).length > 0) {\n const setColumns = Object.entries(setConfig)\n .map(\n ([key, value]) =>\n `set_config('${key.replace(/'/g, \"''\")}', '${typeof value === 'string' ? value.replace(/'/g, \"''\") : value}', true)`,\n )\n .join(', ');\n await performQueryOnClient(client, `SELECT ${setColumns}`);\n }\n }\n\n const localsSql = getSetLocalsSql(options);\n if (localsSql) {\n await client.query(localsSql);\n }\n\n const locals = mergeLocals(this.locals, options);\n\n let result;\n try {\n result = await cb(\n new NodePostgresTransactionAdapter(this, client, this, locals),\n );\n } catch (err) {\n await performQueryOnClient(client, 'ROLLBACK');\n throw err;\n }\n await performQueryOnClient(client, 'COMMIT');\n return result as Result;\n } finally {\n client.release();\n }\n }\n\n close(): Promise<void> {\n const { pool } = this;\n this.pool = new pg.Pool(this.config);\n return pool.end();\n }\n\n assignError(to: QueryError, dbError: Error) {\n const from = dbError as DatabaseError;\n to.message = from.message;\n (to as { length?: number }).length = from.length;\n (to as { name?: string }).name = from.name;\n to.severity = from.severity;\n to.code = from.code;\n to.detail = from.detail;\n to.hint = from.hint;\n to.position = from.position;\n to.internalPosition = from.internalPosition;\n to.internalQuery = from.internalQuery;\n to.where = from.where;\n to.schema = from.schema;\n to.table = from.table;\n to.column = from.column;\n to.dataType = from.dataType;\n to.constraint = from.constraint;\n to.file = from.file;\n to.line = from.line;\n to.routine = from.routine;\n }\n}\n\nconst defaultTypesConfig = {\n getTypeParser(id: number) {\n return defaultTypeParsers[id] || returnArg;\n },\n};\n\ninterface ConnectionSchema {\n connection: { searchPath?: string };\n}\n\nconst setSearchPath = (client: PoolClient, searchPath?: string) => {\n if (\n (client as unknown as ConnectionSchema).connection.searchPath !== searchPath\n ) {\n (client as unknown as ConnectionSchema).connection.searchPath = searchPath;\n return client.query(`SET search_path = ${searchPath || 'public'}`);\n }\n return;\n};\n\n// Execute query with SQL session state setup/cleanup\n// For non-transactional queries: checks out a PoolClient and releases it after (borrowConnection=true)\n// For transactional queries: uses the existing transaction connection (borrowConnection=false)\nconst queryWithSqlSession = async <T extends QueryResultRow = QueryResultRow>(\n adapter: NodePostgresAdapter,\n client: PoolClient | undefined,\n text: string,\n values: unknown[] | undefined,\n startingSavepoint: string | undefined,\n releasingSavepoint: string | undefined,\n arraysMode: boolean,\n sessionState: SqlSessionState | undefined,\n borrowConnection = false,\n): Promise<QueryResult<T>> => {\n const setup = sqlSessionContextComputeSetup(sessionState);\n\n if (!setup) {\n if (borrowConnection) {\n const conn = await adapter.connect();\n try {\n await setSearchPath(conn, adapter.searchPath);\n return await performQueryOnClient(\n conn,\n text,\n values,\n arraysMode ? 'array' : undefined,\n startingSavepoint,\n releasingSavepoint,\n );\n } finally {\n conn.release();\n }\n }\n return performQueryOnClient(\n client!,\n text,\n values,\n arraysMode ? 'array' : undefined,\n startingSavepoint,\n releasingSavepoint,\n );\n }\n\n const conn = borrowConnection ? await adapter.connect() : client!;\n\n const queryFn = (sql: string, vals?: unknown[]) => {\n return conn\n .query({ text: sql, values: vals, rowMode: 'array' })\n .then((res) => ({\n rows: res.rows,\n rowCount: res.rowCount ?? 0,\n fields: res.fields.map((f) => ({ name: f.name })),\n }));\n };\n\n const releaseFn = borrowConnection\n ? async () => {\n conn.release();\n }\n : undefined;\n\n const mainQuery = () =>\n performQueryOnClient(\n conn,\n text,\n values,\n arraysMode ? 'array' : undefined,\n startingSavepoint,\n releasingSavepoint,\n );\n\n if (borrowConnection) {\n try {\n await setSearchPath(conn, adapter.searchPath);\n return await sqlSessionContextExecute<T>(\n queryFn,\n setup,\n mainQuery,\n releaseFn,\n );\n } catch (err) {\n conn.release();\n throw err;\n }\n }\n\n return sqlSessionContextExecute<T>(queryFn, setup, mainQuery);\n};\n\nconst performQueryOnClient = async (\n client: PoolClient,\n text: string,\n values?: unknown[],\n rowMode?: 'array',\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params: any = {\n text,\n values,\n rowMode,\n types: defaultTypesConfig,\n };\n\n // When using save points (it's in transaction), need to perform a single query at a time.\n // stating 1 then 2 then releasing 1 would fail.\n // Start 1, release 1, start 2, release 2, and so on.\n const { __lock } = client as unknown as { __lock?: Promise<unknown> };\n if (__lock) {\n let resolve: () => void | undefined;\n (client as unknown as RecordUnknown).__lock = new Promise<void>((res) => {\n resolve = () => {\n res();\n };\n });\n\n return __lock.then(() => {\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n promise.then(resolve, resolve);\n return promise;\n });\n }\n\n const promise =\n startingSavepoint || releasingSavepoint\n ? performQueryOnClientWithSavepoint(\n client,\n params,\n startingSavepoint,\n releasingSavepoint,\n )\n : client.query(params);\n\n (client as unknown as { __lock?: Promise<unknown> }).__lock =\n promise.catch(noop);\n\n return promise;\n};\n\nconst performQueryOnClientWithSavepoint = (\n client: PoolClient,\n params: unknown,\n startingSavepoint?: string,\n releasingSavepoint?: string,\n) => {\n let promise = startingSavepoint\n ? client\n .query(`SAVEPOINT \"${startingSavepoint}\"`)\n .then(() => client.query(params as never))\n : client.query(params as never);\n\n if (releasingSavepoint) {\n promise = promise.then(\n async (res) => {\n await client.query(`RELEASE SAVEPOINT \"${releasingSavepoint}\"`);\n return res;\n },\n async (err) => {\n await client.query(`ROLLBACK TO SAVEPOINT \"${releasingSavepoint}\"`);\n throw err;\n },\n );\n }\n\n return promise;\n};\n\nexport class NodePostgresTransactionAdapter implements TransactionAdapterBase {\n pool: Pool;\n config: PoolConfig;\n searchPath?: string;\n errorClass = DatabaseError;\n\n constructor(\n public adapter: NodePostgresAdapter,\n public client: PoolClient,\n public parent: AdapterBase,\n public locals: RecordStringOrNumber,\n ) {\n this.pool = adapter.pool;\n this.config = adapter.config;\n this.searchPath = adapter.searchPath;\n }\n\n isInTransaction(): true {\n return true;\n }\n\n updateConfig(config: NodePostgresAdapterOptions): Promise<void> {\n return this.adapter.updateConfig(config);\n }\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n searchPath?: string;\n }): AdapterBase {\n return this.adapter.reconfigure(params);\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSearchPath(): string | undefined {\n return this.adapter.getSearchPath();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n getSchema(): QuerySchema | undefined {\n return this.adapter.getSchema();\n }\n\n connect(): Promise<PoolClient> {\n return Promise.resolve(this.client);\n }\n\n async query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n return queryWithSqlSession(\n this.adapter,\n this.client,\n text,\n values,\n startingSavepoint,\n releasingSavepoint,\n false,\n sqlSessionState,\n false,\n ) as never;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async arrays<R extends any[] = any[]>(\n text: string,\n values?: unknown[],\n startingSavepoint?: string,\n releasingSavepoint?: string,\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryArraysResult<R>> {\n return queryWithSqlSession(\n this.adapter,\n this.client,\n text,\n values,\n startingSavepoint,\n releasingSavepoint,\n true,\n sqlSessionState,\n false,\n ) as never;\n }\n\n async transaction<Result>(...args: TransactionArgs<Result>): Promise<Result> {\n const { cb, options } = getTransactionArgs(args);\n\n // For nested transactions with SQL session state, capture outer transaction-local values\n let capturedRole: string | undefined;\n const capturedConfigs: Record<string, string | null> = {};\n const sqlSession = options?.sqlSessionState;\n\n if (sqlSession) {\n // Capture current role if we're going to override it\n if (sqlSession.role) {\n const roleResult = await this.query<{ role: string }>(\n 'SELECT current_role as role',\n );\n capturedRole = roleResult.rows[0].role;\n }\n\n // Capture current config values for keys we're going to override\n if (\n sqlSession.setConfig &&\n Object.keys(sqlSession.setConfig).length > 0\n ) {\n for (const key of Object.keys(sqlSession.setConfig)) {\n const configResult = await this.query<{ val: string | null }>(\n `SELECT current_setting('${key.replace(/'/g, \"''\")}', true) as val`,\n );\n capturedConfigs[key] = configResult.rows[0].val;\n }\n }\n }\n\n const localsSql = getSetLocalsSql(options);\n if (localsSql) {\n await this.query(localsSql);\n }\n\n const locals = mergeLocals(this.locals, options);\n\n let res: Result;\n try {\n res = (await cb(\n new NodePostgresTransactionAdapter(\n this.adapter,\n this.client,\n this,\n locals,\n ),\n )) as Result;\n } finally {\n // Restore outer transaction-local values after nested transaction completes\n if (sqlSession) {\n if (capturedRole !== undefined) {\n await this.query(`SET ROLE ${capturedRole}`);\n }\n\n for (const [key, value] of Object.entries(capturedConfigs)) {\n // Reset to empty string if previously unset (null), otherwise restore previous value\n const restoreValue = value === null ? '' : value;\n await this.query(\n `SELECT set_config('${key.replace(/'/g, \"''\")}', '${restoreValue.replace(/'/g, \"''\")}', true)`,\n );\n }\n }\n\n const resetLocalsSql = getResetLocalsSql(this.locals, options);\n if (resetLocalsSql) {\n await this.query(resetLocalsSql);\n }\n }\n\n return res;\n }\n\n close() {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error) {\n return this.adapter.assignError(to, from);\n }\n}\n"],"names":["conn","promise"],"mappings":"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"}
|