firebird-wasm 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +112 -0
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/browser/engine-transport.d.ts +19 -0
- package/dist/browser/engine-transport.d.ts.map +1 -1
- package/dist/browser/engine-transport.js +67 -0
- package/dist/browser/engine-transport.js.map +1 -1
- package/dist/browser/firebird-browser.d.ts +44 -1
- package/dist/browser/firebird-browser.d.ts.map +1 -1
- package/dist/browser/firebird-browser.js +123 -0
- package/dist/browser/firebird-browser.js.map +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/opfs-fs.d.ts.map +1 -1
- package/dist/browser/opfs-fs.js +18 -7
- package/dist/browser/opfs-fs.js.map +1 -1
- package/dist/browser/shared-transport.d.ts +3 -0
- package/dist/browser/shared-transport.d.ts.map +1 -1
- package/dist/browser/shared-transport.js +9 -0
- package/dist/browser/shared-transport.js.map +1 -1
- package/dist/browser/worker-protocol.d.ts +1 -1
- package/dist/browser/worker-protocol.d.ts.map +1 -1
- package/dist/browser/worker-transport.d.ts +3 -0
- package/dist/browser/worker-transport.d.ts.map +1 -1
- package/dist/browser/worker-transport.js +9 -0
- package/dist/browser/worker-transport.js.map +1 -1
- package/dist/drizzle/index.d.ts +170 -0
- package/dist/drizzle/index.d.ts.map +1 -0
- package/dist/drizzle/index.js +627 -0
- package/dist/drizzle/index.js.map +1 -0
- package/dist/electric/apply.d.ts +1 -0
- package/dist/electric/apply.d.ts.map +1 -1
- package/dist/electric/apply.js +28 -8
- package/dist/electric/apply.js.map +1 -1
- package/dist/electric/index.js +6 -1
- package/dist/electric/index.js.map +1 -1
- package/dist/electric/values.d.ts.map +1 -1
- package/dist/electric/values.js +5 -2
- package/dist/electric/values.js.map +1 -1
- package/dist/electric-server/catalog.d.ts.map +1 -1
- package/dist/electric-server/catalog.js +3 -2
- package/dist/electric-server/catalog.js.map +1 -1
- package/dist/electric-server/index.d.ts +19 -0
- package/dist/electric-server/index.d.ts.map +1 -1
- package/dist/electric-server/index.js +147 -14
- package/dist/electric-server/index.js.map +1 -1
- package/dist/firebird.d.ts +48 -9
- package/dist/firebird.d.ts.map +1 -1
- package/dist/firebird.js +927 -60
- package/dist/firebird.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/kysely/index.d.ts +197 -0
- package/dist/kysely/index.d.ts.map +1 -0
- package/dist/kysely/index.js +777 -0
- package/dist/kysely/index.js.map +1 -0
- package/dist/sql-tag.d.ts +5 -16
- package/dist/sql-tag.d.ts.map +1 -1
- package/dist/sql-tag.js +15 -0
- package/dist/sql-tag.js.map +1 -1
- package/dist/types.d.ts +24 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/wasm/firebird-embedded-st.js +1 -1
- package/dist/wasm/firebird-embedded-st.wasm +0 -0
- package/dist/wasm/firebird-embedded.js +1 -1
- package/dist/wasm/firebird-embedded.wasm +0 -0
- package/dist/wasm-loader.d.ts +16 -0
- package/dist/wasm-loader.d.ts.map +1 -1
- package/dist/wasm-loader.js.map +1 -1
- package/package.json +21 -3
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* firebird-wasm/drizzle – a Drizzle ORM driver & dialect for `FirebirdBrowser`
|
|
4
|
+
* and `FirebirdLite`.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import {
|
|
8
|
+
* drizzle,
|
|
9
|
+
* firebirdTable,
|
|
10
|
+
* integer,
|
|
11
|
+
* varchar,
|
|
12
|
+
* boolean,
|
|
13
|
+
* eq,
|
|
14
|
+
* } from 'firebird-wasm/drizzle';
|
|
15
|
+
*
|
|
16
|
+
* const items = firebirdTable('items', {
|
|
17
|
+
* id: integer('id').primaryKey(),
|
|
18
|
+
* title: varchar('title', { length: 80 }).notNull(),
|
|
19
|
+
* done: boolean('done').default(false),
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* const db = drizzle(fb, { schema: { items } });
|
|
23
|
+
*
|
|
24
|
+
* await db.insert(items).values({ id: 1, title: 'Ship Drizzle driver', done: false });
|
|
25
|
+
* const open = await db.select().from(items).where(eq(items.done, false)).limit(10).offset(0);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Translates Drizzle's SQL AST to Firebird 3+ SQL:
|
|
29
|
+
* - `?` positional parameter placeholders;
|
|
30
|
+
* - `OFFSET ? ROWS FETCH NEXT ? ROWS ONLY` pagination;
|
|
31
|
+
* - `INSERT / UPDATE / DELETE … RETURNING` (decoded positionally via `rowMode: 'array'`);
|
|
32
|
+
* - multi-row `INSERT INTO … SELECT … FROM RDB$DATABASE UNION ALL …`;
|
|
33
|
+
* - `UPDATE OR INSERT INTO … MATCHING (…)` on `.onConflictDoUpdate({ target })`;
|
|
34
|
+
* - `db.$count(table, where)` with quoted `"COUNT"` alias;
|
|
35
|
+
* - `db.transaction()` mapped onto Firebird isolation levels, plus nested savepoints;
|
|
36
|
+
* - bijective identifier folding (`items` ↔ `"ITEMS"`, while `"camelCase"` stays `"camelCase"`).
|
|
37
|
+
*/
|
|
38
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
39
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
40
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
41
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
42
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
43
|
+
};
|
|
44
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
45
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
46
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
47
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
48
|
+
};
|
|
49
|
+
var _a, _FirebirdDrizzlePreparedQuery_client, _FirebirdDrizzlePreparedQuery_queryString, _FirebirdDrizzlePreparedQuery_params, _FirebirdDrizzlePreparedQuery_logger, _FirebirdDrizzlePreparedQuery_fields, _FirebirdDrizzlePreparedQuery_isResponseInArrayMode, _FirebirdDrizzlePreparedQuery_customResultMapper, _FirebirdDrizzlePreparedQuery_queryMetadata, _FirebirdDrizzlePreparedQuery_identifierCase, _b, _FirebirdDrizzleSession_client, _FirebirdDrizzleSession_dialect, _FirebirdDrizzleSession_schema, _FirebirdDrizzleSession_options, _FirebirdDrizzleSession_logger, _FirebirdDrizzleSession_identifierCase, _c, _FirebirdDrizzleTransaction_txDialect, _FirebirdDrizzleTransaction_txSession, _d, _e;
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.FirebirdDrizzleTransaction = exports.FirebirdDrizzleSession = exports.FirebirdDrizzlePreparedQuery = exports.FirebirdDrizzleDialect = exports.relations = exports.max = exports.min = exports.avg = exports.sum = exports.count = exports.desc = exports.asc = exports.between = exports.ilike = exports.like = exports.isNotNull = exports.isNull = exports.notInArray = exports.inArray = exports.not = exports.or = exports.and = exports.lte = exports.lt = exports.gte = exports.gt = exports.ne = exports.eq = exports.sql = exports.customType = exports.uuid = exports.jsonb = exports.json = exports.timestamp = exports.time = exports.date = exports.numeric = exports.doublePrecision = exports.real = exports.boolean = exports.char = exports.varchar = exports.text = exports.bigserial = exports.serial = exports.bigint = exports.smallint = exports.integer = exports.firebirdTable = exports.pgTable = void 0;
|
|
52
|
+
exports.FirebirdDrizzleDatabase = void 0;
|
|
53
|
+
exports.drizzle = drizzle;
|
|
54
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
55
|
+
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
56
|
+
Object.defineProperty(exports, "bigint", { enumerable: true, get: function () { return pg_core_1.bigint; } });
|
|
57
|
+
Object.defineProperty(exports, "bigserial", { enumerable: true, get: function () { return pg_core_1.bigserial; } });
|
|
58
|
+
Object.defineProperty(exports, "boolean", { enumerable: true, get: function () { return pg_core_1.boolean; } });
|
|
59
|
+
Object.defineProperty(exports, "char", { enumerable: true, get: function () { return pg_core_1.char; } });
|
|
60
|
+
Object.defineProperty(exports, "customType", { enumerable: true, get: function () { return pg_core_1.customType; } });
|
|
61
|
+
Object.defineProperty(exports, "date", { enumerable: true, get: function () { return pg_core_1.date; } });
|
|
62
|
+
Object.defineProperty(exports, "doublePrecision", { enumerable: true, get: function () { return pg_core_1.doublePrecision; } });
|
|
63
|
+
Object.defineProperty(exports, "integer", { enumerable: true, get: function () { return pg_core_1.integer; } });
|
|
64
|
+
Object.defineProperty(exports, "json", { enumerable: true, get: function () { return pg_core_1.json; } });
|
|
65
|
+
Object.defineProperty(exports, "jsonb", { enumerable: true, get: function () { return pg_core_1.jsonb; } });
|
|
66
|
+
Object.defineProperty(exports, "numeric", { enumerable: true, get: function () { return pg_core_1.numeric; } });
|
|
67
|
+
Object.defineProperty(exports, "pgTable", { enumerable: true, get: function () { return pg_core_1.pgTable; } });
|
|
68
|
+
Object.defineProperty(exports, "firebirdTable", { enumerable: true, get: function () { return pg_core_1.pgTable; } });
|
|
69
|
+
Object.defineProperty(exports, "real", { enumerable: true, get: function () { return pg_core_1.real; } });
|
|
70
|
+
Object.defineProperty(exports, "serial", { enumerable: true, get: function () { return pg_core_1.serial; } });
|
|
71
|
+
Object.defineProperty(exports, "smallint", { enumerable: true, get: function () { return pg_core_1.smallint; } });
|
|
72
|
+
Object.defineProperty(exports, "text", { enumerable: true, get: function () { return pg_core_1.text; } });
|
|
73
|
+
Object.defineProperty(exports, "time", { enumerable: true, get: function () { return pg_core_1.time; } });
|
|
74
|
+
Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return pg_core_1.timestamp; } });
|
|
75
|
+
Object.defineProperty(exports, "uuid", { enumerable: true, get: function () { return pg_core_1.uuid; } });
|
|
76
|
+
Object.defineProperty(exports, "varchar", { enumerable: true, get: function () { return pg_core_1.varchar; } });
|
|
77
|
+
const kysely_1 = require("../kysely");
|
|
78
|
+
var drizzle_orm_2 = require("drizzle-orm");
|
|
79
|
+
Object.defineProperty(exports, "sql", { enumerable: true, get: function () { return drizzle_orm_2.sql; } });
|
|
80
|
+
Object.defineProperty(exports, "eq", { enumerable: true, get: function () { return drizzle_orm_2.eq; } });
|
|
81
|
+
Object.defineProperty(exports, "ne", { enumerable: true, get: function () { return drizzle_orm_2.ne; } });
|
|
82
|
+
Object.defineProperty(exports, "gt", { enumerable: true, get: function () { return drizzle_orm_2.gt; } });
|
|
83
|
+
Object.defineProperty(exports, "gte", { enumerable: true, get: function () { return drizzle_orm_2.gte; } });
|
|
84
|
+
Object.defineProperty(exports, "lt", { enumerable: true, get: function () { return drizzle_orm_2.lt; } });
|
|
85
|
+
Object.defineProperty(exports, "lte", { enumerable: true, get: function () { return drizzle_orm_2.lte; } });
|
|
86
|
+
Object.defineProperty(exports, "and", { enumerable: true, get: function () { return drizzle_orm_2.and; } });
|
|
87
|
+
Object.defineProperty(exports, "or", { enumerable: true, get: function () { return drizzle_orm_2.or; } });
|
|
88
|
+
Object.defineProperty(exports, "not", { enumerable: true, get: function () { return drizzle_orm_2.not; } });
|
|
89
|
+
Object.defineProperty(exports, "inArray", { enumerable: true, get: function () { return drizzle_orm_2.inArray; } });
|
|
90
|
+
Object.defineProperty(exports, "notInArray", { enumerable: true, get: function () { return drizzle_orm_2.notInArray; } });
|
|
91
|
+
Object.defineProperty(exports, "isNull", { enumerable: true, get: function () { return drizzle_orm_2.isNull; } });
|
|
92
|
+
Object.defineProperty(exports, "isNotNull", { enumerable: true, get: function () { return drizzle_orm_2.isNotNull; } });
|
|
93
|
+
Object.defineProperty(exports, "like", { enumerable: true, get: function () { return drizzle_orm_2.like; } });
|
|
94
|
+
Object.defineProperty(exports, "ilike", { enumerable: true, get: function () { return drizzle_orm_2.ilike; } });
|
|
95
|
+
Object.defineProperty(exports, "between", { enumerable: true, get: function () { return drizzle_orm_2.between; } });
|
|
96
|
+
Object.defineProperty(exports, "asc", { enumerable: true, get: function () { return drizzle_orm_2.asc; } });
|
|
97
|
+
Object.defineProperty(exports, "desc", { enumerable: true, get: function () { return drizzle_orm_2.desc; } });
|
|
98
|
+
Object.defineProperty(exports, "count", { enumerable: true, get: function () { return drizzle_orm_2.count; } });
|
|
99
|
+
Object.defineProperty(exports, "sum", { enumerable: true, get: function () { return drizzle_orm_2.sum; } });
|
|
100
|
+
Object.defineProperty(exports, "avg", { enumerable: true, get: function () { return drizzle_orm_2.avg; } });
|
|
101
|
+
Object.defineProperty(exports, "min", { enumerable: true, get: function () { return drizzle_orm_2.min; } });
|
|
102
|
+
Object.defineProperty(exports, "max", { enumerable: true, get: function () { return drizzle_orm_2.max; } });
|
|
103
|
+
Object.defineProperty(exports, "relations", { enumerable: true, get: function () { return drizzle_orm_2.relations; } });
|
|
104
|
+
/**
|
|
105
|
+
* Drizzle SQL dialect for Firebird 3+.
|
|
106
|
+
*
|
|
107
|
+
* Extends `PgDialect` (since both dialects share standard SQL quoting, `RETURNING`,
|
|
108
|
+
* CTEs, window functions, and positional `rowMode: 'array'` result mapping) while
|
|
109
|
+
* emitting `?` parameter placeholders, `OFFSET ? ROWS FETCH NEXT ? ROWS ONLY`,
|
|
110
|
+
* multi-row `INSERT INTO … SELECT … FROM RDB$DATABASE UNION ALL …`, and
|
|
111
|
+
* `UPDATE OR INSERT INTO … MATCHING (…)`.
|
|
112
|
+
*/
|
|
113
|
+
class FirebirdDrizzleDialect extends pg_core_1.PgDialect {
|
|
114
|
+
constructor(config) {
|
|
115
|
+
super(config);
|
|
116
|
+
this.identifierCase = config?.identifierCase ?? 'lower';
|
|
117
|
+
this.escapeName = this.escapeName.bind(this);
|
|
118
|
+
this.escapeParam = this.escapeParam.bind(this);
|
|
119
|
+
}
|
|
120
|
+
escapeName(name) {
|
|
121
|
+
const mapped = this.identifierCase === 'lower' && /^[a-z_][a-z0-9_$]*$/.test(name)
|
|
122
|
+
? name.toUpperCase()
|
|
123
|
+
: name;
|
|
124
|
+
return `"${mapped.replace(/"/g, '""')}"`;
|
|
125
|
+
}
|
|
126
|
+
escapeParam(_num) {
|
|
127
|
+
return '?';
|
|
128
|
+
}
|
|
129
|
+
buildSelectQuery(config) {
|
|
130
|
+
const { limit, offset, lockingClause, setOperators } = config;
|
|
131
|
+
const hasLimit = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0);
|
|
132
|
+
const hasOffset = offset !== undefined;
|
|
133
|
+
if (!hasLimit && !hasOffset) {
|
|
134
|
+
return super.buildSelectQuery(config);
|
|
135
|
+
}
|
|
136
|
+
const base = super.buildSelectQuery({
|
|
137
|
+
...config,
|
|
138
|
+
limit: undefined,
|
|
139
|
+
offset: undefined,
|
|
140
|
+
lockingClause: undefined,
|
|
141
|
+
setOperators: [],
|
|
142
|
+
});
|
|
143
|
+
// Firebird SQL:2008 order: OFFSET <n> ROWS FETCH NEXT <m> ROWS ONLY
|
|
144
|
+
if (hasOffset) {
|
|
145
|
+
base.append((0, drizzle_orm_1.sql) ` offset ${offset} rows`);
|
|
146
|
+
}
|
|
147
|
+
if (hasLimit) {
|
|
148
|
+
base.append((0, drizzle_orm_1.sql) ` fetch next ${limit} rows only`);
|
|
149
|
+
}
|
|
150
|
+
if (lockingClause) {
|
|
151
|
+
base.append((0, drizzle_orm_1.sql) ` for ${drizzle_orm_1.sql.raw(lockingClause.strength)}`);
|
|
152
|
+
if (lockingClause.config.noWait) {
|
|
153
|
+
base.append((0, drizzle_orm_1.sql) ` with lock`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (setOperators.length > 0) {
|
|
157
|
+
return this.buildSetOperations(base, setOperators);
|
|
158
|
+
}
|
|
159
|
+
return base;
|
|
160
|
+
}
|
|
161
|
+
buildSetOperationQuery({ leftSelect, setOperator, }) {
|
|
162
|
+
const { limit, offset } = setOperator;
|
|
163
|
+
const hasLimit = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0);
|
|
164
|
+
const hasOffset = offset !== undefined;
|
|
165
|
+
if (!hasLimit && !hasOffset) {
|
|
166
|
+
return super.buildSetOperationQuery({ leftSelect, setOperator });
|
|
167
|
+
}
|
|
168
|
+
const base = super.buildSetOperationQuery({
|
|
169
|
+
leftSelect,
|
|
170
|
+
setOperator: { ...setOperator, limit: undefined, offset: undefined },
|
|
171
|
+
});
|
|
172
|
+
if (hasOffset) {
|
|
173
|
+
base.append((0, drizzle_orm_1.sql) ` offset ${offset} rows`);
|
|
174
|
+
}
|
|
175
|
+
if (hasLimit) {
|
|
176
|
+
base.append((0, drizzle_orm_1.sql) ` fetch next ${limit} rows only`);
|
|
177
|
+
}
|
|
178
|
+
return base;
|
|
179
|
+
}
|
|
180
|
+
buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select, overridingSystemValue_, }) {
|
|
181
|
+
if (select) {
|
|
182
|
+
return super.buildInsertQuery({
|
|
183
|
+
table,
|
|
184
|
+
values: valuesOrSelect,
|
|
185
|
+
onConflict,
|
|
186
|
+
returning,
|
|
187
|
+
withList,
|
|
188
|
+
select,
|
|
189
|
+
overridingSystemValue_,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const columns = (0, drizzle_orm_1.getTableColumns)(table);
|
|
193
|
+
const allEntries = Object.entries(columns).filter(([, col]) => !col
|
|
194
|
+
.shouldDisableInsert?.());
|
|
195
|
+
const values = valuesOrSelect;
|
|
196
|
+
// Keep only columns that are explicitly supplied in `values` or have a runtime
|
|
197
|
+
// `defaultFn` / `onUpdateFn`. This lets omitted identity / default columns use
|
|
198
|
+
// Firebird's column defaults cleanly in both single-row and multi-row inserts.
|
|
199
|
+
const activeEntries = allEntries.filter(([fieldName, col]) => {
|
|
200
|
+
if (col.defaultFn !== undefined)
|
|
201
|
+
return true;
|
|
202
|
+
if (!col.default && col.onUpdateFn !== undefined)
|
|
203
|
+
return true;
|
|
204
|
+
return values.some((row) => {
|
|
205
|
+
const v = row[fieldName];
|
|
206
|
+
return v !== undefined && !((0, drizzle_orm_1.is)(v, drizzle_orm_1.Param) && v.value === undefined);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
const internal = this;
|
|
210
|
+
const withSql = internal.buildWithCTE(withList);
|
|
211
|
+
const returningSql = returning
|
|
212
|
+
? (0, drizzle_orm_1.sql) ` returning ${internal.buildSelection(returning, { isSingleTable: true })}`
|
|
213
|
+
: undefined;
|
|
214
|
+
if (activeEntries.length === 0) {
|
|
215
|
+
return (0, drizzle_orm_1.sql) `${withSql}insert into ${table} default values${returningSql}`;
|
|
216
|
+
}
|
|
217
|
+
const insertOrder = activeEntries.map(([, column]) => drizzle_orm_1.sql.identifier(internal.casing.getColumnCasing(column)));
|
|
218
|
+
const resolveCell = (row, fieldName, col) => {
|
|
219
|
+
const colValue = row[fieldName];
|
|
220
|
+
if (colValue === undefined ||
|
|
221
|
+
((0, drizzle_orm_1.is)(colValue, drizzle_orm_1.Param) && colValue.value === undefined)) {
|
|
222
|
+
if (col.defaultFn !== undefined) {
|
|
223
|
+
const fnRes = col.defaultFn();
|
|
224
|
+
return (0, drizzle_orm_1.is)(fnRes, drizzle_orm_1.SQL) ? fnRes : drizzle_orm_1.sql.param(fnRes, col);
|
|
225
|
+
}
|
|
226
|
+
if (!col.default && col.onUpdateFn !== undefined) {
|
|
227
|
+
const fnRes = col.onUpdateFn();
|
|
228
|
+
return (0, drizzle_orm_1.is)(fnRes, drizzle_orm_1.SQL) ? fnRes : drizzle_orm_1.sql.param(fnRes, col);
|
|
229
|
+
}
|
|
230
|
+
return drizzle_orm_1.sql.param(null, col);
|
|
231
|
+
}
|
|
232
|
+
return colValue;
|
|
233
|
+
};
|
|
234
|
+
// Check if onConflict is an upsert (`(<cols>) ... do update set ...`)
|
|
235
|
+
if (onConflict) {
|
|
236
|
+
const conflictQuery = this.sqlToQuery(onConflict);
|
|
237
|
+
const match = /^\(([^)]+)\)\s+do\s+update\s+set\b/i.exec(conflictQuery.sql.trim());
|
|
238
|
+
if (match && values.length === 1) {
|
|
239
|
+
const targetCols = match[1];
|
|
240
|
+
const rowCells = activeEntries.map(([fieldName, col]) => resolveCell(values[0], fieldName, col));
|
|
241
|
+
return (0, drizzle_orm_1.sql) `${withSql}update or insert into ${table} ${insertOrder} values (${drizzle_orm_1.sql.join(rowCells, (0, drizzle_orm_1.sql) `, `)}) matching (${drizzle_orm_1.sql.raw(targetCols)})${returningSql}`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const overridingSql = overridingSystemValue_ === true ? (0, drizzle_orm_1.sql) `overriding system value ` : undefined;
|
|
245
|
+
if (values.length === 1) {
|
|
246
|
+
const rowCells = activeEntries.map(([fieldName, col]) => resolveCell(values[0], fieldName, col));
|
|
247
|
+
const onConflictSql = onConflict ? (0, drizzle_orm_1.sql) ` on conflict ${onConflict}` : undefined;
|
|
248
|
+
return (0, drizzle_orm_1.sql) `${withSql}insert into ${table} ${insertOrder} ${overridingSql}values (${drizzle_orm_1.sql.join(rowCells, (0, drizzle_orm_1.sql) `, `)})${onConflictSql}${returningSql}`;
|
|
249
|
+
}
|
|
250
|
+
// Multi-row insert via SELECT ... FROM RDB$DATABASE UNION ALL ...
|
|
251
|
+
const selects = values.map((row) => {
|
|
252
|
+
const rowCells = activeEntries.map(([fieldName, col]) => resolveCell(row, fieldName, col));
|
|
253
|
+
return (0, drizzle_orm_1.sql) `select ${drizzle_orm_1.sql.join(rowCells, (0, drizzle_orm_1.sql) `, `)} from rdb$database`;
|
|
254
|
+
});
|
|
255
|
+
return (0, drizzle_orm_1.sql) `${withSql}insert into ${table} ${insertOrder} ${overridingSql}${drizzle_orm_1.sql.join(selects, (0, drizzle_orm_1.sql) ` union all `)}${returningSql}`;
|
|
256
|
+
}
|
|
257
|
+
sqlToQuery(sqlNode, invokeSource) {
|
|
258
|
+
const query = super.sqlToQuery(sqlNode, invokeSource);
|
|
259
|
+
// PgCountBuilder generates `select count(*) as count from ...;`.
|
|
260
|
+
// In Firebird, COUNT is a reserved word and must be quoted as an alias.
|
|
261
|
+
if (/^select count\(\*\) as count from /i.test(query.sql)) {
|
|
262
|
+
query.sql = query.sql
|
|
263
|
+
.replace(/^select count\(\*\) as count from /i, 'select count(*) as "COUNT" from ')
|
|
264
|
+
.replace(/;\s*$/, '');
|
|
265
|
+
}
|
|
266
|
+
return query;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
exports.FirebirdDrizzleDialect = FirebirdDrizzleDialect;
|
|
270
|
+
_a = drizzle_orm_1.entityKind;
|
|
271
|
+
FirebirdDrizzleDialect[_a] = 'FirebirdDrizzleDialect';
|
|
272
|
+
/**
|
|
273
|
+
* Prepared query execution against `FirebirdBrowser` or `FirebirdLite`.
|
|
274
|
+
*/
|
|
275
|
+
class FirebirdDrizzlePreparedQuery extends pg_core_1.PgPreparedQuery {
|
|
276
|
+
constructor(client, queryString, params, logger, fields, isResponseInArrayMode, customResultMapper, queryMetadata, identifierCase) {
|
|
277
|
+
super({ sql: queryString, params }, undefined, queryMetadata, undefined);
|
|
278
|
+
_FirebirdDrizzlePreparedQuery_client.set(this, void 0);
|
|
279
|
+
_FirebirdDrizzlePreparedQuery_queryString.set(this, void 0);
|
|
280
|
+
_FirebirdDrizzlePreparedQuery_params.set(this, void 0);
|
|
281
|
+
_FirebirdDrizzlePreparedQuery_logger.set(this, void 0);
|
|
282
|
+
_FirebirdDrizzlePreparedQuery_fields.set(this, void 0);
|
|
283
|
+
_FirebirdDrizzlePreparedQuery_isResponseInArrayMode.set(this, void 0);
|
|
284
|
+
_FirebirdDrizzlePreparedQuery_customResultMapper.set(this, void 0);
|
|
285
|
+
_FirebirdDrizzlePreparedQuery_queryMetadata.set(this, void 0);
|
|
286
|
+
_FirebirdDrizzlePreparedQuery_identifierCase.set(this, void 0);
|
|
287
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_client, client, "f");
|
|
288
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_queryString, queryString, "f");
|
|
289
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_params, params, "f");
|
|
290
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_logger, logger, "f");
|
|
291
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_fields, fields, "f");
|
|
292
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_isResponseInArrayMode, isResponseInArrayMode, "f");
|
|
293
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_customResultMapper, customResultMapper, "f");
|
|
294
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_queryMetadata, queryMetadata, "f");
|
|
295
|
+
__classPrivateFieldSet(this, _FirebirdDrizzlePreparedQuery_identifierCase, identifierCase, "f");
|
|
296
|
+
}
|
|
297
|
+
async execute(placeholderValues = {}) {
|
|
298
|
+
const params = normalizeParams((0, drizzle_orm_1.fillPlaceholders)(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_params, "f"), placeholderValues));
|
|
299
|
+
__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_logger, "f").logQuery(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params);
|
|
300
|
+
const multiInsert = (0, kysely_1.parseMultiRowInsert)(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params);
|
|
301
|
+
const fields = __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_fields, "f");
|
|
302
|
+
const customResultMapper = __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_customResultMapper, "f");
|
|
303
|
+
const joinsNotNullableMap = this.joinsNotNullableMap;
|
|
304
|
+
if (!fields && !customResultMapper) {
|
|
305
|
+
const isDmlWithoutReturning = __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryMetadata, "f")?.type === 'insert' ||
|
|
306
|
+
__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryMetadata, "f")?.type === 'update' ||
|
|
307
|
+
__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryMetadata, "f")?.type === 'delete' ||
|
|
308
|
+
(/^\s*(insert|update|delete|create|alter|drop|recreate)\b/i.test(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f")) &&
|
|
309
|
+
!/\breturning\b/i.test(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f")));
|
|
310
|
+
if (isDmlWithoutReturning) {
|
|
311
|
+
if (multiInsert && typeof __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").execBatch === 'function') {
|
|
312
|
+
if (multiInsert.uniformSql) {
|
|
313
|
+
const res = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").execBatch(multiInsert.uniformSql, multiInsert.rows.map((r) => r.params));
|
|
314
|
+
return {
|
|
315
|
+
rows: [],
|
|
316
|
+
fields: [],
|
|
317
|
+
affectedRows: extractAffectedRows(res) ?? multiInsert.rows.length,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
for (const row of multiInsert.rows) {
|
|
321
|
+
await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").exec(row.sql, row.params);
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
rows: [],
|
|
325
|
+
fields: [],
|
|
326
|
+
affectedRows: multiInsert.rows.length,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const res = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").exec(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params);
|
|
330
|
+
return {
|
|
331
|
+
rows: [],
|
|
332
|
+
fields: [],
|
|
333
|
+
affectedRows: extractAffectedRows(res),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const raw = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").query(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params, { rowMode: 'object' });
|
|
337
|
+
return {
|
|
338
|
+
rows: mapObjectRows(raw.rows, __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_identifierCase, "f")),
|
|
339
|
+
fields: raw.fields,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
let resultRows;
|
|
343
|
+
if (multiInsert && multiInsert.hasReturning && typeof __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").execBatch === 'function') {
|
|
344
|
+
resultRows = [];
|
|
345
|
+
for (const row of multiInsert.rows) {
|
|
346
|
+
const res = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").query(row.sql, row.params, {
|
|
347
|
+
rowMode: 'array',
|
|
348
|
+
});
|
|
349
|
+
resultRows.push(...res.rows);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
const result = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").query(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params, {
|
|
354
|
+
rowMode: 'array',
|
|
355
|
+
});
|
|
356
|
+
resultRows = result.rows;
|
|
357
|
+
}
|
|
358
|
+
if (customResultMapper) {
|
|
359
|
+
return customResultMapper(resultRows);
|
|
360
|
+
}
|
|
361
|
+
return resultRows.map((row) => mapDrizzleResultRow(fields, row, joinsNotNullableMap));
|
|
362
|
+
}
|
|
363
|
+
async all(placeholderValues = {}) {
|
|
364
|
+
const params = normalizeParams((0, drizzle_orm_1.fillPlaceholders)(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_params, "f"), placeholderValues));
|
|
365
|
+
__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_logger, "f").logQuery(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params);
|
|
366
|
+
const result = await __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_client, "f").query(__classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_queryString, "f"), params, { rowMode: 'object' });
|
|
367
|
+
return mapObjectRows(result.rows, __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_identifierCase, "f"));
|
|
368
|
+
}
|
|
369
|
+
/** @internal */
|
|
370
|
+
isResponseInArrayMode() {
|
|
371
|
+
return __classPrivateFieldGet(this, _FirebirdDrizzlePreparedQuery_isResponseInArrayMode, "f");
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.FirebirdDrizzlePreparedQuery = FirebirdDrizzlePreparedQuery;
|
|
375
|
+
_FirebirdDrizzlePreparedQuery_client = new WeakMap(), _FirebirdDrizzlePreparedQuery_queryString = new WeakMap(), _FirebirdDrizzlePreparedQuery_params = new WeakMap(), _FirebirdDrizzlePreparedQuery_logger = new WeakMap(), _FirebirdDrizzlePreparedQuery_fields = new WeakMap(), _FirebirdDrizzlePreparedQuery_isResponseInArrayMode = new WeakMap(), _FirebirdDrizzlePreparedQuery_customResultMapper = new WeakMap(), _FirebirdDrizzlePreparedQuery_queryMetadata = new WeakMap(), _FirebirdDrizzlePreparedQuery_identifierCase = new WeakMap(), _b = drizzle_orm_1.entityKind;
|
|
376
|
+
FirebirdDrizzlePreparedQuery[_b] = 'FirebirdDrizzlePreparedQuery';
|
|
377
|
+
/**
|
|
378
|
+
* Drizzle session wrapping a `FirebirdBrowser`, `FirebirdLite`, or active transaction.
|
|
379
|
+
*/
|
|
380
|
+
class FirebirdDrizzleSession extends pg_core_1.PgSession {
|
|
381
|
+
constructor(client, dialect, schema, options = {}) {
|
|
382
|
+
super(dialect);
|
|
383
|
+
_FirebirdDrizzleSession_client.set(this, void 0);
|
|
384
|
+
_FirebirdDrizzleSession_dialect.set(this, void 0);
|
|
385
|
+
_FirebirdDrizzleSession_schema.set(this, void 0);
|
|
386
|
+
_FirebirdDrizzleSession_options.set(this, void 0);
|
|
387
|
+
_FirebirdDrizzleSession_logger.set(this, void 0);
|
|
388
|
+
_FirebirdDrizzleSession_identifierCase.set(this, void 0);
|
|
389
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_client, client, "f");
|
|
390
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_dialect, dialect, "f");
|
|
391
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_schema, schema, "f");
|
|
392
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_options, options, "f");
|
|
393
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_logger, options.logger ?? new drizzle_orm_1.NoopLogger(), "f");
|
|
394
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleSession_identifierCase, options.identifierCase ?? 'lower', "f");
|
|
395
|
+
}
|
|
396
|
+
prepareQuery(query, fields, _name, isResponseInArrayMode, customResultMapper, queryMetadata) {
|
|
397
|
+
return new FirebirdDrizzlePreparedQuery(__classPrivateFieldGet(this, _FirebirdDrizzleSession_client, "f"), query.sql, query.params, __classPrivateFieldGet(this, _FirebirdDrizzleSession_logger, "f"), fields, isResponseInArrayMode, customResultMapper, queryMetadata, __classPrivateFieldGet(this, _FirebirdDrizzleSession_identifierCase, "f"));
|
|
398
|
+
}
|
|
399
|
+
async transaction(transaction, config) {
|
|
400
|
+
if (!('transaction' in __classPrivateFieldGet(this, _FirebirdDrizzleSession_client, "f"))) {
|
|
401
|
+
throw new Error('Cannot start a root transaction on a transaction client');
|
|
402
|
+
}
|
|
403
|
+
return __classPrivateFieldGet(this, _FirebirdDrizzleSession_client, "f").transaction(async (txClient) => {
|
|
404
|
+
const session = new FirebirdDrizzleSession(txClient, __classPrivateFieldGet(this, _FirebirdDrizzleSession_dialect, "f"), __classPrivateFieldGet(this, _FirebirdDrizzleSession_schema, "f"), __classPrivateFieldGet(this, _FirebirdDrizzleSession_options, "f"));
|
|
405
|
+
const tx = new FirebirdDrizzleTransaction(__classPrivateFieldGet(this, _FirebirdDrizzleSession_dialect, "f"), session, __classPrivateFieldGet(this, _FirebirdDrizzleSession_schema, "f"));
|
|
406
|
+
return transaction(tx);
|
|
407
|
+
}, mapDrizzleTransactionConfig(config));
|
|
408
|
+
}
|
|
409
|
+
async count(countSql) {
|
|
410
|
+
const res = await this.execute(countSql);
|
|
411
|
+
const first = res.rows[0] ?? {};
|
|
412
|
+
const val = first['count'] ?? first['COUNT'] ?? Object.values(first)[0] ?? 0;
|
|
413
|
+
return Number(val);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
exports.FirebirdDrizzleSession = FirebirdDrizzleSession;
|
|
417
|
+
_FirebirdDrizzleSession_client = new WeakMap(), _FirebirdDrizzleSession_dialect = new WeakMap(), _FirebirdDrizzleSession_schema = new WeakMap(), _FirebirdDrizzleSession_options = new WeakMap(), _FirebirdDrizzleSession_logger = new WeakMap(), _FirebirdDrizzleSession_identifierCase = new WeakMap(), _c = drizzle_orm_1.entityKind;
|
|
418
|
+
FirebirdDrizzleSession[_c] = 'FirebirdDrizzleSession';
|
|
419
|
+
/**
|
|
420
|
+
* Drizzle transaction over a Firebird transaction, with nested savepoints.
|
|
421
|
+
*/
|
|
422
|
+
class FirebirdDrizzleTransaction extends pg_core_1.PgTransaction {
|
|
423
|
+
constructor(dialect, session, schema, nestedIndex = 0) {
|
|
424
|
+
super(dialect, session, schema, nestedIndex);
|
|
425
|
+
_FirebirdDrizzleTransaction_txDialect.set(this, void 0);
|
|
426
|
+
_FirebirdDrizzleTransaction_txSession.set(this, void 0);
|
|
427
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleTransaction_txDialect, dialect, "f");
|
|
428
|
+
__classPrivateFieldSet(this, _FirebirdDrizzleTransaction_txSession, session, "f");
|
|
429
|
+
}
|
|
430
|
+
async transaction(transaction) {
|
|
431
|
+
const savepointName = `sp${this.nestedIndex + 1}`;
|
|
432
|
+
const tx = new FirebirdDrizzleTransaction(__classPrivateFieldGet(this, _FirebirdDrizzleTransaction_txDialect, "f"), __classPrivateFieldGet(this, _FirebirdDrizzleTransaction_txSession, "f"), this.schema, this.nestedIndex + 1);
|
|
433
|
+
await tx.execute(drizzle_orm_1.sql.raw(`savepoint ${savepointName}`));
|
|
434
|
+
try {
|
|
435
|
+
const result = await transaction(tx);
|
|
436
|
+
await tx.execute(drizzle_orm_1.sql.raw(`release savepoint ${savepointName}`));
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
await tx.execute(drizzle_orm_1.sql.raw(`rollback to savepoint ${savepointName}`));
|
|
441
|
+
throw err;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
exports.FirebirdDrizzleTransaction = FirebirdDrizzleTransaction;
|
|
446
|
+
_FirebirdDrizzleTransaction_txDialect = new WeakMap(), _FirebirdDrizzleTransaction_txSession = new WeakMap(), _d = drizzle_orm_1.entityKind;
|
|
447
|
+
FirebirdDrizzleTransaction[_d] = 'FirebirdDrizzleTransaction';
|
|
448
|
+
/**
|
|
449
|
+
* Drizzle database instance backed by `FirebirdBrowser` or `FirebirdLite`.
|
|
450
|
+
*/
|
|
451
|
+
class FirebirdDrizzleDatabase extends pg_core_1.PgDatabase {
|
|
452
|
+
}
|
|
453
|
+
exports.FirebirdDrizzleDatabase = FirebirdDrizzleDatabase;
|
|
454
|
+
_e = drizzle_orm_1.entityKind;
|
|
455
|
+
FirebirdDrizzleDatabase[_e] = 'FirebirdDrizzleDatabase';
|
|
456
|
+
/**
|
|
457
|
+
* Create a Drizzle ORM database instance over a `FirebirdBrowser` or `FirebirdLite` client.
|
|
458
|
+
*/
|
|
459
|
+
function drizzle(clientOrConfig, config) {
|
|
460
|
+
let client;
|
|
461
|
+
let resolvedConfig;
|
|
462
|
+
if (typeof clientOrConfig === 'object' &&
|
|
463
|
+
clientOrConfig !== null &&
|
|
464
|
+
'client' in clientOrConfig &&
|
|
465
|
+
typeof clientOrConfig.query !== 'function') {
|
|
466
|
+
const { client: c, ...rest } = clientOrConfig;
|
|
467
|
+
client = c;
|
|
468
|
+
resolvedConfig = rest;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
client = clientOrConfig;
|
|
472
|
+
resolvedConfig = config ?? {};
|
|
473
|
+
}
|
|
474
|
+
const identifierCase = resolvedConfig.identifierCase ?? 'lower';
|
|
475
|
+
const dialect = new FirebirdDrizzleDialect({
|
|
476
|
+
casing: resolvedConfig.casing,
|
|
477
|
+
identifierCase,
|
|
478
|
+
});
|
|
479
|
+
let logger;
|
|
480
|
+
if (resolvedConfig.logger === true) {
|
|
481
|
+
logger = new drizzle_orm_1.DefaultLogger();
|
|
482
|
+
}
|
|
483
|
+
else if (resolvedConfig.logger !== false) {
|
|
484
|
+
logger = resolvedConfig.logger;
|
|
485
|
+
}
|
|
486
|
+
let schema;
|
|
487
|
+
if (resolvedConfig.schema) {
|
|
488
|
+
const tablesConfig = (0, drizzle_orm_1.extractTablesRelationalConfig)(resolvedConfig.schema, drizzle_orm_1.createTableRelationsHelpers);
|
|
489
|
+
schema = {
|
|
490
|
+
fullSchema: resolvedConfig.schema,
|
|
491
|
+
schema: tablesConfig.tables,
|
|
492
|
+
tableNamesMap: tablesConfig.tableNamesMap,
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
const session = new FirebirdDrizzleSession(client, dialect, schema, { logger, identifierCase });
|
|
496
|
+
const db = new FirebirdDrizzleDatabase(dialect, session, schema);
|
|
497
|
+
db.$client = client;
|
|
498
|
+
return db;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Map a positional row (`rowMode: 'array'`) into Drizzle's nested object shape
|
|
502
|
+
* using each selected column/expression's `mapFromDriverValue` decoder.
|
|
503
|
+
*/
|
|
504
|
+
function mapDrizzleResultRow(columns, row, joinsNotNullableMap) {
|
|
505
|
+
const nullifyMap = {};
|
|
506
|
+
const result = columns.reduce((acc, { path, field }, columnIndex) => {
|
|
507
|
+
let decoder;
|
|
508
|
+
if ((0, drizzle_orm_1.is)(field, drizzle_orm_1.Column)) {
|
|
509
|
+
decoder = field;
|
|
510
|
+
}
|
|
511
|
+
else if ((0, drizzle_orm_1.is)(field, drizzle_orm_1.SQL)) {
|
|
512
|
+
decoder = field.decoder;
|
|
513
|
+
}
|
|
514
|
+
else if ((0, drizzle_orm_1.is)(field, drizzle_orm_1.Subquery)) {
|
|
515
|
+
decoder = field._.sql.decoder;
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
decoder = field.sql
|
|
519
|
+
.decoder;
|
|
520
|
+
}
|
|
521
|
+
let node = acc;
|
|
522
|
+
for (const [pathChunkIndex, pathChunk] of path.entries()) {
|
|
523
|
+
if (pathChunkIndex < path.length - 1) {
|
|
524
|
+
if (!(pathChunk in node)) {
|
|
525
|
+
node[pathChunk] = {};
|
|
526
|
+
}
|
|
527
|
+
node = node[pathChunk];
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
const rawValue = row[columnIndex];
|
|
531
|
+
const value = (node[pathChunk] =
|
|
532
|
+
rawValue === null || rawValue === undefined
|
|
533
|
+
? null
|
|
534
|
+
: decoder.mapFromDriverValue(rawValue));
|
|
535
|
+
if (joinsNotNullableMap && (0, drizzle_orm_1.is)(field, drizzle_orm_1.Column) && path.length === 2) {
|
|
536
|
+
const objectName = path[0];
|
|
537
|
+
if (!(objectName in nullifyMap)) {
|
|
538
|
+
nullifyMap[objectName] =
|
|
539
|
+
value === null ? (0, drizzle_orm_1.getTableName)(field.table) : false;
|
|
540
|
+
}
|
|
541
|
+
else if (typeof nullifyMap[objectName] === 'string' &&
|
|
542
|
+
nullifyMap[objectName] !== (0, drizzle_orm_1.getTableName)(field.table)) {
|
|
543
|
+
nullifyMap[objectName] = false;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return acc;
|
|
549
|
+
}, {});
|
|
550
|
+
if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
|
|
551
|
+
for (const [objectName, tableName] of Object.entries(nullifyMap)) {
|
|
552
|
+
if (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {
|
|
553
|
+
result[objectName] = null;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return result;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Convert Drizzle's `Date.toISOString()` (`YYYY-MM-DDTHH:mm:ss.sssZ`) parameter
|
|
561
|
+
* strings to Firebird's `YYYY-MM-DD HH:mm:ss.sss` timestamp literal format.
|
|
562
|
+
*/
|
|
563
|
+
function normalizeParams(params) {
|
|
564
|
+
return params.map((p) => {
|
|
565
|
+
if (typeof p === 'string' &&
|
|
566
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/.test(p)) {
|
|
567
|
+
return p.replace('T', ' ').replace(/Z$/, '');
|
|
568
|
+
}
|
|
569
|
+
return p;
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
function mapObjectRows(rows, mode) {
|
|
573
|
+
if (mode === 'preserve' || rows.length === 0) {
|
|
574
|
+
return rows;
|
|
575
|
+
}
|
|
576
|
+
const first = rows[0];
|
|
577
|
+
const keys = Object.keys(first);
|
|
578
|
+
const mappedKeys = keys.map((k) => /^[A-Z_][A-Z0-9_$]*$/.test(k) ? k.toLowerCase() : k);
|
|
579
|
+
if (keys.every((k, i) => k === mappedKeys[i])) {
|
|
580
|
+
return rows;
|
|
581
|
+
}
|
|
582
|
+
return rows.map((row) => {
|
|
583
|
+
const out = {};
|
|
584
|
+
for (let i = 0; i < keys.length; i++) {
|
|
585
|
+
out[mappedKeys[i]] = row[keys[i]];
|
|
586
|
+
}
|
|
587
|
+
return out;
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
function mapDrizzleTransactionConfig(config) {
|
|
591
|
+
if (!config)
|
|
592
|
+
return undefined;
|
|
593
|
+
const options = {};
|
|
594
|
+
if (config.accessMode === 'read only') {
|
|
595
|
+
options.readOnly = true;
|
|
596
|
+
}
|
|
597
|
+
switch (config.isolationLevel) {
|
|
598
|
+
case 'read uncommitted':
|
|
599
|
+
case 'read committed':
|
|
600
|
+
options.isolationLevel = 'READ_COMMITTED';
|
|
601
|
+
break;
|
|
602
|
+
case 'repeatable read':
|
|
603
|
+
options.isolationLevel = 'SNAPSHOT';
|
|
604
|
+
break;
|
|
605
|
+
case 'serializable':
|
|
606
|
+
options.isolationLevel = 'SNAPSHOT_TABLE_STABILITY';
|
|
607
|
+
break;
|
|
608
|
+
}
|
|
609
|
+
return options;
|
|
610
|
+
}
|
|
611
|
+
function extractAffectedRows(res) {
|
|
612
|
+
if (typeof res === 'object' && res !== null && 'affectedRows' in res) {
|
|
613
|
+
const n = res.affectedRows;
|
|
614
|
+
return typeof n === 'number' ? n : undefined;
|
|
615
|
+
}
|
|
616
|
+
if (Array.isArray(res)) {
|
|
617
|
+
let total = 0;
|
|
618
|
+
for (const item of res) {
|
|
619
|
+
if (typeof item === 'object' && item !== null && 'affectedRows' in item) {
|
|
620
|
+
total += Number(item.affectedRows ?? 0);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return total;
|
|
624
|
+
}
|
|
625
|
+
return undefined;
|
|
626
|
+
}
|
|
627
|
+
//# sourceMappingURL=index.js.map
|