camusdb 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 +250 -0
- package/dist/client.d.ts +73 -39
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +158 -169
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -1
- package/dist/endpoint-pool.d.ts +8 -0
- package/dist/endpoint-pool.d.ts.map +1 -1
- package/dist/endpoint-pool.js +25 -0
- package/dist/endpoint-pool.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/node-stats.d.ts +113 -0
- package/dist/node-stats.d.ts.map +1 -0
- package/dist/node-stats.js +90 -0
- package/dist/node-stats.js.map +1 -0
- package/dist/options.d.ts +10 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +1 -0
- package/dist/options.js.map +1 -1
- package/dist/pipeline.d.ts +136 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +375 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/prepared/auto-prepare.d.ts +51 -0
- package/dist/prepared/auto-prepare.d.ts.map +1 -0
- package/dist/prepared/auto-prepare.js +150 -0
- package/dist/prepared/auto-prepare.js.map +1 -0
- package/dist/prepared/policy.d.ts +7 -0
- package/dist/prepared/policy.d.ts.map +1 -1
- package/dist/prepared/policy.js +16 -0
- package/dist/prepared/policy.js.map +1 -1
- package/dist/query-stream.d.ts +9 -1
- package/dist/query-stream.d.ts.map +1 -1
- package/dist/query-stream.js +20 -2
- package/dist/query-stream.js.map +1 -1
- package/dist/retry.d.ts +8 -0
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +12 -1
- package/dist/retry.js.map +1 -1
- package/dist/sql-syntax.d.ts +6 -0
- package/dist/sql-syntax.d.ts.map +1 -1
- package/dist/sql-syntax.js +8 -0
- package/dist/sql-syntax.js.map +1 -1
- package/dist/statements.d.ts +14 -0
- package/dist/statements.d.ts.map +1 -1
- package/dist/statements.js +45 -3
- package/dist/statements.js.map +1 -1
- package/dist/telemetry.d.ts +199 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +423 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/transaction.d.ts +60 -5
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +124 -24
- package/dist/transaction.js.map +1 -1
- package/dist/transport/authenticating-transport.d.ts +9 -1
- package/dist/transport/authenticating-transport.d.ts.map +1 -1
- package/dist/transport/authenticating-transport.js +13 -0
- package/dist/transport/authenticating-transport.js.map +1 -1
- package/dist/transport/grpc/batch-frames.d.ts +23 -5
- package/dist/transport/grpc/batch-frames.d.ts.map +1 -1
- package/dist/transport/grpc/batch-frames.js +29 -8
- package/dist/transport/grpc/batch-frames.js.map +1 -1
- package/dist/transport/grpc/batcher.d.ts +69 -5
- package/dist/transport/grpc/batcher.d.ts.map +1 -1
- package/dist/transport/grpc/batcher.js +217 -10
- package/dist/transport/grpc/batcher.js.map +1 -1
- package/dist/transport/grpc/grpc-transport.d.ts +35 -1
- package/dist/transport/grpc/grpc-transport.d.ts.map +1 -1
- package/dist/transport/grpc/grpc-transport.js +193 -7
- package/dist/transport/grpc/grpc-transport.js.map +1 -1
- package/dist/transport/grpc/messages.d.ts +15 -0
- package/dist/transport/grpc/messages.d.ts.map +1 -1
- package/dist/transport/grpc/messages.js +9 -0
- package/dist/transport/grpc/messages.js.map +1 -1
- package/dist/transport/rest-transport.d.ts +9 -1
- package/dist/transport/rest-transport.d.ts.map +1 -1
- package/dist/transport/rest-transport.js +24 -0
- package/dist/transport/rest-transport.js.map +1 -1
- package/dist/transport/sequential-pipeline.d.ts +21 -0
- package/dist/transport/sequential-pipeline.d.ts.map +1 -0
- package/dist/transport/sequential-pipeline.js +119 -0
- package/dist/transport/sequential-pipeline.js.map +1 -0
- package/dist/transport/transport.d.ts +94 -0
- package/dist/transport/transport.d.ts.map +1 -1
- package/dist/transport/transport.js +10 -0
- package/dist/transport/transport.js.map +1 -1
- package/package.json +10 -4
- package/proto/camus_sql.proto +114 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of CamusDB
|
|
3
|
+
*
|
|
4
|
+
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
|
+
* file that was distributed with this source code.
|
|
6
|
+
*/
|
|
7
|
+
import { CamusError } from '../errors.js';
|
|
8
|
+
import { CamusErrorCode } from '../error-codes.js';
|
|
9
|
+
import { isRetryable } from '../retry.js';
|
|
10
|
+
import { isPreparableStatement } from '../statements.js';
|
|
11
|
+
import { PreparedResult, recordPreparedEviction, recordPreparedLookup, recordPreparedRegistration, } from '../telemetry.js';
|
|
12
|
+
import { PrepareDecision } from './policy.js';
|
|
13
|
+
/**
|
|
14
|
+
* Whether this execution should name a prepared statement instead of carrying its SQL,
|
|
15
|
+
* registering it first when this is the execution that tips it over the threshold.
|
|
16
|
+
*
|
|
17
|
+
* The registration is awaited rather than started in the background, because the whole point is
|
|
18
|
+
* that this execution and the ones after it are cheap. Firing it off and running inline anyway
|
|
19
|
+
* would leave a busy statement racing its own warm-up. It costs one extra round trip, once per
|
|
20
|
+
* statement per endpoint.
|
|
21
|
+
*
|
|
22
|
+
* The caller passes the endpoint it already resolved. A REST handle is node-local and the pool
|
|
23
|
+
* rotates, so registering against a freshly drawn endpoint would routinely prepare on one node
|
|
24
|
+
* and execute on another — correct, because the transport re-registers where it lands, but a
|
|
25
|
+
* wasted round trip every single time.
|
|
26
|
+
*/
|
|
27
|
+
export async function shouldPrepare(runtime, sql, endpoint, options) {
|
|
28
|
+
const policy = runtime.preparedStatements;
|
|
29
|
+
if (policy.isDisabled || !isPreparableStatement(sql))
|
|
30
|
+
return false;
|
|
31
|
+
const { decision, evicted } = policy.decide(runtime.database, sql);
|
|
32
|
+
releaseEvicted(runtime, endpoint, evicted);
|
|
33
|
+
switch (decision) {
|
|
34
|
+
case PrepareDecision.Yes:
|
|
35
|
+
recordPreparedLookup(runtime.database, PreparedResult.Hit);
|
|
36
|
+
return true;
|
|
37
|
+
case PrepareDecision.Register: {
|
|
38
|
+
const registered = await registerStatement(runtime, endpoint, runtime.database, sql, options);
|
|
39
|
+
recordPreparedLookup(runtime.database, registered ? PreparedResult.Registered : PreparedResult.Miss);
|
|
40
|
+
return registered;
|
|
41
|
+
}
|
|
42
|
+
default:
|
|
43
|
+
recordPreparedLookup(runtime.database, PreparedResult.Miss);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Registers a statement and records what happened, reporting whether it may now run prepared.
|
|
49
|
+
*
|
|
50
|
+
* A registration failure never reaches the caller: preparing is an optimization, and the
|
|
51
|
+
* statement runs inline exactly as it would have if the driver had not tried. What the failure
|
|
52
|
+
* does decide is whether to ask again. A refusal specific to this statement stops asking for that
|
|
53
|
+
* statement; anything that says the node has no prepared-statement support at all stops asking
|
|
54
|
+
* for every statement, because one round trip per distinct SQL to relearn that is worse than not
|
|
55
|
+
* trying. A failure that never reached a verdict — a timeout, an unreachable node — drops the
|
|
56
|
+
* entry instead, so one network blip does not cost this statement its registration for the life
|
|
57
|
+
* of the process.
|
|
58
|
+
*/
|
|
59
|
+
export async function registerStatement(runtime, endpoint, database, sql, options) {
|
|
60
|
+
const policy = runtime.preparedStatements;
|
|
61
|
+
try {
|
|
62
|
+
await runtime.transport.prepare(endpoint, database, sql, options.timeoutSeconds ?? runtime.timeoutSeconds, options.signal);
|
|
63
|
+
policy.markPrepared(database, sql);
|
|
64
|
+
recordPreparedRegistration(database, PreparedResult.Success);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// The caller's own cancellation is not a verdict on the statement, but the entry must not be
|
|
69
|
+
// left mid-registration, or it would never be reconsidered.
|
|
70
|
+
if (options.signal?.aborted === true) {
|
|
71
|
+
policy.forget(database, sql);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
// The statement is about to run inline and will report any real problem itself. The only
|
|
75
|
+
// decision left here is whether asking again is worth a round trip.
|
|
76
|
+
if (CamusError.is(error) && isUnsupported(error)) {
|
|
77
|
+
policy.markRefused(database, sql);
|
|
78
|
+
policy.disable();
|
|
79
|
+
recordPreparedRegistration(database, PreparedResult.Unsupported, error);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (declinesStatement(error)) {
|
|
83
|
+
policy.markRefused(database, sql);
|
|
84
|
+
recordPreparedRegistration(database, PreparedResult.Refused, error);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
policy.forget(database, sql);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Releases a statement the policy evicted, so the server stops holding a handle this client has
|
|
94
|
+
* stopped using.
|
|
95
|
+
*
|
|
96
|
+
* It is best effort and off the caller's path: it is bookkeeping, not part of the statement being
|
|
97
|
+
* run. It takes the endpoint the caller already resolved rather than drawing a new one, which
|
|
98
|
+
* would rotate the pool as a side effect of housekeeping.
|
|
99
|
+
*/
|
|
100
|
+
export function releaseEvicted(runtime, endpoint, evicted) {
|
|
101
|
+
if (evicted === undefined)
|
|
102
|
+
return;
|
|
103
|
+
recordPreparedEviction(evicted.database);
|
|
104
|
+
void runtime.transport.closePrepared(endpoint, evicted.database, evicted.sql).catch(() => undefined);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The codes that say nothing about the statement itself.
|
|
108
|
+
*
|
|
109
|
+
* `Generic` covers a call that was sent and then lost, and every failure the driver could not
|
|
110
|
+
* classify. The rest name the connection or the principal. A statement that meets one of these is
|
|
111
|
+
* left reconsiderable: the next call site asks again.
|
|
112
|
+
*/
|
|
113
|
+
const UNINFORMATIVE_CODES = new Set([
|
|
114
|
+
CamusErrorCode.Generic,
|
|
115
|
+
CamusErrorCode.EndpointUnreachable,
|
|
116
|
+
CamusErrorCode.AuthenticationFailed,
|
|
117
|
+
CamusErrorCode.InsufficientPrivilege,
|
|
118
|
+
CamusErrorCode.TooManyAuthAttempts,
|
|
119
|
+
CamusErrorCode.InsecureTransport,
|
|
120
|
+
]);
|
|
121
|
+
/**
|
|
122
|
+
* True when the server gave a verdict on this statement, rather than the round trip failing.
|
|
123
|
+
*
|
|
124
|
+
* Only a verdict is terminal. A retryable condition, a transport failure, and an error the driver
|
|
125
|
+
* did not raise itself all leave the question open.
|
|
126
|
+
*/
|
|
127
|
+
function declinesStatement(error) {
|
|
128
|
+
if (!CamusError.is(error))
|
|
129
|
+
return false;
|
|
130
|
+
if (isRetryable(error))
|
|
131
|
+
return false;
|
|
132
|
+
return !UNINFORMATIVE_CODES.has(error.code);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* True when a failure says the node does not implement prepared statements at all, rather than
|
|
136
|
+
* declining this particular statement.
|
|
137
|
+
*
|
|
138
|
+
* Both spellings surface under the generic code, because a server old enough not to have the
|
|
139
|
+
* feature is also too old to have a specific code for refusing it. A server that does have it
|
|
140
|
+
* declines an individual statement with a `CADB05xx` code instead.
|
|
141
|
+
*
|
|
142
|
+
* It is a heuristic, and it is only ever used to answer "is asking again worth a round trip?".
|
|
143
|
+
* Reading it wrong costs at most one wasted registration attempt per statement, never a failed
|
|
144
|
+
* statement.
|
|
145
|
+
*/
|
|
146
|
+
function isUnsupported(error) {
|
|
147
|
+
return (error.code === CamusErrorCode.Generic &&
|
|
148
|
+
(error.message.includes('404') || error.message.toLowerCase().includes('unimplemented')));
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=auto-prepare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-prepare.js","sourceRoot":"","sources":["../../src/prepared/auto-prepare.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,13 @@ export declare class CamusPreparedStatementPolicy {
|
|
|
42
42
|
static forKey(key: string, factory: () => CamusPreparedStatementPolicy): CamusPreparedStatementPolicy;
|
|
43
43
|
/** @internal Test hook: drops every shared policy. */
|
|
44
44
|
static resetShared(): void;
|
|
45
|
+
/**
|
|
46
|
+
* For each database, the statements that the shared policies keep prepared now. It feeds the
|
|
47
|
+
* `camusdb.client.prepared_statement.count` measurement.
|
|
48
|
+
*
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
static collectPreparedCounts(): Map<string, number>;
|
|
45
52
|
readonly maxAutoPrepare: number;
|
|
46
53
|
readonly minUsages: number;
|
|
47
54
|
private readonly entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/prepared/policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,kEAAkE;AAClE,eAAO,MAAM,eAAe;IAC1B,yEAAyE;;IAEzE,yDAAyD;;IAEzD,6DAA6D;;CAErD,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAkBrF,2FAA2F;AAC3F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA4B;IACvC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,OAAO;IAE/C,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAK;IAEvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAEpF,iEAAiE;IACjE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,4BAA4B,GAAG,4BAA4B;IAIrG,sDAAsD;IACtD,MAAM,CAAC,WAAW,IAAI,IAAI;IAI1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAU;gBAEd,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAMrD,mGAAmG;IACnG,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,uDAAuD;IACvD,IAAI,aAAa,IAAI,MAAM,CAQ1B;IAED,wDAAwD;IACxD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlD,2FAA2F;IAC3F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE;IA2BhG;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE;IAa7F,sDAAsD;IACtD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjD,gFAAgF;IAChF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKhD,+FAA+F;IAC/F,OAAO,IAAI,IAAI;IAIf,mFAAmF;IACnF,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI3C,OAAO,CAAC,KAAK;CAiCd"}
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/prepared/policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,kEAAkE;AAClE,eAAO,MAAM,eAAe;IAC1B,yEAAyE;;IAEzE,yDAAyD;;IAEzD,6DAA6D;;CAErD,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAkBrF,2FAA2F;AAC3F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA4B;IACvC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,OAAO;IAE/C,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAK;IAEvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAsD;IAEpF,iEAAiE;IACjE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,4BAA4B,GAAG,4BAA4B;IAIrG,sDAAsD;IACtD,MAAM,CAAC,WAAW,IAAI,IAAI;IAI1B;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAanD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAU;gBAEd,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAMrD,mGAAmG;IACnG,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,uDAAuD;IACvD,IAAI,aAAa,IAAI,MAAM,CAQ1B;IAED,wDAAwD;IACxD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlD,2FAA2F;IAC3F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE;IA2BhG;;;;;OAKG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;KAAE;IAa7F,sDAAsD;IACtD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjD,gFAAgF;IAChF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKhD,+FAA+F;IAC/F,OAAO,IAAI,IAAI;IAIf,mFAAmF;IACnF,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI3C,OAAO,CAAC,KAAK;CAiCd"}
|
package/dist/prepared/policy.js
CHANGED
|
@@ -47,6 +47,22 @@ export class CamusPreparedStatementPolicy {
|
|
|
47
47
|
static resetShared() {
|
|
48
48
|
CamusPreparedStatementPolicy.shared.clear();
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* For each database, the statements that the shared policies keep prepared now. It feeds the
|
|
52
|
+
* `camusdb.client.prepared_statement.count` measurement.
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
static collectPreparedCounts() {
|
|
57
|
+
const counts = new Map();
|
|
58
|
+
for (const policy of CamusPreparedStatementPolicy.shared.values()) {
|
|
59
|
+
for (const entry of policy.entries.values()) {
|
|
60
|
+
if (entry.state === EntryState.Prepared)
|
|
61
|
+
counts.set(entry.database, (counts.get(entry.database) ?? 0) + 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return counts;
|
|
65
|
+
}
|
|
50
66
|
maxAutoPrepare;
|
|
51
67
|
minUsages;
|
|
52
68
|
entries = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/prepared/policy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/prepared/policy.ts"],"names":[],"mappings":"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"}
|
package/dist/query-stream.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { CamusColumn } from './result-set.js';
|
|
8
8
|
import type { CamusRowSource } from './row-source.js';
|
|
9
|
+
import type { CamusOperation } from './telemetry.js';
|
|
9
10
|
import type { DecodeOptions } from './values/decode.js';
|
|
10
11
|
/**
|
|
11
12
|
* Rows delivered one at a time, as an async iterable.
|
|
@@ -34,8 +35,10 @@ export declare class CamusQueryStream<T = Record<string, unknown>> implements As
|
|
|
34
35
|
private readonly mapper;
|
|
35
36
|
private consumed;
|
|
36
37
|
private closed;
|
|
38
|
+
/** The span of the statement. It ends at the last row, at a failed read, or at `close`. */
|
|
39
|
+
private readonly operation;
|
|
37
40
|
/** @internal Built by `CamusClient.queryStream`. */
|
|
38
|
-
constructor(source: CamusRowSource, options: DecodeOptions);
|
|
41
|
+
constructor(source: CamusRowSource, options: DecodeOptions, operation?: CamusOperation);
|
|
39
42
|
/** The output columns, known before the first row. */
|
|
40
43
|
get columns(): CamusColumn[];
|
|
41
44
|
/**
|
|
@@ -45,6 +48,11 @@ export declare class CamusQueryStream<T = Record<string, unknown>> implements As
|
|
|
45
48
|
* keeps the name, and the ones after it take `name_2`, `name_3`, and so on.
|
|
46
49
|
*/
|
|
47
50
|
get columnKeys(): readonly string[];
|
|
51
|
+
/**
|
|
52
|
+
* The number of rows that a `CALL` changed, or `undefined` for a query. A stream over a `CALL` has
|
|
53
|
+
* no rows.
|
|
54
|
+
*/
|
|
55
|
+
get affectedRows(): number | undefined;
|
|
48
56
|
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
49
57
|
/** Reads every remaining row into an array. Convenient when the result is known to be small. */
|
|
50
58
|
toArray(): Promise<T[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-stream.d.ts","sourceRoot":"","sources":["../src/query-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC,EAAE,eAAe;IACrG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,MAAM,CAAS;IAEvB,oDAAoD;gBACxC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"query-stream.d.ts","sourceRoot":"","sources":["../src/query-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC,EAAE,eAAe;IACrG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,MAAM,CAAS;IAEvB,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,oDAAoD;gBACxC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,cAAc;IAMtF,sDAAsD;IACtD,IAAI,OAAO,IAAI,WAAW,EAAE,CAM3B;IAED;;;;;OAKG;IACH,IAAI,UAAU,IAAI,SAAS,MAAM,EAAE,CAElC;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAEM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;IA4BjD,gGAAgG;IAC1F,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAQ7B,qEAAqE;IAC/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
package/dist/query-stream.js
CHANGED
|
@@ -33,10 +33,13 @@ export class CamusQueryStream {
|
|
|
33
33
|
mapper;
|
|
34
34
|
consumed = false;
|
|
35
35
|
closed = false;
|
|
36
|
+
/** The span of the statement. It ends at the last row, at a failed read, or at `close`. */
|
|
37
|
+
operation;
|
|
36
38
|
/** @internal Built by `CamusClient.queryStream`. */
|
|
37
|
-
constructor(source, options) {
|
|
39
|
+
constructor(source, options, operation) {
|
|
38
40
|
this.source = source;
|
|
39
41
|
this.mapper = new RowMapper(source.columnNames, options);
|
|
42
|
+
this.operation = operation;
|
|
40
43
|
}
|
|
41
44
|
/** The output columns, known before the first row. */
|
|
42
45
|
get columns() {
|
|
@@ -55,6 +58,13 @@ export class CamusQueryStream {
|
|
|
55
58
|
get columnKeys() {
|
|
56
59
|
return this.mapper.columnKeys;
|
|
57
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* The number of rows that a `CALL` changed, or `undefined` for a query. A stream over a `CALL` has
|
|
63
|
+
* no rows.
|
|
64
|
+
*/
|
|
65
|
+
get affectedRows() {
|
|
66
|
+
return this.source.recordsAffected >= 0 ? this.source.recordsAffected : undefined;
|
|
67
|
+
}
|
|
58
68
|
async *[Symbol.asyncIterator]() {
|
|
59
69
|
if (this.consumed) {
|
|
60
70
|
throw new Error('This query stream was already iterated. Run the query again for a second pass.');
|
|
@@ -62,7 +72,14 @@ export class CamusQueryStream {
|
|
|
62
72
|
this.consumed = true;
|
|
63
73
|
try {
|
|
64
74
|
for (;;) {
|
|
65
|
-
|
|
75
|
+
let cells;
|
|
76
|
+
try {
|
|
77
|
+
cells = await this.source.next();
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
this.operation?.fail(error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
66
83
|
if (cells === undefined)
|
|
67
84
|
return;
|
|
68
85
|
yield this.mapper.map(cells);
|
|
@@ -85,6 +102,7 @@ export class CamusQueryStream {
|
|
|
85
102
|
if (this.closed)
|
|
86
103
|
return;
|
|
87
104
|
this.closed = true;
|
|
105
|
+
this.operation?.complete();
|
|
88
106
|
await this.source.close();
|
|
89
107
|
}
|
|
90
108
|
async [Symbol.asyncDispose]() {
|
package/dist/query-stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-stream.js","sourceRoot":"","sources":["../src/query-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"query-stream.js","sourceRoot":"","sources":["../src/query-stream.ts"],"names":[],"mappings":"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"}
|
package/dist/retry.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
5
|
* file that was distributed with this source code.
|
|
6
6
|
*/
|
|
7
|
+
import { CamusRetryKind } from './telemetry.js';
|
|
7
8
|
/**
|
|
8
9
|
* True when running the same work again may succeed.
|
|
9
10
|
*
|
|
@@ -31,6 +32,13 @@ export interface RetryOptions {
|
|
|
31
32
|
* clients that conflicted do not retry in step.
|
|
32
33
|
*/
|
|
33
34
|
export declare function withRetry<T>(operation: (attempt: number) => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
35
|
+
/**
|
|
36
|
+
* The loop of `withRetry`. `kind` is what each retry counts as on the
|
|
37
|
+
* `camusdb.client.operation.retries` counter.
|
|
38
|
+
*
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export declare function retryLoop<T>(operation: (attempt: number) => Promise<T>, options: RetryOptions, kind: CamusRetryKind): Promise<T>;
|
|
34
42
|
/**
|
|
35
43
|
* The back-off after attempt number `attempt`, in milliseconds. Exported so a caller can mirror the
|
|
36
44
|
* schedule. The first retry waits the documented 20 ms base, the second 40 ms, and so on.
|
package/dist/retry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAwB7D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAwBnD;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,sCAAsC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,2FAA2F;AAC3F,wBAAgB,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/E"}
|
package/dist/retry.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { CamusError } from './errors.js';
|
|
8
8
|
import { CamusErrorCode } from './error-codes.js';
|
|
9
|
+
import { CamusRetryKind, recordRetry } from './telemetry.js';
|
|
9
10
|
/**
|
|
10
11
|
* Which failures a caller may retry, and a loop that does it.
|
|
11
12
|
*
|
|
@@ -64,7 +65,16 @@ export function isRetryable(error) {
|
|
|
64
65
|
* The delay grows exponentially from 20 ms, caps at 400 ms, and carries 25% jitter, so a set of
|
|
65
66
|
* clients that conflicted do not retry in step.
|
|
66
67
|
*/
|
|
67
|
-
export
|
|
68
|
+
export function withRetry(operation, options = {}) {
|
|
69
|
+
return retryLoop(operation, options, CamusRetryKind.Autocommit);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The loop of `withRetry`. `kind` is what each retry counts as on the
|
|
73
|
+
* `camusdb.client.operation.retries` counter.
|
|
74
|
+
*
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
export async function retryLoop(operation, options, kind) {
|
|
68
78
|
const maxAttempts = Math.max(1, options.maxAttempts ?? 5);
|
|
69
79
|
for (let attempt = 1;; attempt++) {
|
|
70
80
|
try {
|
|
@@ -73,6 +83,7 @@ export async function withRetry(operation, options = {}) {
|
|
|
73
83
|
catch (error) {
|
|
74
84
|
if (attempt >= maxAttempts || !isRetryable(error))
|
|
75
85
|
throw error;
|
|
86
|
+
recordRetry(kind, error);
|
|
76
87
|
await delay(computeDelayMs(attempt), options.signal);
|
|
77
88
|
}
|
|
78
89
|
}
|
package/dist/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/sql-syntax.d.ts
CHANGED
|
@@ -61,6 +61,12 @@ export declare function isValidDatabaseName(database: string): boolean;
|
|
|
61
61
|
* Letters, digits, and `_ - . :` are allowed.
|
|
62
62
|
*/
|
|
63
63
|
export declare function validateBareName(name: string, maxLength: number, parameterName: string): void;
|
|
64
|
+
/**
|
|
65
|
+
* True when the name is a plain identifier: a letter or `_`, then letters, digits, or `_`, all ASCII.
|
|
66
|
+
* The server reads the procedure name of `CALL` only in this form, not delimited, so such a name is
|
|
67
|
+
* emitted as written and any other name has no spelling.
|
|
68
|
+
*/
|
|
69
|
+
export declare function isPlainIdentifier(name: string): boolean;
|
|
64
70
|
/**
|
|
65
71
|
* True when `sql` holds the keyword `RETURNING` as a token: not inside a string literal, a
|
|
66
72
|
* delimited identifier, or a comment, and not as part of a longer name or an `@placeholder`.
|
package/dist/sql-syntax.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-syntax.d.ts","sourceRoot":"","sources":["../src/sql-syntax.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAiBlF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAmB7F;AAID;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAqCxD"}
|
|
1
|
+
{"version":3,"file":"sql-syntax.d.ts","sourceRoot":"","sources":["../src/sql-syntax.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAiBlF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAK7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAmB7F;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAID;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAqCxD"}
|
package/dist/sql-syntax.js
CHANGED
|
@@ -109,6 +109,14 @@ export function validateBareName(name, maxLength, parameterName) {
|
|
|
109
109
|
'or one of _ - . : — the name is emitted into SQL as text and cannot be escaped.');
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* True when the name is a plain identifier: a letter or `_`, then letters, digits, or `_`, all ASCII.
|
|
114
|
+
* The server reads the procedure name of `CALL` only in this form, not delimited, so such a name is
|
|
115
|
+
* emitted as written and any other name has no spelling.
|
|
116
|
+
*/
|
|
117
|
+
export function isPlainIdentifier(name) {
|
|
118
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);
|
|
119
|
+
}
|
|
112
120
|
const RETURNING = 'RETURNING';
|
|
113
121
|
/**
|
|
114
122
|
* True when `sql` holds the keyword `RETURNING` as a token: not inside a string literal, a
|
package/dist/sql-syntax.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-syntax.js","sourceRoot":"","sources":["../src/sql-syntax.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql-syntax.js","sourceRoot":"","sources":["../src/sql-syntax.ts"],"names":[],"mappings":"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"}
|
package/dist/statements.d.ts
CHANGED
|
@@ -4,16 +4,30 @@
|
|
|
4
4
|
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
5
|
* file that was distributed with this source code.
|
|
6
6
|
*/
|
|
7
|
+
import type { Parameters } from './values/encode.js';
|
|
7
8
|
/** True when the statement goes to the DDL route. */
|
|
8
9
|
export declare function isDdlStatement(sql: string): boolean;
|
|
9
10
|
/** True when the statement writes rows and reports how many. */
|
|
10
11
|
export declare function isDmlStatement(sql: string): boolean;
|
|
12
|
+
/** True when the statement is a `CALL`, which the server runs only on the non-query route. */
|
|
13
|
+
export declare function isCallStatement(sql: string): boolean;
|
|
11
14
|
/**
|
|
12
15
|
* True when the statement is an `INSERT`, `UPDATE`, or `DELETE` with a `RETURNING` list, which
|
|
13
16
|
* sends back the rows it wrote. The keyword test skips literals, comments, delimited names, and
|
|
14
17
|
* placeholders.
|
|
15
18
|
*/
|
|
16
19
|
export declare function isWriteReturning(sql: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Composes `CALL name(@a, @b, ...)` for a procedure that a C# extension on the server defines.
|
|
22
|
+
*
|
|
23
|
+
* The arguments follow the order of the parameter object's keys, because a procedure takes its
|
|
24
|
+
* arguments by position. A key that is a whole number, such as `'0'`, comes first in JavaScript
|
|
25
|
+
* whatever its place in the object literal, so use names. The server reads the procedure name only
|
|
26
|
+
* as a plain identifier, so any other name is refused here, before a request.
|
|
27
|
+
*
|
|
28
|
+
* @throws {TypeError} when the procedure name is not a plain identifier.
|
|
29
|
+
*/
|
|
30
|
+
export declare function callStatement(procedure: string, parameters?: Parameters): string;
|
|
17
31
|
/** True when the statement may be registered as a prepared statement. */
|
|
18
32
|
export declare function isPreparableStatement(sql: string): boolean;
|
|
19
33
|
/** True when the statement cannot run inside an explicit transaction. */
|
package/dist/statements.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAqFrD,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAmBhF;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
package/dist/statements.js
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* For the full copyright and license information, please view the LICENSE.txt
|
|
5
5
|
* file that was distributed with this source code.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { CamusError } from './errors.js';
|
|
8
|
+
import { CamusErrorCode } from './error-codes.js';
|
|
9
|
+
import { hasReturningKeyword, isPlainIdentifier } from './sql-syntax.js';
|
|
8
10
|
/**
|
|
9
11
|
* Classifies a statement by its leading keywords.
|
|
10
12
|
*
|
|
@@ -52,8 +54,20 @@ const DDL_PREFIXES = [
|
|
|
52
54
|
'DROP SEQUENCE',
|
|
53
55
|
'ALTER SEQUENCE',
|
|
54
56
|
'COMMENT ON SEQUENCE',
|
|
57
|
+
// Row triggers that run C# extension code. TRIGGER is not a reserved word, but no other
|
|
58
|
+
// statement starts with these two words.
|
|
59
|
+
'CREATE TRIGGER',
|
|
60
|
+
'DROP TRIGGER',
|
|
55
61
|
];
|
|
56
|
-
|
|
62
|
+
/**
|
|
63
|
+
* The statements that run on the non-query route and report an affected-row count.
|
|
64
|
+
*
|
|
65
|
+
* `CALL` runs a procedure that a C# extension on the server defines. The server runs it only on the
|
|
66
|
+
* non-query route, and answers it with an affected-row count and no result set, as it does a write
|
|
67
|
+
* without `RETURNING`.
|
|
68
|
+
*/
|
|
69
|
+
const DML_PREFIXES = ['INSERT', 'UPDATE', 'DELETE', 'CALL'];
|
|
70
|
+
const CALL_PREFIXES = ['CALL'];
|
|
57
71
|
/**
|
|
58
72
|
* The statements the server accepts a registration for: the repeatable data statements, whose
|
|
59
73
|
* whole point is running many times with different values. Schema and administration statements
|
|
@@ -78,13 +92,41 @@ export function isDdlStatement(sql) {
|
|
|
78
92
|
export function isDmlStatement(sql) {
|
|
79
93
|
return startsWithAny(sql, DML_PREFIXES);
|
|
80
94
|
}
|
|
95
|
+
/** True when the statement is a `CALL`, which the server runs only on the non-query route. */
|
|
96
|
+
export function isCallStatement(sql) {
|
|
97
|
+
return startsWithAny(sql, CALL_PREFIXES);
|
|
98
|
+
}
|
|
81
99
|
/**
|
|
82
100
|
* True when the statement is an `INSERT`, `UPDATE`, or `DELETE` with a `RETURNING` list, which
|
|
83
101
|
* sends back the rows it wrote. The keyword test skips literals, comments, delimited names, and
|
|
84
102
|
* placeholders.
|
|
85
103
|
*/
|
|
86
104
|
export function isWriteReturning(sql) {
|
|
87
|
-
return isDmlStatement(sql) && hasReturningKeyword(sql);
|
|
105
|
+
return isDmlStatement(sql) && !isCallStatement(sql) && hasReturningKeyword(sql);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Composes `CALL name(@a, @b, ...)` for a procedure that a C# extension on the server defines.
|
|
109
|
+
*
|
|
110
|
+
* The arguments follow the order of the parameter object's keys, because a procedure takes its
|
|
111
|
+
* arguments by position. A key that is a whole number, such as `'0'`, comes first in JavaScript
|
|
112
|
+
* whatever its place in the object literal, so use names. The server reads the procedure name only
|
|
113
|
+
* as a plain identifier, so any other name is refused here, before a request.
|
|
114
|
+
*
|
|
115
|
+
* @throws {TypeError} when the procedure name is not a plain identifier.
|
|
116
|
+
*/
|
|
117
|
+
export function callStatement(procedure, parameters) {
|
|
118
|
+
const name = procedure.trim();
|
|
119
|
+
if (!isPlainIdentifier(name)) {
|
|
120
|
+
throw new TypeError(`'${name}' is not a procedure name. The procedure name must be a plain identifier: a letter ` +
|
|
121
|
+
"or '_', then letters, digits, or '_'.");
|
|
122
|
+
}
|
|
123
|
+
const placeholders = Object.keys(parameters ?? {}).map((key) => {
|
|
124
|
+
if (key.length === 0) {
|
|
125
|
+
throw new CamusError(CamusErrorCode.InvalidParameter, 'A parameter name cannot be empty.');
|
|
126
|
+
}
|
|
127
|
+
return key.startsWith('@') ? key : `@${key}`;
|
|
128
|
+
});
|
|
129
|
+
return `CALL ${name}(${placeholders.join(', ')})`;
|
|
88
130
|
}
|
|
89
131
|
/** True when the statement may be registered as a prepared statement. */
|
|
90
132
|
export function isPreparableStatement(sql) {
|
package/dist/statements.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../src/statements.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzE;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,MAAM,YAAY,GAAG;IACnB,cAAc;IACd,YAAY;IACZ,aAAa;IACb,gGAAgG;IAChG,iGAAiG;IACjG,+CAA+C;IAC/C,UAAU;IACV,qBAAqB;IACrB,cAAc;IACd,YAAY;IACZ,6FAA6F;IAC7F,+FAA+F;IAC/F,6EAA6E;IAC7E,aAAa;IACb,wBAAwB;IACxB,WAAW;IACX,YAAY;IACZ,0BAA0B;IAC1B,wBAAwB;IACxB,yBAAyB;IACzB,8FAA8F;IAC9F,+FAA+F;IAC/F,6FAA6F;IAC7F,qBAAqB;IACrB,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,qBAAqB;IACrB,wFAAwF;IACxF,yCAAyC;IACzC,gBAAgB;IAChB,cAAc;CACf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE5D,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,CAAC;AAE/B;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE7E;;;;;;;;GAQG;AACH,MAAM,wBAAwB,GAAG,CAAC,UAAU,CAAC,CAAC;AAE9C,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,UAAuB;IACtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CACjB,IAAI,IAAI,qFAAqF;YAC3F,uCAAuC,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,UAAU,CAAC,cAAc,CAAC,gBAAgB,EAAE,mCAAmC,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACjD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,aAAa,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,QAA2B;IAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAEhC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,MAAc;IACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,gEAAgE;YAChE,MAAM,cAAc,GAAG,QAAQ,CAAC;YAChC,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC;gBAAE,QAAQ,EAAE,CAAC;YACxE,IAAI,QAAQ,KAAK,cAAc;gBAAE,OAAO,KAAK,CAAC;QAChD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;QAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM;YAAE,OAAO,KAAK,CAAC;QAElD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,QAAQ,IAAI,MAAM,CAAC;QACnB,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|