pipework 0.196.0 → 0.197.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/CHANGELOG.md +9 -0
- package/dist/test/savepoints.d.ts.map +1 -1
- package/dist/test/savepoints.js +26 -26
- package/dist/test/savepoints.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.197.0
|
|
4
|
+
|
|
5
|
+
- **Faster: a collapsed `db.transaction()` under transaction isolation costs 2 harness round trips, down from 6 + k** (#763). With k settings changed in the block, the harness used to send each step as its own statement: a settings snapshot, `current_user`, `SAVEPOINT`, `RELEASE`, a second snapshot, and one `set_config` per changed setting. Now:
|
|
6
|
+
- opening is one query: `SAVEPOINT` and a single snapshot of the role and every known setting;
|
|
7
|
+
- closing is one query: `RELEASE` and every touched setting set back, plus the role if it was changed;
|
|
8
|
+
- an error is one query: `ROLLBACK TO` and `RELEASE`.
|
|
9
|
+
|
|
10
|
+
The semantics are unchanged. In pipework's own count, 8 transactions went from 64 harness statements to 16. Step-graph and job tests that open many transactions spend far less time waiting on the database.
|
|
11
|
+
|
|
3
12
|
## 0.196.0
|
|
4
13
|
|
|
5
14
|
- **Added: an upload's `onRefuse` hook gets the route's `params` and `query`** (#762). They arrive as the handler gets them: parsed by the route's schema (transforms and coercions applied), or raw when the route has no schema. They are `null` when they fail it, because the file's refusal can come before the handler parses them.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savepoints.d.ts","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"savepoints.d.ts","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAKnG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CA+FlI"}
|
package/dist/test/savepoints.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
import { PostgresJsTransaction } from '../data/query/postgres-js/index.js';
|
|
3
3
|
import { throughErrorBoundary } from '../data/query/postgres-js/driver-error-boundary.js';
|
|
4
|
-
import { sql } from '../data/query/index.js';
|
|
5
4
|
/**
|
|
6
5
|
* Makes `db.transaction(fn)` — and `transaction` on the handle `fn` receives,
|
|
7
6
|
* to any depth — a SAVEPOINT on the transaction the harness already holds on
|
|
@@ -81,10 +80,12 @@ export function collapseTransactionsToSavepoints(db, client) {
|
|
|
81
80
|
}
|
|
82
81
|
block.open = false;
|
|
83
82
|
};
|
|
83
|
+
// Each of the three steps below is one simple-protocol round trip on the
|
|
84
|
+
// raw client, so the harness adds no more than two per block.
|
|
85
|
+
const send = unsafe;
|
|
84
86
|
const runSavepoint = async (fn, block, target) => {
|
|
85
87
|
const name = `pw_${++counter}`;
|
|
86
|
-
const before = await
|
|
87
|
-
await db.execute(sql.raw(`SAVEPOINT ${name}`));
|
|
88
|
+
const before = await openSavepoint(send, name, known);
|
|
88
89
|
let result;
|
|
89
90
|
try {
|
|
90
91
|
const handle = new PostgresJsTransaction(target.dialect, target.session, undefined);
|
|
@@ -93,13 +94,11 @@ export function collapseTransactionsToSavepoints(db, client) {
|
|
|
93
94
|
}
|
|
94
95
|
catch (err) {
|
|
95
96
|
await settleChildren(block);
|
|
96
|
-
await
|
|
97
|
-
await db.execute(sql.raw(`RELEASE SAVEPOINT ${name}`));
|
|
97
|
+
await send(`ROLLBACK TO SAVEPOINT ${name}; RELEASE SAVEPOINT ${name}`);
|
|
98
98
|
throw err;
|
|
99
99
|
}
|
|
100
100
|
await settleChildren(block);
|
|
101
|
-
await
|
|
102
|
-
await restore(db, before, block);
|
|
101
|
+
await send(releaseAndRestore(name, before, block));
|
|
103
102
|
return result;
|
|
104
103
|
};
|
|
105
104
|
wrap(db);
|
|
@@ -121,27 +120,28 @@ function settingNames(query, params) {
|
|
|
121
120
|
names.push(set[1]);
|
|
122
121
|
return names;
|
|
123
122
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
const
|
|
133
|
-
|
|
123
|
+
const literal = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
124
|
+
/** `SAVEPOINT name` and the snapshot of the known settings and the role, in one query. */
|
|
125
|
+
async function openSavepoint(send, name, names) {
|
|
126
|
+
const settings = names.size === 0
|
|
127
|
+
? 'NULL'
|
|
128
|
+
: `(SELECT jsonb_object_agg(n, current_setting(n, true)) FROM unnest(ARRAY[${[...names].map(literal).join(', ')}]::text[]) AS n)`;
|
|
129
|
+
// postgres.js answers a multi-statement simple query with one result per statement.
|
|
130
|
+
const results = await send(`SAVEPOINT ${name}; SELECT current_user AS role, ${settings} AS settings`);
|
|
131
|
+
const row = results[1]?.[0];
|
|
132
|
+
const values = (row?.['settings'] ?? {});
|
|
133
|
+
return { settings: new Map(Object.entries(values)), role: String(row?.['role']) };
|
|
134
134
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
/** `RELEASE SAVEPOINT name`, then every touched setting and a touched role set back, in one query. */
|
|
136
|
+
function releaseAndRestore(name, before, block) {
|
|
137
|
+
let query = `RELEASE SAVEPOINT ${name}`;
|
|
138
|
+
if (block.touched.size > 0) {
|
|
138
139
|
// A setting first seen inside the savepoint was unset before it.
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
await db.execute(sql `SELECT set_config(${name}, ${was}, true)`);
|
|
142
|
-
}
|
|
143
|
-
if (block.roleTouched && after.role !== before.role) {
|
|
144
|
-
await db.execute(sql.raw(`SET LOCAL ROLE "${before.role.replaceAll('"', '""')}"`));
|
|
140
|
+
const calls = [...block.touched].map(n => `set_config(${literal(n)}, ${literal(before.settings.get(n) ?? '')}, true)`);
|
|
141
|
+
query += `; SELECT ${calls.join(', ')}`;
|
|
145
142
|
}
|
|
143
|
+
if (block.roleTouched)
|
|
144
|
+
query += `; SET LOCAL ROLE "${before.role.replaceAll('"', '""')}"`;
|
|
145
|
+
return query;
|
|
146
146
|
}
|
|
147
147
|
//# sourceMappingURL=savepoints.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savepoints.js","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAA2B,MAAM,oCAAoC,CAAA;AACnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;
|
|
1
|
+
{"version":3,"file":"savepoints.js","sourceRoot":"","sources":["../../src/test/savepoints.ts"],"names":[],"mappings":"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"}
|