kysely 0.26.3 → 0.27.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/dist/cjs/dialect/dialect-adapter-base.d.ts +8 -0
- package/dist/cjs/dialect/dialect-adapter-base.js +3 -0
- package/dist/cjs/dialect/dialect-adapter.d.ts +8 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +78 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.js +30 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +143 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.js +2 -0
- package/dist/cjs/dialect/mssql/mssql-dialect.d.ts +70 -0
- package/dist/cjs/dialect/mssql/mssql-dialect.js +65 -0
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +54 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +268 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.d.ts +20 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.js +97 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +11 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +64 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +28 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +1 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +1 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -1
- package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +15 -2
- package/dist/cjs/driver/driver.d.ts +1 -1
- package/dist/cjs/driver/driver.js +1 -0
- package/dist/cjs/driver/runtime-driver.js +5 -1
- package/dist/cjs/driver/single-connection-provider.js +7 -8
- package/dist/cjs/expression/expression-builder.d.ts +66 -75
- package/dist/cjs/expression/expression-builder.js +8 -17
- package/dist/cjs/expression/expression-wrapper.d.ts +8 -8
- package/dist/cjs/helpers/mssql.d.ts +152 -0
- package/dist/cjs/helpers/mssql.js +160 -0
- package/dist/cjs/index.d.ts +7 -1
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/migration/migrator.js +12 -16
- package/dist/cjs/operation-node/add-index-node.d.ts +21 -0
- package/dist/cjs/operation-node/add-index-node.js +31 -0
- package/dist/cjs/operation-node/alter-table-node.d.ts +5 -1
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
- package/dist/cjs/operation-node/create-index-node.d.ts +1 -0
- package/dist/cjs/operation-node/create-table-node.d.ts +1 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +2 -0
- package/dist/cjs/operation-node/unique-constraint-node.d.ts +4 -1
- package/dist/cjs/operation-node/unique-constraint-node.js +8 -1
- package/dist/cjs/parser/binary-operation-parser.js +1 -1
- package/dist/cjs/parser/coalesce-parser.d.ts +12 -2
- package/dist/cjs/parser/reference-parser.d.ts +2 -1
- package/dist/cjs/parser/update-set-parser.d.ts +5 -2
- package/dist/cjs/parser/update-set-parser.js +13 -3
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +4 -4
- package/dist/cjs/query-builder/case-builder.d.ts +5 -4
- package/dist/cjs/query-builder/delete-query-builder.d.ts +3 -3
- package/dist/cjs/query-builder/function-module.d.ts +96 -25
- package/dist/cjs/query-builder/function-module.js +17 -3
- package/dist/cjs/query-builder/having-interface.d.ts +3 -5
- package/dist/cjs/query-builder/insert-query-builder.d.ts +27 -9
- package/dist/cjs/query-builder/insert-query-builder.js +3 -3
- package/dist/cjs/query-builder/insert-result.d.ts +8 -1
- package/dist/cjs/query-builder/insert-result.js +8 -1
- package/dist/cjs/query-builder/json-path-builder.d.ts +3 -2
- package/dist/cjs/query-builder/json-path-builder.js +6 -3
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +58 -16
- package/dist/cjs/query-builder/on-conflict-builder.js +1 -6
- package/dist/cjs/query-builder/over-builder.d.ts +2 -2
- package/dist/cjs/query-builder/select-query-builder.d.ts +38 -22
- package/dist/cjs/query-builder/update-query-builder.d.ts +20 -4
- package/dist/cjs/query-builder/update-query-builder.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +3 -3
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +9 -1
- package/dist/cjs/query-compiler/default-query-compiler.js +65 -12
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +104 -0
- package/dist/cjs/schema/alter-table-add-index-builder.js +146 -0
- package/dist/cjs/schema/alter-table-builder.d.ts +41 -1
- package/dist/cjs/schema/alter-table-builder.js +59 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +25 -0
- package/dist/cjs/schema/column-definition-builder.js +27 -0
- package/dist/cjs/schema/create-index-builder.d.ts +23 -0
- package/dist/cjs/schema/create-index-builder.js +30 -0
- package/dist/cjs/schema/create-table-builder.d.ts +28 -2
- package/dist/cjs/schema/create-table-builder.js +38 -3
- package/dist/cjs/schema/unique-constraint-builder.d.ts +14 -0
- package/dist/cjs/schema/unique-constraint-builder.js +24 -0
- package/dist/cjs/util/log.js +5 -1
- package/dist/cjs/util/object-utils.d.ts +1 -1
- package/dist/cjs/util/type-utils.d.ts +27 -19
- package/dist/esm/dialect/dialect-adapter-base.d.ts +8 -0
- package/dist/esm/dialect/dialect-adapter-base.js +3 -0
- package/dist/esm/dialect/dialect-adapter.d.ts +8 -0
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +78 -0
- package/dist/esm/dialect/mssql/mssql-adapter.js +27 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +143 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.js +2 -0
- package/dist/esm/dialect/mssql/mssql-dialect.d.ts +70 -0
- package/dist/esm/dialect/mssql/mssql-dialect.js +62 -0
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +54 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +265 -0
- package/dist/esm/dialect/mssql/mssql-introspector.d.ts +20 -0
- package/dist/esm/dialect/mssql/mssql-introspector.js +94 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +11 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +61 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +28 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +1 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +1 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -1
- package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.js +15 -2
- package/dist/esm/driver/driver.d.ts +1 -1
- package/dist/esm/driver/driver.js +1 -0
- package/dist/esm/driver/runtime-driver.js +5 -1
- package/dist/esm/driver/single-connection-provider.js +7 -8
- package/dist/esm/expression/expression-builder.d.ts +66 -75
- package/dist/esm/expression/expression-builder.js +10 -19
- package/dist/esm/expression/expression-wrapper.d.ts +8 -8
- package/dist/esm/helpers/mssql.d.ts +152 -0
- package/dist/esm/helpers/mssql.js +155 -0
- package/dist/esm/index.d.ts +7 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/migration/migrator.js +12 -16
- package/dist/esm/operation-node/add-index-node.d.ts +21 -0
- package/dist/esm/operation-node/add-index-node.js +29 -0
- package/dist/esm/operation-node/alter-table-node.d.ts +5 -1
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/column-update-node.d.ts +2 -3
- package/dist/esm/operation-node/create-index-node.d.ts +1 -0
- package/dist/esm/operation-node/create-table-node.d.ts +1 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +17 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +2 -0
- package/dist/esm/operation-node/unique-constraint-node.d.ts +4 -1
- package/dist/esm/operation-node/unique-constraint-node.js +8 -1
- package/dist/esm/parser/binary-operation-parser.js +1 -1
- package/dist/esm/parser/coalesce-parser.d.ts +12 -2
- package/dist/esm/parser/reference-parser.d.ts +2 -1
- package/dist/esm/parser/update-set-parser.d.ts +5 -2
- package/dist/esm/parser/update-set-parser.js +10 -1
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +4 -4
- package/dist/esm/query-builder/case-builder.d.ts +5 -4
- package/dist/esm/query-builder/delete-query-builder.d.ts +3 -3
- package/dist/esm/query-builder/function-module.d.ts +96 -25
- package/dist/esm/query-builder/function-module.js +17 -3
- package/dist/esm/query-builder/having-interface.d.ts +3 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +27 -9
- package/dist/esm/query-builder/insert-query-builder.js +4 -4
- package/dist/esm/query-builder/insert-result.d.ts +8 -1
- package/dist/esm/query-builder/insert-result.js +8 -1
- package/dist/esm/query-builder/json-path-builder.d.ts +3 -2
- package/dist/esm/query-builder/json-path-builder.js +6 -3
- package/dist/esm/query-builder/on-conflict-builder.d.ts +58 -16
- package/dist/esm/query-builder/on-conflict-builder.js +2 -7
- package/dist/esm/query-builder/over-builder.d.ts +2 -2
- package/dist/esm/query-builder/select-query-builder.d.ts +38 -22
- package/dist/esm/query-builder/update-query-builder.d.ts +20 -4
- package/dist/esm/query-builder/update-query-builder.js +3 -3
- package/dist/esm/query-builder/where-interface.d.ts +3 -3
- package/dist/esm/query-compiler/default-query-compiler.d.ts +9 -1
- package/dist/esm/query-compiler/default-query-compiler.js +65 -12
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +104 -0
- package/dist/esm/schema/alter-table-add-index-builder.js +143 -0
- package/dist/esm/schema/alter-table-builder.d.ts +41 -1
- package/dist/esm/schema/alter-table-builder.js +59 -2
- package/dist/esm/schema/column-definition-builder.d.ts +25 -0
- package/dist/esm/schema/column-definition-builder.js +27 -0
- package/dist/esm/schema/create-index-builder.d.ts +23 -0
- package/dist/esm/schema/create-index-builder.js +30 -0
- package/dist/esm/schema/create-table-builder.d.ts +28 -2
- package/dist/esm/schema/create-table-builder.js +38 -3
- package/dist/esm/schema/unique-constraint-builder.d.ts +14 -0
- package/dist/esm/schema/unique-constraint-builder.js +21 -0
- package/dist/esm/util/log.js +5 -1
- package/dist/esm/util/object-utils.d.ts +1 -1
- package/dist/esm/util/type-utils.d.ts +27 -19
- package/helpers/mssql.d.ts +1 -0
- package/helpers/mssql.js +1 -0
- package/package.json +17 -6
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/// <reference types="./mssql-driver.d.ts" />
|
|
2
|
+
import { freeze, isBigInt, isBoolean, isBuffer, isDate, isNull, isNumber, isString, isUndefined, } from '../../util/object-utils.js';
|
|
3
|
+
import { CompiledQuery } from '../../query-compiler/compiled-query.js';
|
|
4
|
+
import { extendStackTrace } from '../../util/stack-trace-utils.js';
|
|
5
|
+
import { randomString } from '../../util/random-string.js';
|
|
6
|
+
import { Deferred } from '../../util/deferred.js';
|
|
7
|
+
const PRIVATE_RELEASE_METHOD = Symbol();
|
|
8
|
+
const PRIVATE_DESTROY_METHOD = Symbol();
|
|
9
|
+
export class MssqlDriver {
|
|
10
|
+
#config;
|
|
11
|
+
#pool;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.#config = freeze({ ...config });
|
|
14
|
+
this.#pool = new this.#config.tarn.Pool({
|
|
15
|
+
...this.#config.tarn.options,
|
|
16
|
+
create: async () => {
|
|
17
|
+
const connection = await this.#config.tedious.connectionFactory();
|
|
18
|
+
await new Promise((resolve, reject) => connection.connect((error) => {
|
|
19
|
+
if (error)
|
|
20
|
+
reject(error);
|
|
21
|
+
else
|
|
22
|
+
resolve(undefined);
|
|
23
|
+
}));
|
|
24
|
+
return new MssqlConnection(connection, this.#config.tedious);
|
|
25
|
+
},
|
|
26
|
+
destroy: async (connection) => {
|
|
27
|
+
await connection[PRIVATE_DESTROY_METHOD]();
|
|
28
|
+
},
|
|
29
|
+
// @ts-ignore `tarn` accepts a function that returns a promise here, but
|
|
30
|
+
// the types are not aligned and it type errors.
|
|
31
|
+
validate: (connection) => connection.validate(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async init() {
|
|
35
|
+
// noop
|
|
36
|
+
}
|
|
37
|
+
async acquireConnection() {
|
|
38
|
+
return await this.#pool.acquire().promise;
|
|
39
|
+
}
|
|
40
|
+
async beginTransaction(connection, settings) {
|
|
41
|
+
await connection.beginTransaction(settings);
|
|
42
|
+
}
|
|
43
|
+
async commitTransaction(connection) {
|
|
44
|
+
await connection.commitTransaction();
|
|
45
|
+
}
|
|
46
|
+
async rollbackTransaction(connection) {
|
|
47
|
+
await connection.rollbackTransaction();
|
|
48
|
+
}
|
|
49
|
+
async releaseConnection(connection) {
|
|
50
|
+
await connection[PRIVATE_RELEASE_METHOD]();
|
|
51
|
+
this.#pool.release(connection);
|
|
52
|
+
}
|
|
53
|
+
async destroy() {
|
|
54
|
+
await this.#pool.destroy();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
class MssqlConnection {
|
|
58
|
+
#connection;
|
|
59
|
+
#tedious;
|
|
60
|
+
constructor(connection, tedious) {
|
|
61
|
+
this.#connection = connection;
|
|
62
|
+
this.#tedious = tedious;
|
|
63
|
+
}
|
|
64
|
+
async beginTransaction(settings) {
|
|
65
|
+
const { isolationLevel } = settings;
|
|
66
|
+
await new Promise((resolve, reject) => this.#connection.beginTransaction((error) => {
|
|
67
|
+
if (error)
|
|
68
|
+
reject(error);
|
|
69
|
+
else
|
|
70
|
+
resolve(undefined);
|
|
71
|
+
}, isolationLevel ? randomString(8) : undefined, isolationLevel
|
|
72
|
+
? this.#getTediousIsolationLevel(isolationLevel)
|
|
73
|
+
: undefined));
|
|
74
|
+
}
|
|
75
|
+
async commitTransaction() {
|
|
76
|
+
await new Promise((resolve, reject) => this.#connection.commitTransaction((error) => {
|
|
77
|
+
if (error)
|
|
78
|
+
reject(error);
|
|
79
|
+
else
|
|
80
|
+
resolve(undefined);
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
async executeQuery(compiledQuery) {
|
|
84
|
+
try {
|
|
85
|
+
const deferred = new Deferred();
|
|
86
|
+
const request = new MssqlRequest(this.#tedious, compiledQuery, deferred);
|
|
87
|
+
this.#connection.execSql(request.request);
|
|
88
|
+
const { rowCount, rows } = await deferred.promise;
|
|
89
|
+
return {
|
|
90
|
+
numAffectedRows: rowCount !== undefined ? BigInt(rowCount) : undefined,
|
|
91
|
+
rows,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw extendStackTrace(err, new Error());
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async rollbackTransaction() {
|
|
99
|
+
await new Promise((resolve, reject) => this.#connection.rollbackTransaction((error) => {
|
|
100
|
+
if (error)
|
|
101
|
+
reject(error);
|
|
102
|
+
else
|
|
103
|
+
resolve(undefined);
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
async *streamQuery(compiledQuery, chunkSize) {
|
|
107
|
+
if (!Number.isInteger(chunkSize) || chunkSize <= 0) {
|
|
108
|
+
throw new Error('chunkSize must be a positive integer');
|
|
109
|
+
}
|
|
110
|
+
const request = new MssqlRequest(this.#tedious, compiledQuery);
|
|
111
|
+
this.#connection.execSql(request.request);
|
|
112
|
+
try {
|
|
113
|
+
while (true) {
|
|
114
|
+
const rows = await request.readChunk(chunkSize);
|
|
115
|
+
if (rows.length === 0) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
yield { rows };
|
|
119
|
+
if (rows.length < chunkSize) {
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
this.#connection.cancel();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async validate() {
|
|
129
|
+
try {
|
|
130
|
+
const deferred = new Deferred();
|
|
131
|
+
const request = new MssqlRequest(this.#tedious, CompiledQuery.raw('select 1'), deferred);
|
|
132
|
+
this.#connection.execSql(request.request);
|
|
133
|
+
await deferred.promise;
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
#getTediousIsolationLevel(isolationLevel) {
|
|
141
|
+
const { ISOLATION_LEVEL } = this.#tedious;
|
|
142
|
+
const mapper = {
|
|
143
|
+
'read committed': ISOLATION_LEVEL.READ_COMMITTED,
|
|
144
|
+
'read uncommitted': ISOLATION_LEVEL.READ_UNCOMMITTED,
|
|
145
|
+
'repeatable read': ISOLATION_LEVEL.REPEATABLE_READ,
|
|
146
|
+
serializable: ISOLATION_LEVEL.SERIALIZABLE,
|
|
147
|
+
snapshot: ISOLATION_LEVEL.SNAPSHOT,
|
|
148
|
+
};
|
|
149
|
+
const tediousIsolationLevel = mapper[isolationLevel];
|
|
150
|
+
if (tediousIsolationLevel === undefined) {
|
|
151
|
+
throw new Error(`Unknown isolation level: ${isolationLevel}`);
|
|
152
|
+
}
|
|
153
|
+
return tediousIsolationLevel;
|
|
154
|
+
}
|
|
155
|
+
[PRIVATE_RELEASE_METHOD]() {
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
this.#connection.reset((error) => {
|
|
158
|
+
if (error)
|
|
159
|
+
reject(error);
|
|
160
|
+
else
|
|
161
|
+
resolve(undefined);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
[PRIVATE_DESTROY_METHOD]() {
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
this.#connection.once('end', () => {
|
|
168
|
+
resolve(undefined);
|
|
169
|
+
});
|
|
170
|
+
this.#connection.close();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
class MssqlRequest {
|
|
175
|
+
#request;
|
|
176
|
+
#rows;
|
|
177
|
+
#tedious;
|
|
178
|
+
#completed;
|
|
179
|
+
#error;
|
|
180
|
+
#rowCount;
|
|
181
|
+
constructor(tedious, compiledQuery, onDone) {
|
|
182
|
+
this.#completed = false;
|
|
183
|
+
this.#rows = [];
|
|
184
|
+
this.#tedious = tedious;
|
|
185
|
+
const { parameters, sql } = compiledQuery;
|
|
186
|
+
this.#request = new this.#tedious.Request(sql, (err, rowCount) => {
|
|
187
|
+
if (err) {
|
|
188
|
+
this.#error = err instanceof AggregateError ? err.errors : err;
|
|
189
|
+
onDone?.reject(this.#error);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.#rowCount = rowCount;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
this.#addParametersToRequest(parameters);
|
|
196
|
+
this.#attachListeners(onDone);
|
|
197
|
+
}
|
|
198
|
+
get request() {
|
|
199
|
+
return this.#request;
|
|
200
|
+
}
|
|
201
|
+
readChunk(chunkSize) {
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
const interval = setInterval(() => {
|
|
204
|
+
if (this.#error) {
|
|
205
|
+
clearInterval(interval);
|
|
206
|
+
reject(this.#error);
|
|
207
|
+
}
|
|
208
|
+
else if (this.#completed || this.#rows.length >= chunkSize) {
|
|
209
|
+
clearInterval(interval);
|
|
210
|
+
resolve(this.#rows.splice(0, chunkSize));
|
|
211
|
+
}
|
|
212
|
+
}, 0);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
#addParametersToRequest(parameters) {
|
|
216
|
+
for (let i = 0; i < parameters.length; i++) {
|
|
217
|
+
const parameter = parameters[i];
|
|
218
|
+
this.#request.addParameter(String(i + 1), this.#getTediousDataType(parameter), parameter);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
#attachListeners(onDone) {
|
|
222
|
+
const rowListener = (columns) => {
|
|
223
|
+
const row = {};
|
|
224
|
+
for (const column of columns) {
|
|
225
|
+
row[column.metadata.colName] = column.value;
|
|
226
|
+
}
|
|
227
|
+
this.#rows.push(row);
|
|
228
|
+
};
|
|
229
|
+
this.#request.on('row', rowListener);
|
|
230
|
+
this.#request.once('requestCompleted', () => {
|
|
231
|
+
this.#completed = true;
|
|
232
|
+
this.#request.off('row', rowListener);
|
|
233
|
+
onDone?.resolve({
|
|
234
|
+
rowCount: this.#rowCount,
|
|
235
|
+
rows: this.#rows,
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
#getTediousDataType(value) {
|
|
240
|
+
if (isNull(value) || isUndefined(value) || isString(value)) {
|
|
241
|
+
return this.#tedious.TYPES.NVarChar;
|
|
242
|
+
}
|
|
243
|
+
if (isBigInt(value) || (isNumber(value) && value % 1 === 0)) {
|
|
244
|
+
if (value < -2147483648 || value > 2147483647) {
|
|
245
|
+
return this.#tedious.TYPES.BigInt;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
return this.#tedious.TYPES.Int;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (isNumber(value)) {
|
|
252
|
+
return this.#tedious.TYPES.Float;
|
|
253
|
+
}
|
|
254
|
+
if (isBoolean(value)) {
|
|
255
|
+
return this.#tedious.TYPES.Bit;
|
|
256
|
+
}
|
|
257
|
+
if (isDate(value)) {
|
|
258
|
+
return this.#tedious.TYPES.DateTime;
|
|
259
|
+
}
|
|
260
|
+
if (isBuffer(value)) {
|
|
261
|
+
return this.#tedious.TYPES.VarBinary;
|
|
262
|
+
}
|
|
263
|
+
return this.#tedious.TYPES.NVarChar;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Kysely } from '../../kysely.js';
|
|
2
|
+
import { DatabaseIntrospector, DatabaseMetadata, DatabaseMetadataOptions, SchemaMetadata, TableMetadata } from '../database-introspector.js';
|
|
3
|
+
export declare class MssqlIntrospector implements DatabaseIntrospector {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(db: Kysely<any>);
|
|
6
|
+
/**
|
|
7
|
+
* Get schema metadata.
|
|
8
|
+
*/
|
|
9
|
+
getSchemas(): Promise<SchemaMetadata[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Get tables and views metadata.
|
|
12
|
+
*/
|
|
13
|
+
getTables(options?: DatabaseMetadataOptions): Promise<TableMetadata[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the database metadata such as table and column names.
|
|
16
|
+
*
|
|
17
|
+
* @deprecated Use getTables() instead.
|
|
18
|
+
*/
|
|
19
|
+
getMetadata(options?: DatabaseMetadataOptions): Promise<DatabaseMetadata>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/// <reference types="./mssql-introspector.d.ts" />
|
|
2
|
+
import { DEFAULT_MIGRATION_LOCK_TABLE, DEFAULT_MIGRATION_TABLE, } from '../../migration/migrator.js';
|
|
3
|
+
import { freeze } from '../../util/object-utils.js';
|
|
4
|
+
export class MssqlIntrospector {
|
|
5
|
+
#db;
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.#db = db;
|
|
8
|
+
}
|
|
9
|
+
async getSchemas() {
|
|
10
|
+
return await this.#db.selectFrom('sys.schemas').select('name').execute();
|
|
11
|
+
}
|
|
12
|
+
async getTables(options = { withInternalKyselyTables: false }) {
|
|
13
|
+
const rawColumns = await this.#db
|
|
14
|
+
.selectFrom('sys.tables as tables')
|
|
15
|
+
.leftJoin('sys.schemas as table_schemas', 'table_schemas.schema_id', 'tables.schema_id')
|
|
16
|
+
.innerJoin('sys.columns as columns', 'columns.object_id', 'tables.object_id')
|
|
17
|
+
.innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
|
|
18
|
+
.leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
|
|
19
|
+
.$if(!options.withInternalKyselyTables, (qb) => qb
|
|
20
|
+
.where('tables.name', '!=', DEFAULT_MIGRATION_TABLE)
|
|
21
|
+
.where('tables.name', '!=', DEFAULT_MIGRATION_LOCK_TABLE))
|
|
22
|
+
.select([
|
|
23
|
+
'tables.name as table_name',
|
|
24
|
+
(eb) => eb
|
|
25
|
+
.ref('tables.type')
|
|
26
|
+
.$castTo()
|
|
27
|
+
.as('table_type'),
|
|
28
|
+
'table_schemas.name as table_schema_name',
|
|
29
|
+
'columns.default_object_id as column_default_object_id',
|
|
30
|
+
'columns.generated_always_type_desc as column_generated_always_type',
|
|
31
|
+
'columns.is_computed as column_is_computed',
|
|
32
|
+
'columns.is_identity as column_is_identity',
|
|
33
|
+
'columns.is_nullable as column_is_nullable',
|
|
34
|
+
'columns.is_rowguidcol as column_is_rowguidcol',
|
|
35
|
+
'columns.name as column_name',
|
|
36
|
+
'types.is_nullable as type_is_nullable',
|
|
37
|
+
'types.name as type_name',
|
|
38
|
+
'type_schemas.name as type_schema_name',
|
|
39
|
+
])
|
|
40
|
+
.unionAll(this.#db
|
|
41
|
+
.selectFrom('sys.views as views')
|
|
42
|
+
.leftJoin('sys.schemas as view_schemas', 'view_schemas.schema_id', 'views.schema_id')
|
|
43
|
+
.innerJoin('sys.columns as columns', 'columns.object_id', 'views.object_id')
|
|
44
|
+
.innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
|
|
45
|
+
.leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
|
|
46
|
+
.select([
|
|
47
|
+
'views.name as table_name',
|
|
48
|
+
'views.type as table_type',
|
|
49
|
+
'view_schemas.name as table_schema_name',
|
|
50
|
+
'columns.default_object_id as column_default_object_id',
|
|
51
|
+
'columns.generated_always_type_desc as column_generated_always_type',
|
|
52
|
+
'columns.is_computed as column_is_computed',
|
|
53
|
+
'columns.is_identity as column_is_identity',
|
|
54
|
+
'columns.is_nullable as column_is_nullable',
|
|
55
|
+
'columns.is_rowguidcol as column_is_rowguidcol',
|
|
56
|
+
'columns.name as column_name',
|
|
57
|
+
'types.is_nullable as type_is_nullable',
|
|
58
|
+
'types.name as type_name',
|
|
59
|
+
'type_schemas.name as type_schema_name',
|
|
60
|
+
]))
|
|
61
|
+
.orderBy('table_schema_name')
|
|
62
|
+
.orderBy('table_name')
|
|
63
|
+
.orderBy('column_name')
|
|
64
|
+
.execute();
|
|
65
|
+
const tableDictionary = {};
|
|
66
|
+
for (const rawColumn of rawColumns) {
|
|
67
|
+
const key = `${rawColumn.table_schema_name}.${rawColumn.table_name}`;
|
|
68
|
+
const table = (tableDictionary[key] ||= freeze({
|
|
69
|
+
columns: [],
|
|
70
|
+
isView: rawColumn.table_type === 'V ',
|
|
71
|
+
name: rawColumn.table_name,
|
|
72
|
+
schema: rawColumn.table_schema_name ?? undefined,
|
|
73
|
+
}));
|
|
74
|
+
table.columns.push(freeze({
|
|
75
|
+
dataType: rawColumn.type_name,
|
|
76
|
+
dataTypeSchema: rawColumn.type_schema_name ?? undefined,
|
|
77
|
+
hasDefaultValue: rawColumn.column_default_object_id > 0 ||
|
|
78
|
+
rawColumn.column_generated_always_type !== 'NOT_APPLICABLE' ||
|
|
79
|
+
rawColumn.column_is_identity ||
|
|
80
|
+
rawColumn.column_is_computed ||
|
|
81
|
+
rawColumn.column_is_rowguidcol,
|
|
82
|
+
isAutoIncrementing: rawColumn.column_is_identity,
|
|
83
|
+
isNullable: rawColumn.column_is_nullable && rawColumn.type_is_nullable,
|
|
84
|
+
name: rawColumn.column_name,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
return Object.values(tableDictionary);
|
|
88
|
+
}
|
|
89
|
+
async getMetadata(options) {
|
|
90
|
+
return {
|
|
91
|
+
tables: await this.getTables(options),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AddColumnNode } from '../../operation-node/add-column-node.js';
|
|
2
|
+
import { AlterTableColumnAlterationNode } from '../../operation-node/alter-table-node.js';
|
|
3
|
+
import { DropColumnNode } from '../../operation-node/drop-column-node.js';
|
|
4
|
+
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
5
|
+
export declare class MssqlQueryCompiler extends DefaultQueryCompiler {
|
|
6
|
+
protected getCurrentParameterPlaceholder(): string;
|
|
7
|
+
protected compileColumnAlterations(columnAlterations: readonly AlterTableColumnAlterationNode[]): void;
|
|
8
|
+
protected visitAddColumn(node: AddColumnNode): void;
|
|
9
|
+
protected visitDropColumn(node: DropColumnNode): void;
|
|
10
|
+
protected announcesNewColumnDataType(): boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/// <reference types="./mssql-query-compiler.d.ts" />
|
|
2
|
+
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
3
|
+
export class MssqlQueryCompiler extends DefaultQueryCompiler {
|
|
4
|
+
getCurrentParameterPlaceholder() {
|
|
5
|
+
return `@${this.numParameters}`;
|
|
6
|
+
}
|
|
7
|
+
// mssql allows multi-column alterations in a single statement,
|
|
8
|
+
// but you can only use the command keyword/s once.
|
|
9
|
+
// it also doesn't support multiple kinds of commands in the same
|
|
10
|
+
// alter table statement, but we compile that anyway for the sake
|
|
11
|
+
// of WYSIWYG.
|
|
12
|
+
compileColumnAlterations(columnAlterations) {
|
|
13
|
+
const nodesByKind = {};
|
|
14
|
+
for (const columnAlteration of columnAlterations) {
|
|
15
|
+
if (!nodesByKind[columnAlteration.kind]) {
|
|
16
|
+
nodesByKind[columnAlteration.kind] = [];
|
|
17
|
+
}
|
|
18
|
+
nodesByKind[columnAlteration.kind].push(columnAlteration);
|
|
19
|
+
}
|
|
20
|
+
let first = true;
|
|
21
|
+
if (nodesByKind.AddColumnNode) {
|
|
22
|
+
this.append('add ');
|
|
23
|
+
this.compileList(nodesByKind.AddColumnNode);
|
|
24
|
+
first = false;
|
|
25
|
+
}
|
|
26
|
+
// multiple of these are not really supported by mssql,
|
|
27
|
+
// but for the sake of WYSIWYG.
|
|
28
|
+
if (nodesByKind.AlterColumnNode) {
|
|
29
|
+
if (!first)
|
|
30
|
+
this.append(', ');
|
|
31
|
+
this.compileList(nodesByKind.AlterColumnNode);
|
|
32
|
+
}
|
|
33
|
+
if (nodesByKind.DropColumnNode) {
|
|
34
|
+
if (!first)
|
|
35
|
+
this.append(', ');
|
|
36
|
+
this.append('drop column ');
|
|
37
|
+
this.compileList(nodesByKind.DropColumnNode);
|
|
38
|
+
}
|
|
39
|
+
// not really supported by mssql, but for the sake of WYSIWYG.
|
|
40
|
+
if (nodesByKind.ModifyColumnNode) {
|
|
41
|
+
if (!first)
|
|
42
|
+
this.append(', ');
|
|
43
|
+
this.compileList(nodesByKind.ModifyColumnNode);
|
|
44
|
+
}
|
|
45
|
+
// not really supported by mssql, but for the sake of WYSIWYG.
|
|
46
|
+
if (nodesByKind.RenameColumnNode) {
|
|
47
|
+
if (!first)
|
|
48
|
+
this.append(', ');
|
|
49
|
+
this.compileList(nodesByKind.RenameColumnNode);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
visitAddColumn(node) {
|
|
53
|
+
this.visitNode(node.column);
|
|
54
|
+
}
|
|
55
|
+
visitDropColumn(node) {
|
|
56
|
+
this.visitNode(node.column);
|
|
57
|
+
}
|
|
58
|
+
announcesNewColumnDataType() {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CreateIndexNode } from '../../operation-node/create-index-node.js';
|
|
1
2
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
2
3
|
export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
|
|
3
4
|
protected getCurrentParameterPlaceholder(): string;
|
|
@@ -8,4 +9,5 @@ export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
|
|
|
8
9
|
protected getLeftIdentifierWrapper(): string;
|
|
9
10
|
protected getRightIdentifierWrapper(): string;
|
|
10
11
|
protected sanitizeIdentifier(identifier: string): string;
|
|
12
|
+
protected visitCreateIndex(node: CreateIndexNode): void;
|
|
11
13
|
}
|
|
@@ -26,4 +26,32 @@ export class MysqlQueryCompiler extends DefaultQueryCompiler {
|
|
|
26
26
|
sanitizeIdentifier(identifier) {
|
|
27
27
|
return identifier.replace(ID_WRAP_REGEX, '``');
|
|
28
28
|
}
|
|
29
|
+
visitCreateIndex(node) {
|
|
30
|
+
this.append('create ');
|
|
31
|
+
if (node.unique) {
|
|
32
|
+
this.append('unique ');
|
|
33
|
+
}
|
|
34
|
+
this.append('index ');
|
|
35
|
+
if (node.ifNotExists) {
|
|
36
|
+
this.append('if not exists ');
|
|
37
|
+
}
|
|
38
|
+
this.visitNode(node.name);
|
|
39
|
+
if (node.using) {
|
|
40
|
+
this.append(' using ');
|
|
41
|
+
this.visitNode(node.using);
|
|
42
|
+
}
|
|
43
|
+
if (node.table) {
|
|
44
|
+
this.append(' on ');
|
|
45
|
+
this.visitNode(node.table);
|
|
46
|
+
}
|
|
47
|
+
if (node.columns) {
|
|
48
|
+
this.append(' (');
|
|
49
|
+
this.compileList(node.columns);
|
|
50
|
+
this.append(')');
|
|
51
|
+
}
|
|
52
|
+
if (node.where) {
|
|
53
|
+
this.append(' ');
|
|
54
|
+
this.visitNode(node.where);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
29
57
|
}
|
|
@@ -26,7 +26,7 @@ export class PostgresDriver {
|
|
|
26
26
|
// The driver must take care of calling `onCreateConnection` when a new
|
|
27
27
|
// connection is created. The `pg` module doesn't provide an async hook
|
|
28
28
|
// for the connection creation. We need to call the method explicitly.
|
|
29
|
-
if (this.#config
|
|
29
|
+
if (this.#config.onCreateConnection) {
|
|
30
30
|
await this.#config.onCreateConnection(connection);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Kysely } from '../../kysely.js';
|
|
2
2
|
import { DialectAdapterBase } from '../dialect-adapter-base.js';
|
|
3
3
|
import { MigrationLockOptions } from '../dialect-adapter.js';
|
|
4
|
-
export declare class SqliteAdapter
|
|
4
|
+
export declare class SqliteAdapter extends DialectAdapterBase {
|
|
5
5
|
/**
|
|
6
6
|
* Whether or not this dialect supports transactional DDL.
|
|
7
7
|
*
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="./sqlite-driver.d.ts" />
|
|
2
|
+
import { SelectQueryNode } from '../../operation-node/select-query-node.js';
|
|
2
3
|
import { CompiledQuery } from '../../query-compiler/compiled-query.js';
|
|
3
4
|
import { freeze, isFunction } from '../../util/object-utils.js';
|
|
4
5
|
export class SqliteDriver {
|
|
@@ -67,8 +68,20 @@ class SqliteConnection {
|
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
|
-
async *streamQuery() {
|
|
71
|
-
|
|
71
|
+
async *streamQuery(compiledQuery, _chunkSize) {
|
|
72
|
+
const { sql, parameters, query } = compiledQuery;
|
|
73
|
+
const stmt = this.#db.prepare(sql);
|
|
74
|
+
if (SelectQueryNode.is(query)) {
|
|
75
|
+
const iter = stmt.iterate(parameters);
|
|
76
|
+
for (const row of iter) {
|
|
77
|
+
yield {
|
|
78
|
+
rows: [row],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new Error('Sqlite driver only supports streaming of select queries');
|
|
84
|
+
}
|
|
72
85
|
}
|
|
73
86
|
}
|
|
74
87
|
class ConnectionMutex {
|
|
@@ -40,5 +40,5 @@ export interface Driver {
|
|
|
40
40
|
export interface TransactionSettings {
|
|
41
41
|
readonly isolationLevel?: IsolationLevel;
|
|
42
42
|
}
|
|
43
|
-
export declare const TRANSACTION_ISOLATION_LEVELS: readonly ["read uncommitted", "read committed", "repeatable read", "serializable"];
|
|
43
|
+
export declare const TRANSACTION_ISOLATION_LEVELS: readonly ["read uncommitted", "read committed", "repeatable read", "serializable", "snapshot"];
|
|
44
44
|
export type IsolationLevel = ArrayItemType<typeof TRANSACTION_ISOLATION_LEVELS>;
|
|
@@ -84,16 +84,20 @@ export class RuntimeDriver {
|
|
|
84
84
|
#addLogging(connection) {
|
|
85
85
|
const executeQuery = connection.executeQuery;
|
|
86
86
|
connection.executeQuery = async (compiledQuery) => {
|
|
87
|
+
let caughtError;
|
|
87
88
|
const startTime = performanceNow();
|
|
88
89
|
try {
|
|
89
90
|
return await executeQuery.call(connection, compiledQuery);
|
|
90
91
|
}
|
|
91
92
|
catch (error) {
|
|
93
|
+
caughtError = error;
|
|
92
94
|
await this.#logError(error, compiledQuery, startTime);
|
|
93
95
|
throw error;
|
|
94
96
|
}
|
|
95
97
|
finally {
|
|
96
|
-
|
|
98
|
+
if (!caughtError) {
|
|
99
|
+
await this.#logQuery(compiledQuery, startTime);
|
|
100
|
+
}
|
|
97
101
|
}
|
|
98
102
|
};
|
|
99
103
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="./single-connection-provider.d.ts" />
|
|
2
|
+
const ignoreError = () => { };
|
|
2
3
|
export class SingleConnectionProvider {
|
|
3
4
|
#connection;
|
|
4
5
|
#runningPromise;
|
|
@@ -7,17 +8,15 @@ export class SingleConnectionProvider {
|
|
|
7
8
|
}
|
|
8
9
|
async provideConnection(consumer) {
|
|
9
10
|
while (this.#runningPromise) {
|
|
10
|
-
await this.#runningPromise;
|
|
11
|
+
await this.#runningPromise.catch(ignoreError);
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
})
|
|
17
|
-
.catch(() => {
|
|
13
|
+
// `#runningPromise` must be set to undefined before it's
|
|
14
|
+
// resolved or rejected. Otherwise the while loop above
|
|
15
|
+
// will misbehave.
|
|
16
|
+
this.#runningPromise = this.#run(consumer).finally(() => {
|
|
18
17
|
this.#runningPromise = undefined;
|
|
19
18
|
});
|
|
20
|
-
return
|
|
19
|
+
return this.#runningPromise;
|
|
21
20
|
}
|
|
22
21
|
// Run the runner in an async function to make sure it doesn't
|
|
23
22
|
// throw synchronous errors.
|