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,145 +1,145 @@
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
- const _ = require('lodash');
10
-
11
- async function stdMysqlQuery(con, sql) {
12
- return new Promise((resolve, reject) => {
13
- try {
14
- con.query(
15
- {
16
- sql,
17
- timeout: 500,
18
- },
19
- function (error, results, fields) {
20
- if (error) {
21
- reject(error);
22
- } else {
23
- resolve(results);
24
- }
25
- }
26
- );
27
- } catch (err) {
28
- reject(err); // double sure...
29
- }
30
- });
31
- }
32
-
33
- const mysql2 = require('mysql2');
34
- let mysql2Con = { _fatalError: 'initmefirst' };
35
- async function mysql2Query(sql) {
36
- // recreate connection on fatal error
37
- if (mysql2Con._fatalError) {
38
- console.log('========== Reconnecting mysql2');
39
- mysql2Con = mysql2.createConnection({
40
- host: 'localhost',
41
- user: 'root',
42
- password: 'mysqlrootpassword',
43
- port: 23306,
44
- connectTimeout: 500,
45
- debug: true,
46
- });
47
- mysql2Con.on('error', (err) => {
48
- console.log('- STATS Mysql2 connection died:', err);
49
- });
50
- }
51
- console.log('================ MYSQL2 Running query ======');
52
- const res = await stdMysqlQuery(mysql2Con, sql);
53
- console.log('====================== done ================');
54
- return res;
55
- }
56
-
57
- const counters = {};
58
- function setMysqlQueryCounters(name) {
59
- const counts = (counters[name] = { queries: 0, results: 0, errors: 0 });
60
- }
61
- setMysqlQueryCounters('mysql2');
62
-
63
- // start printing out counters
64
- let lastCounters = _.cloneDeep(counters);
65
- setInterval(() => {
66
- const reqsPerSec = {};
67
- for (let key of Object.keys(counters)) {
68
- reqsPerSec[key] = {
69
- queries: counters[key].queries - lastCounters[key].queries,
70
- results: counters[key].results - lastCounters[key].results,
71
- errors: counters[key].errors - lastCounters[key].errors,
72
- };
73
- }
74
- console.log(
75
- '------------------------ STATS PER SECOND ------------------------'
76
- );
77
- console.dir(reqsPerSec, { colors: true });
78
- console.log(
79
- '------------------------------- EOS ------------------------------'
80
- );
81
- lastCounters = _.cloneDeep(counters);
82
- }, 1000);
83
-
84
- async function recreateProxy(serviceName, listenPort, proxyToPort) {
85
- try {
86
- await rp.delete({
87
- url: `${toxicli.host}/proxies/${serviceName}`,
88
- });
89
- } catch (err) {}
90
-
91
- const proxy = await toxicli.createProxy({
92
- name: serviceName,
93
- listen: `0.0.0.0:${listenPort}`,
94
- upstream: `${serviceName}:${proxyToPort}`,
95
- });
96
-
97
- // add some latency
98
- await proxy.addToxic(
99
- new toxiproxy.Toxic(proxy, {
100
- type: 'latency',
101
- attributes: { latency: 1, jitter: 1 },
102
- })
103
- );
104
-
105
- // cause connections to be closed every some transferred bytes
106
- await proxy.addToxic(
107
- new toxiproxy.Toxic(proxy, {
108
- type: 'limit_data',
109
- attributes: { bytes: 1000 },
110
- })
111
- );
112
- }
113
-
114
- async function main() {
115
- await recreateProxy('mysql', 23306, 3306);
116
- setInterval(() => recreateProxy('mysql', 23306, 3306), 2000);
117
-
118
- async function loopQueries(prefix, query) {
119
- const counts = counters[prefix];
120
-
121
- while (true) {
122
- try {
123
- counts.queries += 1;
124
- // without this delay we might endup to busy failure loop
125
- await delay(0);
126
- await query();
127
- counts.results += 1;
128
- } catch (err) {
129
- counts.errors += 1;
130
- console.log(prefix, err);
131
- }
132
- }
133
- }
134
-
135
- loopQueries('mysql2', () => mysql2Query('select 1'));
136
-
137
- // wait forever
138
- while (true) {
139
- await delay(1000);
140
- }
141
- }
142
-
143
- main()
144
- .then(() => console.log('DONE'))
145
- .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
+ const _ = require('lodash');
10
+
11
+ async function stdMysqlQuery(con, sql) {
12
+ return new Promise((resolve, reject) => {
13
+ try {
14
+ con.query(
15
+ {
16
+ sql,
17
+ timeout: 500,
18
+ },
19
+ function (error, results, fields) {
20
+ if (error) {
21
+ reject(error);
22
+ } else {
23
+ resolve(results);
24
+ }
25
+ }
26
+ );
27
+ } catch (err) {
28
+ reject(err); // double sure...
29
+ }
30
+ });
31
+ }
32
+
33
+ const mysql2 = require('mysql2');
34
+ let mysql2Con = { _fatalError: 'initmefirst' };
35
+ async function mysql2Query(sql) {
36
+ // recreate connection on fatal error
37
+ if (mysql2Con._fatalError) {
38
+ console.log('========== Reconnecting mysql2');
39
+ mysql2Con = mysql2.createConnection({
40
+ host: 'localhost',
41
+ user: 'root',
42
+ password: 'mysqlrootpassword',
43
+ port: 23306,
44
+ connectTimeout: 500,
45
+ debug: true,
46
+ });
47
+ mysql2Con.on('error', (err) => {
48
+ console.log('- STATS Mysql2 connection died:', err);
49
+ });
50
+ }
51
+ console.log('================ MYSQL2 Running query ======');
52
+ const res = await stdMysqlQuery(mysql2Con, sql);
53
+ console.log('====================== done ================');
54
+ return res;
55
+ }
56
+
57
+ const counters = {};
58
+ function setMysqlQueryCounters(name) {
59
+ const counts = (counters[name] = { queries: 0, results: 0, errors: 0 });
60
+ }
61
+ setMysqlQueryCounters('mysql2');
62
+
63
+ // start printing out counters
64
+ let lastCounters = _.cloneDeep(counters);
65
+ setInterval(() => {
66
+ const reqsPerSec = {};
67
+ for (let key of Object.keys(counters)) {
68
+ reqsPerSec[key] = {
69
+ queries: counters[key].queries - lastCounters[key].queries,
70
+ results: counters[key].results - lastCounters[key].results,
71
+ errors: counters[key].errors - lastCounters[key].errors,
72
+ };
73
+ }
74
+ console.log(
75
+ '------------------------ STATS PER SECOND ------------------------'
76
+ );
77
+ console.dir(reqsPerSec, { colors: true });
78
+ console.log(
79
+ '------------------------------- EOS ------------------------------'
80
+ );
81
+ lastCounters = _.cloneDeep(counters);
82
+ }, 1000);
83
+
84
+ async function recreateProxy(serviceName, listenPort, proxyToPort) {
85
+ try {
86
+ await rp.delete({
87
+ url: `${toxicli.host}/proxies/${serviceName}`,
88
+ });
89
+ } catch (err) {}
90
+
91
+ const proxy = await toxicli.createProxy({
92
+ name: serviceName,
93
+ listen: `0.0.0.0:${listenPort}`,
94
+ upstream: `${serviceName}:${proxyToPort}`,
95
+ });
96
+
97
+ // add some latency
98
+ await proxy.addToxic(
99
+ new toxiproxy.Toxic(proxy, {
100
+ type: 'latency',
101
+ attributes: { latency: 1, jitter: 1 },
102
+ })
103
+ );
104
+
105
+ // cause connections to be closed every some transferred bytes
106
+ await proxy.addToxic(
107
+ new toxiproxy.Toxic(proxy, {
108
+ type: 'limit_data',
109
+ attributes: { bytes: 1000 },
110
+ })
111
+ );
112
+ }
113
+
114
+ async function main() {
115
+ await recreateProxy('mysql', 23306, 3306);
116
+ setInterval(() => recreateProxy('mysql', 23306, 3306), 2000);
117
+
118
+ async function loopQueries(prefix, query) {
119
+ const counts = counters[prefix];
120
+
121
+ while (true) {
122
+ try {
123
+ counts.queries += 1;
124
+ // without this delay we might endup to busy failure loop
125
+ await delay(0);
126
+ await query();
127
+ counts.results += 1;
128
+ } catch (err) {
129
+ counts.errors += 1;
130
+ console.log(prefix, err);
131
+ }
132
+ }
133
+ }
134
+
135
+ loopQueries('mysql2', () => mysql2Query('select 1'));
136
+
137
+ // wait forever
138
+ while (true) {
139
+ await delay(1000);
140
+ }
141
+ }
142
+
143
+ main()
144
+ .then(() => console.log('DONE'))
145
+ .catch((err) => console.log(err));
@@ -1,100 +1,100 @@
1
- /**
2
- * Test case when mysql2 driver strangely exits when one tries to send query
3
- * to dead connection.
4
- */
5
-
6
- const delay = require('../../lib/execution/internal/delay');
7
- const toxiproxy = require('toxiproxy-node-client');
8
- const toxicli = new toxiproxy.Toxiproxy('http://localhost:8474');
9
- const rp = require('request-promise-native');
10
-
11
- // drops old toxicproxy and creates new
12
- async function recreateProxy(serviceName, listenPort, proxyToPort) {
13
- try {
14
- await rp.delete({
15
- url: `${toxicli.host}/proxies/${serviceName}`,
16
- });
17
- } catch (err) {
18
- // there was no proxy by that name... its ok
19
- }
20
-
21
- const proxy = await toxicli.createProxy({
22
- name: serviceName,
23
- listen: `0.0.0.0:${listenPort}`,
24
- upstream: `${serviceName}:${proxyToPort}`,
25
- });
26
- }
27
-
28
- async function insanelyParanoidQuery(con) {
29
- console.log('sending query');
30
- const res = await new Promise((resolve, reject) => {
31
- try {
32
- con.query('select 1', [], function (err, rows, fields) {
33
- if (err) {
34
- reject(err);
35
- } else {
36
- resolve(rows);
37
- }
38
- });
39
- } catch (err) {
40
- console.log('Huh synchronous exception?! (shouldnt be possible)');
41
- reject(err);
42
- }
43
- });
44
- console.log(res);
45
- }
46
-
47
- async function main() {
48
- // create proxy from localhost:23306 -> mysqldocker:3306
49
- await recreateProxy('mysql', 23306, 3306);
50
-
51
- // ------------- setup mysql2 db driver connection
52
- const mysql2 = require('mysql2'); // with mysql this works...
53
- const mysql2Con = await mysql2.createConnection({
54
- host: 'localhost',
55
- user: 'root',
56
- password: 'mysqlrootpassword',
57
- port: 23306,
58
- });
59
-
60
- mysql2Con.on('error', function (err) {
61
- console.log("I'm dead", err);
62
- });
63
-
64
- console.log('Going to cut connections');
65
-
66
- // cut connection during recreate
67
- await recreateProxy('mysql', 23306, 3306);
68
-
69
- console.log('Proxy recreated... start waiting');
70
-
71
- // wait forever
72
- while (true) {
73
- await delay(1000);
74
- try {
75
- await insanelyParanoidQuery(mysql2Con);
76
- } catch (err) {
77
- console.log('query failed:', err);
78
- }
79
- await recreateProxy('mysql', 23306, 3306);
80
- }
81
- }
82
-
83
- main()
84
- .then(() => console.log('Process stopped normally'))
85
- .catch((err) => {
86
- console.log('Process stopped to failure', err);
87
- });
88
-
89
- console.log('Waiting for eventloop to stop...');
90
-
91
- process.on('uncaughtException', function (err) {
92
- console.log('uncaughtException', err);
93
- });
94
-
95
- process.on('exit', function () {
96
- console.log(
97
- 'Did someone call process.exit() or wat? exitCode:',
98
- process.exitCode
99
- );
100
- });
1
+ /**
2
+ * Test case when mysql2 driver strangely exits when one tries to send query
3
+ * to dead connection.
4
+ */
5
+
6
+ const delay = require('../../lib/execution/internal/delay');
7
+ const toxiproxy = require('toxiproxy-node-client');
8
+ const toxicli = new toxiproxy.Toxiproxy('http://localhost:8474');
9
+ const rp = require('request-promise-native');
10
+
11
+ // drops old toxicproxy and creates new
12
+ async function recreateProxy(serviceName, listenPort, proxyToPort) {
13
+ try {
14
+ await rp.delete({
15
+ url: `${toxicli.host}/proxies/${serviceName}`,
16
+ });
17
+ } catch (err) {
18
+ // there was no proxy by that name... its ok
19
+ }
20
+
21
+ const proxy = await toxicli.createProxy({
22
+ name: serviceName,
23
+ listen: `0.0.0.0:${listenPort}`,
24
+ upstream: `${serviceName}:${proxyToPort}`,
25
+ });
26
+ }
27
+
28
+ async function insanelyParanoidQuery(con) {
29
+ console.log('sending query');
30
+ const res = await new Promise((resolve, reject) => {
31
+ try {
32
+ con.query('select 1', [], function (err, rows, fields) {
33
+ if (err) {
34
+ reject(err);
35
+ } else {
36
+ resolve(rows);
37
+ }
38
+ });
39
+ } catch (err) {
40
+ console.log('Huh synchronous exception?! (shouldnt be possible)');
41
+ reject(err);
42
+ }
43
+ });
44
+ console.log(res);
45
+ }
46
+
47
+ async function main() {
48
+ // create proxy from localhost:23306 -> mysqldocker:3306
49
+ await recreateProxy('mysql', 23306, 3306);
50
+
51
+ // ------------- setup mysql2 db driver connection
52
+ const mysql2 = require('mysql2'); // with mysql this works...
53
+ const mysql2Con = await mysql2.createConnection({
54
+ host: 'localhost',
55
+ user: 'root',
56
+ password: 'mysqlrootpassword',
57
+ port: 23306,
58
+ });
59
+
60
+ mysql2Con.on('error', function (err) {
61
+ console.log("I'm dead", err);
62
+ });
63
+
64
+ console.log('Going to cut connections');
65
+
66
+ // cut connection during recreate
67
+ await recreateProxy('mysql', 23306, 3306);
68
+
69
+ console.log('Proxy recreated... start waiting');
70
+
71
+ // wait forever
72
+ while (true) {
73
+ await delay(1000);
74
+ try {
75
+ await insanelyParanoidQuery(mysql2Con);
76
+ } catch (err) {
77
+ console.log('query failed:', err);
78
+ }
79
+ await recreateProxy('mysql', 23306, 3306);
80
+ }
81
+ }
82
+
83
+ main()
84
+ .then(() => console.log('Process stopped normally'))
85
+ .catch((err) => {
86
+ console.log('Process stopped to failure', err);
87
+ });
88
+
89
+ console.log('Waiting for eventloop to stop...');
90
+
91
+ process.on('uncaughtException', function (err) {
92
+ console.log('uncaughtException', err);
93
+ });
94
+
95
+ process.on('exit', function () {
96
+ console.log(
97
+ 'Did someone call process.exit() or wat? exitCode:',
98
+ process.exitCode
99
+ );
100
+ });