@bitblit/ratchet-rdbms 4.0.116-alpha → 4.0.120-alpha

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 (65) hide show
  1. package/lib/build/ratchet-rdbms-info.d.ts +1 -1
  2. package/lib/index.d.ts +28 -0
  3. package/lib/index.mjs +2 -0
  4. package/lib/index.mjs.map +1 -0
  5. package/lib/model/paginator.d.ts +1 -1
  6. package/lib/model/ssh/ssh-tunnel-container.d.ts +1 -1
  7. package/package.json +13 -12
  8. package/lib/build/ratchet-rdbms-info.js +0 -15
  9. package/lib/build/ratchet-rdbms-info.js.map +0 -1
  10. package/lib/model/connection-config.js +0 -2
  11. package/lib/model/connection-config.js.map +0 -1
  12. package/lib/model/db-config.js +0 -2
  13. package/lib/model/db-config.js.map +0 -1
  14. package/lib/model/group-by-count-result.js +0 -2
  15. package/lib/model/group-by-count-result.js.map +0 -1
  16. package/lib/model/mysql/mysql-master-status.js +0 -2
  17. package/lib/model/mysql/mysql-master-status.js.map +0 -1
  18. package/lib/model/mysql/mysql-results-wrapper.js +0 -2
  19. package/lib/model/mysql/mysql-results-wrapper.js.map +0 -1
  20. package/lib/model/mysql/mysql-slave-status.js +0 -2
  21. package/lib/model/mysql/mysql-slave-status.js.map +0 -1
  22. package/lib/model/mysql/mysql-style-connection-provider.js +0 -2
  23. package/lib/model/mysql/mysql-style-connection-provider.js.map +0 -1
  24. package/lib/model/mysql/mysql-update-results.js +0 -2
  25. package/lib/model/mysql/mysql-update-results.js.map +0 -1
  26. package/lib/model/paginated-results.js +0 -2
  27. package/lib/model/paginated-results.js.map +0 -1
  28. package/lib/model/pagination-bounds.js +0 -2
  29. package/lib/model/pagination-bounds.js.map +0 -1
  30. package/lib/model/paginator.js +0 -2
  31. package/lib/model/paginator.js.map +0 -1
  32. package/lib/model/query-defaults.js +0 -2
  33. package/lib/model/query-defaults.js.map +0 -1
  34. package/lib/model/query-text-provider.js +0 -2
  35. package/lib/model/query-text-provider.js.map +0 -1
  36. package/lib/model/sort-direction.js +0 -6
  37. package/lib/model/sort-direction.js.map +0 -1
  38. package/lib/model/ssh/ssh-tunnel-config.js +0 -2
  39. package/lib/model/ssh/ssh-tunnel-config.js.map +0 -1
  40. package/lib/model/ssh/ssh-tunnel-container.js +0 -2
  41. package/lib/model/ssh/ssh-tunnel-container.js.map +0 -1
  42. package/lib/model/ssh-config.js +0 -2
  43. package/lib/model/ssh-config.js.map +0 -1
  44. package/lib/model/transaction-isolation-level.js +0 -6
  45. package/lib/model/transaction-isolation-level.js.map +0 -1
  46. package/lib/named-parameter-maria-db-service.js +0 -253
  47. package/lib/named-parameter-maria-db-service.js.map +0 -1
  48. package/lib/non-pooled-mysql-style-connection-provider.js +0 -17
  49. package/lib/non-pooled-mysql-style-connection-provider.js.map +0 -1
  50. package/lib/query-builder/query-builder-result.js +0 -13
  51. package/lib/query-builder/query-builder-result.js.map +0 -1
  52. package/lib/query-builder/query-builder.js +0 -354
  53. package/lib/query-builder/query-builder.js.map +0 -1
  54. package/lib/query-builder/query-builder.spec.js +0 -127
  55. package/lib/query-builder/query-builder.spec.js.map +0 -1
  56. package/lib/query-builder/query-util.js +0 -70
  57. package/lib/query-builder/query-util.js.map +0 -1
  58. package/lib/rds-mysql-style-connection-provider.js +0 -161
  59. package/lib/rds-mysql-style-connection-provider.js.map +0 -1
  60. package/lib/ssh-tunnel-service.js +0 -48
  61. package/lib/ssh-tunnel-service.js.map +0 -1
  62. package/lib/transactional-named-parameter-maria-db-service.js +0 -130
  63. package/lib/transactional-named-parameter-maria-db-service.js.map +0 -1
  64. package/lib/util/relational-database-utils.js +0 -30
  65. package/lib/util/relational-database-utils.js.map +0 -1
@@ -1,253 +0,0 @@
1
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
2
- import { TimeoutToken } from '@bitblit/ratchet-common/lib/lang/timeout-token.js';
3
- import { PromiseRatchet } from '@bitblit/ratchet-common/lib/lang/promise-ratchet.js';
4
- import { DurationRatchet } from '@bitblit/ratchet-common/lib/lang/duration-ratchet.js';
5
- import { ErrorRatchet } from '@bitblit/ratchet-common/lib/lang/error-ratchet.js';
6
- import { StopWatch } from '@bitblit/ratchet-common/lib/lang/stop-watch.js';
7
- import { QueryUtil } from './query-builder/query-util.js';
8
- import { TransactionIsolationLevel } from './model/transaction-isolation-level.js';
9
- import { NonPooledMysqlStyleConnectionProvider } from './non-pooled-mysql-style-connection-provider.js';
10
- import { QueryBuilder } from './query-builder/query-builder.js';
11
- class NamedParameterMariaDbService {
12
- queryProvider;
13
- connectionProvider;
14
- queryDefaults;
15
- static LONG_QUERY_TIME_MS = 8500;
16
- serviceName = 'TBD';
17
- constructor(queryProvider, connectionProvider, queryDefaults) {
18
- this.queryProvider = queryProvider;
19
- this.connectionProvider = connectionProvider;
20
- this.queryDefaults = queryDefaults;
21
- this.serviceName = 'NamedParameterMariaDb';
22
- }
23
- getQueryDefaults() {
24
- return this.queryDefaults;
25
- }
26
- getQueryProvider() {
27
- return this.queryProvider;
28
- }
29
- async createNonPooledMysqlStyleConnectionProvider(queryDefaults, additionalConfig) {
30
- Logger.info('createTransactional : %s : %j', queryDefaults, additionalConfig);
31
- if (!this.connectionProvider.createNonPooledDatabaseConnection) {
32
- throw new Error(`Connection provider does not implement createNonPooledDatabaseConnection`);
33
- }
34
- const newConn = await this.connectionProvider.createNonPooledDatabaseConnection(queryDefaults, additionalConfig);
35
- if (!newConn) {
36
- throw new Error(`Connection could not be created for DB type ${queryDefaults}`);
37
- }
38
- return new NonPooledMysqlStyleConnectionProvider(newConn);
39
- }
40
- fetchQueryRawTextByName(queryPath) {
41
- return this.queryProvider.fetchQuery(queryPath);
42
- }
43
- queryBuilder(queryPath) {
44
- const queryBuilder = new QueryBuilder(this.queryProvider);
45
- if (queryPath) {
46
- queryBuilder.withNamedQuery(queryPath);
47
- }
48
- return queryBuilder;
49
- }
50
- async executeUpdateOrInsertByName(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {
51
- const builder = this.queryBuilder(queryPath).withParams(params ?? {});
52
- return this.buildAndExecuteUpdateOrInsert(builder, timeoutMS);
53
- }
54
- async buildAndExecuteUpdateOrInsert(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {
55
- const build = queryBuilder.build();
56
- const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS);
57
- const rval = resp.results;
58
- return rval;
59
- }
60
- async buildAndExecuteUpdateOrInsertWithRetry(queryBuilder, maxRetries, timeoutMS = this.queryDefaults.timeoutMS) {
61
- let retry = 0;
62
- let res;
63
- while (!res && retry < maxRetries) {
64
- retry++;
65
- try {
66
- res = await this.buildAndExecuteUpdateOrInsert(queryBuilder, timeoutMS);
67
- }
68
- catch (err) {
69
- Logger.info('Caught problem while trying to update/insert : %d : %s ', retry, err);
70
- await PromiseRatchet.wait(retry * 2000);
71
- }
72
- }
73
- if (!res) {
74
- throw new Error(`Failed to execute update after ${maxRetries} retries`);
75
- }
76
- return res;
77
- }
78
- async executeQueryByName(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {
79
- const builder = this.queryBuilder(queryPath).withParams(params);
80
- const resp = await this.buildAndExecute(builder, timeoutMS);
81
- return resp;
82
- }
83
- async executeQueryByNameSingle(queryPath, params, timeoutMS = this.queryDefaults.timeoutMS) {
84
- const builder = this.queryBuilder(queryPath).withParams(params);
85
- const resp = await this.buildAndExecute(builder, timeoutMS);
86
- return resp.length === 1 ? resp[0] : null;
87
- }
88
- async buildAndExecute(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {
89
- const build = queryBuilder.build();
90
- const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS, queryBuilder.getDebugComment());
91
- return resp.results;
92
- }
93
- async buildAndExecuteSingle(queryBuilder, timeoutMS = this.queryDefaults.timeoutMS) {
94
- const build = queryBuilder.build();
95
- const resp = await this.executeQueryWithMeta(build.transactionIsolationLevel, build.query, build.namedParams, timeoutMS, queryBuilder.getDebugComment());
96
- return resp.results.length === 1 ? resp.results[0] : null;
97
- }
98
- async buildAndExecuteFetchTotalRows(queryBuilder, groupBy = '', timeoutMS = this.queryDefaults.timeoutMS) {
99
- const buildUnfiltered = queryBuilder.buildUnfiltered();
100
- let query = buildUnfiltered.query.replace('COUNT(*)', `${groupBy} as groupByField, COUNT(*) as count`);
101
- query = `${query} GROUP BY ${groupBy}`;
102
- Logger.info('Unfiltered query %s', buildUnfiltered.query);
103
- const resp = await this.executeQueryWithMeta(buildUnfiltered.transactionIsolationLevel, query, buildUnfiltered.namedParams, timeoutMS);
104
- return resp.results;
105
- }
106
- async executeQueryWithMeta(transactionIsolationLevel, query, fields = {}, timeoutMS = this.queryDefaults.timeoutMS, debugComment) {
107
- const sw = new StopWatch();
108
- if (!timeoutMS) {
109
- timeoutMS = this.queryDefaults.timeoutMS;
110
- }
111
- await this.changeNextQueryTransactionIsolationLevel(transactionIsolationLevel);
112
- const result = await PromiseRatchet.timeout(this.innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields, undefined), 'Query:' + query, timeoutMS);
113
- if (TimeoutToken.isTimeoutToken(result)) {
114
- Logger.warn('Timed out (after %s): %j', DurationRatchet.colonFormatMsDuration(timeoutMS), result);
115
- const duration = DurationRatchet.colonFormatMsDuration(timeoutMS);
116
- throw new Error(`Timed out (after ${duration}) waiting for query : ${query}`);
117
- }
118
- const rval = result;
119
- if (!rval.results) {
120
- Logger.error('DB:executeQueryWithMeta:Failure: %j', rval);
121
- }
122
- if (debugComment && sw.elapsedMS() > NamedParameterMariaDbService.LONG_QUERY_TIME_MS) {
123
- Logger.info('NamedParameterMariaDbService long query: %s, %s', debugComment, sw.dump());
124
- }
125
- return rval;
126
- }
127
- async shutdown() {
128
- Logger.info('Shutting down %s service', this.serviceName);
129
- let rval;
130
- try {
131
- rval = await this.connectionProvider.clearConnectionCache();
132
- }
133
- catch (err) {
134
- Logger.error('Failure trying to shutdown : %s', err, err);
135
- rval = false;
136
- }
137
- return rval;
138
- }
139
- async testConnection(quietMode = false) {
140
- if (!quietMode) {
141
- Logger.info('Running connection test');
142
- }
143
- const res = await this.executeQueryWithMeta(TransactionIsolationLevel.Default, 'SELECT UNIX_TIMESTAMP(now())*1000 AS test');
144
- const rows = res.results;
145
- const timestamp = rows.length === 1 ? rows[0].test : null;
146
- if (!quietMode) {
147
- Logger.info('Test returned : %j', timestamp);
148
- }
149
- return timestamp;
150
- }
151
- async testDbFailure() {
152
- await this.executeQueryWithMeta(TransactionIsolationLevel.Default, 'this is a bad query');
153
- }
154
- async changeNextQueryTransactionIsolationLevel(tx) {
155
- if (tx && tx !== TransactionIsolationLevel.Default) {
156
- Logger.debug('Setting tx to %s', tx);
157
- return await this.innerExecutePreparedAsPromiseWithRetryCloseConnection('SET TRANSACTION ISOLATION LEVEL ' + tx, {});
158
- }
159
- return null;
160
- }
161
- async forceCloseConnectionForTesting() {
162
- Logger.warn('Forcing connection closed for testing');
163
- const conn = await this.getDB();
164
- try {
165
- await conn.end();
166
- Logger.info('Connection has been ended, but not set to null');
167
- return true;
168
- }
169
- catch (err) {
170
- Logger.error('Error closing connection : %s', err, err);
171
- return false;
172
- }
173
- }
174
- async innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields = {}, retryCount = 1) {
175
- try {
176
- const result = await this.innerExecutePreparedAsPromise(query, fields);
177
- return result;
178
- }
179
- catch (errIn) {
180
- const err = ErrorRatchet.asErr(errIn);
181
- if (err.message.includes('closed state') ||
182
- err.message.includes('This socket has been ended by the other party') ||
183
- err.message.includes('ETIMEDOUT') ||
184
- err.message.includes('NeonNoConnection') ||
185
- err.message.includes('ER_LOCK_WAIT_TIMEOUT')) {
186
- const wait = Math.min(1000 * retryCount);
187
- Logger.warn('Found closed connection or lock timeout - clearing and attempting retry after %d (try %d of 3) (%s)', wait, retryCount, err.message);
188
- if (retryCount < 4) {
189
- const cleared = await this.connectionProvider.clearConnectionCache();
190
- Logger.info('Clear connection cache returned %s', cleared);
191
- await PromiseRatchet.wait(wait);
192
- return this.innerExecutePreparedAsPromiseWithRetryCloseConnection(query, fields, retryCount + 1);
193
- }
194
- else {
195
- Logger.warn('Ran out of retries');
196
- throw new Error('Connection closed and cannot retry any more - dying horribly');
197
- }
198
- }
199
- else {
200
- Logger.error('Named Param DB Query Failed : Err: %s Query: %s Params: %j', err, query, fields, err);
201
- try {
202
- const conn = await this.getDB();
203
- Logger.error('-----\nFor paste into tooling only: \n\n%s\n\n', QueryUtil.renderQueryStringForPasteIntoTool(query, fields, (v) => conn.escape(v)));
204
- }
205
- catch (err2) {
206
- Logger.error('Really bad - failed trying to get the conn for logging : %s', err2);
207
- }
208
- throw err;
209
- }
210
- }
211
- }
212
- async innerExecutePreparedAsPromise(query, fields = {}) {
213
- const conn = await this.getDB();
214
- conn.config.namedPlaceholders = true;
215
- const sw = new StopWatch();
216
- try {
217
- const [rows, outFields] = await conn.query(query, fields);
218
- const rval = {
219
- results: rows,
220
- fields: outFields,
221
- };
222
- Logger.debug('Success : Finished query : %s\n%s\n\nParams : %j', sw.dump(), QueryUtil.reformatQueryForLogging(query), fields);
223
- Logger.debug('-----\nFor paste into tooling only : \n\n%s\n\n', QueryUtil.renderQueryStringForPasteIntoTool(query, fields, (v) => conn.escape(v)));
224
- return rval;
225
- }
226
- finally {
227
- conn.config.namedPlaceholders = false;
228
- }
229
- }
230
- async getDB() {
231
- const conn = await this.connectionProvider.getConnection(this.queryDefaults.databaseName);
232
- if (!conn) {
233
- throw new Error('NeonNoConnection : getConnection returned null - likely failed to get connection from db');
234
- }
235
- return conn;
236
- }
237
- async resetConnection() {
238
- let rval = false;
239
- Logger.info('Resetting connection');
240
- try {
241
- await this.connectionProvider.clearConnectionCache();
242
- const tmpValue = await this.testConnection();
243
- rval = !!tmpValue;
244
- Logger.info('Reset connection returning %s', rval);
245
- }
246
- catch (err) {
247
- Logger.error('Failed to reset connection : %s', err);
248
- }
249
- return rval;
250
- }
251
- }
252
- export { NamedParameterMariaDbService };
253
- //# sourceMappingURL=named-parameter-maria-db-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"named-parameter-maria-db-service.js","sourceRoot":"","sources":["../src/named-parameter-maria-db-service.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
2
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
3
- export class NonPooledMysqlStyleConnectionProvider {
4
- connection;
5
- constructor(connection) {
6
- this.connection = connection;
7
- RequireRatchet.notNullOrUndefined(connection);
8
- }
9
- async getConnection() {
10
- return this.connection;
11
- }
12
- async clearConnectionCache() {
13
- Logger.info('clearConnectionCache ignored - not pooled');
14
- return true;
15
- }
16
- }
17
- //# sourceMappingURL=non-pooled-mysql-style-connection-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"non-pooled-mysql-style-connection-provider.js","sourceRoot":"","sources":["../src/non-pooled-mysql-style-connection-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,8CAA8C,CAAC;AAEtE,MAAM,OAAO,qCAAqC;IAC5B;IAApB,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QACxC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IACM,KAAK,CAAC,aAAa;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACM,KAAK,CAAC,oBAAoB;QAC/B,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,13 +0,0 @@
1
- export class QueryBuilderResult {
2
- query;
3
- namedParams;
4
- paginator;
5
- transactionIsolationLevel;
6
- constructor(query, namedParams, paginator, transactionIsolationLevel) {
7
- this.query = query;
8
- this.namedParams = namedParams;
9
- this.paginator = paginator;
10
- this.transactionIsolationLevel = transactionIsolationLevel;
11
- }
12
- }
13
- //# sourceMappingURL=query-builder-result.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-builder-result.js","sourceRoot":"","sources":["../../src/query-builder/query-builder-result.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAS;IACd,WAAW,CAA0B;IACrC,SAAS,CAAkB;IAC3B,yBAAyB,CAA4B;IAErD,YACE,KAAa,EACb,WAAoC,EACpC,SAAqC,EACrC,yBAAoD;QAEpD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;IAC7D,CAAC;CACF"}
@@ -1,354 +0,0 @@
1
- import { ErrorRatchet } from '@bitblit/ratchet-common/lib/lang/error-ratchet.js';
2
- import { Logger } from '@bitblit/ratchet-common/lib/logger/logger.js';
3
- import { RequireRatchet } from '@bitblit/ratchet-common/lib/lang/require-ratchet.js';
4
- import { StringRatchet } from '@bitblit/ratchet-common/lib/lang/string-ratchet.js';
5
- import _ from 'lodash';
6
- import { QueryBuilderResult } from './query-builder-result.js';
7
- import { TransactionIsolationLevel } from '../model/transaction-isolation-level.js';
8
- import { SortDirection } from '../model/sort-direction.js';
9
- class QueryBuilder {
10
- static ALLOWED_SQL_CONSTRUCT = /^[a-z0-9_.`]+$/i;
11
- queryProvider;
12
- query;
13
- meta = Object.freeze({});
14
- sqlConstructs = {};
15
- namedParams = {};
16
- conditionals = {};
17
- debugComment = '';
18
- paginator;
19
- debugAnnotateMode = false;
20
- transactionIsolationLevel = TransactionIsolationLevel.Default;
21
- constructor(queryProvider) {
22
- this.queryProvider = queryProvider;
23
- }
24
- clone() {
25
- const clone = new QueryBuilder(this.queryProvider);
26
- if (this.query) {
27
- clone.withBaseQuery(this.query);
28
- }
29
- clone.sqlConstructs = _.clone(this.sqlConstructs);
30
- clone.namedParams = _.clone(this.namedParams);
31
- clone.conditionals = _.clone(this.conditionals);
32
- clone.paginator = _.clone(this.paginator);
33
- clone.debugComment = this.debugComment;
34
- clone.transactionIsolationLevel = this.transactionIsolationLevel;
35
- return clone;
36
- }
37
- withTransactionIsolationLevel(level) {
38
- this.transactionIsolationLevel = level;
39
- return this;
40
- }
41
- withDebugComment(comment) {
42
- this.debugComment = comment;
43
- return this;
44
- }
45
- appendDebugComment(comment) {
46
- this.debugComment = this.debugComment + comment;
47
- return this;
48
- }
49
- withNamedQuery(queryPath) {
50
- this.query = this.queryProvider.fetchQuery(queryPath);
51
- if (!StringRatchet.trimToNull(this.query)) {
52
- ErrorRatchet.throwFormattedErr('Requested query that does not exist : %s', queryPath);
53
- }
54
- this.meta = Object.freeze({ queryPath: queryPath });
55
- this.withDebugComment(' ' + queryPath + ' ');
56
- return this;
57
- }
58
- withBaseQuery(baseQuery) {
59
- this.query = baseQuery;
60
- }
61
- withSqlConstruct(key, value) {
62
- this.sqlConstructs[key] = value;
63
- return this;
64
- }
65
- withSqlConstructs(params) {
66
- this.sqlConstructs = Object.assign(this.sqlConstructs, params);
67
- return this;
68
- }
69
- removeParam(key) {
70
- delete this.namedParams[key];
71
- return this;
72
- }
73
- paramNames() {
74
- return Object.keys(this.namedParams);
75
- }
76
- withParam(key, value) {
77
- this.namedParams[key] = value;
78
- return this;
79
- }
80
- withParams(params) {
81
- this.namedParams = Object.assign(this.namedParams, params);
82
- return this;
83
- }
84
- withExpandedParam(keyPrefix, values, extendIfExists) {
85
- const lengthParamName = keyPrefix + 'Length';
86
- let oldSize = this.fetchCopyOfParam(lengthParamName) ?? 0;
87
- if (oldSize > 0 && !extendIfExists) {
88
- Logger.silly('Old item found and not extending - removing old params');
89
- const toRemove = this.paramNames().filter((s) => s.startsWith(keyPrefix));
90
- toRemove.forEach((s) => this.removeParam(s));
91
- oldSize = 0;
92
- }
93
- this.withParam(lengthParamName, values.length + oldSize);
94
- for (let i = 0; i < values.length; i++) {
95
- const value = values[i];
96
- if (typeof value === 'object' && !!value) {
97
- for (const key of Object.keys(value)) {
98
- const paramKey = keyPrefix + key.charAt(0).toUpperCase() + key.slice(1) + (i + oldSize);
99
- this.withParam(paramKey, value[key]);
100
- }
101
- }
102
- else {
103
- const paramKey = keyPrefix + i;
104
- this.withParam(paramKey, value);
105
- }
106
- }
107
- return this;
108
- }
109
- withConditional(tag, state = true) {
110
- this.conditionals[tag] = state;
111
- return this;
112
- }
113
- withConditionals(params) {
114
- this.conditionals = Object.assign(this.conditionals, params);
115
- return this;
116
- }
117
- withPaginator(paginator) {
118
- RequireRatchet.notNullOrUndefined(paginator, 'paginator');
119
- RequireRatchet.notNullOrUndefined(paginator.cn, 'paginator.cn');
120
- RequireRatchet.true(paginator.min || paginator.max || paginator.l, 'paginator must have some limit');
121
- paginator.s = paginator.s ?? SortDirection.Asc;
122
- this.paginator = paginator;
123
- return this;
124
- }
125
- fetchCopyOfParam(paramName) {
126
- return this.namedParams[paramName];
127
- }
128
- fetchCopyOfConditional(conditionalName) {
129
- return this.conditionals[conditionalName];
130
- }
131
- containsParam(paramName) {
132
- return this.namedParams[paramName] != undefined;
133
- }
134
- getDebugComment() {
135
- return this.debugComment;
136
- }
137
- containsConditional(conditionalName) {
138
- return this.conditionals[conditionalName] != undefined;
139
- }
140
- build() {
141
- const build = this.clone();
142
- return build.internalBuild(false);
143
- }
144
- buildUnfiltered() {
145
- const builder = this.clone();
146
- return builder.internalBuild(true);
147
- }
148
- internalBuild(unfiltered) {
149
- this.applyQueryFragments();
150
- this.applyConditionalBlocks();
151
- this.applyRepeatBlocks();
152
- this.applyPagination(unfiltered);
153
- this.applySqlConstructs();
154
- this.applyComments();
155
- this.runQueryChecks();
156
- this.stripNonAsciiParams();
157
- return new QueryBuilderResult((this.query ?? '').trim(), this.namedParams, this.paginator, this.transactionIsolationLevel);
158
- }
159
- stripNonAsciiParams() {
160
- const reduced = StringRatchet.stripNonAscii(JSON.stringify(this.namedParams));
161
- this.namedParams = JSON.parse(reduced);
162
- }
163
- runQueryChecks() {
164
- const quotedNamedParams = [...(this.query?.matchAll(/['"]:[A-z-]*['"]/gm) ?? [])];
165
- if (quotedNamedParams.length > 0) {
166
- Logger.warn('The resulting query contains quoted named params check this this is intended. Instances found: %s', quotedNamedParams.join(', '));
167
- }
168
- }
169
- applyComments() {
170
- if (this.debugComment.length && this.query) {
171
- const firstSpaceIndex = this.query.indexOf(' ');
172
- const comment = this.debugComment;
173
- this.query = this.query.substring(0, firstSpaceIndex + 1) + `/*${comment}*/` + this.query.substring(firstSpaceIndex + 1);
174
- }
175
- }
176
- applySqlConstructs() {
177
- for (const key of Object.keys(this.sqlConstructs)) {
178
- let value;
179
- const val = this.sqlConstructs[key];
180
- if (Array.isArray(val)) {
181
- val.forEach((v) => {
182
- if (typeof v !== 'string' || !v.match(QueryBuilder.ALLOWED_SQL_CONSTRUCT)) {
183
- throw new Error(`sql construct entry ${v} is invalid value must be alphanumeric only.`);
184
- }
185
- });
186
- value = val.join(', ');
187
- }
188
- else {
189
- value = StringRatchet.safeString(val);
190
- if (value.length > 0 && !value.match(QueryBuilder.ALLOWED_SQL_CONSTRUCT)) {
191
- throw new Error(`sql construct ${value} is invalid value must be alphanumeric only.`);
192
- }
193
- }
194
- const sqlReservedWords = ['update', 'insert', 'delete', 'drop', 'select'];
195
- for (const word of sqlReservedWords) {
196
- if (value.toLowerCase().includes(word)) {
197
- throw new Error(`sql construct ${value} is invalid value must not contain reserved word ${word}.`);
198
- }
199
- }
200
- const rawKey = `##sqlConstruct:${key}##`;
201
- while (this.query?.includes(rawKey)) {
202
- this.query = this.query.replace(rawKey, value);
203
- }
204
- }
205
- }
206
- applyRepeatBlocks() {
207
- const startSymbol = '<repeat';
208
- const endSymbol = '>';
209
- while (true) {
210
- const startIndex = this.query?.indexOf(startSymbol);
211
- if (startIndex === -1 || !this.query || typeof startIndex !== 'number') {
212
- return;
213
- }
214
- const endIndex = this.query.indexOf(endSymbol, startIndex);
215
- if (endIndex == -1) {
216
- throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);
217
- }
218
- const content = this.query.substring(startIndex + startSymbol.length, endIndex).trim();
219
- const countSymbol = 'count=';
220
- let countParam = '';
221
- const joinSymbol = 'join=';
222
- let joinString;
223
- const params = content.split(' ');
224
- for (const param of params) {
225
- if (param.includes(countSymbol)) {
226
- countParam = param.substring(param.indexOf(countSymbol) + countSymbol.length);
227
- }
228
- if (param.includes(joinSymbol)) {
229
- joinString = param.substring(param.indexOf(joinSymbol) + joinSymbol.length);
230
- }
231
- }
232
- const endTag = `</repeat>`;
233
- const endTagIndex = this.query.indexOf(endTag);
234
- const repeatedContent = this.query.substring(endIndex + endSymbol.length, endTagIndex);
235
- this.query = this.query.substring(0, startIndex) + this.query.substring(endTagIndex + endTag.length);
236
- const count = this.namedParams[countParam.substring(1)];
237
- for (let i = 0; i < count; i++) {
238
- let indexedContent = repeatedContent;
239
- if (joinString && i != 0) {
240
- indexedContent += joinString;
241
- }
242
- let startParamTagIndex = indexedContent.indexOf(`::`);
243
- while (startParamTagIndex != -1) {
244
- const endParamTagIndex = indexedContent.indexOf(`::`, startParamTagIndex + 2);
245
- if (endParamTagIndex == -1) {
246
- throw new Error(`Invalid query when finding end symbol matching :: check that you have closed all your tags correctly. Query: ${this.query} `);
247
- }
248
- const param = indexedContent.substring(startParamTagIndex + 2, endParamTagIndex);
249
- indexedContent = indexedContent.replace('::' + param + '::', ':' + param + i);
250
- startParamTagIndex = indexedContent.indexOf(`::`);
251
- }
252
- this.query = this.query.substring(0, startIndex) + indexedContent + this.query.substring(startIndex);
253
- }
254
- }
255
- }
256
- applyQueryFragments() {
257
- const startSymbol = '[[';
258
- const endSymbol = ']]';
259
- while (true) {
260
- const startIndex = this.query?.indexOf(startSymbol);
261
- if (startIndex == -1 || !this.query || typeof startIndex !== 'number') {
262
- return;
263
- }
264
- const endIndex = this.query.indexOf(endSymbol, startIndex);
265
- if (endIndex == -1) {
266
- throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);
267
- }
268
- const rawName = this.query.substring(startIndex + startSymbol.length, endIndex);
269
- const namedQueryElement = this.queryProvider.fetchQuery(rawName);
270
- if (!namedQueryElement) {
271
- throw new Error(`Invalid query, query fragment ${rawName} not found in named queries.`);
272
- }
273
- this.query = this.query.replace(`[[${rawName}]]`, namedQueryElement);
274
- }
275
- }
276
- applyPagination(unfiltered) {
277
- const paginationRawKey = '##pagination##';
278
- if (!unfiltered && this.paginator) {
279
- const sortDirEnum = this.paginator.s == SortDirection.Desc ? SortDirection.Desc : SortDirection.Asc;
280
- const sortDir = StringRatchet.safeString(sortDirEnum);
281
- if (this.paginator.min || this.paginator.max) {
282
- let wc = 'WHERE ##sqlConstruct:queryBuilderPaginatorWhere##';
283
- this.withSqlConstruct('queryBuilderPaginatorWhere', this.paginator.cn);
284
- if (this.paginator.min) {
285
- wc += '>= :queryBuilderPaginatorWhereMin';
286
- this.withParam('queryBuilderPaginatorWhereMin', this.paginator.min);
287
- }
288
- if (this.paginator.max) {
289
- if (this.paginator.min) {
290
- wc += ' AND ##sqlConstruct:queryBuilderPaginatorWhere##';
291
- }
292
- wc += '< :queryBuilderPaginatorWhereMax';
293
- this.withParam('queryBuilderPaginatorWhereMax', this.paginator.max);
294
- }
295
- this.query += wc;
296
- }
297
- this.query += ` ORDER BY ##sqlConstruct:queryBuilderOrderBy## ${sortDir}`;
298
- this.withSqlConstruct('queryBuilderOrderBy', this.paginator.cn);
299
- if (this.paginator.l) {
300
- this.query += ' LIMIT :queryBuilderLimit';
301
- this.withParam('queryBuilderLimit', this.paginator.l);
302
- }
303
- }
304
- if (unfiltered && this.query) {
305
- const paginationSplitIndex = this.query.indexOf(paginationRawKey);
306
- if (paginationSplitIndex != -1) {
307
- this.query = 'SELECT COUNT(*) ' + this.query.substring(paginationSplitIndex + paginationRawKey.length);
308
- }
309
- }
310
- while (this.query?.includes(paginationRawKey)) {
311
- this.query = this.query.replace(paginationRawKey, '');
312
- }
313
- }
314
- applyConditionalBlocks() {
315
- const startSymbol = '<<';
316
- const endSymbol = '>>';
317
- while (true) {
318
- const startIndex = this.query?.indexOf(startSymbol);
319
- if (startIndex == -1 || !this.query || typeof startIndex !== 'number') {
320
- return;
321
- }
322
- const endIndex = this.query.indexOf(endSymbol, startIndex);
323
- if (endIndex == -1) {
324
- throw new Error(`Invalid query when finding end symbol matching ${endSymbol} in ${this.query} check that you have closed all your tags correctly.`);
325
- }
326
- const rawTag = this.query.substring(startIndex + startSymbol.length, endIndex);
327
- const tag = rawTag.replace(':', '');
328
- const endTag = `<</${rawTag}>>`;
329
- const endTagIndex = this.query.indexOf(endTag);
330
- if (endTagIndex == -1) {
331
- throw new Error(`Invalid query when finding conditional end tag matching ${endTag} in ${this.query} check that your query contains an exact match of this tag.`);
332
- }
333
- let replacement = this.query.substring(endIndex + endSymbol.length, endTagIndex);
334
- if (rawTag.startsWith(':')) {
335
- const param = this.namedParams[tag];
336
- if (param == null || (Array.isArray(param) && param.length == 0)) {
337
- replacement = '';
338
- }
339
- }
340
- else {
341
- const conditional = this.conditionals[tag.replace('!', '')];
342
- if (conditional == undefined || conditional == tag.startsWith('!')) {
343
- replacement = '';
344
- }
345
- }
346
- if (this.debugAnnotateMode) {
347
- replacement = '/* conditional ' + tag + '*/';
348
- }
349
- this.query = this.query.substring(0, startIndex) + replacement + this.query.substring(endTagIndex + endTag.length);
350
- }
351
- }
352
- }
353
- export { QueryBuilder };
354
- //# sourceMappingURL=query-builder.js.map