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.
Files changed (185) hide show
  1. package/dist/cjs/dialect/dialect-adapter-base.d.ts +8 -0
  2. package/dist/cjs/dialect/dialect-adapter-base.js +3 -0
  3. package/dist/cjs/dialect/dialect-adapter.d.ts +8 -0
  4. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +78 -0
  5. package/dist/cjs/dialect/mssql/mssql-adapter.js +30 -0
  6. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +143 -0
  7. package/dist/cjs/dialect/mssql/mssql-dialect-config.js +2 -0
  8. package/dist/cjs/dialect/mssql/mssql-dialect.d.ts +70 -0
  9. package/dist/cjs/dialect/mssql/mssql-dialect.js +65 -0
  10. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +54 -0
  11. package/dist/cjs/dialect/mssql/mssql-driver.js +268 -0
  12. package/dist/cjs/dialect/mssql/mssql-introspector.d.ts +20 -0
  13. package/dist/cjs/dialect/mssql/mssql-introspector.js +97 -0
  14. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +11 -0
  15. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +64 -0
  16. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +2 -0
  17. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +28 -0
  18. package/dist/cjs/dialect/postgres/postgres-driver.js +1 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +1 -1
  20. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -1
  21. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
  22. package/dist/cjs/dialect/sqlite/sqlite-driver.js +15 -2
  23. package/dist/cjs/driver/driver.d.ts +1 -1
  24. package/dist/cjs/driver/driver.js +1 -0
  25. package/dist/cjs/driver/runtime-driver.js +5 -1
  26. package/dist/cjs/driver/single-connection-provider.js +7 -8
  27. package/dist/cjs/expression/expression-builder.d.ts +66 -75
  28. package/dist/cjs/expression/expression-builder.js +8 -17
  29. package/dist/cjs/expression/expression-wrapper.d.ts +8 -8
  30. package/dist/cjs/helpers/mssql.d.ts +152 -0
  31. package/dist/cjs/helpers/mssql.js +160 -0
  32. package/dist/cjs/index.d.ts +7 -1
  33. package/dist/cjs/index.js +6 -0
  34. package/dist/cjs/migration/migrator.js +12 -16
  35. package/dist/cjs/operation-node/add-index-node.d.ts +21 -0
  36. package/dist/cjs/operation-node/add-index-node.js +31 -0
  37. package/dist/cjs/operation-node/alter-table-node.d.ts +5 -1
  38. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  39. package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
  40. package/dist/cjs/operation-node/create-index-node.d.ts +1 -0
  41. package/dist/cjs/operation-node/create-table-node.d.ts +1 -0
  42. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  43. package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
  44. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  45. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  46. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  47. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  48. package/dist/cjs/operation-node/operator-node.js +2 -0
  49. package/dist/cjs/operation-node/unique-constraint-node.d.ts +4 -1
  50. package/dist/cjs/operation-node/unique-constraint-node.js +8 -1
  51. package/dist/cjs/parser/binary-operation-parser.js +1 -1
  52. package/dist/cjs/parser/coalesce-parser.d.ts +12 -2
  53. package/dist/cjs/parser/reference-parser.d.ts +2 -1
  54. package/dist/cjs/parser/update-set-parser.d.ts +5 -2
  55. package/dist/cjs/parser/update-set-parser.js +13 -3
  56. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +4 -4
  57. package/dist/cjs/query-builder/case-builder.d.ts +5 -4
  58. package/dist/cjs/query-builder/delete-query-builder.d.ts +3 -3
  59. package/dist/cjs/query-builder/function-module.d.ts +96 -25
  60. package/dist/cjs/query-builder/function-module.js +17 -3
  61. package/dist/cjs/query-builder/having-interface.d.ts +3 -5
  62. package/dist/cjs/query-builder/insert-query-builder.d.ts +27 -9
  63. package/dist/cjs/query-builder/insert-query-builder.js +3 -3
  64. package/dist/cjs/query-builder/insert-result.d.ts +8 -1
  65. package/dist/cjs/query-builder/insert-result.js +8 -1
  66. package/dist/cjs/query-builder/json-path-builder.d.ts +3 -2
  67. package/dist/cjs/query-builder/json-path-builder.js +6 -3
  68. package/dist/cjs/query-builder/on-conflict-builder.d.ts +58 -16
  69. package/dist/cjs/query-builder/on-conflict-builder.js +1 -6
  70. package/dist/cjs/query-builder/over-builder.d.ts +2 -2
  71. package/dist/cjs/query-builder/select-query-builder.d.ts +38 -22
  72. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -4
  73. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  74. package/dist/cjs/query-builder/where-interface.d.ts +3 -3
  75. package/dist/cjs/query-compiler/default-query-compiler.d.ts +9 -1
  76. package/dist/cjs/query-compiler/default-query-compiler.js +65 -12
  77. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +104 -0
  78. package/dist/cjs/schema/alter-table-add-index-builder.js +146 -0
  79. package/dist/cjs/schema/alter-table-builder.d.ts +41 -1
  80. package/dist/cjs/schema/alter-table-builder.js +59 -2
  81. package/dist/cjs/schema/column-definition-builder.d.ts +25 -0
  82. package/dist/cjs/schema/column-definition-builder.js +27 -0
  83. package/dist/cjs/schema/create-index-builder.d.ts +23 -0
  84. package/dist/cjs/schema/create-index-builder.js +30 -0
  85. package/dist/cjs/schema/create-table-builder.d.ts +28 -2
  86. package/dist/cjs/schema/create-table-builder.js +38 -3
  87. package/dist/cjs/schema/unique-constraint-builder.d.ts +14 -0
  88. package/dist/cjs/schema/unique-constraint-builder.js +24 -0
  89. package/dist/cjs/util/log.js +5 -1
  90. package/dist/cjs/util/object-utils.d.ts +1 -1
  91. package/dist/cjs/util/type-utils.d.ts +27 -19
  92. package/dist/esm/dialect/dialect-adapter-base.d.ts +8 -0
  93. package/dist/esm/dialect/dialect-adapter-base.js +3 -0
  94. package/dist/esm/dialect/dialect-adapter.d.ts +8 -0
  95. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +78 -0
  96. package/dist/esm/dialect/mssql/mssql-adapter.js +27 -0
  97. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +143 -0
  98. package/dist/esm/dialect/mssql/mssql-dialect-config.js +2 -0
  99. package/dist/esm/dialect/mssql/mssql-dialect.d.ts +70 -0
  100. package/dist/esm/dialect/mssql/mssql-dialect.js +62 -0
  101. package/dist/esm/dialect/mssql/mssql-driver.d.ts +54 -0
  102. package/dist/esm/dialect/mssql/mssql-driver.js +265 -0
  103. package/dist/esm/dialect/mssql/mssql-introspector.d.ts +20 -0
  104. package/dist/esm/dialect/mssql/mssql-introspector.js +94 -0
  105. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +11 -0
  106. package/dist/esm/dialect/mssql/mssql-query-compiler.js +61 -0
  107. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +2 -0
  108. package/dist/esm/dialect/mysql/mysql-query-compiler.js +28 -0
  109. package/dist/esm/dialect/postgres/postgres-driver.js +1 -1
  110. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +1 -1
  111. package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -1
  112. package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
  113. package/dist/esm/dialect/sqlite/sqlite-driver.js +15 -2
  114. package/dist/esm/driver/driver.d.ts +1 -1
  115. package/dist/esm/driver/driver.js +1 -0
  116. package/dist/esm/driver/runtime-driver.js +5 -1
  117. package/dist/esm/driver/single-connection-provider.js +7 -8
  118. package/dist/esm/expression/expression-builder.d.ts +66 -75
  119. package/dist/esm/expression/expression-builder.js +10 -19
  120. package/dist/esm/expression/expression-wrapper.d.ts +8 -8
  121. package/dist/esm/helpers/mssql.d.ts +152 -0
  122. package/dist/esm/helpers/mssql.js +155 -0
  123. package/dist/esm/index.d.ts +7 -1
  124. package/dist/esm/index.js +6 -0
  125. package/dist/esm/migration/migrator.js +12 -16
  126. package/dist/esm/operation-node/add-index-node.d.ts +21 -0
  127. package/dist/esm/operation-node/add-index-node.js +29 -0
  128. package/dist/esm/operation-node/alter-table-node.d.ts +5 -1
  129. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  130. package/dist/esm/operation-node/column-update-node.d.ts +2 -3
  131. package/dist/esm/operation-node/create-index-node.d.ts +1 -0
  132. package/dist/esm/operation-node/create-table-node.d.ts +1 -0
  133. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  134. package/dist/esm/operation-node/operation-node-transformer.js +17 -0
  135. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  136. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  137. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  138. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  139. package/dist/esm/operation-node/operator-node.js +2 -0
  140. package/dist/esm/operation-node/unique-constraint-node.d.ts +4 -1
  141. package/dist/esm/operation-node/unique-constraint-node.js +8 -1
  142. package/dist/esm/parser/binary-operation-parser.js +1 -1
  143. package/dist/esm/parser/coalesce-parser.d.ts +12 -2
  144. package/dist/esm/parser/reference-parser.d.ts +2 -1
  145. package/dist/esm/parser/update-set-parser.d.ts +5 -2
  146. package/dist/esm/parser/update-set-parser.js +10 -1
  147. package/dist/esm/query-builder/aggregate-function-builder.d.ts +4 -4
  148. package/dist/esm/query-builder/case-builder.d.ts +5 -4
  149. package/dist/esm/query-builder/delete-query-builder.d.ts +3 -3
  150. package/dist/esm/query-builder/function-module.d.ts +96 -25
  151. package/dist/esm/query-builder/function-module.js +17 -3
  152. package/dist/esm/query-builder/having-interface.d.ts +3 -5
  153. package/dist/esm/query-builder/insert-query-builder.d.ts +27 -9
  154. package/dist/esm/query-builder/insert-query-builder.js +4 -4
  155. package/dist/esm/query-builder/insert-result.d.ts +8 -1
  156. package/dist/esm/query-builder/insert-result.js +8 -1
  157. package/dist/esm/query-builder/json-path-builder.d.ts +3 -2
  158. package/dist/esm/query-builder/json-path-builder.js +6 -3
  159. package/dist/esm/query-builder/on-conflict-builder.d.ts +58 -16
  160. package/dist/esm/query-builder/on-conflict-builder.js +2 -7
  161. package/dist/esm/query-builder/over-builder.d.ts +2 -2
  162. package/dist/esm/query-builder/select-query-builder.d.ts +38 -22
  163. package/dist/esm/query-builder/update-query-builder.d.ts +20 -4
  164. package/dist/esm/query-builder/update-query-builder.js +3 -3
  165. package/dist/esm/query-builder/where-interface.d.ts +3 -3
  166. package/dist/esm/query-compiler/default-query-compiler.d.ts +9 -1
  167. package/dist/esm/query-compiler/default-query-compiler.js +65 -12
  168. package/dist/esm/schema/alter-table-add-index-builder.d.ts +104 -0
  169. package/dist/esm/schema/alter-table-add-index-builder.js +143 -0
  170. package/dist/esm/schema/alter-table-builder.d.ts +41 -1
  171. package/dist/esm/schema/alter-table-builder.js +59 -2
  172. package/dist/esm/schema/column-definition-builder.d.ts +25 -0
  173. package/dist/esm/schema/column-definition-builder.js +27 -0
  174. package/dist/esm/schema/create-index-builder.d.ts +23 -0
  175. package/dist/esm/schema/create-index-builder.js +30 -0
  176. package/dist/esm/schema/create-table-builder.d.ts +28 -2
  177. package/dist/esm/schema/create-table-builder.js +38 -3
  178. package/dist/esm/schema/unique-constraint-builder.d.ts +14 -0
  179. package/dist/esm/schema/unique-constraint-builder.js +21 -0
  180. package/dist/esm/util/log.js +5 -1
  181. package/dist/esm/util/object-utils.d.ts +1 -1
  182. package/dist/esm/util/type-utils.d.ts +27 -19
  183. package/helpers/mssql.d.ts +1 -0
  184. package/helpers/mssql.js +1 -0
  185. 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?.onCreateConnection) {
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 implements DialectAdapterBase {
4
+ export declare class SqliteAdapter extends DialectAdapterBase {
5
5
  /**
6
6
  * Whether or not this dialect supports transactional DDL.
7
7
  *
@@ -1,5 +1,6 @@
1
1
  /// <reference types="./sqlite-adapter.d.ts" />
2
- export class SqliteAdapter {
2
+ import { DialectAdapterBase } from '../dialect-adapter-base.js';
3
+ export class SqliteAdapter extends DialectAdapterBase {
3
4
  get supportsTransactionalDdl() {
4
5
  return false;
5
6
  }
@@ -37,4 +37,5 @@ export interface SqliteStatement {
37
37
  changes: number | bigint;
38
38
  lastInsertRowid: number | bigint;
39
39
  };
40
+ iterate(parameters: ReadonlyArray<unknown>): IterableIterator<unknown>;
40
41
  }
@@ -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
- throw new Error("Sqlite driver doesn't support streaming");
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>;
@@ -4,4 +4,5 @@ export const TRANSACTION_ISOLATION_LEVELS = [
4
4
  'read committed',
5
5
  'repeatable read',
6
6
  'serializable',
7
+ 'snapshot',
7
8
  ];
@@ -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
- await this.#logQuery(compiledQuery, startTime);
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
- const promise = this.#run(consumer);
13
- this.#runningPromise = promise
14
- .then(() => {
15
- this.#runningPromise = undefined;
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 promise;
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.