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