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.
@@ -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 performQuery(this, text, values, void 0);
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 performQuery(this, text, values, "array");
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 performQuery = async (adapter, text, values, rowMode, startingSavepoint) => {
226
- const client = await adapter.connect();
227
- try {
228
- await setSearchPath(client, adapter.searchPath);
229
- return await performQueryOnClient(
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
- rowMode,
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 await performQueryOnClient(
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 await performQueryOnClient(
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
- const res = await cb(
358
- new NodePostgresTransactionAdapter(
359
- this.adapter,
360
- this.client,
361
- this,
362
- locals
363
- )
364
- );
365
- const resetLocalsSql = getResetLocalsSql(this.locals, options);
366
- if (resetLocalsSql) {
367
- await this.query(resetLocalsSql);
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":";;;;AAYA,MAAM,eAAyC,GAAA;AAAA,EAC7C,EAAI,EAAA,KAAA,CAAA;AAAA,EACJ,OAAS,EAAA,KAAA,CAAA;AACX,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAAC,IAAmC,KAAA;AACpE,EAAI,IAAA,IAAA,CAAK,CAAC,CAAG,EAAA;AACX,IAAgB,eAAA,CAAA,OAAA,GAAU,KAAK,CAAC,CAAA,CAAA;AAChC,IAAgB,eAAA,CAAA,EAAA,GAAK,KAAK,CAAC,CAAA,CAAA;AAAA,GACtB,MAAA;AACL,IAAgB,eAAA,CAAA,EAAA,GAAK,KAAK,CAAC,CAAA,CAAA;AAAA,GAC7B;AACA,EAAO,OAAA,eAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,WAAc,GAAA,CACzB,MACA,EAAA,OAAA,KAEA,OAAS,EAAA,MAAA,GAAS,EAAE,GAAG,MAAQ,EAAA,GAAG,OAAQ,CAAA,MAAA,EAAW,GAAA,MAAA,CAAA;AAE1C,MAAA,eAAA,GAAkB,CAC7B,OACuB,KAAA;AACvB,EAAI,IAAA,CAAC,SAAS,MAAQ,EAAA,OAAA;AAEtB,EAAA,OAAO,OAAO,OAAQ,CAAA,OAAA,CAAQ,MAAM,CACjC,CAAA,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,aAAa,GAAG,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAA,CACjD,KAAK,IAAI,CAAA,CAAA;AACd,CAAA,CAAA;AAEa,MAAA,iBAAA,GAAoB,CAC/B,YAAA,EACA,OACuB,KAAA;AACvB,EAAI,IAAA,CAAC,SAAS,MAAQ,EAAA,OAAA;AAEtB,EAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAA,CACjC,MAAiB,CAAA,CAAC,GAAK,EAAA,CAAC,GAAK,EAAA,KAAK,CAAM,KAAA;AACvC,IAAI,IAAA,YAAA,CAAa,GAAG,CAAA,KAAM,KAAO,EAAA;AAC/B,MAAA,GAAA,CAAI,KAAK,CAAa,UAAA,EAAA,GAAG,IAAI,YAAa,CAAA,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,KAClD;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACN,EAAA,EAAE,CAAA,CACJ,KAAK,IAAI,CAAA,CAAA;AACd,CAAA;;AC1BO,MAAM,WAAW,CAGtB;AAAA,EACA,GAAA;AAAA,EACA,GAAG,OAAA;AACL,CACqE,KAAA;AACnE,EAAA,OAAO,mBAAoB,CAAA;AAAA,IACzB,GAAG,OAAA;AAAA,IACH,GAAA;AAAA,IACA,OAAA,EAAS,IAAI,mBAAA,CAAoB,OAAO,CAAA;AAAA,GACzC,CAAA,CAAA;AACH,EAAA;AAEA,MAAM,EAAE,OAAU,GAAA,EAAA,CAAA;AAMlB,MAAM,qBAAkC,EAAC,CAAA;AAEzC,KAAW,MAAA,GAAA,IAAO,MAAM,QAAU,EAAA;AAChC,EAAM,MAAA,EAAA,GAAK,KAAM,CAAA,QAAA,CAAS,GAAkC,CAAA,CAAA;AAC5D,EAAA,kBAAA,CAAmB,EAAE,CAAA,GAAI,KAAM,CAAA,aAAA,CAAc,EAAE,CAAA,CAAA;AACjD,CAAA;AAEA;AAAA,EACE,MAAM,QAAS,CAAA,IAAA;AAAA,EACf,MAAM,QAAS,CAAA,SAAA;AAAA,EACf,MAAM,QAAS,CAAA,WAAA;AAAA,EACf,MAAM,QAAS,CAAA,MAAA;AAAA,EACf,MAAM,QAAS,CAAA,KAAA;AACjB,CAAE,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AAChB,EAAA,OAAO,mBAAmB,EAAE,CAAA,CAAA;AAC9B,CAAC,CAAA,CAAA;AAaM,MAAM,mBAA2C,CAAA;AAAA,EAMtD,YAAmB,MAAoC,EAAA;AAApC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAHnB,IAAa,IAAA,CAAA,UAAA,GAAA,aAAA,CAAA;AAIX,IAAK,IAAA,CAAA,IAAA,GAAO,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA,CAAA;AACjC,IAAA,IAAA,CAAK,SAAS,IAAK,CAAA,UAAA,GACf,EAAE,WAAa,EAAA,IAAA,CAAK,YACpB,GAAA,WAAA,CAAA;AAAA,GACN;AAAA,EAEA,eAA2B,GAAA;AACzB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEQ,UAAU,MAA0C,EAAA;AAC1D,IAAA,IAAI,aAAa,MAAO,CAAA,UAAA,CAAA;AACxB,IAAA,IAAI,OAAO,WAAa,EAAA;AACtB,MAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,WAAW,CAAA,CAAA;AAEtC,MAAA,MAAM,GAAM,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAEtC,MAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,QAAI,GAAA,CAAA,YAAA,CAAa,OAAO,KAAK,CAAA,CAAA;AAAA,OACpB,MAAA,IAAA,CAAC,MAAO,CAAA,GAAA,IAAO,QAAQ,MAAQ,EAAA;AACxC,QAAA,MAAA,CAAO,GAAM,GAAA,IAAA,CAAA;AAAA,OACf;AAEA,MAAA,IAAI,CAAC,UAAY,EAAA;AACf,QAAA,UAAA,GAAa,GAAI,CAAA,YAAA,CAAa,GAAI,CAAA,YAAY,CAAK,IAAA,KAAA,CAAA,CAAA;AAAA,OACrD;AAEA,MAAO,MAAA,CAAA,WAAA,GAAc,IAAI,QAAS,EAAA,CAAA;AAClC,MAAC,MAAA,CAAsB,mBAAmB,MAAO,CAAA,WAAA,CAAA;AAAA,KACnD;AAEA,IAAI,IAAA,UAAA;AACF,MAAK,IAAA,CAAA,UAAA,GAAa,UAAe,KAAA,QAAA,GAAW,KAAY,CAAA,GAAA,UAAA,CAAA;AAE1D,IAAA,MAAM,IAAO,GAAA,IAAI,EAAG,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAE/B,IAAA,IAAI,OAAO,YAAc,EAAA;AACvB,MAAA,qBAAA;AAAA,QACE,IAAA;AAAA,QACA,MAAO,CAAA,YAAA,KAAiB,IAAO,GAAA,WAAA,GAAc,MAAO,CAAA,YAAA;AAAA,OACtD,CAAA;AAEA,MAAA,IAAA,CAAK,OAAU,GAAA,6BAAA;AAAA,QAA8B,IAAA;AAAA,QAAM,MACjD,IAAK,CAAA,IAAA,CAAK,OAAQ,EAAA;AAAA,OACpB,CAAA;AAAA,KACF;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEQ,MAA0B,GAAA;AAChC,IAAO,OAAA,IAAA,CAAK,OAAO,WACf,GAAA,IAAI,IAAI,IAAK,CAAA,MAAA,CAAO,WAAW,CAC/B,GAAA,KAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,MAAM,aAAa,MAAmD,EAAA;AACpE,IAAA,MAAM,KAAK,KAAM,EAAA,CAAA;AACjB,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,KAAK,MAAQ,EAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,YAAY,MAKY,EAAA;AACtB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,IAAI,cAAc,MAAQ,EAAA;AACxB,QAAI,GAAA,CAAA,QAAA,GAAW,CAAI,CAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,OACpC;AAEA,MAAI,IAAA,MAAA,CAAO,SAAS,KAAW,CAAA,EAAA;AAC7B,QAAA,GAAA,CAAI,WAAW,MAAO,CAAA,IAAA,CAAA;AAAA,OACxB;AAEA,MAAI,IAAA,MAAA,CAAO,aAAa,KAAW,CAAA,EAAA;AACjC,QAAA,GAAA,CAAI,WAAW,MAAO,CAAA,QAAA,CAAA;AAAA,OACxB;AAEA,MAAI,IAAA,MAAA,CAAO,eAAe,KAAW,CAAA,EAAA;AACnC,QAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,YAAc,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,OACtD;AAEA,MAAA,OAAO,IAAI,mBAAoB,CAAA;AAAA,QAC7B,GAAG,IAAK,CAAA,MAAA;AAAA,QACR,WAAA,EAAa,IAAI,QAAS,EAAA;AAAA,OAC3B,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAO,OAAA,IAAI,oBAAoB,EAAE,GAAG,KAAK,MAAQ,EAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,KAC9D;AAAA,GACF;AAAA,EAEA,WAAsB,GAAA;AACpB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,MAAM,GAAI,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA,GAAK,KAAK,MAAO,CAAA,QAAA,CAAA;AAAA,GACpD;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,GAAM,GAAA,GAAA,CAAI,QAAY,GAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,aAAoC,GAAA;AAClC,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AAAA,GACd;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,OAAO,GAAM,GAAA,GAAA,CAAI,QAAY,GAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,SAAqC,GAAA;AACnC,IAAA,OAAO,KAAK,MAAO,CAAA,MAAA,CAAA;AAAA,GACrB;AAAA,EAEA,OAA+B,GAAA;AAC7B,IAAO,OAAA,IAAA,CAAK,KAAK,OAAQ,EAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,KAAA,CACE,MACA,MACyB,EAAA;AACzB,IAAA,OAAO,YAAa,CAAA,IAAA,EAAM,IAAM,EAAA,MAAA,EAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,GACnD;AAAA;AAAA,EAGA,MAAA,CACE,MACA,MAC+B,EAAA;AAC/B,IAAA,OAAO,YAAa,CAAA,IAAA,EAAM,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAAA,GACjD;AAAA,EAEA,MAAM,eAAuB,IAAgD,EAAA;AAC3E,IAAM,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,OAAQ,EAAA,CAAA;AAElC,IAAA,MAAM,EAAE,EAAA,EAAI,OAAQ,EAAA,GAAI,mBAAmB,IAAI,CAAA,CAAA;AAE/C,IAAI,IAAA;AACF,MAAM,MAAA,oBAAA;AAAA,QACJ,MAAA;AAAA,QACA,OAAS,EAAA,OAAA,GAAU,QAAW,GAAA,OAAA,CAAQ,OAAU,GAAA,OAAA;AAAA,OAClD,CAAA;AAEA,MAAM,MAAA,SAAA,GAAY,gBAAgB,OAAO,CAAA,CAAA;AACzC,MAAA,IAAI,SAAW,EAAA;AACb,QAAM,MAAA,MAAA,CAAO,MAAM,SAAS,CAAA,CAAA;AAAA,OAC9B;AAEA,MAAA,MAAM,MAAS,GAAA,WAAA,CAAY,IAAK,CAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAE/C,MAAI,IAAA,MAAA,CAAA;AACJ,MAAI,IAAA;AACF,QAAA,MAAA,GAAS,MAAM,EAAA;AAAA,UACb,IAAI,8BAAA,CAA+B,IAAM,EAAA,MAAA,EAAQ,MAAM,MAAM,CAAA;AAAA,SAC/D,CAAA;AAAA,eACO,GAAK,EAAA;AACZ,QAAM,MAAA,oBAAA,CAAqB,QAAQ,UAAU,CAAA,CAAA;AAC7C,QAAM,MAAA,GAAA,CAAA;AAAA,OACR;AACA,MAAM,MAAA,oBAAA,CAAqB,QAAQ,QAAQ,CAAA,CAAA;AAC3C,MAAO,OAAA,MAAA,CAAA;AAAA,KACP,SAAA;AACA,MAAA,MAAA,CAAO,OAAQ,EAAA,CAAA;AAAA,KACjB;AAAA,GACF;AAAA,EAEA,KAAuB,GAAA;AACrB,IAAM,MAAA,EAAE,MAAS,GAAA,IAAA,CAAA;AACjB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAI,EAAG,CAAA,IAAA,CAAK,KAAK,MAAM,CAAA,CAAA;AACnC,IAAA,OAAO,KAAK,GAAI,EAAA,CAAA;AAAA,GAClB;AAAA,EAEA,WAAA,CAAY,IAAgB,OAAgB,EAAA;AAC1C,IAAA,MAAM,IAAO,GAAA,OAAA,CAAA;AACb,IAAA,EAAA,CAAG,UAAU,IAAK,CAAA,OAAA,CAAA;AAClB,IAAC,EAAA,CAA2B,SAAS,IAAK,CAAA,MAAA,CAAA;AAC1C,IAAC,EAAA,CAAyB,OAAO,IAAK,CAAA,IAAA,CAAA;AACtC,IAAA,EAAA,CAAG,WAAW,IAAK,CAAA,QAAA,CAAA;AACnB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,SAAS,IAAK,CAAA,MAAA,CAAA;AACjB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,WAAW,IAAK,CAAA,QAAA,CAAA;AACnB,IAAA,EAAA,CAAG,mBAAmB,IAAK,CAAA,gBAAA,CAAA;AAC3B,IAAA,EAAA,CAAG,gBAAgB,IAAK,CAAA,aAAA,CAAA;AACxB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,KAAA,CAAA;AAChB,IAAA,EAAA,CAAG,SAAS,IAAK,CAAA,MAAA,CAAA;AACjB,IAAA,EAAA,CAAG,QAAQ,IAAK,CAAA,KAAA,CAAA;AAChB,IAAA,EAAA,CAAG,SAAS,IAAK,CAAA,MAAA,CAAA;AACjB,IAAA,EAAA,CAAG,WAAW,IAAK,CAAA,QAAA,CAAA;AACnB,IAAA,EAAA,CAAG,aAAa,IAAK,CAAA,UAAA,CAAA;AACrB,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,OAAO,IAAK,CAAA,IAAA,CAAA;AACf,IAAA,EAAA,CAAG,UAAU,IAAK,CAAA,OAAA,CAAA;AAAA,GACpB;AACF,CAAA;AAEA,MAAM,kBAAqB,GAAA;AAAA,EACzB,cAAc,EAAY,EAAA;AACxB,IAAO,OAAA,kBAAA,CAAmB,EAAE,CAAK,IAAA,SAAA,CAAA;AAAA,GACnC;AACF,CAAA,CAAA;AAMA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAoB,UAAwB,KAAA;AACjE,EACG,IAAA,MAAA,CAAuC,UAAW,CAAA,UAAA,KAAe,UAClE,EAAA;AACA,IAAC,MAAA,CAAuC,WAAW,UAAa,GAAA,UAAA,CAAA;AAChE,IAAA,OAAO,MAAO,CAAA,KAAA,CAAM,CAAqB,kBAAA,EAAA,UAAA,IAAc,QAAQ,CAAE,CAAA,CAAA,CAAA;AAAA,GACnE;AACA,EAAA,OAAA;AACF,CAAA,CAAA;AAEA,MAAM,eAAe,OACnB,OAAA,EACA,IACA,EAAA,MAAA,EACA,SACA,iBACG,KAAA;AACH,EAAM,MAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAQ,EAAA,CAAA;AACrC,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,CAAc,MAAQ,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAC9C,IAAA,OAAO,MAAM,oBAAA;AAAA,MACX,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAA;AAAA,KACF,CAAA;AAAA,GACA,SAAA;AACA,IAAA,MAAA,CAAO,OAAQ,EAAA,CAAA;AAAA,GACjB;AACF,CAAA,CAAA;AAEA,MAAM,uBAAuB,OAC3B,MAAA,EACA,MACA,MACA,EAAA,OAAA,EACA,mBACA,kBACG,KAAA;AAEH,EAAA,MAAM,MAAc,GAAA;AAAA,IAClB,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAO,EAAA,kBAAA;AAAA,GACT,CAAA;AAKA,EAAM,MAAA,EAAE,QAAW,GAAA,MAAA,CAAA;AACnB,EAAA,IAAI,MAAQ,EAAA;AACV,IAAI,IAAA,OAAA,CAAA;AACJ,IAAC,MAAoC,CAAA,MAAA,GAAS,IAAI,OAAA,CAAc,CAAC,GAAQ,KAAA;AACvE,MAAA,OAAA,GAAU,MAAM;AACd,QAAI,GAAA,EAAA,CAAA;AAAA,OACN,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,MAAA,CAAO,KAAK,MAAM;AACvB,MAAMA,MAAAA,QAAAA,GACJ,qBAAqB,kBACjB,GAAA,iCAAA;AAAA,QACE,MAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,OACF,GACA,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACzB,MAAAA,QAAAA,CAAQ,IAAK,CAAA,OAAA,EAAS,OAAO,CAAA,CAAA;AAC7B,MAAOA,OAAAA,QAAAA,CAAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,OAAA,GACJ,qBAAqB,kBACjB,GAAA,iCAAA;AAAA,IACE,MAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,kBAAA;AAAA,GACF,GACA,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEzB,EAAC,MAAoD,CAAA,MAAA,GACnD,OAAQ,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAEpB,EAAO,OAAA,OAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,iCAAoC,GAAA,CACxC,MACA,EAAA,MAAA,EACA,mBACA,kBACG,KAAA;AACH,EAAA,IAAI,UAAU,iBACV,GAAA,MAAA,CACG,KAAM,CAAA,CAAA,WAAA,EAAc,iBAAiB,CAAG,CAAA,CAAA,CAAA,CACxC,IAAK,CAAA,MAAM,OAAO,KAAM,CAAA,MAAe,CAAC,CAC3C,GAAA,MAAA,CAAO,MAAM,MAAe,CAAA,CAAA;AAEhC,EAAA,IAAI,kBAAoB,EAAA;AACtB,IAAA,OAAA,GAAU,OAAQ,CAAA,IAAA;AAAA,MAChB,OAAO,GAAQ,KAAA;AACb,QAAA,MAAM,MAAO,CAAA,KAAA,CAAM,CAAsB,mBAAA,EAAA,kBAAkB,CAAG,CAAA,CAAA,CAAA,CAAA;AAC9D,QAAO,OAAA,GAAA,CAAA;AAAA,OACT;AAAA,MACA,OAAO,GAAQ,KAAA;AACb,QAAA,MAAM,MAAO,CAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,kBAAkB,CAAG,CAAA,CAAA,CAAA,CAAA;AAClE,QAAM,MAAA,GAAA,CAAA;AAAA,OACR;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,8BAAiE,CAAA;AAAA,EAM5E,WACS,CAAA,OAAA,EACA,MACA,EAAA,MAAA,EACA,MACP,EAAA;AAJO,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AANT,IAAa,IAAA,CAAA,UAAA,GAAA,aAAA,CAAA;AAQX,IAAA,IAAA,CAAK,OAAO,OAAQ,CAAA,IAAA,CAAA;AACpB,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA,CAAA;AACtB,IAAA,IAAA,CAAK,aAAa,OAAQ,CAAA,UAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,eAAwB,GAAA;AACtB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,aAAa,MAAmD,EAAA;AAC9D,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,YAAA,CAAa,MAAM,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,YAAY,MAKI,EAAA;AACd,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,GACxC;AAAA,EAEA,WAAsB,GAAA;AACpB,IAAO,OAAA,IAAA,CAAK,QAAQ,WAAY,EAAA,CAAA;AAAA,GAClC;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAO,OAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,aAAoC,GAAA;AAClC,IAAO,OAAA,IAAA,CAAK,QAAQ,aAAc,EAAA,CAAA;AAAA,GACpC;AAAA,EAEA,OAAkB,GAAA;AAChB,IAAO,OAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,SAAqC,GAAA;AACnC,IAAO,OAAA,IAAA,CAAK,QAAQ,SAAU,EAAA,CAAA;AAAA,GAChC;AAAA,EAEA,OAA+B,GAAA;AAC7B,IAAO,OAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,GACpC;AAAA,EAEA,MAAM,KAAA,CACJ,IACA,EAAA,MAAA,EACA,mBACA,kBACyB,EAAA;AACzB,IAAA,OAAO,MAAM,oBAAA;AAAA,MACX,IAAK,CAAA,MAAA;AAAA,MACL,IAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,CAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,IACA,EAAA,MAAA,EACA,mBACA,kBAC+B,EAAA;AAC/B,IAAA,OAAO,MAAM,oBAAA;AAAA,MACX,IAAK,CAAA,MAAA;AAAA,MACL,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAA;AAAA,MACA,kBAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,eAAuB,IAAgD,EAAA;AAC3E,IAAA,MAAM,EAAE,EAAA,EAAI,OAAQ,EAAA,GAAI,mBAAmB,IAAI,CAAA,CAAA;AAE/C,IAAM,MAAA,SAAA,GAAY,gBAAgB,OAAO,CAAA,CAAA;AACzC,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,IAAA,CAAK,MAAM,SAAS,CAAA,CAAA;AAAA,KAC5B;AAEA,IAAA,MAAM,MAAS,GAAA,WAAA,CAAY,IAAK,CAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAE/C,IAAA,MAAM,MAAO,MAAM,EAAA;AAAA,MACjB,IAAI,8BAAA;AAAA,QACF,IAAK,CAAA,OAAA;AAAA,QACL,IAAK,CAAA,MAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAA,MAAM,cAAiB,GAAA,iBAAA,CAAkB,IAAK,CAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAC7D,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAM,MAAA,IAAA,CAAK,MAAM,cAAc,CAAA,CAAA;AAAA,KACjC;AAEA,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AAAA,EAEA,KAAQ,GAAA;AACN,IAAO,OAAA,IAAA,CAAK,QAAQ,KAAM,EAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,WAAA,CAAY,IAAgB,IAAa,EAAA;AACvC,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,WAAY,CAAA,EAAA,EAAI,IAAI,CAAA,CAAA;AAAA,GAC1C;AACF;;;;"}
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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"}