@typed-sql/postgres 1.0.0-rc.0 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +130 -0
- package/README.md +57 -65
- package/dist/packages/postgres/src/bulk.d.ts +30 -0
- package/dist/packages/postgres/src/bulk.d.ts.map +1 -0
- package/dist/packages/postgres/src/bulk.js +228 -0
- package/dist/packages/postgres/src/bulk.js.map +1 -0
- package/dist/packages/postgres/src/index.d.ts +5 -1
- package/dist/packages/postgres/src/index.d.ts.map +1 -1
- package/dist/packages/postgres/src/index.js +17 -4
- package/dist/packages/postgres/src/index.js.map +1 -1
- package/dist/packages/postgres/src/pg.d.ts +68 -4
- package/dist/packages/postgres/src/pg.d.ts.map +1 -1
- package/dist/packages/postgres/src/pg.js +458 -14
- package/dist/packages/postgres/src/pg.js.map +1 -1
- package/dist/packages/postgres/src/prepared.d.ts +20 -0
- package/dist/packages/postgres/src/prepared.d.ts.map +1 -0
- package/dist/packages/postgres/src/prepared.js +47 -0
- package/dist/packages/postgres/src/prepared.js.map +1 -0
- package/dist/packages/postgres/src/provider.d.ts +2 -1
- package/dist/packages/postgres/src/provider.d.ts.map +1 -1
- package/dist/packages/postgres/src/provider.js +3 -1
- package/dist/packages/postgres/src/provider.js.map +1 -1
- package/dist/packages/postgres/src/resolver.d.ts.map +1 -1
- package/dist/packages/postgres/src/resolver.js +11 -1
- package/dist/packages/postgres/src/resolver.js.map +1 -1
- package/dist/packages/postgres/src/routing.d.ts +22 -0
- package/dist/packages/postgres/src/routing.d.ts.map +1 -0
- package/dist/packages/postgres/src/routing.js +70 -0
- package/dist/packages/postgres/src/routing.js.map +1 -0
- package/dist/packages/postgres/src/runtime.d.ts +34 -3
- package/dist/packages/postgres/src/runtime.d.ts.map +1 -1
- package/dist/packages/postgres/src/runtime.js +923 -22
- package/dist/packages/postgres/src/runtime.js.map +1 -1
- package/dist/packages/postgres/src/semantics.d.ts +5 -0
- package/dist/packages/postgres/src/semantics.d.ts.map +1 -0
- package/dist/packages/postgres/src/semantics.js +211 -0
- package/dist/packages/postgres/src/semantics.js.map +1 -0
- package/dist/packages/postgres/src/stream.d.ts +34 -0
- package/dist/packages/postgres/src/stream.d.ts.map +1 -0
- package/dist/packages/postgres/src/stream.js +124 -0
- package/dist/packages/postgres/src/stream.js.map +1 -0
- package/dist/packages/postgres/src/version.d.ts +2 -0
- package/dist/packages/postgres/src/version.d.ts.map +1 -0
- package/dist/packages/postgres/src/version.js +2 -0
- package/dist/packages/postgres/src/version.js.map +1 -0
- package/package.json +4 -4
|
@@ -1,5 +1,56 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { once } from "node:events";
|
|
3
|
+
import { finished } from "node:stream/promises";
|
|
1
4
|
import { PostgresSchemaProvider } from "./provider.js";
|
|
2
5
|
import { createPostgresDatabase, } from "./runtime.js";
|
|
6
|
+
import { defaultPostgresTypePolicy, isKnownPostgresType, mapPostgresType, } from "./type-policy.js";
|
|
7
|
+
const pgCursorPackage = "pg-cursor";
|
|
8
|
+
const pgCopyStreamsPackage = "pg-copy-streams";
|
|
9
|
+
const queryTimeoutError = "@typed-sql/postgres/pg does not accept pg query_timeout because pg can reject before the connection is ready for reuse; use PostgreSQL statement_timeout instead";
|
|
10
|
+
async function defaultPgCursorImporter() {
|
|
11
|
+
return import(pgCursorPackage);
|
|
12
|
+
}
|
|
13
|
+
async function defaultPgCopyStreamsImporter() {
|
|
14
|
+
return import(pgCopyStreamsPackage);
|
|
15
|
+
}
|
|
16
|
+
function pgCursorConstructor(module) {
|
|
17
|
+
const candidate = typeof module === "object" && module !== null && "default" in module
|
|
18
|
+
? module.default
|
|
19
|
+
: module;
|
|
20
|
+
if (typeof candidate !== "function") {
|
|
21
|
+
throw new TypeError("The application-owned pg-cursor package does not export a default Cursor constructor");
|
|
22
|
+
}
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
export async function loadPgCursorDriver(importer = defaultPgCursorImporter) {
|
|
26
|
+
try {
|
|
27
|
+
return pgCursorConstructor(await importer());
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof Error && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
31
|
+
throw new Error("@typed-sql/postgres/pg streaming requires the application-owned pg-cursor package. Install it with: pnpm add pg-cursor", { cause: error });
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function loadPgCopyStreams(importer = defaultPgCopyStreamsImporter) {
|
|
37
|
+
try {
|
|
38
|
+
const module = await importer();
|
|
39
|
+
if (typeof module !== "object" ||
|
|
40
|
+
module === null ||
|
|
41
|
+
typeof module.from !== "function" ||
|
|
42
|
+
typeof module.to !== "function") {
|
|
43
|
+
throw new TypeError("The application-owned pg-copy-streams package must export from() and to() factories");
|
|
44
|
+
}
|
|
45
|
+
return module;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof Error && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
49
|
+
throw new Error("@typed-sql/postgres/pg COPY requires the application-owned pg-copy-streams package. Install it with: pnpm add pg-copy-streams", { cause: error });
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
3
54
|
export async function loadPgDriver(importer = () => import("pg")) {
|
|
4
55
|
try {
|
|
5
56
|
return await importer();
|
|
@@ -19,37 +70,427 @@ async function connectionString(value) {
|
|
|
19
70
|
throw new TypeError("PostgreSQL connectionString must not be empty");
|
|
20
71
|
return resolved;
|
|
21
72
|
}
|
|
73
|
+
const POSTGRES_LIVE_VERIFIER_VERSION = "postgres-prepare-v1";
|
|
74
|
+
/** Creates a lazy adapter over PostgreSQL PREPARE and pg_prepared_statements. */
|
|
75
|
+
export function createPgLiveVerifier(options) {
|
|
76
|
+
const ownsPool = options.pool === undefined;
|
|
77
|
+
let poolPromise;
|
|
78
|
+
let serverPromise;
|
|
79
|
+
const acquirePool = () => {
|
|
80
|
+
poolPromise ??= (async () => {
|
|
81
|
+
if (options.pool !== undefined)
|
|
82
|
+
return options.pool;
|
|
83
|
+
if (options.connectionString === undefined)
|
|
84
|
+
throw new TypeError("PostgreSQL live verification requires connectionString or pool");
|
|
85
|
+
const value = await connectionString(options.connectionString);
|
|
86
|
+
const { Pool } = await loadPgDriver(options.driverImporter);
|
|
87
|
+
return new Pool({ ...options.poolConfig, connectionString: value });
|
|
88
|
+
})();
|
|
89
|
+
return poolPromise;
|
|
90
|
+
};
|
|
91
|
+
const server = async () => {
|
|
92
|
+
serverPromise ??= (async () => {
|
|
93
|
+
const pool = await acquirePool();
|
|
94
|
+
const version = await pool.query("SELECT current_setting('server_version') AS version");
|
|
95
|
+
const extensions = await pool.query("SELECT extname || ':' || extversion AS extension FROM pg_extension ORDER BY extname");
|
|
96
|
+
return { version: version.rows[0]?.version ?? "unknown", features: extensions.rows.map((row) => row.extension) };
|
|
97
|
+
})();
|
|
98
|
+
return serverPromise;
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
dialect: "postgres",
|
|
102
|
+
adapterVersion: POSTGRES_LIVE_VERIFIER_VERSION,
|
|
103
|
+
server,
|
|
104
|
+
async verify(request) {
|
|
105
|
+
if (!/^sha256:[a-f\d]{64}$/u.test(request.fingerprint)) {
|
|
106
|
+
throw new TypeError("PostgreSQL live verification requires a SHA-256 query fingerprint");
|
|
107
|
+
}
|
|
108
|
+
const pool = await acquirePool();
|
|
109
|
+
const client = await pool.connect();
|
|
110
|
+
const name = `typed_sql_${request.fingerprint.replace(/^sha256:/u, "").slice(0, 32)}`;
|
|
111
|
+
let prepared = false;
|
|
112
|
+
let evidence;
|
|
113
|
+
let failure;
|
|
114
|
+
try {
|
|
115
|
+
await client.query(`PREPARE ${name} AS ${request.sql}`);
|
|
116
|
+
prepared = true;
|
|
117
|
+
const major = Number.parseInt((await server()).version.split(".")[0] ?? "0", 10);
|
|
118
|
+
const metadata = await client.query(major >= 18
|
|
119
|
+
? `SELECT parameter_types::text[] AS "parameterTypes", result_types::text[] AS "resultTypes" FROM pg_prepared_statements WHERE name = '${name}'`
|
|
120
|
+
: `SELECT parameter_types::text[] AS "parameterTypes" FROM pg_prepared_statements WHERE name = '${name}'`);
|
|
121
|
+
const row = metadata.rows[0];
|
|
122
|
+
if (row === undefined)
|
|
123
|
+
throw new Error("Prepared statement metadata was not returned");
|
|
124
|
+
const policy = options.typePolicy ?? defaultPostgresTypePolicy;
|
|
125
|
+
const fields = (types) => (types ?? []).map((databaseType, offset) => ({
|
|
126
|
+
index: offset + 1,
|
|
127
|
+
databaseType,
|
|
128
|
+
...(isKnownPostgresType(databaseType, options.schema)
|
|
129
|
+
? { tsType: mapPostgresType(databaseType, policy, options.schema) }
|
|
130
|
+
: {}),
|
|
131
|
+
}));
|
|
132
|
+
evidence = {
|
|
133
|
+
parameters: fields(row.parameterTypes),
|
|
134
|
+
columns: fields(row.resultTypes),
|
|
135
|
+
...(major >= 18 ? {} : { unavailable: ["columns"] }),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
failure = error;
|
|
140
|
+
}
|
|
141
|
+
let cleanupFailure;
|
|
142
|
+
if (prepared) {
|
|
143
|
+
try {
|
|
144
|
+
await client.query(`DEALLOCATE ${name}`);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
cleanupFailure = error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
client.release(cleanupFailure instanceof Error ? cleanupFailure : cleanupFailure === undefined ? undefined : true);
|
|
151
|
+
if (failure !== undefined)
|
|
152
|
+
throw failure;
|
|
153
|
+
if (cleanupFailure !== undefined)
|
|
154
|
+
throw cleanupFailure;
|
|
155
|
+
if (evidence === undefined)
|
|
156
|
+
throw new Error("PostgreSQL verification produced no evidence");
|
|
157
|
+
return evidence;
|
|
158
|
+
},
|
|
159
|
+
async close() {
|
|
160
|
+
if (ownsPool && poolPromise !== undefined)
|
|
161
|
+
await (await poolPromise).end();
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const POSTGRES_PLAN_INSPECTOR_VERSION = "postgres-explain-json-v1";
|
|
166
|
+
const postgresPlanSettings = [
|
|
167
|
+
"cpu_index_tuple_cost",
|
|
168
|
+
"cpu_operator_cost",
|
|
169
|
+
"cpu_tuple_cost",
|
|
170
|
+
"cursor_tuple_fraction",
|
|
171
|
+
"default_statistics_target",
|
|
172
|
+
"effective_cache_size",
|
|
173
|
+
"effective_io_concurrency",
|
|
174
|
+
"enable_bitmapscan",
|
|
175
|
+
"enable_gathermerge",
|
|
176
|
+
"enable_hashagg",
|
|
177
|
+
"enable_hashjoin",
|
|
178
|
+
"enable_incremental_sort",
|
|
179
|
+
"enable_indexonlyscan",
|
|
180
|
+
"enable_indexscan",
|
|
181
|
+
"enable_material",
|
|
182
|
+
"enable_memoize",
|
|
183
|
+
"enable_mergejoin",
|
|
184
|
+
"enable_nestloop",
|
|
185
|
+
"enable_parallel_append",
|
|
186
|
+
"enable_parallel_hash",
|
|
187
|
+
"enable_partition_pruning",
|
|
188
|
+
"enable_partitionwise_aggregate",
|
|
189
|
+
"enable_partitionwise_join",
|
|
190
|
+
"enable_seqscan",
|
|
191
|
+
"enable_sort",
|
|
192
|
+
"enable_tidscan",
|
|
193
|
+
"jit",
|
|
194
|
+
"max_parallel_workers_per_gather",
|
|
195
|
+
"min_parallel_index_scan_size",
|
|
196
|
+
"min_parallel_table_scan_size",
|
|
197
|
+
"parallel_setup_cost",
|
|
198
|
+
"parallel_tuple_cost",
|
|
199
|
+
"plan_cache_mode",
|
|
200
|
+
"random_page_cost",
|
|
201
|
+
"work_mem",
|
|
202
|
+
];
|
|
203
|
+
function postgresPlan(value) {
|
|
204
|
+
const parsed = typeof value === "string" ? JSON.parse(value) : value;
|
|
205
|
+
const document = Array.isArray(parsed) ? parsed[0] : undefined;
|
|
206
|
+
const root = typeof document === "object" && document !== null && "Plan" in document
|
|
207
|
+
? document.Plan
|
|
208
|
+
: undefined;
|
|
209
|
+
if (typeof root !== "object" || root === null || Array.isArray(root)) {
|
|
210
|
+
throw new TypeError("PostgreSQL returned an unsupported JSON plan");
|
|
211
|
+
}
|
|
212
|
+
const rootRecord = root;
|
|
213
|
+
const nodes = [];
|
|
214
|
+
const visit = (value) => {
|
|
215
|
+
const kind = value["Node Type"];
|
|
216
|
+
if (typeof kind !== "string" || kind.length === 0)
|
|
217
|
+
throw new TypeError("PostgreSQL plan node has no type");
|
|
218
|
+
const relation = value["Relation Name"];
|
|
219
|
+
const index = value["Index Name"];
|
|
220
|
+
const estimatedRows = value["Plan Rows"];
|
|
221
|
+
const estimatedCost = value["Total Cost"];
|
|
222
|
+
nodes.push({
|
|
223
|
+
kind,
|
|
224
|
+
...(typeof relation === "string" ? { relation } : {}),
|
|
225
|
+
...(typeof index === "string" ? { index } : {}),
|
|
226
|
+
...(typeof estimatedRows === "number" ? { estimatedRows } : {}),
|
|
227
|
+
...(typeof estimatedCost === "number" ? { estimatedCost } : {}),
|
|
228
|
+
});
|
|
229
|
+
const children = value.Plans;
|
|
230
|
+
if (Array.isArray(children)) {
|
|
231
|
+
for (const child of children) {
|
|
232
|
+
if (typeof child !== "object" || child === null || Array.isArray(child)) {
|
|
233
|
+
throw new TypeError("PostgreSQL plan child is invalid");
|
|
234
|
+
}
|
|
235
|
+
visit(child);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
visit(rootRecord);
|
|
240
|
+
return {
|
|
241
|
+
...(typeof rootRecord["Total Cost"] === "number" ? { totalCost: rootRecord["Total Cost"] } : {}),
|
|
242
|
+
...(typeof rootRecord["Plan Rows"] === "number" ? { estimatedRows: rootRecord["Plan Rows"] } : {}),
|
|
243
|
+
nodes,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/** Creates a lazy, non-executing adapter over PostgreSQL structured EXPLAIN. */
|
|
247
|
+
export function createPgPlanInspector(options) {
|
|
248
|
+
const ownsPool = options.pool === undefined;
|
|
249
|
+
let poolPromise;
|
|
250
|
+
let environmentPromise;
|
|
251
|
+
const acquirePool = () => {
|
|
252
|
+
poolPromise ??= (async () => {
|
|
253
|
+
if (options.pool !== undefined)
|
|
254
|
+
return options.pool;
|
|
255
|
+
if (options.connectionString === undefined) {
|
|
256
|
+
throw new TypeError("PostgreSQL plan capture requires connectionString or pool");
|
|
257
|
+
}
|
|
258
|
+
const value = await connectionString(options.connectionString);
|
|
259
|
+
const { Pool } = await loadPgDriver(options.driverImporter);
|
|
260
|
+
return new Pool({ ...options.poolConfig, connectionString: value });
|
|
261
|
+
})();
|
|
262
|
+
return poolPromise;
|
|
263
|
+
};
|
|
264
|
+
return {
|
|
265
|
+
dialect: "postgres",
|
|
266
|
+
adapterVersion: POSTGRES_PLAN_INSPECTOR_VERSION,
|
|
267
|
+
parameterMode: "value-free",
|
|
268
|
+
async environment() {
|
|
269
|
+
environmentPromise ??= (async () => {
|
|
270
|
+
const pool = await acquirePool();
|
|
271
|
+
const versionResult = await pool.query("SELECT current_setting('server_version') AS version");
|
|
272
|
+
const settingResult = await pool.query("SELECT name, setting FROM pg_settings WHERE name = ANY($1::text[]) ORDER BY name", [postgresPlanSettings]);
|
|
273
|
+
const statistics = await pool.query("SELECT schemaname, relname, n_live_tup::text, n_dead_tup::text, COALESCE(last_analyze::text, '') AS last_analyze, COALESCE(last_autoanalyze::text, '') AS last_autoanalyze FROM pg_stat_all_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, relname");
|
|
274
|
+
return {
|
|
275
|
+
version: versionResult.rows[0]?.version ?? "unknown",
|
|
276
|
+
settings: Object.fromEntries(settingResult.rows.map((row) => [row.name, row.setting])),
|
|
277
|
+
statisticsFingerprint: `sha256:${createHash("sha256").update(JSON.stringify(statistics.rows)).digest("hex")}`,
|
|
278
|
+
};
|
|
279
|
+
})();
|
|
280
|
+
return environmentPromise;
|
|
281
|
+
},
|
|
282
|
+
async capture(request) {
|
|
283
|
+
if (!/^sha256:[a-f\d]{64}$/u.test(request.fingerprint)) {
|
|
284
|
+
throw new TypeError("PostgreSQL plan capture requires a SHA-256 query fingerprint");
|
|
285
|
+
}
|
|
286
|
+
if (request.values !== undefined && request.values.length !== request.parameterCount) {
|
|
287
|
+
throw new TypeError("PostgreSQL plan samples do not match the parameter count");
|
|
288
|
+
}
|
|
289
|
+
const client = await (await acquirePool()).connect();
|
|
290
|
+
let failure;
|
|
291
|
+
try {
|
|
292
|
+
const prefix = request.values === undefined ? "EXPLAIN (GENERIC_PLAN TRUE, FORMAT JSON) " : "EXPLAIN (FORMAT JSON) ";
|
|
293
|
+
const result = await client.query(`${prefix}${request.sql}`, request.values);
|
|
294
|
+
return postgresPlan(result.rows[0]?.["QUERY PLAN"]);
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
failure = error;
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
client.release(failure instanceof Error ? failure : failure === undefined ? undefined : true);
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
async close() {
|
|
305
|
+
if (ownsPool && poolPromise !== undefined)
|
|
306
|
+
await (await poolPromise).end();
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
22
310
|
function validatePoolConfig(poolConfig) {
|
|
311
|
+
if (poolConfig !== undefined && "query_timeout" in poolConfig)
|
|
312
|
+
throw new TypeError(queryTimeoutError);
|
|
23
313
|
if (poolConfig !== undefined && "types" in poolConfig) {
|
|
24
314
|
throw new TypeError("@typed-sql/postgres/pg owns poolConfig.types so decoded values match typePolicy; remove that option");
|
|
25
315
|
}
|
|
26
316
|
}
|
|
317
|
+
function validateConnectionStringQueryTimeout(value) {
|
|
318
|
+
try {
|
|
319
|
+
const url = new URL(value);
|
|
320
|
+
for (const name of url.searchParams.keys()) {
|
|
321
|
+
if (name === "query_timeout")
|
|
322
|
+
throw new TypeError(queryTimeoutError);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (error instanceof TypeError && error.message === queryTimeoutError)
|
|
327
|
+
throw error;
|
|
328
|
+
// Let pg report malformed or non-URL connection strings through its normal validation path.
|
|
329
|
+
}
|
|
330
|
+
}
|
|
27
331
|
function queryConfig(config) {
|
|
28
332
|
return {
|
|
333
|
+
...(config.name === undefined ? {} : { name: config.name }),
|
|
29
334
|
text: config.text,
|
|
30
335
|
...(config.values === undefined ? {} : { values: [...config.values] }),
|
|
31
336
|
...(config.types === undefined ? {} : { types: config.types }),
|
|
32
337
|
};
|
|
33
338
|
}
|
|
34
|
-
export function adaptPgPool(pool) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
339
|
+
export function adaptPgPool(pool, cursorImporter = defaultPgCursorImporter, copyStreamsImporter = defaultPgCopyStreamsImporter) {
|
|
340
|
+
const options = pool.options;
|
|
341
|
+
if (options !== undefined && "query_timeout" in options)
|
|
342
|
+
throw new TypeError(queryTimeoutError);
|
|
343
|
+
if (typeof options?.connectionString === "string")
|
|
344
|
+
validateConnectionStringQueryTimeout(options.connectionString);
|
|
345
|
+
let cursorConstructorPromise;
|
|
346
|
+
const loadCursor = () => {
|
|
347
|
+
cursorConstructorPromise ??= loadPgCursorDriver(cursorImporter);
|
|
348
|
+
return cursorConstructorPromise;
|
|
349
|
+
};
|
|
350
|
+
let copyStreamsPromise;
|
|
351
|
+
const loadCopyStreams = () => {
|
|
352
|
+
copyStreamsPromise ??= loadPgCopyStreams(copyStreamsImporter);
|
|
353
|
+
return copyStreamsPromise;
|
|
354
|
+
};
|
|
355
|
+
const wrapClient = (client) => {
|
|
356
|
+
let fatalError;
|
|
357
|
+
let rejectFatal;
|
|
358
|
+
const fatalSettlement = new Promise((_resolve, reject) => {
|
|
359
|
+
rejectFatal = reject;
|
|
360
|
+
});
|
|
361
|
+
// The promise intentionally remains pending for a healthy lease and must never be unhandled.
|
|
362
|
+
void fatalSettlement.catch(() => undefined);
|
|
363
|
+
const recordFatal = (error) => {
|
|
364
|
+
if (fatalError !== undefined)
|
|
365
|
+
return;
|
|
366
|
+
fatalError = error;
|
|
367
|
+
rejectFatal(error);
|
|
368
|
+
};
|
|
369
|
+
const onError = (error) => recordFatal(error);
|
|
370
|
+
const onEnd = () => recordFatal(new Error("The PostgreSQL connection ended while it was leased"));
|
|
371
|
+
client.on("error", onError);
|
|
372
|
+
client.on("end", onEnd);
|
|
373
|
+
return {
|
|
374
|
+
pipeline: client.pipeline,
|
|
375
|
+
async query(config) {
|
|
376
|
+
const result = typeof config === "string"
|
|
377
|
+
? await client.query(config)
|
|
378
|
+
: await client.query(queryConfig(config));
|
|
379
|
+
return { rows: result.rows };
|
|
380
|
+
},
|
|
381
|
+
async openCursor(config) {
|
|
382
|
+
const Cursor = await loadCursor();
|
|
383
|
+
// pg-cursor always parses an unnamed statement. Keep the prepared name in typed-sql's
|
|
384
|
+
// driver-neutral config, but do not pretend the native cursor can honor it.
|
|
385
|
+
const cursor = new Cursor(config.text, config.values, {
|
|
386
|
+
...(config.types === undefined ? {} : { types: config.types }),
|
|
387
|
+
});
|
|
388
|
+
const queryCursor = client.query.bind(client);
|
|
389
|
+
const nativeCursor = queryCursor(cursor);
|
|
390
|
+
return {
|
|
391
|
+
read: (rowCount) => nativeCursor.read(rowCount),
|
|
392
|
+
async close() {
|
|
393
|
+
if (fatalError !== undefined)
|
|
394
|
+
throw fatalError;
|
|
395
|
+
const nativeClose = nativeCursor.close();
|
|
396
|
+
// Keep observing the native promise even when fatal settlement wins the race.
|
|
397
|
+
void nativeClose.catch(() => undefined);
|
|
398
|
+
await Promise.race([nativeClose, fatalSettlement]);
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
},
|
|
402
|
+
async openCopyFrom(statement) {
|
|
403
|
+
const copy = await loadCopyStreams();
|
|
404
|
+
const nativeQuery = client.query.bind(client);
|
|
405
|
+
const writable = nativeQuery(copy.from(statement));
|
|
406
|
+
const terminal = finished(writable);
|
|
407
|
+
void terminal.catch(() => undefined);
|
|
408
|
+
return {
|
|
409
|
+
async write(chunk) {
|
|
410
|
+
if (!writable.write(chunk))
|
|
411
|
+
await once(writable, "drain");
|
|
412
|
+
},
|
|
413
|
+
async finish() {
|
|
414
|
+
writable.end();
|
|
415
|
+
await terminal;
|
|
416
|
+
},
|
|
417
|
+
async abort(error) {
|
|
418
|
+
writable.destroy(error instanceof Error ? error : new Error("PostgreSQL COPY FROM aborted"));
|
|
419
|
+
await terminal.catch(() => undefined);
|
|
420
|
+
},
|
|
421
|
+
};
|
|
422
|
+
},
|
|
423
|
+
async openCopyTo(statement) {
|
|
424
|
+
const copy = await loadCopyStreams();
|
|
425
|
+
const nativeQuery = client.query.bind(client);
|
|
426
|
+
const readable = nativeQuery(copy.to(statement));
|
|
427
|
+
const terminal = finished(readable);
|
|
428
|
+
void terminal.catch(() => undefined);
|
|
429
|
+
const iterator = readable[Symbol.asyncIterator]();
|
|
430
|
+
let complete = false;
|
|
431
|
+
const close = async () => {
|
|
432
|
+
const early = !complete;
|
|
433
|
+
complete = true;
|
|
434
|
+
if (early)
|
|
435
|
+
readable.destroy();
|
|
436
|
+
if (early)
|
|
437
|
+
await terminal.catch(() => undefined);
|
|
438
|
+
else
|
|
439
|
+
await terminal;
|
|
440
|
+
};
|
|
441
|
+
const source = {
|
|
442
|
+
[Symbol.asyncIterator]() {
|
|
443
|
+
return source;
|
|
444
|
+
},
|
|
445
|
+
async next() {
|
|
446
|
+
const result = await iterator.next();
|
|
447
|
+
if (result.done === true) {
|
|
448
|
+
complete = true;
|
|
449
|
+
return { done: true, value: undefined };
|
|
450
|
+
}
|
|
451
|
+
const value = result.value;
|
|
452
|
+
return {
|
|
453
|
+
done: false,
|
|
454
|
+
value: value instanceof Uint8Array ? value : Buffer.from(value),
|
|
455
|
+
};
|
|
456
|
+
},
|
|
457
|
+
async return() {
|
|
458
|
+
await close();
|
|
459
|
+
return { done: true, value: undefined };
|
|
460
|
+
},
|
|
461
|
+
close,
|
|
462
|
+
async abort(error) {
|
|
463
|
+
readable.destroy(error instanceof Error ? error : new Error("PostgreSQL COPY TO aborted"));
|
|
464
|
+
await terminal.catch(() => undefined);
|
|
465
|
+
complete = true;
|
|
466
|
+
},
|
|
467
|
+
async [Symbol.asyncDispose]() {
|
|
468
|
+
await close();
|
|
469
|
+
},
|
|
470
|
+
};
|
|
471
|
+
return source;
|
|
472
|
+
},
|
|
473
|
+
release(error) {
|
|
474
|
+
client.removeListener("error", onError);
|
|
475
|
+
client.removeListener("end", onEnd);
|
|
476
|
+
client.release(error === undefined ? fatalError : error);
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
};
|
|
46
480
|
return {
|
|
481
|
+
executionCapabilities: Object.freeze({ cancellation: true, deadlines: true }),
|
|
47
482
|
async query(config) {
|
|
48
483
|
const result = typeof config === "string"
|
|
49
484
|
? await pool.query(config)
|
|
50
485
|
: await pool.query(queryConfig(config));
|
|
51
486
|
return { rows: result.rows };
|
|
52
487
|
},
|
|
488
|
+
async ensureCursor() {
|
|
489
|
+
await loadCursor();
|
|
490
|
+
},
|
|
491
|
+
async ensureCopy() {
|
|
492
|
+
await loadCopyStreams();
|
|
493
|
+
},
|
|
53
494
|
async connect() {
|
|
54
495
|
return wrapClient(await pool.connect());
|
|
55
496
|
},
|
|
@@ -60,15 +501,18 @@ export function adaptPgPool(pool) {
|
|
|
60
501
|
}
|
|
61
502
|
export async function createPgDatabase(options) {
|
|
62
503
|
validatePoolConfig(options.poolConfig);
|
|
504
|
+
const resolvedConnectionString = await connectionString(options.connectionString);
|
|
505
|
+
validateConnectionStringQueryTimeout(resolvedConnectionString);
|
|
63
506
|
const driver = await loadPgDriver();
|
|
64
507
|
const { Pool } = driver;
|
|
65
|
-
const pool = new Pool({ ...options.poolConfig, connectionString:
|
|
508
|
+
const pool = new Pool({ ...options.poolConfig, connectionString: resolvedConnectionString });
|
|
66
509
|
return createPostgresDatabase({
|
|
67
|
-
pool: adaptPgPool(pool),
|
|
510
|
+
pool: adaptPgPool(pool, options.cursorImporter, options.copyStreamsImporter),
|
|
68
511
|
ownsPool: true,
|
|
69
512
|
fallbackTypeParsers: driver.types,
|
|
70
513
|
...(options.typePolicy === undefined ? {} : { typePolicy: options.typePolicy }),
|
|
71
514
|
...(options.decimal === undefined ? {} : { decimal: options.decimal }),
|
|
515
|
+
...(options.observer === undefined ? {} : { observer: options.observer }),
|
|
72
516
|
});
|
|
73
517
|
}
|
|
74
518
|
export function pg(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg.js","sourceRoot":"","sources":["../../../../src/pg.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pg.js","sourceRoot":"","sources":["../../../../src/pg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Query, type QueryRenderSkeleton, type RenderedQuery, type SqlRenderer } from "@typed-sql/core";
|
|
2
|
+
export interface PostgresPreparedQueryFactory<Arguments extends readonly unknown[], Row, Params extends readonly unknown[]> {
|
|
3
|
+
(...args: Arguments): Query<Row, Params>;
|
|
4
|
+
readonly statementName: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PostgresPreparedQueryMetadata {
|
|
7
|
+
readonly statementName: string;
|
|
8
|
+
readonly rendered: RenderedQuery;
|
|
9
|
+
}
|
|
10
|
+
interface PreparedStatement {
|
|
11
|
+
skeleton: QueryRenderSkeleton | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface PostgresPreparedQueryState {
|
|
14
|
+
readonly statements: Map<string, PreparedStatement>;
|
|
15
|
+
readonly queries: WeakMap<object, PostgresPreparedQueryMetadata>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createPostgresPreparedQueryState(): PostgresPreparedQueryState;
|
|
18
|
+
export declare function preparePostgresQuery<Arguments extends readonly unknown[], Row, Params extends readonly unknown[]>(state: PostgresPreparedQueryState, renderer: SqlRenderer, statementName: string, factory: (...args: Arguments) => Query<Row, Params>): PostgresPreparedQueryFactory<Arguments, Row, Params>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=prepared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepared.d.ts","sourceRoot":"","sources":["../../../../src/prepared.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,4BAA4B,CAC3C,SAAS,SAAS,SAAS,OAAO,EAAE,EACpC,GAAG,EACH,MAAM,SAAS,SAAS,OAAO,EAAE;IAEjC,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;CAClE;AAED,wBAAgB,gCAAgC,IAAI,0BAA0B,CAK7E;AAQD,wBAAgB,oBAAoB,CAAC,SAAS,SAAS,SAAS,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,EAC/G,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,GAClD,4BAA4B,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAwCtD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { bindQueryRenderSkeleton, compileQueryRenderSkeleton, } from "@typed-sql/core";
|
|
2
|
+
export function createPostgresPreparedQueryState() {
|
|
3
|
+
return {
|
|
4
|
+
statements: new Map(),
|
|
5
|
+
queries: new WeakMap(),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function validateStatementName(statementName) {
|
|
9
|
+
if (typeof statementName !== "string" || statementName.length === 0 || statementName.includes("\0")) {
|
|
10
|
+
throw new TypeError("Prepared statement names must be non-empty and cannot contain NUL");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function preparePostgresQuery(state, renderer, statementName, factory) {
|
|
14
|
+
validateStatementName(statementName);
|
|
15
|
+
if (state.statements.has(statementName)) {
|
|
16
|
+
throw new TypeError(`Prepared statement name ${JSON.stringify(statementName)} is already registered`);
|
|
17
|
+
}
|
|
18
|
+
const statement = { skeleton: undefined };
|
|
19
|
+
state.statements.set(statementName, statement);
|
|
20
|
+
const prepared = (...args) => {
|
|
21
|
+
const query = factory(...args);
|
|
22
|
+
const existing = state.queries.get(query);
|
|
23
|
+
if (existing !== undefined && existing.statementName !== statementName) {
|
|
24
|
+
throw new TypeError(`A query cannot use both prepared statement ${JSON.stringify(existing.statementName)} and ${JSON.stringify(statementName)}`);
|
|
25
|
+
}
|
|
26
|
+
let rendered = existing?.rendered;
|
|
27
|
+
const skeleton = statement.skeleton;
|
|
28
|
+
if (rendered === undefined) {
|
|
29
|
+
if (skeleton === undefined) {
|
|
30
|
+
const compiled = compileQueryRenderSkeleton(query, renderer);
|
|
31
|
+
statement.skeleton = compiled.skeleton;
|
|
32
|
+
rendered = compiled.rendered;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
rendered = bindQueryRenderSkeleton(query, skeleton);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (rendered === undefined) {
|
|
39
|
+
throw new TypeError(`Prepared statement ${JSON.stringify(statementName)} must always render the same SQL text and structure`);
|
|
40
|
+
}
|
|
41
|
+
if (existing === undefined)
|
|
42
|
+
state.queries.set(query, { statementName, rendered });
|
|
43
|
+
return query;
|
|
44
|
+
};
|
|
45
|
+
return Object.freeze(Object.assign(prepared, { statementName }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=prepared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepared.js","sourceRoot":"","sources":["../../../../src/prepared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAK3B,MAAM,iBAAiB,CAAC;AAyBzB,MAAM,UAAU,gCAAgC;IAC9C,OAAO;QACL,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,OAAO,EAAE,IAAI,OAAO,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB;IAClD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAiC,EACjC,QAAqB,EACrB,aAAqB,EACrB,OAAmD;IAEnD,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,SAAS,GAAsB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAe,EAAsB,EAAE;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YACvE,MAAM,IAAI,SAAS,CACjB,8CAA8C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAC5H,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC7D,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACvC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CACjB,sBAAsB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,qDAAqD,CACzG,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -81,7 +81,8 @@ export declare const postgresCatalogQueries: {
|
|
|
81
81
|
ORDER BY position
|
|
82
82
|
) AS argument_types,
|
|
83
83
|
format_type(p.prorettype, NULL) AS database_return_type,
|
|
84
|
-
p.proretset AS set_returning
|
|
84
|
+
p.proretset AS set_returning,
|
|
85
|
+
p.provolatile AS volatility
|
|
85
86
|
FROM pg_catalog.pg_proc AS p
|
|
86
87
|
JOIN pg_catalog.pg_namespace AS n ON n.oid = p.pronamespace
|
|
87
88
|
WHERE p.prokind = 'f'
|