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.
@@ -32,6 +32,109 @@ const getResetLocalsSql = (parentLocals, options) => {
32
32
  }, []).join("; ");
33
33
  };
34
34
 
35
+ const quoteRoleIdentifier = (role) => {
36
+ return `"${role.replace(/"/g, '""')}"`;
37
+ };
38
+ const buildConfigRestoreExpression = (key, value) => {
39
+ const escapedKey = key.replace(/'/g, "''");
40
+ if (value === null || value === void 0) {
41
+ value = "";
42
+ }
43
+ return `set_config('${escapedKey}', '${value.replace(/'/g, "''")}', false) as "${key}"`;
44
+ };
45
+ const sqlSessionContextComputeSetup = (desired) => {
46
+ if (!desired) return void 0;
47
+ const role = desired.role;
48
+ const hasRole = role !== void 0;
49
+ const { setConfig } = desired;
50
+ const configKeys = setConfig && Object.keys(setConfig);
51
+ const hasConfig = configKeys && configKeys.length > 0;
52
+ if (!hasRole && !hasConfig) return void 0;
53
+ const result = {};
54
+ if (hasRole) {
55
+ result.roleSetupSql = `SET ROLE ${quoteRoleIdentifier(role)}`;
56
+ result.captureRoleSql = "SELECT current_user";
57
+ }
58
+ if (hasConfig && setConfig) {
59
+ result.captureConfigValues = configKeys;
60
+ const captureColumns = configKeys.map((key, i) => `current_setting($${i + 1}, true) as "${key}"`).join(", ");
61
+ result.captureConfigSql = `SELECT ${captureColumns}`;
62
+ const setColumns = configKeys.map((key) => {
63
+ const value = setConfig[key];
64
+ return `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value}', false) as "${key}"`;
65
+ }).join(", ");
66
+ result.configSetupSql = `SELECT ${setColumns}`;
67
+ }
68
+ return result;
69
+ };
70
+ const sqlSessionContextBuildConfigRestoreBatchSql = (configs) => {
71
+ const keys = Object.keys(configs);
72
+ if (keys.length === 0) return void 0;
73
+ const expressions = keys.map((key) => buildConfigRestoreExpression(key, configs[key])).join(", ");
74
+ return `SELECT ${expressions}`;
75
+ };
76
+ const sqlSessionContextExecute = async (query, setup, mainQuery, release) => {
77
+ if (!setup) {
78
+ return mainQuery();
79
+ }
80
+ const captured = {};
81
+ const {
82
+ captureRoleSql,
83
+ roleSetupSql,
84
+ captureConfigSql,
85
+ captureConfigValues,
86
+ configSetupSql
87
+ } = setup;
88
+ const setupPromises = [];
89
+ if (captureRoleSql) {
90
+ setupPromises.push(
91
+ query(captureRoleSql).then((res) => {
92
+ captured.previousRole = res.rows[0]?.[0];
93
+ })
94
+ );
95
+ setupPromises.push(query(roleSetupSql));
96
+ }
97
+ if (captureConfigSql && captureConfigValues && configSetupSql) {
98
+ captured.previousConfigs = {};
99
+ const previousConfigs = captured.previousConfigs;
100
+ setupPromises.push(
101
+ query(captureConfigSql, captureConfigValues).then((res) => {
102
+ const row = res.rows[0];
103
+ captureConfigValues.forEach((key, i) => {
104
+ previousConfigs[key] = row[i];
105
+ });
106
+ })
107
+ );
108
+ setupPromises.push(query(configSetupSql));
109
+ }
110
+ try {
111
+ await Promise.all(setupPromises);
112
+ return await mainQuery();
113
+ } finally {
114
+ try {
115
+ const cleanupPromises = [];
116
+ if (roleSetupSql && captured.previousRole !== void 0) {
117
+ cleanupPromises.push(
118
+ query(`SET ROLE ${quoteRoleIdentifier(captured.previousRole)}`)
119
+ );
120
+ }
121
+ if (captured.previousConfigs) {
122
+ const restoreSql = sqlSessionContextBuildConfigRestoreBatchSql(
123
+ captured.previousConfigs
124
+ );
125
+ if (restoreSql) {
126
+ cleanupPromises.push(query(restoreSql));
127
+ }
128
+ }
129
+ await Promise.all(cleanupPromises);
130
+ } finally {
131
+ if (release) {
132
+ await release();
133
+ }
134
+ }
135
+ }
136
+ };
137
+
35
138
  const createDb = ({
36
139
  log,
37
140
  ...options
@@ -149,12 +252,32 @@ class NodePostgresAdapter {
149
252
  connect() {
150
253
  return this.pool.connect();
151
254
  }
152
- query(text, values) {
153
- return performQuery(this, text, values, void 0);
255
+ query(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
256
+ return queryWithSqlSession(
257
+ this,
258
+ void 0,
259
+ text,
260
+ values,
261
+ startingSavepoint,
262
+ releasingSavepoint,
263
+ false,
264
+ sqlSessionState,
265
+ true
266
+ );
154
267
  }
155
268
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
- arrays(text, values) {
157
- return performQuery(this, text, values, "array");
269
+ arrays(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
270
+ return queryWithSqlSession(
271
+ this,
272
+ void 0,
273
+ text,
274
+ values,
275
+ startingSavepoint,
276
+ releasingSavepoint,
277
+ true,
278
+ sqlSessionState,
279
+ true
280
+ );
158
281
  }
159
282
  async transaction(...args) {
160
283
  const client = await this.connect();
@@ -164,6 +287,18 @@ class NodePostgresAdapter {
164
287
  client,
165
288
  options?.options ? "BEGIN " + options.options : "BEGIN"
166
289
  );
290
+ if (options?.sqlSessionState) {
291
+ const { role, setConfig } = options.sqlSessionState;
292
+ if (role) {
293
+ await performQueryOnClient(client, `SET ROLE ${role}`);
294
+ }
295
+ if (setConfig && Object.keys(setConfig).length > 0) {
296
+ const setColumns = Object.entries(setConfig).map(
297
+ ([key, value]) => `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value}', true)`
298
+ ).join(", ");
299
+ await performQueryOnClient(client, `SELECT ${setColumns}`);
300
+ }
301
+ }
167
302
  const localsSql = getSetLocalsSql(options);
168
303
  if (localsSql) {
169
304
  await client.query(localsSql);
@@ -224,20 +359,68 @@ const setSearchPath = (client, searchPath) => {
224
359
  }
225
360
  return;
226
361
  };
227
- const performQuery = async (adapter, text, values, rowMode, startingSavepoint) => {
228
- const client = await adapter.connect();
229
- try {
230
- await setSearchPath(client, adapter.searchPath);
231
- return await performQueryOnClient(
362
+ const queryWithSqlSession = async (adapter, client, text, values, startingSavepoint, releasingSavepoint, arraysMode, sessionState, borrowConnection = false) => {
363
+ const setup = sqlSessionContextComputeSetup(sessionState);
364
+ if (!setup) {
365
+ if (borrowConnection) {
366
+ const conn2 = await adapter.connect();
367
+ try {
368
+ await setSearchPath(conn2, adapter.searchPath);
369
+ return await performQueryOnClient(
370
+ conn2,
371
+ text,
372
+ values,
373
+ arraysMode ? "array" : void 0,
374
+ startingSavepoint,
375
+ releasingSavepoint
376
+ );
377
+ } finally {
378
+ conn2.release();
379
+ }
380
+ }
381
+ return performQueryOnClient(
232
382
  client,
233
383
  text,
234
384
  values,
235
- rowMode,
236
- startingSavepoint
385
+ arraysMode ? "array" : void 0,
386
+ startingSavepoint,
387
+ releasingSavepoint
237
388
  );
238
- } finally {
239
- client.release();
240
389
  }
390
+ const conn = borrowConnection ? await adapter.connect() : client;
391
+ const queryFn = (sql, vals) => {
392
+ return conn.query({ text: sql, values: vals, rowMode: "array" }).then((res) => ({
393
+ rows: res.rows,
394
+ rowCount: res.rowCount ?? 0,
395
+ fields: res.fields.map((f) => ({ name: f.name }))
396
+ }));
397
+ };
398
+ const releaseFn = borrowConnection ? async () => {
399
+ conn.release();
400
+ } : void 0;
401
+ const mainQuery = () => performQueryOnClient(
402
+ conn,
403
+ text,
404
+ values,
405
+ arraysMode ? "array" : void 0,
406
+ startingSavepoint,
407
+ releasingSavepoint
408
+ );
409
+ if (borrowConnection) {
410
+ try {
411
+ await setSearchPath(conn, adapter.searchPath);
412
+ return await sqlSessionContextExecute(
413
+ queryFn,
414
+ setup,
415
+ mainQuery,
416
+ releaseFn
417
+ );
418
+ } catch (err) {
419
+ conn.release();
420
+ throw err;
421
+ }
422
+ }
423
+ return sqlSessionContextExecute(queryFn, setup, mainQuery);
241
424
  };
242
425
  const performQueryOnClient = async (client, text, values, rowMode, startingSavepoint, releasingSavepoint) => {
243
426
  const params = {
@@ -328,45 +511,85 @@ class NodePostgresTransactionAdapter {
328
511
  connect() {
329
512
  return Promise.resolve(this.client);
330
513
  }
331
- async query(text, values, startingSavepoint, releasingSavepoint) {
332
- return await performQueryOnClient(
514
+ async query(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
515
+ return queryWithSqlSession(
516
+ this.adapter,
333
517
  this.client,
334
518
  text,
335
519
  values,
336
- void 0,
337
520
  startingSavepoint,
338
- releasingSavepoint
521
+ releasingSavepoint,
522
+ false,
523
+ sqlSessionState,
524
+ false
339
525
  );
340
526
  }
341
527
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
342
- async arrays(text, values, startingSavepoint, releasingSavepoint) {
343
- return await performQueryOnClient(
528
+ async arrays(text, values, startingSavepoint, releasingSavepoint, sqlSessionState) {
529
+ return queryWithSqlSession(
530
+ this.adapter,
344
531
  this.client,
345
532
  text,
346
533
  values,
347
- "array",
348
534
  startingSavepoint,
349
- releasingSavepoint
535
+ releasingSavepoint,
536
+ true,
537
+ sqlSessionState,
538
+ false
350
539
  );
351
540
  }
352
541
  async transaction(...args) {
353
542
  const { cb, options } = getTransactionArgs(args);
543
+ let capturedRole;
544
+ const capturedConfigs = {};
545
+ const sqlSession = options?.sqlSessionState;
546
+ if (sqlSession) {
547
+ if (sqlSession.role) {
548
+ const roleResult = await this.query(
549
+ "SELECT current_role as role"
550
+ );
551
+ capturedRole = roleResult.rows[0].role;
552
+ }
553
+ if (sqlSession.setConfig && Object.keys(sqlSession.setConfig).length > 0) {
554
+ for (const key of Object.keys(sqlSession.setConfig)) {
555
+ const configResult = await this.query(
556
+ `SELECT current_setting('${key.replace(/'/g, "''")}', true) as val`
557
+ );
558
+ capturedConfigs[key] = configResult.rows[0].val;
559
+ }
560
+ }
561
+ }
354
562
  const localsSql = getSetLocalsSql(options);
355
563
  if (localsSql) {
356
564
  await this.query(localsSql);
357
565
  }
358
566
  const locals = mergeLocals(this.locals, options);
359
- const res = await cb(
360
- new NodePostgresTransactionAdapter(
361
- this.adapter,
362
- this.client,
363
- this,
364
- locals
365
- )
366
- );
367
- const resetLocalsSql = getResetLocalsSql(this.locals, options);
368
- if (resetLocalsSql) {
369
- await this.query(resetLocalsSql);
567
+ let res;
568
+ try {
569
+ res = await cb(
570
+ new NodePostgresTransactionAdapter(
571
+ this.adapter,
572
+ this.client,
573
+ this,
574
+ locals
575
+ )
576
+ );
577
+ } finally {
578
+ if (sqlSession) {
579
+ if (capturedRole !== void 0) {
580
+ await this.query(`SET ROLE ${capturedRole}`);
581
+ }
582
+ for (const [key, value] of Object.entries(capturedConfigs)) {
583
+ const restoreValue = value === null ? "" : value;
584
+ await this.query(
585
+ `SELECT set_config('${key.replace(/'/g, "''")}', '${restoreValue.replace(/'/g, "''")}', true)`
586
+ );
587
+ }
588
+ }
589
+ const resetLocalsSql = getResetLocalsSql(this.locals, options);
590
+ if (resetLocalsSql) {
591
+ await this.query(resetLocalsSql);
592
+ }
370
593
  }
371
594
  return res;
372
595
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node-postgres.js","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":["createDbWithAdapter","DatabaseError","emptyObject","setConnectRetryConfig","wrapAdapterFnWithConnectRetry","returnArg","promise","noop"],"mappings":"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"}
1
+ {"version":3,"file":"node-postgres.js","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":["createDbWithAdapter","DatabaseError","emptyObject","setConnectRetryConfig","wrapAdapterFnWithConnectRetry","returnArg","conn","promise","noop"],"mappings":"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"}