callman-core 1.44.0 → 1.45.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/ai-packs/db-queries.md +21 -4
- package/ai-packs/feature-policy.md +1 -1
- package/ai-packs/pm-api.md +1 -1
- package/ai-packs/scenario-nodes.md +8 -5
- package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -1
- package/dist/ai/prompts/scenarioNodeReference.js +17 -6
- package/dist/ai/prompts/scenarioNodeReference.js.map +1 -1
- package/dist/host/connections.d.ts.map +1 -1
- package/dist/host/connections.js +7 -0
- package/dist/host/connections.js.map +1 -1
- package/dist/host/db/db-query-reference.d.ts.map +1 -1
- package/dist/host/db/db-query-reference.js +25 -9
- package/dist/host/db/db-query-reference.js.map +1 -1
- package/dist/host/db/dbBinds.d.ts +20 -0
- package/dist/host/db/dbBinds.d.ts.map +1 -0
- package/dist/host/db/dbBinds.js +61 -0
- package/dist/host/db/dbBinds.js.map +1 -0
- package/dist/host/db/dbSessionManager.d.ts +13 -0
- package/dist/host/db/dbSessionManager.d.ts.map +1 -0
- package/dist/host/db/dbSessionManager.js +165 -0
- package/dist/host/db/dbSessionManager.js.map +1 -0
- package/dist/host/db/introspection/index.d.ts +1 -0
- package/dist/host/db/introspection/index.d.ts.map +1 -1
- package/dist/host/db/introspection/index.js +1 -0
- package/dist/host/db/introspection/index.js.map +1 -1
- package/dist/host/db/introspection/routines.d.ts +38 -0
- package/dist/host/db/introspection/routines.d.ts.map +1 -0
- package/dist/host/db/introspection/routines.js +439 -0
- package/dist/host/db/introspection/routines.js.map +1 -0
- package/dist/host/db/mssqlAdapter.d.ts +10 -4
- package/dist/host/db/mssqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mssqlAdapter.js +144 -34
- package/dist/host/db/mssqlAdapter.js.map +1 -1
- package/dist/host/db/mysqlAdapter.d.ts +10 -4
- package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mysqlAdapter.js +66 -16
- package/dist/host/db/mysqlAdapter.js.map +1 -1
- package/dist/host/db/oracleAdapter.d.ts +10 -4
- package/dist/host/db/oracleAdapter.d.ts.map +1 -1
- package/dist/host/db/oracleAdapter.js +301 -28
- package/dist/host/db/oracleAdapter.js.map +1 -1
- package/dist/host/db/pgClientConfig.d.ts +10 -1
- package/dist/host/db/pgClientConfig.d.ts.map +1 -1
- package/dist/host/db/pgClientConfig.js +59 -0
- package/dist/host/db/pgClientConfig.js.map +1 -1
- package/dist/host/db/pgSession.d.ts +11 -0
- package/dist/host/db/pgSession.d.ts.map +1 -0
- package/dist/host/db/pgSession.js +62 -0
- package/dist/host/db/pgSession.js.map +1 -0
- package/dist/host/db/pgSessionManager.d.ts +5 -14
- package/dist/host/db/pgSessionManager.d.ts.map +1 -1
- package/dist/host/db/pgSessionManager.js +9 -161
- package/dist/host/db/pgSessionManager.js.map +1 -1
- package/dist/host/db/postgresAdapter.d.ts +2 -4
- package/dist/host/db/postgresAdapter.d.ts.map +1 -1
- package/dist/host/db/postgresAdapter.js +26 -6
- package/dist/host/db/postgresAdapter.js.map +1 -1
- package/dist/host/db/queryExecutor.d.ts +2 -4
- package/dist/host/db/queryExecutor.d.ts.map +1 -1
- package/dist/host/db/queryExecutor.js +35 -23
- package/dist/host/db/queryExecutor.js.map +1 -1
- package/dist/host/db/sqlState.d.ts +1 -0
- package/dist/host/db/sqlState.d.ts.map +1 -1
- package/dist/host/db/sqlState.js +20 -0
- package/dist/host/db/sqlState.js.map +1 -1
- package/dist/host/db/types.d.ts +38 -0
- package/dist/host/db/types.d.ts.map +1 -1
- package/dist/host/index.d.ts +5 -3
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +8 -6
- package/dist/host/index.js.map +1 -1
- package/dist/scenario-runner/adapters/db-executor.d.ts +17 -3
- package/dist/scenario-runner/adapters/db-executor.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/db-executor.js +57 -22
- package/dist/scenario-runner/adapters/db-executor.js.map +1 -1
- package/dist/scenario-runner/adapters/index.d.ts +1 -1
- package/dist/scenario-runner/adapters/index.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/index.js +1 -1
- package/dist/scenario-runner/adapters/index.js.map +1 -1
- package/dist/scenario-runner/adapters/types.d.ts +7 -0
- package/dist/scenario-runner/adapters/types.d.ts.map +1 -1
- package/dist/scenario-runner/index.d.ts +1 -1
- package/dist/scenario-runner/index.d.ts.map +1 -1
- package/dist/scenario-runner/index.js +1 -1
- package/dist/scenario-runner/index.js.map +1 -1
- package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
- package/dist/scenario-runner/nodePolicy.js +3 -0
- package/dist/scenario-runner/nodePolicy.js.map +1 -1
- package/dist/scenario-runner/runScenario.d.ts +4 -2
- package/dist/scenario-runner/runScenario.d.ts.map +1 -1
- package/dist/scenario-runner/runScenario.js +47 -12
- package/dist/scenario-runner/runScenario.js.map +1 -1
- package/dist/scenario-runner/runScenarioWithDataset.d.ts.map +1 -1
- package/dist/scenario-runner/runScenarioWithDataset.js +65 -1
- package/dist/scenario-runner/runScenarioWithDataset.js.map +1 -1
- package/dist/scenario-runner/types.d.ts +21 -1
- package/dist/scenario-runner/types.d.ts.map +1 -1
- package/dist/script/features/db.d.ts +7 -0
- package/dist/script/features/db.d.ts.map +1 -1
- package/dist/script/features/db.js +8 -1
- package/dist/script/features/db.js.map +1 -1
- package/dist/script/pm-api-declarations.d.ts.map +1 -1
- package/dist/script/pm-api-declarations.js +24 -0
- package/dist/script/pm-api-declarations.js.map +1 -1
- package/dist/script/pm-api-metadata.js +1 -1
- package/dist/script/pm-api-metadata.js.map +1 -1
- package/dist/script/types.d.ts +7 -0
- package/dist/script/types.d.ts.map +1 -1
- package/dist-cjs/ai/prompts/scenarioNodeReference.js +17 -6
- package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -1
- package/dist-cjs/host/connections.js +7 -0
- package/dist-cjs/host/connections.js.map +1 -1
- package/dist-cjs/host/db/db-query-reference.js +25 -9
- package/dist-cjs/host/db/db-query-reference.js.map +1 -1
- package/dist-cjs/host/db/dbBinds.js +71 -0
- package/dist-cjs/host/db/dbBinds.js.map +1 -0
- package/dist-cjs/host/db/dbSessionManager.js +172 -0
- package/dist-cjs/host/db/dbSessionManager.js.map +1 -0
- package/dist-cjs/host/db/introspection/index.js +4 -1
- package/dist-cjs/host/db/introspection/index.js.map +1 -1
- package/dist-cjs/host/db/introspection/routines.js +444 -0
- package/dist-cjs/host/db/introspection/routines.js.map +1 -0
- package/dist-cjs/host/db/mssqlAdapter.js +146 -35
- package/dist-cjs/host/db/mssqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/mysqlAdapter.js +68 -17
- package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/oracleAdapter.js +303 -29
- package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
- package/dist-cjs/host/db/pgClientConfig.js +61 -1
- package/dist-cjs/host/db/pgClientConfig.js.map +1 -1
- package/dist-cjs/host/db/pgSession.js +67 -0
- package/dist-cjs/host/db/pgSession.js.map +1 -0
- package/dist-cjs/host/db/pgSessionManager.js +10 -166
- package/dist-cjs/host/db/pgSessionManager.js.map +1 -1
- package/dist-cjs/host/db/postgresAdapter.js +25 -5
- package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
- package/dist-cjs/host/db/queryExecutor.js +34 -22
- package/dist-cjs/host/db/queryExecutor.js.map +1 -1
- package/dist-cjs/host/db/sqlState.js +22 -1
- package/dist-cjs/host/db/sqlState.js.map +1 -1
- package/dist-cjs/host/index.js +15 -6
- package/dist-cjs/host/index.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/db-executor.js +57 -21
- package/dist-cjs/scenario-runner/adapters/db-executor.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/index.js +3 -1
- package/dist-cjs/scenario-runner/adapters/index.js.map +1 -1
- package/dist-cjs/scenario-runner/index.js +2 -1
- package/dist-cjs/scenario-runner/index.js.map +1 -1
- package/dist-cjs/scenario-runner/nodePolicy.js +3 -0
- package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenario.js +49 -13
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenarioWithDataset.js +65 -1
- package/dist-cjs/scenario-runner/runScenarioWithDataset.js.map +1 -1
- package/dist-cjs/script/features/db.js +8 -1
- package/dist-cjs/script/features/db.js.map +1 -1
- package/dist-cjs/script/pm-api-declarations.js +24 -0
- package/dist-cjs/script/pm-api-declarations.js.map +1 -1
- package/dist-cjs/script/pm-api-metadata.js +1 -1
- package/dist-cjs/script/pm-api-metadata.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// The PostgreSQL side of run-scoped sessions: one live `pg` Client, on which
|
|
2
|
+
// BEGIN, temp tables, GUCs and advisory locks survive between nodes.
|
|
3
|
+
import { loadOptionalModule } from "../lazy.js";
|
|
4
|
+
import { buildPgClientConfig, runPgStatement } from "./pgClientConfig.js";
|
|
5
|
+
const unwrap = (mod) => (mod && mod.default && !mod.Client ? mod.default : mod);
|
|
6
|
+
// Test seam mirroring postgresAdapter's — lets unit tests inject a fake
|
|
7
|
+
// driver without a live server.
|
|
8
|
+
let pgDriverOverride = null;
|
|
9
|
+
export const __setPgSessionDriverForTests = (driver) => {
|
|
10
|
+
pgDriverOverride = driver;
|
|
11
|
+
};
|
|
12
|
+
const loadPgDriver = async () => {
|
|
13
|
+
if (pgDriverOverride)
|
|
14
|
+
return pgDriverOverride;
|
|
15
|
+
try {
|
|
16
|
+
return unwrap(await loadOptionalModule("pg"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error("PostgreSQL driver (`pg`) is not installed. Install `pg` to use PostgreSQL sessions.");
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export const openPgSession = async (connection, onLost) => {
|
|
23
|
+
const { Client } = await loadPgDriver();
|
|
24
|
+
const client = new Client(buildPgClientConfig(connection));
|
|
25
|
+
await client.connect();
|
|
26
|
+
// Socket-level errors surface here (killed backend, network drop); the
|
|
27
|
+
// manager marks the session so the next query fails fast with the cause.
|
|
28
|
+
client.on?.("error", (error) => {
|
|
29
|
+
onLost(error instanceof Error ? error.message : "PostgreSQL session connection lost");
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
label: "PostgreSQL",
|
|
33
|
+
exec: async (query, options, inTransaction) => {
|
|
34
|
+
if (!inTransaction)
|
|
35
|
+
return runPgStatement(client, query, options);
|
|
36
|
+
// A failed statement aborts a Postgres transaction. The savepoint keeps
|
|
37
|
+
// the run's transaction alive, so a node that expects an error can be
|
|
38
|
+
// followed by more work and the final ROLLBACK/COMMIT still means it.
|
|
39
|
+
await client.query("SAVEPOINT callman_stmt");
|
|
40
|
+
try {
|
|
41
|
+
const result = await runPgStatement(client, query, options);
|
|
42
|
+
await client.query("RELEASE SAVEPOINT callman_stmt");
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
await client.query("ROLLBACK TO SAVEPOINT callman_stmt").catch(() => undefined);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
begin: async () => {
|
|
51
|
+
await client.query("BEGIN");
|
|
52
|
+
},
|
|
53
|
+
commit: async () => {
|
|
54
|
+
await client.query("COMMIT");
|
|
55
|
+
},
|
|
56
|
+
rollback: async () => {
|
|
57
|
+
await client.query("ROLLBACK");
|
|
58
|
+
},
|
|
59
|
+
close: () => client.end(),
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=pgSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgSession.js","sourceRoot":"","sources":["../../../src/host/db/pgSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
runId: string;
|
|
7
|
-
transactionMode: PgSessionTransactionMode;
|
|
8
|
-
query: string;
|
|
9
|
-
params?: unknown[];
|
|
10
|
-
}
|
|
11
|
-
export declare const executePostgresQueryInSession: (input: PgSessionExecuteInput) => Promise<{
|
|
12
|
-
rows: unknown[];
|
|
13
|
-
rowCount: number;
|
|
14
|
-
}>;
|
|
1
|
+
import { type DbSessionExecuteInput, type DbSessionTransactionMode } from "./dbSessionManager.js";
|
|
2
|
+
export { __setPgSessionDriverForTests } from "./pgSession.js";
|
|
3
|
+
export type PgSessionTransactionMode = DbSessionTransactionMode;
|
|
4
|
+
export type PgSessionExecuteInput = DbSessionExecuteInput;
|
|
5
|
+
export declare const executePostgresQueryInSession: (input: DbSessionExecuteInput) => Promise<import("./types.js").DbStatementResult>;
|
|
15
6
|
export declare const releasePostgresSessionsForRun: (runId: string, outcome: "commit" | "rollback") => Promise<void>;
|
|
16
7
|
export declare const closeAllPostgresSessions: () => Promise<void>;
|
|
17
8
|
export declare const __getPgSessionCountForTests: () => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgSessionManager.d.ts","sourceRoot":"","sources":["../../../src/host/db/pgSessionManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pgSessionManager.d.ts","sourceRoot":"","sources":["../../../src/host/db/pgSessionManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE1D,eAAO,MAAM,6BAA6B,mFAAqB,CAAC;AAChE,eAAO,MAAM,6BAA6B,kEAA0B,CAAC;AACrE,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,2BAA2B,cAA8B,CAAC"}
|
|
@@ -1,162 +1,10 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// design — other providers reject `useSession` at the host driver.
|
|
11
|
-
import { loadOptionalModule } from "../lazy.js";
|
|
12
|
-
import { buildPgClientConfig, runPgQuery } from "./pgClientConfig.js";
|
|
13
|
-
const IDLE_SWEEP_INTERVAL_MS = 60_000;
|
|
14
|
-
const IDLE_SESSION_TTL_MS = 5 * 60_000;
|
|
15
|
-
const sessions = new Map();
|
|
16
|
-
let sweeper = null;
|
|
17
|
-
const unwrap = (mod) => (mod && mod.default && !mod.Client ? mod.default : mod);
|
|
18
|
-
// Test seam mirroring postgresAdapter's — lets unit tests inject a fake
|
|
19
|
-
// driver without a live server.
|
|
20
|
-
let pgDriverOverride = null;
|
|
21
|
-
export const __setPgSessionDriverForTests = (driver) => {
|
|
22
|
-
pgDriverOverride = driver;
|
|
23
|
-
};
|
|
24
|
-
const loadPgDriver = async () => {
|
|
25
|
-
if (pgDriverOverride)
|
|
26
|
-
return pgDriverOverride;
|
|
27
|
-
try {
|
|
28
|
-
return unwrap(await loadOptionalModule("pg"));
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
throw new Error("PostgreSQL driver (`pg`) is not installed. Install `pg` to use PostgreSQL sessions.");
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
// Connection identity participates in the key so two different connections
|
|
35
|
-
// in one run never share a client, even if their `id`s degenerate to the
|
|
36
|
-
// same normalized placeholder.
|
|
37
|
-
const sessionKey = (runId, connection) => [
|
|
38
|
-
runId,
|
|
39
|
-
connection.id,
|
|
40
|
-
connection.connectionString ?? "",
|
|
41
|
-
connection.host,
|
|
42
|
-
String(connection.port),
|
|
43
|
-
connection.database ?? "",
|
|
44
|
-
connection.username,
|
|
45
|
-
].join("::");
|
|
46
|
-
const ensureSweeper = () => {
|
|
47
|
-
if (sweeper)
|
|
48
|
-
return;
|
|
49
|
-
sweeper = setInterval(() => {
|
|
50
|
-
const now = Date.now();
|
|
51
|
-
for (const [key, entry] of sessions) {
|
|
52
|
-
if (now - entry.lastUsedAtMs > IDLE_SESSION_TTL_MS) {
|
|
53
|
-
sessions.delete(key);
|
|
54
|
-
void destroyEntry(entry, "rollback");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (sessions.size === 0 && sweeper) {
|
|
58
|
-
clearInterval(sweeper);
|
|
59
|
-
sweeper = null;
|
|
60
|
-
}
|
|
61
|
-
}, IDLE_SWEEP_INTERVAL_MS);
|
|
62
|
-
// Never keep the host process alive just for the sweeper.
|
|
63
|
-
sweeper.unref?.();
|
|
64
|
-
};
|
|
65
|
-
const destroyEntry = async (entry, outcome) => {
|
|
66
|
-
try {
|
|
67
|
-
const client = await entry.clientPromise;
|
|
68
|
-
if (entry.transactionOpen && !entry.poisoned) {
|
|
69
|
-
try {
|
|
70
|
-
await client.query(outcome === "commit" ? "COMMIT" : "ROLLBACK");
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// The transaction dies with the connection either way.
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
await client.end();
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
// Best-effort teardown.
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
// Client never connected — nothing to tear down.
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
const openEntry = (runId, connection) => {
|
|
88
|
-
const entry = {
|
|
89
|
-
clientPromise: (async () => {
|
|
90
|
-
const { Client } = await loadPgDriver();
|
|
91
|
-
const client = new Client(buildPgClientConfig(connection));
|
|
92
|
-
await client.connect();
|
|
93
|
-
// Socket-level errors surface here (killed backend, network drop);
|
|
94
|
-
// mark the session so the next query fails fast with the cause.
|
|
95
|
-
client.on?.("error", (error) => {
|
|
96
|
-
entry.poisoned =
|
|
97
|
-
error instanceof Error ? error.message : "PostgreSQL session connection lost";
|
|
98
|
-
});
|
|
99
|
-
return client;
|
|
100
|
-
})(),
|
|
101
|
-
chain: Promise.resolve(),
|
|
102
|
-
transactionOpen: false,
|
|
103
|
-
poisoned: null,
|
|
104
|
-
lastUsedAtMs: Date.now(),
|
|
105
|
-
runId,
|
|
106
|
-
};
|
|
107
|
-
return entry;
|
|
108
|
-
};
|
|
109
|
-
export const executePostgresQueryInSession = async (input) => {
|
|
110
|
-
const key = sessionKey(input.runId, input.connection);
|
|
111
|
-
let entry = sessions.get(key);
|
|
112
|
-
if (!entry) {
|
|
113
|
-
entry = openEntry(input.runId, input.connection);
|
|
114
|
-
sessions.set(key, entry);
|
|
115
|
-
ensureSweeper();
|
|
116
|
-
}
|
|
117
|
-
const run = entry.chain.then(async () => {
|
|
118
|
-
if (entry.poisoned) {
|
|
119
|
-
throw new Error(`PostgreSQL session is unusable: ${entry.poisoned}`);
|
|
120
|
-
}
|
|
121
|
-
const client = await entry.clientPromise;
|
|
122
|
-
if (input.transactionMode !== "none" && !entry.transactionOpen) {
|
|
123
|
-
await client.query("BEGIN");
|
|
124
|
-
entry.transactionOpen = true;
|
|
125
|
-
}
|
|
126
|
-
return runPgQuery(client, input.query, input.params ?? []);
|
|
127
|
-
});
|
|
128
|
-
// The chain must survive a failed query (SQL errors are normal in
|
|
129
|
-
// expectError flows) — swallow for chaining purposes only.
|
|
130
|
-
entry.chain = run.then(() => undefined, () => undefined).then(() => {
|
|
131
|
-
entry.lastUsedAtMs = Date.now();
|
|
132
|
-
});
|
|
133
|
-
return run;
|
|
134
|
-
};
|
|
135
|
-
// Close every session belonging to `runId` — COMMIT/ROLLBACK per the run
|
|
136
|
-
// outcome, then end the client. Queued statements finish (or fail) first
|
|
137
|
-
// thanks to the serialization chain.
|
|
138
|
-
export const releasePostgresSessionsForRun = async (runId, outcome) => {
|
|
139
|
-
const owned = [];
|
|
140
|
-
for (const [key, entry] of sessions) {
|
|
141
|
-
if (entry.runId === runId)
|
|
142
|
-
owned.push([key, entry]);
|
|
143
|
-
}
|
|
144
|
-
await Promise.all(owned.map(async ([key, entry]) => {
|
|
145
|
-
sessions.delete(key);
|
|
146
|
-
await entry.chain;
|
|
147
|
-
await destroyEntry(entry, outcome);
|
|
148
|
-
}));
|
|
149
|
-
};
|
|
150
|
-
// Shutdown hook for hosts (backend process exit, CLI end, electron quit).
|
|
151
|
-
export const closeAllPostgresSessions = async () => {
|
|
152
|
-
const all = Array.from(sessions.values());
|
|
153
|
-
sessions.clear();
|
|
154
|
-
if (sweeper) {
|
|
155
|
-
clearInterval(sweeper);
|
|
156
|
-
sweeper = null;
|
|
157
|
-
}
|
|
158
|
-
await Promise.all(all.map((entry) => destroyEntry(entry, "rollback")));
|
|
159
|
-
};
|
|
160
|
-
// Introspection for tests.
|
|
161
|
-
export const __getPgSessionCountForTests = () => sessions.size;
|
|
1
|
+
// The original, Postgres-named surface of run-scoped sessions. Sessions now
|
|
2
|
+
// cover every SQL engine (dbSessionManager); hosts and tests that import these
|
|
3
|
+
// names keep working.
|
|
4
|
+
import { __getDbSessionCountForTests, closeAllDbSessions, executeInDbSession, releaseDbSessionsForRun, } from "./dbSessionManager.js";
|
|
5
|
+
export { __setPgSessionDriverForTests } from "./pgSession.js";
|
|
6
|
+
export const executePostgresQueryInSession = executeInDbSession;
|
|
7
|
+
export const releasePostgresSessionsForRun = releaseDbSessionsForRun;
|
|
8
|
+
export const closeAllPostgresSessions = closeAllDbSessions;
|
|
9
|
+
export const __getPgSessionCountForTests = __getDbSessionCountForTests;
|
|
162
10
|
//# sourceMappingURL=pgSessionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgSessionManager.js","sourceRoot":"","sources":["../../../src/host/db/pgSessionManager.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"pgSessionManager.js","sourceRoot":"","sources":["../../../src/host/db/pgSessionManager.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,sBAAsB;AAEtB,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GAGxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAK9D,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,6BAA6B,GAAG,uBAAuB,CAAC;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,2BAA2B,CAAC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import type { DbConnection } from "./types.js";
|
|
1
|
+
import type { DbConnection, DbExecuteOptions, DbStatementResult } from "./types.js";
|
|
2
2
|
import { type DbQueryTimings } from "./dbTimings.js";
|
|
3
3
|
export declare const __setPostgresDriverForTests: (driver: any | null) => void;
|
|
4
4
|
export declare const withPostgresClient: <T>(connection: DbConnection, fn: (client: any) => Promise<T>) => Promise<T>;
|
|
5
5
|
export declare const testPostgresConnection: (connection: DbConnection) => Promise<void>;
|
|
6
|
-
export declare const executePostgresQuery: (connection: DbConnection, query: string,
|
|
7
|
-
rows: unknown[];
|
|
8
|
-
rowCount: number;
|
|
6
|
+
export declare const executePostgresQuery: (connection: DbConnection, query: string, paramsOrOptions?: unknown[] | DbExecuteOptions) => Promise<DbStatementResult & {
|
|
9
7
|
timings?: DbQueryTimings;
|
|
10
8
|
}>;
|
|
11
9
|
//# sourceMappingURL=postgresAdapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresAdapter.d.ts","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresAdapter.d.ts","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAcnF,eAAO,MAAM,2BAA2B,GAAI,QAAQ,GAAG,GAAG,IAAI,KAAG,IAEhE,CAAC;AAiBF,eAAO,MAAM,kBAAkB,GAAU,CAAC,EAAG,YAAY,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CASjH,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,YAAY,YAAY,KAAG,OAAO,CAAC,IAAI,CASnF,CAAC;AA0EF,eAAO,MAAM,oBAAoB,GAC/B,YAAY,YAAY,EACxB,OAAO,MAAM,EACb,kBAAiB,OAAO,EAAE,GAAG,gBAAqB,KACjD,OAAO,CAAC,iBAAiB,GAAG;IAAE,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,CAuB1D,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// modes) and query execution are shared with the session manager through
|
|
4
4
|
// pgClientConfig.ts.
|
|
5
5
|
import { loadOptionalModule } from "../lazy.js";
|
|
6
|
-
import { buildPgClientConfig,
|
|
6
|
+
import { buildPgClientConfig, runPgStatement } from "./pgClientConfig.js";
|
|
7
7
|
import { emptyDbTimings, startDbTimer } from "./dbTimings.js";
|
|
8
8
|
import { acquirePooled, getDbPoolSettings, getOrCreateDbPool, isDbPoolingEnabled, isSessionMutatingStatement, markReleased, } from "./dbPool.js";
|
|
9
9
|
const unwrap = (mod) => (mod && mod.default && !mod.Client ? mod.default : mod);
|
|
@@ -47,8 +47,25 @@ export const testPostgresConnection = async (connection) => {
|
|
|
47
47
|
await client.end();
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
+
// A cursor only lives inside a transaction, so a one-shot statement that hands
|
|
51
|
+
// one back runs in its own.
|
|
52
|
+
const runPgOnClient = async (client, query, options) => {
|
|
53
|
+
if (!options.binds?.some((bind) => bind.type === "cursor")) {
|
|
54
|
+
return runPgStatement(client, query, options);
|
|
55
|
+
}
|
|
56
|
+
await client.query("BEGIN");
|
|
57
|
+
try {
|
|
58
|
+
const result = await runPgStatement(client, query, options);
|
|
59
|
+
await client.query("COMMIT");
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
await client.query("ROLLBACK").catch(() => undefined);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
50
67
|
// Pooled path (configureDbPooling): one pg.Pool per connection identity.
|
|
51
|
-
const executePostgresQueryPooled = async (connection, query,
|
|
68
|
+
const executePostgresQueryPooled = async (connection, query, options) => {
|
|
52
69
|
const settings = getDbPoolSettings();
|
|
53
70
|
const entry = await getOrCreateDbPool(connection, async () => {
|
|
54
71
|
const { Pool } = await loadPgDriver();
|
|
@@ -76,7 +93,7 @@ const executePostgresQueryPooled = async (connection, query, params) => {
|
|
|
76
93
|
let failed = false;
|
|
77
94
|
const queryTimer = startDbTimer();
|
|
78
95
|
try {
|
|
79
|
-
const result = await
|
|
96
|
+
const result = await runPgOnClient(client, query, options);
|
|
80
97
|
timings.queryMs = queryTimer();
|
|
81
98
|
return { ...result, timings };
|
|
82
99
|
}
|
|
@@ -91,9 +108,12 @@ const executePostgresQueryPooled = async (connection, query, params) => {
|
|
|
91
108
|
timings.closeMs = closeTimer();
|
|
92
109
|
}
|
|
93
110
|
};
|
|
94
|
-
export const executePostgresQuery = async (connection, query,
|
|
111
|
+
export const executePostgresQuery = async (connection, query, paramsOrOptions = []) => {
|
|
112
|
+
const options = Array.isArray(paramsOrOptions)
|
|
113
|
+
? { params: paramsOrOptions }
|
|
114
|
+
: paramsOrOptions;
|
|
95
115
|
if (isDbPoolingEnabled()) {
|
|
96
|
-
return executePostgresQueryPooled(connection, query,
|
|
116
|
+
return executePostgresQueryPooled(connection, query, options);
|
|
97
117
|
}
|
|
98
118
|
const { Client } = await loadPgDriver();
|
|
99
119
|
const timings = emptyDbTimings();
|
|
@@ -103,7 +123,7 @@ export const executePostgresQuery = async (connection, query, params = []) => {
|
|
|
103
123
|
timings.connectMs = connectTimer();
|
|
104
124
|
const queryTimer = startDbTimer();
|
|
105
125
|
try {
|
|
106
|
-
const result = await
|
|
126
|
+
const result = await runPgOnClient(client, query, options);
|
|
107
127
|
timings.queryMs = queryTimer();
|
|
108
128
|
return { ...result, timings };
|
|
109
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,yEAAyE;AACzE,qBAAqB;AAErB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"postgresAdapter.js","sourceRoot":"","sources":["../../../src/host/db/postgresAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DbQueryTimings } from "./dbTimings.js";
|
|
2
|
-
import type { DbConnection, DbConnectionInput, DbConnectionTestResult, DbQueryExecutionResult, ExecuteDbQueryPayload } from "./types.js";
|
|
2
|
+
import type { DbConnection, DbConnectionInput, DbConnectionTestResult, DbExecuteOptions, DbQueryExecutionResult, DbStatementResult, ExecuteDbQueryPayload } from "./types.js";
|
|
3
3
|
export declare const executeResolvedDbQuery: (input: {
|
|
4
4
|
connection: DbConnectionInput;
|
|
5
5
|
resolvedQuery: string;
|
|
@@ -8,9 +8,7 @@ export declare const executeResolvedDbQuery: (input: {
|
|
|
8
8
|
runId: string;
|
|
9
9
|
transactionMode: "none" | "rollback" | "commit";
|
|
10
10
|
};
|
|
11
|
-
}) => Promise<{
|
|
12
|
-
rows: unknown[];
|
|
13
|
-
rowCount: number;
|
|
11
|
+
} & Omit<DbExecuteOptions, "params">) => Promise<DbStatementResult & {
|
|
14
12
|
timings?: DbQueryTimings;
|
|
15
13
|
}>;
|
|
16
14
|
export declare const normalizeConnectionInput: (connectionInput: DbConnectionInput) => DbConnection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryExecutor.d.ts","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAerD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"queryExecutor.d.ts","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAerD,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AA6BpB,eAAO,MAAM,sBAAsB,GACjC,OAAO;IACL,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;KAAE,CAAC;CAC9E,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,KACnC,OAAO,CAAC,iBAAiB,GAAG;IAAE,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,CAmB1D,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,iBAAiB,iBAAiB,KAAG,YA0B5E,CAAC;AAIH,eAAO,MAAM,gBAAgB,GAC3B,iBAAiB,iBAAiB,KACjC,OAAO,CAAC,sBAAsB,CA8BhC,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,SAAS,qBAAqB,KAC7B,OAAO,CAAC,sBAAsB,CAkFhC,CAAC"}
|
|
@@ -7,23 +7,23 @@ import { executeMongoQuery, parseMongoCommandText, testMongoConnection } from ".
|
|
|
7
7
|
import { executeMysqlQuery, testMysqlConnection } from "./mysqlAdapter.js";
|
|
8
8
|
import { executeOracleQuery, getOracleClientErrorCode, testOracleConnection, } from "./oracleAdapter.js";
|
|
9
9
|
import { executePostgresQuery, testPostgresConnection } from "./postgresAdapter.js";
|
|
10
|
-
import {
|
|
10
|
+
import { executeInDbSession } from "./dbSessionManager.js";
|
|
11
11
|
import { describeDbError } from "./dbErrors.js";
|
|
12
|
-
import { extractSqlState } from "./sqlState.js";
|
|
12
|
+
import { extractDbErrorCode, extractSqlState } from "./sqlState.js";
|
|
13
13
|
import { resolveTemplate } from "./templateResolver.js";
|
|
14
14
|
import { executeMssqlQuery, testMssqlConnection } from "./mssqlAdapter.js";
|
|
15
|
-
const executeAgainstConnection = async (connection, resolvedQuery,
|
|
15
|
+
const executeAgainstConnection = async (connection, resolvedQuery, options = {}) => {
|
|
16
16
|
switch (connection.type) {
|
|
17
17
|
case "mongo":
|
|
18
18
|
return executeMongoQuery(connection, await parseMongoCommandText(resolvedQuery));
|
|
19
19
|
case "postgres":
|
|
20
|
-
return executePostgresQuery(connection, resolvedQuery,
|
|
20
|
+
return executePostgresQuery(connection, resolvedQuery, options);
|
|
21
21
|
case "mysql":
|
|
22
|
-
return executeMysqlQuery(connection, resolvedQuery,
|
|
22
|
+
return executeMysqlQuery(connection, resolvedQuery, options);
|
|
23
23
|
case "mssql":
|
|
24
|
-
return executeMssqlQuery(connection, resolvedQuery,
|
|
24
|
+
return executeMssqlQuery(connection, resolvedQuery, options);
|
|
25
25
|
default:
|
|
26
|
-
return executeOracleQuery(connection, resolvedQuery);
|
|
26
|
+
return executeOracleQuery(connection, resolvedQuery, options);
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
// Pre-resolved dispatcher: dispatch an ALREADY template-resolved query to the
|
|
@@ -31,25 +31,28 @@ const executeAgainstConnection = async (connection, resolvedQuery, params = [])
|
|
|
31
31
|
// the scenario / `databaseExecutor` path (core's scenario runner resolves the
|
|
32
32
|
// template before calling the host), so hosts must not duplicate adapter logic.
|
|
33
33
|
//
|
|
34
|
-
// `session` (additive) routes the query through the run-scoped
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// `useSession` node never silently runs autocommit.
|
|
34
|
+
// `session` (additive) routes the query through the run-scoped session instead
|
|
35
|
+
// of a one-shot connection — see dbSessionManager. MongoDB has none and fails
|
|
36
|
+
// with an actionable message so a `useSession` node never silently autocommits.
|
|
38
37
|
export const executeResolvedDbQuery = (input) => {
|
|
39
38
|
const connection = normalizeConnectionInput(input.connection);
|
|
39
|
+
const options = {
|
|
40
|
+
params: input.params ?? [],
|
|
41
|
+
binds: input.binds,
|
|
42
|
+
captureOutput: input.captureOutput,
|
|
43
|
+
timeoutMs: input.timeoutMs,
|
|
44
|
+
signal: input.signal,
|
|
45
|
+
};
|
|
40
46
|
if (input.session) {
|
|
41
|
-
|
|
42
|
-
return Promise.reject(new Error(`Scenario DB sessions are only supported for PostgreSQL connections (got "${connection.type}"). Disable 'Run in scenario transaction' on this node.`));
|
|
43
|
-
}
|
|
44
|
-
return executePostgresQueryInSession({
|
|
47
|
+
return executeInDbSession({
|
|
45
48
|
connection,
|
|
46
49
|
runId: input.session.runId,
|
|
47
50
|
transactionMode: input.session.transactionMode,
|
|
48
51
|
query: input.resolvedQuery,
|
|
49
|
-
|
|
52
|
+
...options,
|
|
50
53
|
});
|
|
51
54
|
}
|
|
52
|
-
return executeAgainstConnection(connection, input.resolvedQuery,
|
|
55
|
+
return executeAgainstConnection(connection, input.resolvedQuery, options);
|
|
53
56
|
};
|
|
54
57
|
export const normalizeConnectionInput = (connectionInput) => ({
|
|
55
58
|
id: connectionInput.id?.trim() || "runtime-connection",
|
|
@@ -136,18 +139,21 @@ export const executeQuery = async (payload) => {
|
|
|
136
139
|
}
|
|
137
140
|
try {
|
|
138
141
|
const resolvedQuery = resolveTemplate(payload.query, payload.context ?? {});
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
+
const options = {
|
|
143
|
+
params: payload.params ?? [],
|
|
144
|
+
binds: payload.binds,
|
|
145
|
+
captureOutput: payload.captureOutput,
|
|
146
|
+
timeoutMs: payload.timeoutMs,
|
|
147
|
+
};
|
|
142
148
|
const result = payload.session
|
|
143
|
-
? await
|
|
149
|
+
? await executeInDbSession({
|
|
144
150
|
connection,
|
|
145
151
|
runId: payload.session.runId,
|
|
146
152
|
transactionMode: payload.session.transactionMode,
|
|
147
153
|
query: resolvedQuery,
|
|
148
|
-
|
|
154
|
+
...options,
|
|
149
155
|
})
|
|
150
|
-
: await executeAgainstConnection(connection, resolvedQuery,
|
|
156
|
+
: await executeAgainstConnection(connection, resolvedQuery, options);
|
|
151
157
|
return {
|
|
152
158
|
success: true,
|
|
153
159
|
phase: payload.phase,
|
|
@@ -158,11 +164,15 @@ export const executeQuery = async (payload) => {
|
|
|
158
164
|
resolvedQuery,
|
|
159
165
|
rows: result.rows,
|
|
160
166
|
rowCount: result.rowCount,
|
|
167
|
+
...(result.out ? { out: result.out } : {}),
|
|
168
|
+
...(result.output ? { output: result.output } : {}),
|
|
169
|
+
...(result.resultSets ? { resultSets: result.resultSets } : {}),
|
|
161
170
|
durationMs: Math.round(performance.now() - startedAt),
|
|
162
171
|
executedAt: new Date().toISOString(),
|
|
163
172
|
};
|
|
164
173
|
}
|
|
165
174
|
catch (error) {
|
|
175
|
+
const dbOutput = error?.dbOutput;
|
|
166
176
|
return {
|
|
167
177
|
success: false,
|
|
168
178
|
phase: payload.phase,
|
|
@@ -179,6 +189,8 @@ export const executeQuery = async (payload) => {
|
|
|
179
189
|
executedAt: new Date().toISOString(),
|
|
180
190
|
error: error instanceof Error ? error.message : String(error),
|
|
181
191
|
...(extractSqlState(error) ? { sqlState: extractSqlState(error) } : {}),
|
|
192
|
+
...(extractDbErrorCode(error) ? { dbErrorCode: extractDbErrorCode(error) } : {}),
|
|
193
|
+
...(dbOutput ? { output: dbOutput } : {}),
|
|
182
194
|
...(getOracleClientErrorCode(error) ? { errorCode: getOracleClientErrorCode(error) } : {}),
|
|
183
195
|
...(describeDbError(error) ? { diagnosis: describeDbError(error) ?? undefined } : {}),
|
|
184
196
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,+EAA+E;AAC/E,gFAAgF;AAChF,wEAAwE;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"queryExecutor.js","sourceRoot":"","sources":["../../../src/host/db/queryExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlState.d.ts","sourceRoot":"","sources":["../../../src/host/db/sqlState.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAOzD,CAAC"}
|
|
1
|
+
{"version":3,"file":"sqlState.d.ts","sourceRoot":"","sources":["../../../src/host/db/sqlState.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAOzD,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAmB5D,CAAC"}
|
package/dist/host/db/sqlState.js
CHANGED
|
@@ -11,4 +11,24 @@ export const extractSqlState = (error) => {
|
|
|
11
11
|
? candidate
|
|
12
12
|
: undefined;
|
|
13
13
|
};
|
|
14
|
+
// The engine's own error code, for engines whose errors are not SQLSTATE
|
|
15
|
+
// classified: "ORA-20001", "MSSQL-50000", "ER_SIGNAL_EXCEPTION". `.dbErrorCode`
|
|
16
|
+
// is checked first so hosts can carry it across their own error types.
|
|
17
|
+
export const extractDbErrorCode = (error) => {
|
|
18
|
+
if (!error || typeof error !== "object")
|
|
19
|
+
return undefined;
|
|
20
|
+
const record = error;
|
|
21
|
+
if (typeof record.dbErrorCode === "string" && record.dbErrorCode)
|
|
22
|
+
return record.dbErrorCode;
|
|
23
|
+
if (typeof record.errorNum === "number" && record.errorNum > 0) {
|
|
24
|
+
return `ORA-${String(record.errorNum).padStart(5, "0")}`;
|
|
25
|
+
}
|
|
26
|
+
if (typeof record.number === "number" && record.number > 0)
|
|
27
|
+
return `MSSQL-${record.number}`;
|
|
28
|
+
if (typeof record.code === "string" && /^(ORA-\d+|ER_[A-Z0-9_]+)$/.test(record.code)) {
|
|
29
|
+
return record.code;
|
|
30
|
+
}
|
|
31
|
+
const inMessage = typeof record.message === "string" ? record.message.match(/\bORA-\d{5}\b/) : null;
|
|
32
|
+
return inMessage?.[0];
|
|
33
|
+
};
|
|
14
34
|
//# sourceMappingURL=sqlState.js.map
|