okmodel 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -1131
- package/dist/adapters/capabilities.d.ts +35 -0
- package/dist/adapters/failure.d.ts +13 -2
- package/dist/adapters/lazy-errors.d.ts +22 -0
- package/dist/adapters/pg/bun-sql.d.ts +53 -0
- package/dist/adapters/pg/bunsql-extra.d.ts +54 -3
- package/dist/adapters/pg/bunsql.d.ts +15 -2
- package/dist/adapters/pg/cursor.d.ts +17 -0
- package/dist/adapters/pg/neon-extra.d.ts +18 -0
- package/dist/adapters/pg/neon.d.ts +104 -0
- package/dist/adapters/pg/no-inflight-timeout.d.ts +11 -8
- package/dist/adapters/pg/nodepostgres-extra.d.ts +22 -1
- package/dist/adapters/pg/nodepostgres.d.ts +12 -0
- package/dist/adapters/pg/pglite-wire.d.ts +24 -0
- package/dist/adapters/pg/pglite.d.ts +10 -0
- package/dist/adapters/pg/postgres-extra.d.ts +27 -11
- package/dist/adapters/pg/reserved.d.ts +42 -0
- package/dist/adapters/pg/session.d.ts +0 -18
- package/dist/contracts/connection.d.ts +7 -6
- package/dist/contracts/error.d.ts +1 -1
- package/dist/dialects/pg/floor.d.ts +68 -0
- package/dist/dialects/pg/fn/index.d.ts +39 -1
- package/dist/dialects/pg/fn/index.js +118 -26
- package/dist/dialects/pg/index.d.ts +8 -1
- package/dist/dialects/pg/index.js +435 -170
- package/dist/dialects/pg/introspect.d.ts +11 -0
- package/dist/dialects/pg/keys.d.ts +11 -8
- package/dist/dialects/pg/model.d.ts +40 -0
- package/dist/dialects/pg/morph.d.ts +43 -0
- package/dist/dialects/pg/operator-fit.d.ts +2 -2
- package/dist/dialects/pg/operators.d.ts +14 -7
- package/dist/dialects/pg/ops/bucket.d.ts +65 -0
- package/dist/dialects/pg/ops/fragment.d.ts +119 -0
- package/dist/dialects/pg/ops/inc.d.ts +2 -2
- package/dist/dialects/pg/ops/lane.d.ts +49 -0
- package/dist/dialects/pg/ops/matches.d.ts +9 -12
- package/dist/dialects/pg/ops/relevance.d.ts +13 -0
- package/dist/dialects/pg/ops/search-query.d.ts +22 -0
- package/dist/dialects/pg/ops/window.d.ts +103 -0
- package/dist/dialects/pg/preset.d.ts +1 -1
- package/dist/dialects/pg/relations.d.ts +100 -3
- package/dist/dialects/pg/schema.d.ts +31 -3
- package/dist/dialects/pg/view/client.d.ts +14 -6
- package/dist/dialects/pg/view/index.d.ts +73 -1
- package/dist/dialects/pg/view/index.js +156 -5
- package/dist/dialects/pg/view/scratch.d.ts +8 -5
- package/dist/runtime/aggregate.d.ts +8 -2
- package/dist/runtime/bucket-group.d.ts +70 -0
- package/dist/runtime/conflict.d.ts +22 -4
- package/dist/runtime/include.d.ts +0 -8
- package/dist/runtime/inflight.d.ts +1 -1
- package/dist/runtime/otel.d.ts +105 -0
- package/dist/runtime/otel.js +97 -0
- package/dist/runtime/page.d.ts +4 -1
- package/dist/runtime/pg/bun.js +12 -6
- package/dist/runtime/pg/neon.d.ts +38 -0
- package/dist/runtime/pg/neon.js +64 -0
- package/dist/runtime/pg/pg.js +5 -5
- package/dist/runtime/pg/pglite.d.ts +1 -0
- package/dist/runtime/pg/pglite.js +9 -9
- package/dist/runtime/pg/postgresjs.js +5 -5
- package/dist/runtime/plan.d.ts +95 -5
- package/dist/runtime/read-stream.d.ts +13 -16
- package/dist/runtime/result-name.d.ts +17 -0
- package/dist/runtime/server-check.d.ts +3 -3
- package/dist/runtime/sort-bind.d.ts +21 -0
- package/dist/runtime/sort.d.ts +56 -0
- package/dist/runtime/sql-fragment.d.ts +43 -0
- package/dist/runtime/sync.d.ts +70 -0
- package/dist/runtime/tenancy/index.js +15 -13
- package/dist/runtime/text-search.d.ts +20 -0
- package/dist/runtime/topology.d.ts +1 -1
- package/dist/runtime/traits/index.d.ts +80 -0
- package/dist/runtime/traits/index.js +184 -21
- package/dist/runtime/tree.d.ts +38 -0
- package/dist/runtime/types.d.ts +232 -22
- package/dist/runtime/validate/index.js +4 -4
- package/dist/runtime/version.d.ts +39 -0
- package/dist/runtime/window.d.ts +21 -0
- package/dist/runtime/write.d.ts +54 -2
- package/dist/shared/{929h19xp.js → 0wrea3jq.js} +141 -13
- package/dist/shared/{qq3899ht.js → 12z7aznj.js} +243 -14
- package/dist/shared/{1z04fa85.js → 14x60fbf.js} +12 -57
- package/dist/shared/{ek2wt2dz.js → 16kvjebh.js} +4 -4
- package/dist/shared/{wynzeggs.js → 195pzzzz.js} +8 -8
- package/dist/shared/1d9q9cv2.js +312 -0
- package/dist/shared/2c13q96h.js +18 -0
- package/dist/shared/{b4v57v3x.js → 2d3xq4ps.js} +2 -2
- package/dist/shared/{1f0xa3cb.js → 3449rcae.js} +5 -5
- package/dist/shared/{wkme6tep.js → 35q0n9tz.js} +8 -16
- package/dist/shared/3bb7wsqt.js +99 -0
- package/dist/shared/3t6kw83m.js +249 -0
- package/dist/shared/{5j36z8dn.js → 4m6hskg8.js} +39 -70
- package/dist/shared/{n076ydsc.js → 4vbf83xx.js} +69 -28
- package/dist/shared/{vmfkhszw.js → 63f4ksbz.js} +33 -26
- package/dist/shared/{c58secgj.js → 63qtkrca.js} +38 -4
- package/dist/shared/6m78c8ss.js +6 -0
- package/dist/shared/{x3jc53kg.js → 760ppr76.js} +15 -7
- package/dist/shared/7ghwamrf.js +40 -0
- package/dist/shared/7kms6fvj.js +20 -0
- package/dist/shared/7n7ddwt4.js +6 -0
- package/dist/shared/9a4ae4p8.js +31 -0
- package/dist/shared/{hazqqecq.js → 9dr2qnx7.js} +63 -34
- package/dist/shared/{h15jx9bc.js → 9dvh1dr6.js} +1 -1
- package/dist/shared/a62rb2da.js +13 -0
- package/dist/shared/{cgbamx3e.js → ae4j5f42.js} +23 -4
- package/dist/shared/agsfb86s.js +233 -0
- package/dist/shared/{8x72s86k.js → b6d6p0zc.js} +13 -7
- package/dist/shared/{ag4c7516.js → b76b8d95.js} +2 -2
- package/dist/shared/{j60w0dvr.js → bah9nbg3.js} +58 -38
- package/dist/shared/bnby0esn.js +10 -0
- package/dist/shared/bsek72fg.js +225 -0
- package/dist/shared/{2cg3wnxc.js → bxas03mq.js} +608 -141
- package/dist/shared/{31vm914h.js → cm3w0ywp.js} +15 -16
- package/dist/shared/{gwn6v667.js → cnkky55j.js} +25 -14
- package/dist/shared/{dk8v79p3.js → d5nmj7vv.js} +1 -1
- package/dist/shared/{ttmg09vd.js → dpc2r7rb.js} +8 -8
- package/dist/shared/dzj09cye.js +10 -0
- package/dist/shared/{sbdme3vy.js → e8zyaqvj.js} +60 -10
- package/dist/shared/{2jd1sn0e.js → ecn8mfdq.js} +6 -6
- package/dist/shared/exn3sd90.js +359 -0
- package/dist/shared/{t3g0k88x.js → f4jy1j7x.js} +39 -22
- package/dist/shared/{y2t3jktd.js → fjpnhqan.js} +20 -13
- package/dist/shared/g5yc06ka.js +272 -0
- package/dist/shared/ga9j92qj.js +25 -0
- package/dist/shared/{3fqwmr09.js → hfqmpasr.js} +6 -6
- package/dist/shared/{wt5rzv1h.js → hm5f8jby.js} +7 -7
- package/dist/shared/{ys0xzyaj.js → hqpxf4a4.js} +224 -19
- package/dist/shared/jebgrkeq.js +179 -0
- package/dist/shared/{09p049xa.js → jp36k7dp.js} +44 -16
- package/dist/shared/jx2m62cs.js +96 -0
- package/dist/shared/{r11n8grd.js → k86n8vq3.js} +7 -4
- package/dist/shared/{2z7wv5tj.js → kgwp4jdd.js} +56 -35
- package/dist/shared/{knmes2kh.js → kj9d8maq.js} +1 -1
- package/dist/shared/{g90m9b0g.js → m4xff2a6.js} +6 -5
- package/dist/shared/{r6nwkxnt.js → m7n9h2a5.js} +4 -4
- package/dist/shared/mfedzr74.js +145 -0
- package/dist/shared/{f0f1n281.js → mkrn359n.js} +60 -11
- package/dist/shared/{p248q79y.js → mnvjvqyp.js} +10 -10
- package/dist/shared/{672t5vym.js → mss6ctgv.js} +2 -2
- package/dist/shared/{4az561fn.js → mtw6jz76.js} +8 -23
- package/dist/shared/n05z9nwz.js +313 -0
- package/dist/shared/{pjr6xrm5.js → n0jmpgj1.js} +20 -17
- package/dist/shared/{p6bjzq9q.js → n41w4fbz.js} +14 -6
- package/dist/shared/{b3awxn7h.js → n454kcnw.js} +1 -1
- package/dist/shared/n7kg8mmx.js +61 -0
- package/dist/shared/nbw1z4yd.js +18 -0
- package/dist/shared/needfe47.js +66 -0
- package/dist/shared/{1nw1f3vs.js → njga14v4.js} +9 -9
- package/dist/shared/{5yv4k6a6.js → nmnsgj7x.js} +145 -3
- package/dist/shared/{vjpnzwjz.js → p3xbdcvt.js} +14 -18
- package/dist/shared/p5nh3r8q.js +622 -0
- package/dist/shared/{nx9hh281.js → pan0370z.js} +13 -12
- package/dist/shared/q0cqt2sp.js +12 -0
- package/dist/shared/qd9hhd8f.js +37 -0
- package/dist/shared/{mb2ycs1p.js → qfw14tna.js} +15 -15
- package/dist/shared/{9s0ypp87.js → sjk86yrx.js} +1 -1
- package/dist/shared/th3be82n.js +208 -0
- package/dist/shared/{ed0b8k4s.js → typ3vy7t.js} +1 -1
- package/dist/shared/{5d8t84hg.js → v1wad97q.js} +14 -14
- package/dist/shared/{x72jb7ad.js → v8g1vgv8.js} +1 -1
- package/dist/shared/{9628a9xt.js → vk7rag46.js} +1 -1
- package/dist/shared/{ze4hxsmy.js → w9ejzaqf.js} +1 -1
- package/dist/shared/{q3j1tq7a.js → wcrheftc.js} +148 -23
- package/dist/shared/wvdjznah.js +213 -0
- package/dist/shared/wz2a78mp.js +8 -0
- package/dist/shared/xfhe73sb.js +436 -0
- package/dist/shared/{r1fdd0f6.js → z581d7ny.js} +5 -2
- package/dist/shared/{8etn7d8w.js → z7s6fpxv.js} +1 -1
- package/dist/shared/{32cnm7kn.js → zbqbmmrp.js} +76 -40
- package/dist/shared/{n7mcc1gk.js → zchaghkf.js} +4 -3
- package/dist/shared/{xq0mvhts.js → zgex00fd.js} +6 -6
- package/dist/shared/{nsva2a6b.js → znm0bpp5.js} +3 -0
- package/dist/shared/zq1he88x.js +155 -0
- package/dist/tooling/cli.js +26 -13
- package/dist/tooling/driver-run.js +4971 -0
- package/dist/tooling/driver-test.d.ts +36 -0
- package/dist/tooling/migrate/commands.d.ts +2 -2
- package/dist/tooling/migrate/engine.d.ts +3 -2
- package/dist/tooling/migrate/index.js +9 -9
- package/dist/tooling/migrate/project.d.ts +3 -0
- package/dist/tooling/shared/03k6res6.js +210 -0
- package/dist/tooling/shared/08kemxjd.js +10 -0
- package/dist/tooling/shared/2revefqt.js +209 -0
- package/dist/tooling/shared/2wtvc7rw.js +1425 -0
- package/dist/tooling/shared/345tbc2k.js +16 -0
- package/dist/tooling/shared/3m1hkg7z.js +344 -0
- package/dist/tooling/shared/3rrw5w8f.js +81 -0
- package/dist/tooling/shared/3tq8pnb8.js +131 -0
- package/dist/tooling/shared/417zdsk7.js +194 -0
- package/dist/tooling/shared/4d2w25vw.js +40 -0
- package/dist/tooling/shared/54tqkxja.js +51 -0
- package/dist/tooling/shared/5bvw2nev.js +12 -0
- package/dist/tooling/shared/6nyfyw70.js +231 -0
- package/dist/tooling/shared/72fyg4zv.js +160 -0
- package/dist/tooling/shared/733a1tq3.js +38 -0
- package/dist/tooling/shared/7ae7rjmn.js +20 -0
- package/dist/tooling/shared/7kms6fvj.js +20 -0
- package/dist/tooling/shared/8sqrsw3s.js +49 -0
- package/dist/tooling/shared/96ps4g1z.js +32 -0
- package/dist/tooling/shared/9kazs5p6.js +195 -0
- package/dist/tooling/shared/9xzm7hjg.js +38 -0
- package/dist/tooling/shared/a6pp9d12.js +49 -0
- package/dist/tooling/shared/a7q7t4n3.js +22 -0
- package/dist/tooling/shared/aftb2mwr.js +18 -0
- package/dist/tooling/shared/bz2dqhab.js +311 -0
- package/dist/tooling/shared/cmptmb4f.js +12 -0
- package/dist/tooling/shared/ddjtfgnx.js +177 -0
- package/dist/tooling/shared/djydjpqt.js +261 -0
- package/dist/tooling/shared/dw08f3m8.js +9 -0
- package/dist/tooling/shared/dy672fz6.js +16 -0
- package/dist/tooling/shared/dzx85q70.js +66 -0
- package/dist/tooling/shared/ec71zqgt.js +270 -0
- package/dist/{shared/d5azex6s.js → tooling/shared/ep8zh3bk.js} +1 -1
- package/dist/tooling/shared/f9mphxej.js +3789 -0
- package/dist/tooling/shared/fb9k2qwd.js +89 -0
- package/dist/tooling/shared/g9ad4n80.js +211 -0
- package/dist/tooling/shared/gfvtj6d0.js +94 -0
- package/dist/tooling/shared/gmcf9cxf.js +294 -0
- package/dist/tooling/shared/htnaj77v.js +17 -0
- package/dist/tooling/shared/j9t5s12a.js +7 -0
- package/dist/tooling/shared/jne7b93p.js +42 -0
- package/dist/tooling/shared/ma2340rx.js +118 -0
- package/dist/tooling/shared/mtrqn2hn.js +505 -0
- package/dist/tooling/shared/n4jqhpqz.js +27 -0
- package/dist/tooling/shared/nf7jmhfa.js +20 -0
- package/dist/tooling/shared/p7f08ktn.js +332 -0
- package/dist/tooling/shared/ppnnnvj8.js +13 -0
- package/dist/tooling/shared/pqy21k24.js +312 -0
- package/dist/tooling/shared/pw8fgahx.js +69 -0
- package/dist/tooling/shared/pwsytxm5.js +17 -0
- package/dist/tooling/shared/rf83gr2d.js +94 -0
- package/dist/tooling/shared/rq5kk8j6.js +401 -0
- package/dist/tooling/shared/rs1jb051.js +12 -0
- package/dist/tooling/shared/smn6kz1p.js +157 -0
- package/dist/tooling/shared/spk1jg3r.js +1696 -0
- package/dist/tooling/shared/tn8gay14.js +143 -0
- package/dist/tooling/shared/vraj6d74.js +42 -0
- package/dist/tooling/shared/vs0t6qt8.js +64 -0
- package/dist/tooling/shared/vx86qjv8.js +150 -0
- package/dist/tooling/shared/w7qe8sj1.js +140 -0
- package/dist/tooling/shared/wt7j7nf6.js +15 -0
- package/dist/tooling/shared/wwnekq5n.js +6 -0
- package/dist/tooling/shared/xhrnjch9.js +185 -0
- package/dist/tooling/shared/xjs6zqtc.js +190 -0
- package/dist/tooling/shared/y031jct9.js +16 -0
- package/dist/tooling/shared/y5656f0e.js +233 -0
- package/dist/tooling/shared/yfr8hzhm.js +604 -0
- package/dist/tooling/shared/yk9mp7vb.js +250 -0
- package/dist/tooling/shared/yw30vnq2.js +139 -0
- package/dist/tooling/shared/z8d7ptht.js +618 -0
- package/dist/tooling/shared/zhwnfyb2.js +9 -0
- package/dist/tooling/shared/zvnhh1n0.js +198 -0
- package/dist/tooling/testing/index.js +3 -3
- package/package.json +17 -3
- package/dist/shared/3qnhc7w5.js +0 -38
- package/dist/shared/7m88x3e9.js +0 -45
- package/dist/shared/8dqhth8c.js +0 -12
- package/dist/shared/j3rkk835.js +0 -99
- package/dist/shared/k68eedmy.js +0 -85
- package/dist/shared/venqrjna.js +0 -216
- package/dist/shared/wxr8cwns.js +0 -6
- package/dist/shared/y34a8714.js +0 -150
- package/dist/shared/zm0mafk4.js +0 -92
- package/dist/shared/zy8r7qvz.js +0 -116
- package/dist/shared/{ywr8hmey.js → 606g0nbf.js} +3 -3
- package/dist/shared/{rpycarcr.js → gcefca6p.js} +4 -4
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DriverError2,
|
|
3
|
+
timedOut2
|
|
4
|
+
} from "./cm3w0ywp.js";
|
|
1
5
|
import {
|
|
2
6
|
PgSession
|
|
3
|
-
} from "./
|
|
7
|
+
} from "./35q0n9tz.js";
|
|
4
8
|
import {
|
|
5
9
|
isConnectionLost
|
|
6
|
-
} from "./
|
|
10
|
+
} from "./cnkky55j.js";
|
|
7
11
|
import {
|
|
8
12
|
driverErrors,
|
|
9
13
|
rejectClosed,
|
|
@@ -11,32 +15,45 @@ import {
|
|
|
11
15
|
runCall,
|
|
12
16
|
rowsFrom,
|
|
13
17
|
resultFrom
|
|
14
|
-
} from "./
|
|
18
|
+
} from "./ae4j5f42.js";
|
|
15
19
|
|
|
16
20
|
// src/adapters/pg/postgres-extra.ts
|
|
17
21
|
var RESET_ALL = "RESET ALL";
|
|
18
22
|
var UNLOCK = "SELECT pg_advisory_unlock_all()";
|
|
19
|
-
async function checkout2(pool) {
|
|
23
|
+
async function checkout2(pool, timeoutMs) {
|
|
20
24
|
if (pool.isClosed())
|
|
21
25
|
return rejectClosed();
|
|
22
|
-
const reserved = await reserveConnection(pool.sql, pool.acquireMs, pool.counters);
|
|
26
|
+
const reserved = await reserveConnection(pool.sql, pool.acquireMs, pool.counters, timeoutMs);
|
|
23
27
|
pool.counters.reserved += 1;
|
|
24
28
|
const local = new Set;
|
|
25
29
|
const session = new PgSession(reserved, pool.counters, "reserved", local, pool.isClosed, pool.poolInflight, pool.notices, pool.named);
|
|
26
30
|
let released = false;
|
|
27
|
-
const lost = { on: false
|
|
31
|
+
const lost = { on: false, stop: () => {
|
|
32
|
+
return;
|
|
33
|
+
} };
|
|
28
34
|
arm(reserved, lost);
|
|
29
|
-
|
|
35
|
+
let limit = timeoutMs !== undefined && timeoutMs > 0 ? timeoutMs : 0;
|
|
36
|
+
const remember = (timeout) => {
|
|
37
|
+
if (timeout !== undefined && timeout > 0)
|
|
38
|
+
limit = timeout;
|
|
39
|
+
};
|
|
40
|
+
const guard = (run) => lost.on ? rejectClosed() : run().catch((error) => {
|
|
30
41
|
if (isConnectionLost(error))
|
|
31
42
|
lost.on = true;
|
|
32
43
|
throw error;
|
|
33
44
|
});
|
|
34
45
|
return {
|
|
35
|
-
execute: (text, params, options) =>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
execute: (text, params, options) => {
|
|
47
|
+
remember(options?.timeout);
|
|
48
|
+
return guard(() => runCall(pool.isClosed(), options, (watch) => session.query(text, params, watch)));
|
|
49
|
+
},
|
|
50
|
+
batch: (statements, options) => {
|
|
51
|
+
remember(options?.timeout);
|
|
52
|
+
return guard(() => runCall(pool.isClosed(), options, async (watch) => {
|
|
53
|
+
const { runAtomicBatch } = await import("./b76b8d95.js");
|
|
54
|
+
return runAtomicBatch(session, statements, watch);
|
|
55
|
+
}));
|
|
56
|
+
},
|
|
40
57
|
cancel() {
|
|
41
58
|
session.cancel();
|
|
42
59
|
},
|
|
@@ -44,13 +61,16 @@ async function checkout2(pool) {
|
|
|
44
61
|
if (released)
|
|
45
62
|
return;
|
|
46
63
|
released = true;
|
|
64
|
+
const ms = limit;
|
|
47
65
|
try {
|
|
48
66
|
if (!lost.on)
|
|
49
|
-
await resetConnection(reserved, session.depth());
|
|
67
|
+
await deadline(ms, () => resetConnection(reserved, session.depth()), lost);
|
|
68
|
+
} catch {
|
|
69
|
+
lost.on = true;
|
|
50
70
|
} finally {
|
|
51
71
|
pool.counters.reserved = Math.max(0, pool.counters.reserved - 1);
|
|
52
72
|
if (lost.on)
|
|
53
|
-
await pool.sql.unsafe("select 1").catch(() => {
|
|
73
|
+
await deadline(ms, () => pool.sql.unsafe("select 1"), pool.sql).catch(() => {
|
|
54
74
|
return;
|
|
55
75
|
});
|
|
56
76
|
else
|
|
@@ -73,37 +93,141 @@ async function* stream2(sql, text, params) {
|
|
|
73
93
|
yield rowsFrom(chunk);
|
|
74
94
|
}
|
|
75
95
|
}
|
|
76
|
-
function
|
|
96
|
+
function poolWaits(sql) {
|
|
97
|
+
const options = sql.options;
|
|
98
|
+
if (options === undefined || options.q !== undefined)
|
|
99
|
+
return options;
|
|
100
|
+
const q = new Set;
|
|
101
|
+
const n = new Set;
|
|
102
|
+
options.q = q;
|
|
103
|
+
options.n = n;
|
|
104
|
+
options.onclose = (id) => {
|
|
105
|
+
n.add(id);
|
|
106
|
+
if (n.size < options.max) {
|
|
107
|
+
queueMicrotask(() => {
|
|
108
|
+
for (const wait of q)
|
|
109
|
+
wait.a();
|
|
110
|
+
});
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
n.clear();
|
|
114
|
+
for (const wait of q)
|
|
115
|
+
wait.s();
|
|
116
|
+
q.clear();
|
|
117
|
+
};
|
|
118
|
+
return options;
|
|
119
|
+
}
|
|
120
|
+
function deadline(ms, run, link) {
|
|
121
|
+
let timer;
|
|
122
|
+
let off = () => {
|
|
123
|
+
return;
|
|
124
|
+
};
|
|
125
|
+
const slot = link !== undefined && "stop" in link ? link : undefined;
|
|
126
|
+
const pool = slot === undefined && link !== undefined ? poolWaits(link) : undefined;
|
|
127
|
+
let ended = false;
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
const fail = (error) => {
|
|
130
|
+
if (ended)
|
|
131
|
+
return;
|
|
132
|
+
ended = true;
|
|
133
|
+
reject(error);
|
|
134
|
+
};
|
|
135
|
+
const stop = () => {
|
|
136
|
+
fail(new DriverError2("Connection closed", { sqlstate: "08006" }));
|
|
137
|
+
};
|
|
138
|
+
if (slot !== undefined)
|
|
139
|
+
slot.stop = stop;
|
|
140
|
+
const go = () => {
|
|
141
|
+
const pending = run();
|
|
142
|
+
if (ms > 0 && timer === undefined) {
|
|
143
|
+
timer = setTimeout(() => {
|
|
144
|
+
pending.cancel?.();
|
|
145
|
+
fail(timedOut2());
|
|
146
|
+
}, ms);
|
|
147
|
+
}
|
|
148
|
+
pending.then((value) => {
|
|
149
|
+
if (ended) {
|
|
150
|
+
value.release?.();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
ended = true;
|
|
154
|
+
pool?.n?.clear();
|
|
155
|
+
resolve(value);
|
|
156
|
+
}, fail);
|
|
157
|
+
};
|
|
158
|
+
if (ms === 0 && pool?.q !== undefined) {
|
|
159
|
+
let used = false;
|
|
160
|
+
const wait = {
|
|
161
|
+
s: stop,
|
|
162
|
+
a() {
|
|
163
|
+
if (used || ended)
|
|
164
|
+
return;
|
|
165
|
+
used = true;
|
|
166
|
+
go();
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
pool.q.add(wait);
|
|
170
|
+
off = () => pool.q?.delete(wait);
|
|
171
|
+
}
|
|
172
|
+
go();
|
|
173
|
+
}).finally(() => {
|
|
174
|
+
clearTimeout(timer);
|
|
175
|
+
if (slot !== undefined)
|
|
176
|
+
slot.stop = () => {
|
|
177
|
+
return;
|
|
178
|
+
};
|
|
179
|
+
off();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async function runBatch2(pool, statements, options) {
|
|
183
|
+
const connection = await checkout2(pool, options?.timeout);
|
|
184
|
+
try {
|
|
185
|
+
return await connection.batch(statements, options);
|
|
186
|
+
} finally {
|
|
187
|
+
await connection.release();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function reserveConnection(sql, acquireMs, counters, callMs) {
|
|
77
191
|
counters.waiting += 1;
|
|
78
192
|
let settled = false;
|
|
193
|
+
const finish = () => {
|
|
194
|
+
counters.waiting = Math.max(0, counters.waiting - 1);
|
|
195
|
+
};
|
|
79
196
|
return new Promise((resolve, reject) => {
|
|
80
197
|
let timer;
|
|
81
198
|
if (acquireMs !== undefined) {
|
|
82
199
|
timer = setTimeout(() => {
|
|
200
|
+
if (settled)
|
|
201
|
+
return;
|
|
83
202
|
settled = true;
|
|
84
|
-
|
|
203
|
+
finish();
|
|
85
204
|
driverErrors().then((errors) => {
|
|
86
205
|
reject(errors.acquireTimeout());
|
|
87
206
|
});
|
|
88
207
|
}, acquireMs);
|
|
89
208
|
}
|
|
90
|
-
|
|
209
|
+
const ms = callMs !== undefined && callMs > 0 ? callMs : 0;
|
|
210
|
+
deadline(ms, () => sql.reserve(), sql).then((connection) => {
|
|
91
211
|
if (settled) {
|
|
92
|
-
resetConnection(connection, 0).
|
|
212
|
+
resetConnection(connection, 0).catch(() => {
|
|
213
|
+
return;
|
|
214
|
+
}).finally(() => {
|
|
93
215
|
connection.release();
|
|
94
216
|
});
|
|
95
217
|
return;
|
|
96
218
|
}
|
|
219
|
+
settled = true;
|
|
97
220
|
if (timer !== undefined)
|
|
98
221
|
clearTimeout(timer);
|
|
99
|
-
|
|
222
|
+
finish();
|
|
100
223
|
resolve(connection);
|
|
101
224
|
}, (error) => {
|
|
102
225
|
if (settled)
|
|
103
226
|
return;
|
|
227
|
+
settled = true;
|
|
104
228
|
if (timer !== undefined)
|
|
105
229
|
clearTimeout(timer);
|
|
106
|
-
|
|
230
|
+
finish();
|
|
107
231
|
mapFailure(error).then(reject);
|
|
108
232
|
});
|
|
109
233
|
});
|
|
@@ -139,6 +263,7 @@ function arm(sql, lost) {
|
|
|
139
263
|
onexecute(connection) {
|
|
140
264
|
connection.onclose = () => {
|
|
141
265
|
lost.on = true;
|
|
266
|
+
lost.stop();
|
|
142
267
|
};
|
|
143
268
|
}
|
|
144
269
|
});
|
|
@@ -182,13 +307,13 @@ async function holdListener2(gate, start) {
|
|
|
182
307
|
}
|
|
183
308
|
}
|
|
184
309
|
function watchQuery2(pending, watch, onAbort, ctx) {
|
|
185
|
-
return pending.then((
|
|
310
|
+
return pending.then((value) => {
|
|
186
311
|
finishWatch(pending, watch, onAbort, ctx);
|
|
187
312
|
const why = watch.reason();
|
|
188
313
|
if (why === "timeout" || why === "cancelled")
|
|
189
314
|
return classify(why, watch);
|
|
190
315
|
ctx.note(ctx.text);
|
|
191
|
-
return resultFrom(
|
|
316
|
+
return resultFrom(value, ctx.notices.since(ctx.start));
|
|
192
317
|
}, (error) => {
|
|
193
318
|
finishWatch(pending, watch, onAbort, ctx);
|
|
194
319
|
return classify(error, watch);
|
|
@@ -214,4 +339,4 @@ async function classify(error, watch) {
|
|
|
214
339
|
return Promise.reject(errors.mapDriverError(error));
|
|
215
340
|
}
|
|
216
341
|
|
|
217
|
-
export { checkout2, describe2, stream2, watchReserved2, holdCheckout2, holdListener2, watchQuery2 };
|
|
342
|
+
export { checkout2, describe2, stream2, runBatch2, watchReserved2, holdCheckout2, holdListener2, watchQuery2 };
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DriverError2
|
|
3
|
+
} from "./cm3w0ywp.js";
|
|
4
|
+
import {
|
|
5
|
+
send2,
|
|
6
|
+
reserve,
|
|
7
|
+
park
|
|
8
|
+
} from "./zbqbmmrp.js";
|
|
9
|
+
import {
|
|
10
|
+
resetSession2,
|
|
11
|
+
refuseWhenLost2
|
|
12
|
+
} from "./7ghwamrf.js";
|
|
13
|
+
import {
|
|
14
|
+
cursorStream
|
|
15
|
+
} from "./7kms6fvj.js";
|
|
16
|
+
import {
|
|
17
|
+
isConnectionFailure
|
|
18
|
+
} from "./cnkky55j.js";
|
|
19
|
+
import {
|
|
20
|
+
noTimeout
|
|
21
|
+
} from "./q0cqt2sp.js";
|
|
22
|
+
import {
|
|
23
|
+
WireSession
|
|
24
|
+
} from "./mtw6jz76.js";
|
|
25
|
+
import {
|
|
26
|
+
rejectClosed,
|
|
27
|
+
runCall
|
|
28
|
+
} from "./ae4j5f42.js";
|
|
29
|
+
|
|
30
|
+
// src/adapters/pg/bunsql-extra.ts
|
|
31
|
+
async function recover(sql, error, text, depth, clientRead, closedDuring, again) {
|
|
32
|
+
if (!lostQuery(error))
|
|
33
|
+
throw error;
|
|
34
|
+
await flushClosed(sql);
|
|
35
|
+
const alreadyDead = closedDuring || socketClosed(error);
|
|
36
|
+
if (!clientRead && !alreadyDead || depth !== 0 || !readStatement(text))
|
|
37
|
+
throw error;
|
|
38
|
+
try {
|
|
39
|
+
return await again();
|
|
40
|
+
} catch (next) {
|
|
41
|
+
if (lostQuery(next))
|
|
42
|
+
await flushClosed(sql);
|
|
43
|
+
throw next;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function drainClosed(sql) {
|
|
47
|
+
return flushClosed(sql).then(() => {
|
|
48
|
+
return;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function readStatement(text) {
|
|
52
|
+
const head = text.trimStart().toLowerCase().replace(/\s+/g, " ");
|
|
53
|
+
if (head.length === 0 || head.includes("pg_advisory"))
|
|
54
|
+
return false;
|
|
55
|
+
if (/\sfor (?:no key update|key share|update|share)\b/.test(head))
|
|
56
|
+
return false;
|
|
57
|
+
return !/^(?:insert|update|delete|refresh|with|create|alter|drop|truncate|grant|revoke|comment|vacuum|analyze|reindex|copy|begin|start|commit|rollback|savepoint|release|set|reset)\b/.test(head);
|
|
58
|
+
}
|
|
59
|
+
function lostQuery(error) {
|
|
60
|
+
return isConnectionFailure(error) || socketClosed(error);
|
|
61
|
+
}
|
|
62
|
+
function socketClosed(error) {
|
|
63
|
+
if (!(error instanceof Error))
|
|
64
|
+
return false;
|
|
65
|
+
if (error.message === "Connection closed")
|
|
66
|
+
return true;
|
|
67
|
+
return error.cause instanceof Error && error.cause.message === "Connection closed";
|
|
68
|
+
}
|
|
69
|
+
async function listen(sql, parked, closed, channel, onNotify) {
|
|
70
|
+
if (closed)
|
|
71
|
+
return rejectClosed();
|
|
72
|
+
const pending = parked.splice(0);
|
|
73
|
+
for (const reserved of pending) {
|
|
74
|
+
const done = reserved.release();
|
|
75
|
+
if (done instanceof Promise)
|
|
76
|
+
await done;
|
|
77
|
+
}
|
|
78
|
+
const subscription = await sql.listen(channel, onNotify);
|
|
79
|
+
return async () => {
|
|
80
|
+
await subscription.unlisten();
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function checkout(held) {
|
|
84
|
+
const { counters, isClosed } = held;
|
|
85
|
+
if (isClosed())
|
|
86
|
+
return rejectClosed();
|
|
87
|
+
const reserved = await takeOpen(held) ?? await reserve(held.sql, held.acquireMs, counters);
|
|
88
|
+
counters.reserved += 1;
|
|
89
|
+
const session = new WireSession((text, params) => send2(reserved, text, params), held.notices, isClosed, false, () => {
|
|
90
|
+
counters.reservedBusy += 1;
|
|
91
|
+
}, () => {
|
|
92
|
+
counters.reservedBusy = Math.max(0, counters.reservedBusy - 1);
|
|
93
|
+
});
|
|
94
|
+
let lost = { on: false };
|
|
95
|
+
const opened = held.closures();
|
|
96
|
+
const reconnected = () => {
|
|
97
|
+
if (held.closures() === opened)
|
|
98
|
+
return;
|
|
99
|
+
lost.on = true;
|
|
100
|
+
return Promise.reject(new DriverError2("Connection closed", { sqlstate: "08006" }));
|
|
101
|
+
};
|
|
102
|
+
const guard = (run) => refuseWhenLost2(lost, () => run().catch((error) => {
|
|
103
|
+
if (error instanceof Error && bunClosed(error.message)) {
|
|
104
|
+
throw new DriverError2(error.message, { cause: error, sqlstate: "08006" });
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}));
|
|
108
|
+
let released = false;
|
|
109
|
+
return {
|
|
110
|
+
execute: (text, params, options) => {
|
|
111
|
+
const refused = noTimeout(options);
|
|
112
|
+
if (refused !== undefined)
|
|
113
|
+
return refused;
|
|
114
|
+
const gone = reconnected();
|
|
115
|
+
if (gone !== undefined)
|
|
116
|
+
return gone;
|
|
117
|
+
return guard(() => runCall(isClosed(), options, (watch) => session.query(text, params, watch)));
|
|
118
|
+
},
|
|
119
|
+
batch: (statements, options) => {
|
|
120
|
+
const refused = noTimeout(options);
|
|
121
|
+
if (refused !== undefined)
|
|
122
|
+
return refused;
|
|
123
|
+
const gone = reconnected();
|
|
124
|
+
if (gone !== undefined)
|
|
125
|
+
return gone;
|
|
126
|
+
return guard(() => runCall(isClosed(), options, async (watch) => {
|
|
127
|
+
const { runAtomicBatch } = await import("./b76b8d95.js");
|
|
128
|
+
return runAtomicBatch(session, statements, watch);
|
|
129
|
+
}));
|
|
130
|
+
},
|
|
131
|
+
evict() {
|
|
132
|
+
lost.on = true;
|
|
133
|
+
},
|
|
134
|
+
async release() {
|
|
135
|
+
if (released)
|
|
136
|
+
return;
|
|
137
|
+
released = true;
|
|
138
|
+
if (!lost.on && reportsClosed(reserved))
|
|
139
|
+
lost.on = true;
|
|
140
|
+
try {
|
|
141
|
+
if (!lost.on)
|
|
142
|
+
await reset(session, reserved);
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (lostQuery(error) || reportsClosed(reserved))
|
|
145
|
+
lost.on = true;
|
|
146
|
+
else
|
|
147
|
+
throw error;
|
|
148
|
+
} finally {
|
|
149
|
+
counters.reserved = Math.max(0, counters.reserved - 1);
|
|
150
|
+
if (lost.on) {
|
|
151
|
+
try {
|
|
152
|
+
reserved.release();
|
|
153
|
+
} catch {}
|
|
154
|
+
await flushClosed(held.sql);
|
|
155
|
+
} else
|
|
156
|
+
await park(held.parked, reserved);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function reportsClosed(reserved) {
|
|
162
|
+
return Reflect.get(reserved, "closed") === true;
|
|
163
|
+
}
|
|
164
|
+
async function takeOpen(held) {
|
|
165
|
+
while (held.parked.length > 0) {
|
|
166
|
+
const next = held.parked.pop();
|
|
167
|
+
if (next === undefined)
|
|
168
|
+
return;
|
|
169
|
+
if (!reportsClosed(next))
|
|
170
|
+
return next;
|
|
171
|
+
try {
|
|
172
|
+
next.release();
|
|
173
|
+
} catch {}
|
|
174
|
+
await flushClosed(held.sql);
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
async function flushClosed(sql) {
|
|
179
|
+
for (let attempt = 0;attempt < 3; attempt += 1) {
|
|
180
|
+
try {
|
|
181
|
+
await sql.unsafe("select 1");
|
|
182
|
+
return true;
|
|
183
|
+
} catch {}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
function bunClosed(message) {
|
|
188
|
+
return message === "Connection closed" || message === "connection must be a PostgresSQLConnection";
|
|
189
|
+
}
|
|
190
|
+
async function reset(session, sql) {
|
|
191
|
+
const run = (text) => sql.unsafe(text);
|
|
192
|
+
await resetSession2(session.depth(), run);
|
|
193
|
+
}
|
|
194
|
+
function streamRows(checkout, text, params) {
|
|
195
|
+
return async function* () {
|
|
196
|
+
const connection = await checkout();
|
|
197
|
+
try {
|
|
198
|
+
yield* cursorStream((statement, values) => connection.execute(statement, values), text, params);
|
|
199
|
+
} catch (error) {
|
|
200
|
+
connection.evict?.();
|
|
201
|
+
throw error;
|
|
202
|
+
} finally {
|
|
203
|
+
await connection.release();
|
|
204
|
+
}
|
|
205
|
+
}();
|
|
206
|
+
}
|
|
207
|
+
export {
|
|
208
|
+
checkout,
|
|
209
|
+
drainClosed,
|
|
210
|
+
listen,
|
|
211
|
+
recover,
|
|
212
|
+
streamRows
|
|
213
|
+
};
|