knex 2.4.2 → 2.5.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 (190) hide show
  1. package/CHANGELOG.md +54 -18
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +147 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +473 -473
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/knex.mjs +11 -0
  12. package/lib/builder-interface-augmenter.js +120 -120
  13. package/lib/client.js +495 -475
  14. package/lib/constants.js +61 -61
  15. package/lib/dialects/better-sqlite3/index.js +77 -72
  16. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  17. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  18. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  19. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  20. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  21. package/lib/dialects/cockroachdb/index.js +86 -86
  22. package/lib/dialects/index.js +33 -33
  23. package/lib/dialects/mssql/index.js +500 -495
  24. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  25. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -600
  26. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  27. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  28. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  29. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  30. package/lib/dialects/mssql/transaction.js +176 -176
  31. package/lib/dialects/mysql/index.js +201 -201
  32. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  33. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  34. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  35. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  36. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  37. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  38. package/lib/dialects/mysql/transaction.js +46 -46
  39. package/lib/dialects/mysql2/index.js +53 -33
  40. package/lib/dialects/mysql2/transaction.js +44 -44
  41. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  42. package/lib/dialects/oracle/index.js +92 -92
  43. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -342
  44. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  45. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  46. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  47. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  48. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  49. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  50. package/lib/dialects/oracle/utils.js +87 -87
  51. package/lib/dialects/oracledb/index.js +327 -327
  52. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  53. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -55
  54. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  55. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  56. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  57. package/lib/dialects/oracledb/transaction.js +98 -98
  58. package/lib/dialects/oracledb/utils.js +208 -208
  59. package/lib/dialects/pgnative/index.js +60 -60
  60. package/lib/dialects/postgres/execution/pg-transaction.js +19 -12
  61. package/lib/dialects/postgres/index.js +358 -358
  62. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -38
  63. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -395
  64. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  65. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  66. package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -299
  67. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  68. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  69. package/lib/dialects/redshift/index.js +86 -86
  70. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  71. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  72. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  73. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  74. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  75. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  76. package/lib/dialects/redshift/transaction.js +32 -25
  77. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -18
  78. package/lib/dialects/sqlite3/index.js +250 -250
  79. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  80. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  81. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  82. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  83. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  84. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  85. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  86. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  87. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  88. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  89. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  90. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  91. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  92. package/lib/execution/batch-insert.js +51 -51
  93. package/lib/execution/internal/delay.js +6 -6
  94. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  95. package/lib/execution/internal/query-executioner.js +62 -62
  96. package/lib/execution/runner.js +325 -307
  97. package/lib/execution/transaction.js +409 -401
  98. package/lib/formatter/formatterUtils.js +42 -42
  99. package/lib/formatter/rawFormatter.js +84 -84
  100. package/lib/formatter/wrappingFormatter.js +250 -250
  101. package/lib/formatter.js +25 -25
  102. package/lib/index.js +3 -3
  103. package/lib/knex-builder/FunctionHelper.js +80 -54
  104. package/lib/knex-builder/Knex.js +59 -59
  105. package/lib/knex-builder/internal/config-resolver.js +57 -57
  106. package/lib/knex-builder/internal/parse-connection.js +87 -87
  107. package/lib/knex-builder/make-knex.js +345 -340
  108. package/lib/logger.js +76 -76
  109. package/lib/migrations/common/MigrationsLoader.js +36 -36
  110. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  111. package/lib/migrations/migrate/Migrator.js +598 -598
  112. package/lib/migrations/migrate/migrate-stub.js +17 -17
  113. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  114. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  115. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  116. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  117. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  118. package/lib/migrations/migrate/stub/eg.stub +14 -14
  119. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  120. package/lib/migrations/migrate/stub/js.stub +22 -22
  121. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  122. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  123. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  124. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  125. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  126. package/lib/migrations/migrate/stub/ls.stub +14 -14
  127. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  128. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  129. package/lib/migrations/migrate/stub/ts.stub +21 -21
  130. package/lib/migrations/migrate/table-creator.js +77 -77
  131. package/lib/migrations/migrate/table-resolver.js +27 -27
  132. package/lib/migrations/seed/Seeder.js +137 -137
  133. package/lib/migrations/seed/seed-stub.js +13 -13
  134. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  135. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  136. package/lib/migrations/seed/stub/coffee.stub +9 -9
  137. package/lib/migrations/seed/stub/eg.stub +11 -11
  138. package/lib/migrations/seed/stub/js.stub +13 -13
  139. package/lib/migrations/seed/stub/ls.stub +11 -11
  140. package/lib/migrations/seed/stub/mjs.stub +12 -12
  141. package/lib/migrations/seed/stub/ts.stub +13 -13
  142. package/lib/migrations/util/fs.js +86 -86
  143. package/lib/migrations/util/import-file.js +12 -12
  144. package/lib/migrations/util/is-module-type.js +9 -9
  145. package/lib/migrations/util/template.js +52 -52
  146. package/lib/migrations/util/timestamp.js +14 -14
  147. package/lib/query/analytic.js +52 -52
  148. package/lib/query/constants.js +15 -15
  149. package/lib/query/joinclause.js +270 -270
  150. package/lib/query/method-constants.js +136 -135
  151. package/lib/query/querybuilder.js +1793 -1794
  152. package/lib/query/querycompiler.js +1591 -1580
  153. package/lib/raw.js +139 -139
  154. package/lib/ref.js +39 -39
  155. package/lib/schema/builder.js +115 -115
  156. package/lib/schema/columnbuilder.js +146 -146
  157. package/lib/schema/columncompiler.js +307 -307
  158. package/lib/schema/compiler.js +187 -187
  159. package/lib/schema/internal/helpers.js +55 -55
  160. package/lib/schema/tablebuilder.js +376 -376
  161. package/lib/schema/tablecompiler.js +433 -433
  162. package/lib/schema/viewbuilder.js +92 -92
  163. package/lib/schema/viewcompiler.js +138 -138
  164. package/lib/util/finally-mixin.js +13 -13
  165. package/lib/util/helpers.js +95 -95
  166. package/lib/util/is.js +32 -32
  167. package/lib/util/nanoid.js +40 -40
  168. package/lib/util/noop.js +1 -1
  169. package/lib/util/save-async-stack.js +14 -14
  170. package/lib/util/security.js +26 -0
  171. package/lib/util/string.js +190 -190
  172. package/lib/util/timeout.js +29 -29
  173. package/package.json +12 -10
  174. package/scripts/build.js +125 -125
  175. package/scripts/clean.js +31 -31
  176. package/scripts/docker-compose.yml +152 -152
  177. package/scripts/next-release-howto.md +24 -24
  178. package/scripts/oracledb-install-driver-libs.sh +82 -82
  179. package/scripts/release.sh +34 -34
  180. package/scripts/runkit-example.js +34 -34
  181. package/scripts/stress-test/README.txt +18 -18
  182. package/scripts/stress-test/docker-compose.yml +57 -57
  183. package/scripts/stress-test/knex-stress-test.js +208 -208
  184. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  185. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  186. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  187. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  188. package/types/index.d.ts +3273 -3233
  189. package/types/result.d.ts +27 -27
  190. package/types/tables.d.ts +4 -4
@@ -1,184 +1,184 @@
1
- /**
2
- * Test case for figuring out robust way to recognize if connection is dead
3
- * for mysql based drivers.
4
- */
5
- const delay = require('../../lib/execution/internal/delay');
6
- const toxiproxy = require('toxiproxy-node-client');
7
- const toxicli = new toxiproxy.Toxiproxy('http://localhost:8474');
8
- const rp = require('request-promise-native');
9
-
10
- async function stdMysqlQuery(con, sql) {
11
- return new Promise((resolve, reject) => {
12
- try {
13
- con.query(
14
- {
15
- sql,
16
- timeout: 4000,
17
- },
18
- function (error, results, fields) {
19
- if (error) {
20
- reject(error);
21
- } else {
22
- resolve(results);
23
- }
24
- }
25
- );
26
- } catch (err) {
27
- reject(err); // double sure...
28
- }
29
- });
30
- }
31
-
32
- // ALL THE DRIVERS HAS DIFFERENT BAG OF TRICKS TO RECOVER AND
33
- // RECOGNIZE WHEN CONNECTION HAS BEEN CLOSED
34
-
35
- // ------------- setup mysql db driver connection
36
- const mysql = require('mysql');
37
- let mysqlCon = { state: 'disconnected' };
38
- async function mysqlQuery(sql) {
39
- // best way to check if connection is still alive
40
- if (mysqlCon.state === 'disconnected') {
41
- console.log('reconnecting mysql');
42
- mysqlCon = mysql.createConnection({
43
- host: 'localhost',
44
- user: 'root',
45
- password: 'mysqlrootpassword',
46
- port: 23306,
47
- connectTimeout: 500,
48
- });
49
- // not always triggered, if this happens during query
50
- mysqlCon.on('error', (err) => {
51
- console.log('- STATS Mysql connection died:', err);
52
- });
53
- }
54
- return stdMysqlQuery(mysqlCon, sql);
55
- }
56
-
57
- // ------------- setup mysql2 db driver connection
58
- const mysql2 = require('mysql2');
59
- let mysql2Con = { _fatalError: 'initmefirst' };
60
- async function mysql2Query(sql) {
61
- if (mysql2Con._fatalError) {
62
- console.log('reconnecting mysql2');
63
- mysql2Con = mysql2.createConnection({
64
- host: 'localhost',
65
- user: 'root',
66
- password: 'mysqlrootpassword',
67
- port: 23306,
68
- connectTimeout: 500,
69
- });
70
- mysql2Con.on('error', (err) => {
71
- console.log('- STATS Mysql2 connection died:', err);
72
- });
73
- }
74
- console.log('================ MYSQL2 Running query....');
75
- const res = await stdMysqlQuery(mysql2Con, sql);
76
- console.log('=========== done');
77
- return res;
78
- }
79
-
80
- const counters = {};
81
- function setMysqlQueryCounters(name) {
82
- const counts = (counters[name] = { queries: 0, results: 0, errors: 0 });
83
- }
84
- setMysqlQueryCounters('mysql');
85
- setMysqlQueryCounters('mysql2');
86
-
87
- const _ = require('lodash');
88
-
89
- // start printing out counters
90
- let lastCounters = _.cloneDeep(counters);
91
-
92
- setInterval(() => {
93
- const reqsPerSec = {};
94
- for (let key of Object.keys(counters)) {
95
- reqsPerSec[key] = {
96
- queries: counters[key].queries - lastCounters[key].queries,
97
- results: counters[key].results - lastCounters[key].results,
98
- errors: counters[key].errors - lastCounters[key].errors,
99
- };
100
- }
101
- console.log(
102
- '------------------------ STATS PER SECOND ------------------------'
103
- );
104
- console.dir(reqsPerSec, { colors: true });
105
- console.log(
106
- '------------------------------- EOS ------------------------------'
107
- );
108
- lastCounters = _.cloneDeep(counters);
109
-
110
- // if hang
111
- ///if (reqsPerSec.mysql2.queries === 0) process.exit(0);
112
- }, 1000);
113
-
114
- async function main() {
115
- async function recreateProxy(serviceName, listenPort, proxyToPort) {
116
- try {
117
- await rp.delete({
118
- url: `${toxicli.host}/proxies/${serviceName}`,
119
- });
120
- } catch (err) {}
121
-
122
- const proxy = await toxicli.createProxy({
123
- name: serviceName,
124
- listen: `0.0.0.0:${listenPort}`,
125
- upstream: `${serviceName}:${proxyToPort}`,
126
- });
127
-
128
- // add some latency
129
- await proxy.addToxic(
130
- new toxiproxy.Toxic(proxy, {
131
- type: 'latency',
132
- attributes: { latency: 1, jitter: 1 },
133
- })
134
- );
135
-
136
- // cause connections to be closed every some transferred bytes
137
- await proxy.addToxic(
138
- new toxiproxy.Toxic(proxy, {
139
- type: 'limit_data',
140
- attributes: { bytes: 1000 },
141
- })
142
- );
143
- }
144
-
145
- // create TCP proxies for simulating bad connections etc.
146
- async function recreateProxies() {
147
- console.log('----- Recreating proxies -> cutting connections completely');
148
- await recreateProxy('postgresql', 25432, 5432);
149
- await recreateProxy('mysql', 23306, 3306);
150
- await recreateProxy('oracledb', 21521, 1521);
151
- }
152
- setInterval(() => recreateProxies(), 2000);
153
-
154
- async function loopQueries(prefix, query) {
155
- const counts = counters[prefix];
156
-
157
- while (true) {
158
- try {
159
- counts.queries += 1;
160
- // without this delay we endup to busy failure loop
161
- await delay(0);
162
- await query();
163
- counts.results += 1;
164
- } catch (err) {
165
- counts.errors += 1;
166
- console.log(prefix, err);
167
- }
168
- }
169
- }
170
-
171
- await recreateProxies();
172
-
173
- loopQueries('mysql', () => mysqlQuery('select 1'));
174
- loopQueries('mysql2', () => mysql2Query('select 1'));
175
-
176
- // wait forever
177
- while (true) {
178
- await delay(1000);
179
- }
180
- }
181
-
182
- main()
183
- .then(() => console.log('DONE'))
184
- .catch((err) => console.log(err));
1
+ /**
2
+ * Test case for figuring out robust way to recognize if connection is dead
3
+ * for mysql based drivers.
4
+ */
5
+ const delay = require('../../lib/execution/internal/delay');
6
+ const toxiproxy = require('toxiproxy-node-client');
7
+ const toxicli = new toxiproxy.Toxiproxy('http://localhost:8474');
8
+ const rp = require('request-promise-native');
9
+
10
+ async function stdMysqlQuery(con, sql) {
11
+ return new Promise((resolve, reject) => {
12
+ try {
13
+ con.query(
14
+ {
15
+ sql,
16
+ timeout: 4000,
17
+ },
18
+ function (error, results, fields) {
19
+ if (error) {
20
+ reject(error);
21
+ } else {
22
+ resolve(results);
23
+ }
24
+ }
25
+ );
26
+ } catch (err) {
27
+ reject(err); // double sure...
28
+ }
29
+ });
30
+ }
31
+
32
+ // ALL THE DRIVERS HAS DIFFERENT BAG OF TRICKS TO RECOVER AND
33
+ // RECOGNIZE WHEN CONNECTION HAS BEEN CLOSED
34
+
35
+ // ------------- setup mysql db driver connection
36
+ const mysql = require('mysql');
37
+ let mysqlCon = { state: 'disconnected' };
38
+ async function mysqlQuery(sql) {
39
+ // best way to check if connection is still alive
40
+ if (mysqlCon.state === 'disconnected') {
41
+ console.log('reconnecting mysql');
42
+ mysqlCon = mysql.createConnection({
43
+ host: 'localhost',
44
+ user: 'root',
45
+ password: 'mysqlrootpassword',
46
+ port: 23306,
47
+ connectTimeout: 500,
48
+ });
49
+ // not always triggered, if this happens during query
50
+ mysqlCon.on('error', (err) => {
51
+ console.log('- STATS Mysql connection died:', err);
52
+ });
53
+ }
54
+ return stdMysqlQuery(mysqlCon, sql);
55
+ }
56
+
57
+ // ------------- setup mysql2 db driver connection
58
+ const mysql2 = require('mysql2');
59
+ let mysql2Con = { _fatalError: 'initmefirst' };
60
+ async function mysql2Query(sql) {
61
+ if (mysql2Con._fatalError) {
62
+ console.log('reconnecting mysql2');
63
+ mysql2Con = mysql2.createConnection({
64
+ host: 'localhost',
65
+ user: 'root',
66
+ password: 'mysqlrootpassword',
67
+ port: 23306,
68
+ connectTimeout: 500,
69
+ });
70
+ mysql2Con.on('error', (err) => {
71
+ console.log('- STATS Mysql2 connection died:', err);
72
+ });
73
+ }
74
+ console.log('================ MYSQL2 Running query....');
75
+ const res = await stdMysqlQuery(mysql2Con, sql);
76
+ console.log('=========== done');
77
+ return res;
78
+ }
79
+
80
+ const counters = {};
81
+ function setMysqlQueryCounters(name) {
82
+ const counts = (counters[name] = { queries: 0, results: 0, errors: 0 });
83
+ }
84
+ setMysqlQueryCounters('mysql');
85
+ setMysqlQueryCounters('mysql2');
86
+
87
+ const _ = require('lodash');
88
+
89
+ // start printing out counters
90
+ let lastCounters = _.cloneDeep(counters);
91
+
92
+ setInterval(() => {
93
+ const reqsPerSec = {};
94
+ for (let key of Object.keys(counters)) {
95
+ reqsPerSec[key] = {
96
+ queries: counters[key].queries - lastCounters[key].queries,
97
+ results: counters[key].results - lastCounters[key].results,
98
+ errors: counters[key].errors - lastCounters[key].errors,
99
+ };
100
+ }
101
+ console.log(
102
+ '------------------------ STATS PER SECOND ------------------------'
103
+ );
104
+ console.dir(reqsPerSec, { colors: true });
105
+ console.log(
106
+ '------------------------------- EOS ------------------------------'
107
+ );
108
+ lastCounters = _.cloneDeep(counters);
109
+
110
+ // if hang
111
+ ///if (reqsPerSec.mysql2.queries === 0) process.exit(0);
112
+ }, 1000);
113
+
114
+ async function main() {
115
+ async function recreateProxy(serviceName, listenPort, proxyToPort) {
116
+ try {
117
+ await rp.delete({
118
+ url: `${toxicli.host}/proxies/${serviceName}`,
119
+ });
120
+ } catch (err) {}
121
+
122
+ const proxy = await toxicli.createProxy({
123
+ name: serviceName,
124
+ listen: `0.0.0.0:${listenPort}`,
125
+ upstream: `${serviceName}:${proxyToPort}`,
126
+ });
127
+
128
+ // add some latency
129
+ await proxy.addToxic(
130
+ new toxiproxy.Toxic(proxy, {
131
+ type: 'latency',
132
+ attributes: { latency: 1, jitter: 1 },
133
+ })
134
+ );
135
+
136
+ // cause connections to be closed every some transferred bytes
137
+ await proxy.addToxic(
138
+ new toxiproxy.Toxic(proxy, {
139
+ type: 'limit_data',
140
+ attributes: { bytes: 1000 },
141
+ })
142
+ );
143
+ }
144
+
145
+ // create TCP proxies for simulating bad connections etc.
146
+ async function recreateProxies() {
147
+ console.log('----- Recreating proxies -> cutting connections completely');
148
+ await recreateProxy('postgresql', 25432, 5432);
149
+ await recreateProxy('mysql', 23306, 3306);
150
+ await recreateProxy('oracledb', 21521, 1521);
151
+ }
152
+ setInterval(() => recreateProxies(), 2000);
153
+
154
+ async function loopQueries(prefix, query) {
155
+ const counts = counters[prefix];
156
+
157
+ while (true) {
158
+ try {
159
+ counts.queries += 1;
160
+ // without this delay we endup to busy failure loop
161
+ await delay(0);
162
+ await query();
163
+ counts.results += 1;
164
+ } catch (err) {
165
+ counts.errors += 1;
166
+ console.log(prefix, err);
167
+ }
168
+ }
169
+ }
170
+
171
+ await recreateProxies();
172
+
173
+ loopQueries('mysql', () => mysqlQuery('select 1'));
174
+ loopQueries('mysql2', () => mysql2Query('select 1'));
175
+
176
+ // wait forever
177
+ while (true) {
178
+ await delay(1000);
179
+ }
180
+ }
181
+
182
+ main()
183
+ .then(() => console.log('DONE'))
184
+ .catch((err) => console.log(err));
@@ -1,90 +1,90 @@
1
- #!/usr/bin/env node
2
-
3
- const path = require('path');
4
- const fs = require('fs');
5
-
6
- // Directory constants
7
- const scriptDirectory = __dirname;
8
- const repoDirectory = path.join(scriptDirectory, '..');
9
- const libDirectory = path.join(repoDirectory, 'lib');
10
-
11
- const helpText = `
12
- Helper script to update lib/.gitignore for all .js files from .ts files.
13
-
14
- update_gitignore_for_tsc_output.js COMMAND
15
-
16
- COMMAND:
17
- run: Update lib/.gitignore file.
18
- help: Print this menu.
19
-
20
- NOTES FOR USAGE:
21
- 1. This script is tested to work on Ubuntu 18.04 LTS.
22
- `;
23
-
24
- const gitignoreHeader = `# DO NOT EDIT, GENERATED BY: scripts/update_gitignore_for_tsc_output.js
25
-
26
- # Do not include tsc generated type definitions
27
- **/*.d.ts
28
-
29
- # Do not include tsc source maps
30
- **/*.js.map
31
-
32
- # Do not include .js files from .ts files
33
- `;
34
-
35
- function main(cliCommand) {
36
- if (cliCommand === 'run') {
37
- console.log('Generating lib/.gitignore ...');
38
-
39
- // Find all .ts files in lib/
40
- const directoriesToProcess = [libDirectory];
41
- const tsFiles = [];
42
- while (directoriesToProcess.length > 0) {
43
- const directory = directoriesToProcess.pop();
44
- if (!fs.existsSync(directory)) {
45
- throw new Error("Directory doesn't exist:", directory);
46
- }
47
-
48
- const files = fs.readdirSync(directory);
49
- files.forEach((file) => {
50
- const filename = path.join(directory, file);
51
- const stat = fs.lstatSync(filename);
52
- if (stat.isDirectory()) {
53
- directoriesToProcess.push(filename);
54
- } else if (filename.endsWith('.ts') && !filename.endsWith('.d.ts')) {
55
- tsFiles.push(filename);
56
- console.log('Found .ts file:', filename);
57
- }
58
- });
59
- }
60
-
61
- // Get paths of .js files to ignore
62
- const jsFilesToIgnore = tsFiles.map((filepath) => {
63
- // Cuts off `${libDirectory}/`
64
- const relativeTsPath = filepath.slice(libDirectory.length + 1);
65
- // Swaps .ts for .js file ending
66
- const relativeJsPath =
67
- relativeTsPath.slice(0, relativeTsPath.length - 3) + '.js';
68
- // Always use POSIX-style path separators - .gitignore requires it
69
- return relativeJsPath.split(path.sep).join(path.posix.sep);
70
- });
71
- const jsFilesToIgnoreString = jsFilesToIgnore.join('\n');
72
- const libGitignorePath = path.join(libDirectory, '.gitignore');
73
- fs.writeFileSync(
74
- libGitignorePath,
75
- gitignoreHeader + jsFilesToIgnoreString + '\n'
76
- );
77
- console.log('DONE');
78
- } else if (['help', '--help', '-h', undefined].includes(cliCommand)) {
79
- console.log(helpText);
80
- } else {
81
- console.log(`Unsupported command: ${cliCommand}`);
82
- console.log("Try running with 'help' to see supported commands.");
83
- process.exit(1);
84
- }
85
- }
86
-
87
- // Main script logic
88
- const cliCommand = process.argv[2];
89
- // Start the bash app's main function
90
- main(cliCommand);
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('path');
4
+ const fs = require('fs');
5
+
6
+ // Directory constants
7
+ const scriptDirectory = __dirname;
8
+ const repoDirectory = path.join(scriptDirectory, '..');
9
+ const libDirectory = path.join(repoDirectory, 'lib');
10
+
11
+ const helpText = `
12
+ Helper script to update lib/.gitignore for all .js files from .ts files.
13
+
14
+ update_gitignore_for_tsc_output.js COMMAND
15
+
16
+ COMMAND:
17
+ run: Update lib/.gitignore file.
18
+ help: Print this menu.
19
+
20
+ NOTES FOR USAGE:
21
+ 1. This script is tested to work on Ubuntu 18.04 LTS.
22
+ `;
23
+
24
+ const gitignoreHeader = `# DO NOT EDIT, GENERATED BY: scripts/update_gitignore_for_tsc_output.js
25
+
26
+ # Do not include tsc generated type definitions
27
+ **/*.d.ts
28
+
29
+ # Do not include tsc source maps
30
+ **/*.js.map
31
+
32
+ # Do not include .js files from .ts files
33
+ `;
34
+
35
+ function main(cliCommand) {
36
+ if (cliCommand === 'run') {
37
+ console.log('Generating lib/.gitignore ...');
38
+
39
+ // Find all .ts files in lib/
40
+ const directoriesToProcess = [libDirectory];
41
+ const tsFiles = [];
42
+ while (directoriesToProcess.length > 0) {
43
+ const directory = directoriesToProcess.pop();
44
+ if (!fs.existsSync(directory)) {
45
+ throw new Error("Directory doesn't exist:", directory);
46
+ }
47
+
48
+ const files = fs.readdirSync(directory);
49
+ files.forEach((file) => {
50
+ const filename = path.join(directory, file);
51
+ const stat = fs.lstatSync(filename);
52
+ if (stat.isDirectory()) {
53
+ directoriesToProcess.push(filename);
54
+ } else if (filename.endsWith('.ts') && !filename.endsWith('.d.ts')) {
55
+ tsFiles.push(filename);
56
+ console.log('Found .ts file:', filename);
57
+ }
58
+ });
59
+ }
60
+
61
+ // Get paths of .js files to ignore
62
+ const jsFilesToIgnore = tsFiles.map((filepath) => {
63
+ // Cuts off `${libDirectory}/`
64
+ const relativeTsPath = filepath.slice(libDirectory.length + 1);
65
+ // Swaps .ts for .js file ending
66
+ const relativeJsPath =
67
+ relativeTsPath.slice(0, relativeTsPath.length - 3) + '.js';
68
+ // Always use POSIX-style path separators - .gitignore requires it
69
+ return relativeJsPath.split(path.sep).join(path.posix.sep);
70
+ });
71
+ const jsFilesToIgnoreString = jsFilesToIgnore.join('\n');
72
+ const libGitignorePath = path.join(libDirectory, '.gitignore');
73
+ fs.writeFileSync(
74
+ libGitignorePath,
75
+ gitignoreHeader + jsFilesToIgnoreString + '\n'
76
+ );
77
+ console.log('DONE');
78
+ } else if (['help', '--help', '-h', undefined].includes(cliCommand)) {
79
+ console.log(helpText);
80
+ } else {
81
+ console.log(`Unsupported command: ${cliCommand}`);
82
+ console.log("Try running with 'help' to see supported commands.");
83
+ process.exit(1);
84
+ }
85
+ }
86
+
87
+ // Main script logic
88
+ const cliCommand = process.argv[2];
89
+ // Start the bash app's main function
90
+ main(cliCommand);