├── .gitignore
├── README.md
├── cloudflare-mysql
├── .eslintignore
├── .eslintrc
├── .github
│ └── workflows
│ │ └── ci.yml
├── .gitignore
├── Changes.md
├── License
├── Readme.md
├── appveyor.yml
├── benchmark
│ ├── analyze.js
│ ├── parse-100k-blog-rows.js
│ └── select-100k-blog-rows.js
├── index.d.ts
├── index.js
├── lib
│ ├── BufferCopy.js
│ ├── Connection.js
│ ├── ConnectionConfig.js
│ ├── Pool.js
│ ├── PoolCluster.js
│ ├── PoolConfig.js
│ ├── PoolConnection.js
│ ├── PoolNamespace.js
│ ├── PoolSelector.js
│ └── protocol
│ │ ├── Auth.js
│ │ ├── BufferList.js
│ │ ├── PacketHeader.js
│ │ ├── PacketWriter.js
│ │ ├── Parser.js
│ │ ├── Protocol.js
│ │ ├── ResultSet.js
│ │ ├── SqlString.js
│ │ ├── Timer.js
│ │ ├── constants
│ │ ├── charsets.js
│ │ ├── client.js
│ │ ├── errors.js
│ │ ├── field_flags.js
│ │ ├── server_status.js
│ │ ├── ssl_profiles.js
│ │ └── types.js
│ │ ├── packets
│ │ ├── AuthSwitchRequestPacket.js
│ │ ├── AuthSwitchResponsePacket.js
│ │ ├── ClientAuthenticationPacket.js
│ │ ├── ComChangeUserPacket.js
│ │ ├── ComPingPacket.js
│ │ ├── ComQueryPacket.js
│ │ ├── ComQuitPacket.js
│ │ ├── ComStatisticsPacket.js
│ │ ├── EmptyPacket.js
│ │ ├── EofPacket.js
│ │ ├── ErrorPacket.js
│ │ ├── Field.js
│ │ ├── FieldPacket.js
│ │ ├── HandshakeInitializationPacket.js
│ │ ├── LocalDataFilePacket.js
│ │ ├── LocalInfileRequestPacket.js
│ │ ├── OkPacket.js
│ │ ├── OldPasswordPacket.js
│ │ ├── ResultSetHeaderPacket.js
│ │ ├── RowDataPacket.js
│ │ ├── SSLRequestPacket.js
│ │ ├── StatisticsPacket.js
│ │ ├── UseOldPasswordPacket.js
│ │ └── index.js
│ │ └── sequences
│ │ ├── ChangeUser.js
│ │ ├── Handshake.js
│ │ ├── Ping.js
│ │ ├── Query.js
│ │ ├── Quit.js
│ │ ├── Sequence.js
│ │ ├── Statistics.js
│ │ └── index.js
├── package.json
├── test
│ ├── FakeServer.js
│ ├── common.js
│ ├── fixtures
│ │ ├── data.csv
│ │ ├── server.crt
│ │ └── server.key
│ ├── integration
│ │ └── connection
│ │ │ ├── test-bad-credentials.js
│ │ │ ├── test-bulk-insert.js
│ │ │ ├── test-change-user-charset.js
│ │ │ ├── test-change-user-reset.js
│ │ │ ├── test-connection-config-flags-affected-rows.js
│ │ │ ├── test-connection-destroy.js
│ │ │ ├── test-connection-thread-id.js
│ │ │ ├── test-error-sqlmessage.js
│ │ │ ├── test-insert-results.js
│ │ │ ├── test-load-data-infile-disable.js
│ │ │ ├── test-load-data-infile.js
│ │ │ ├── test-multiple-statements-load-data-infile.js
│ │ │ ├── test-multiple-statements-streaming.js
│ │ │ ├── test-multiple-statements-with-error.js
│ │ │ ├── test-multiple-statements.js
│ │ │ ├── test-nested-tables-query.js
│ │ │ ├── test-ping.js
│ │ │ ├── test-procedure-with-multiple-selects.js
│ │ │ ├── test-procedure-with-single-select.js
│ │ │ ├── test-query-changed-rows.js
│ │ │ ├── test-query-empty.js
│ │ │ ├── test-query-escape-id.js
│ │ │ ├── test-query-escaping.js
│ │ │ ├── test-query.js
│ │ │ ├── test-select-empty-string.js
│ │ │ ├── test-send-and-receive-large-packets.js
│ │ │ ├── test-send-and-receive-large-text.js
│ │ │ ├── test-server-timeout-disconnect.js
│ │ │ ├── test-statistics.js
│ │ │ ├── test-timezones.js
│ │ │ ├── test-transaction-commit.js
│ │ │ ├── test-transaction-rollback.js
│ │ │ ├── test-type-cast-null-fields.js
│ │ │ ├── test-type-cast-query.js
│ │ │ ├── test-type-casting.js
│ │ │ └── test-zerofill-results.js
│ ├── run.js
│ └── unit
│ │ ├── connection
│ │ ├── test-auth-no-old-password.js
│ │ ├── test-auth-no-password.js
│ │ ├── test-auth-old-password.js
│ │ ├── test-auth-password.js
│ │ ├── test-auth-switch-native.js
│ │ ├── test-auth-switch-unknown.js
│ │ ├── test-callback-errors-are-not-caught.js
│ │ ├── test-callback-primitive-errors-are-not-caught.js
│ │ ├── test-change-database-fatal-error.js
│ │ ├── test-change-user-auth-switch-unknown.js
│ │ ├── test-change-user-auth-switch.js
│ │ ├── test-change-user-before-connect.js
│ │ ├── test-change-user-empty-queue.js
│ │ ├── test-change-user-fatal-error.js
│ │ ├── test-change-user-timeout.js
│ │ ├── test-change-user.js
│ │ ├── test-connect-domain.js
│ │ ├── test-connect-error-event.js
│ │ ├── test-connect-event.js
│ │ ├── test-connect-no-domain.js
│ │ ├── test-connect-timeout-only.js
│ │ ├── test-connect-timeout.js
│ │ ├── test-connection-error.js
│ │ ├── test-connection-ssl-ciphers-unknown.js
│ │ ├── test-connection-ssl-ciphers.js
│ │ ├── test-connection-ssl-denied.js
│ │ ├── test-connection-ssl-ignore.js
│ │ ├── test-connection-ssl-max-version-accept.js
│ │ ├── test-connection-ssl-max-version-reject.js
│ │ ├── test-connection-ssl-min-version-accept.js
│ │ ├── test-connection-ssl-min-version-reject.js
│ │ ├── test-connection-ssl-reject.js
│ │ ├── test-connection-ssl.js
│ │ ├── test-connection-thread-id-error.js
│ │ ├── test-connection-thread-id.js
│ │ ├── test-custom-query-format.js
│ │ ├── test-custom-type-cast.js
│ │ ├── test-date-type-cast.js
│ │ ├── test-datetime-type-cast.js
│ │ ├── test-debug-exclude.js
│ │ ├── test-debug-parser-error.js
│ │ ├── test-debug.js
│ │ ├── test-domain-implicit.js
│ │ ├── test-domains.js
│ │ ├── test-double-connect.js
│ │ ├── test-drain-event.js
│ │ ├── test-end-event.js
│ │ ├── test-enqueue-event.js
│ │ ├── test-error-event.js
│ │ ├── test-error-trace-bad-stack.js
│ │ ├── test-error-trace-no-stack.js
│ │ ├── test-error-trace.js
│ │ ├── test-exception-safety.js
│ │ ├── test-fatal-connect-error.js
│ │ ├── test-fatal-network-error-going-to-all-callbacks.js
│ │ ├── test-fatal-network-error-without-handlers.js
│ │ ├── test-host-denied-error.js
│ │ ├── test-implicit-connect.js
│ │ ├── test-incorrect-packet-sequence.js
│ │ ├── test-insecure-auth-error.js
│ │ ├── test-large-blobs.js
│ │ ├── test-load-data-infile-disable.js
│ │ ├── test-long-stack-traces-disabled.js
│ │ ├── test-long-stack-traces-for-connection-errors.js
│ │ ├── test-long-stack-traces.js
│ │ ├── test-packet-out-of-order.js
│ │ ├── test-parser-error.js
│ │ ├── test-protocol-stray-packet.js
│ │ ├── test-query-after-destroy.js
│ │ ├── test-query-after-end-without-callback.js
│ │ ├── test-query-after-end.js
│ │ ├── test-query-timeout.js
│ │ ├── test-quit-ok-packet.js
│ │ ├── test-server-unexpected-disconnect.js
│ │ ├── test-timestamp-type-cast.js
│ │ └── test-unix-domain-socket.js
│ │ ├── pool-cluster
│ │ ├── test-add-after-end.js
│ │ ├── test-add-same-id.js
│ │ ├── test-connection-default-selector.js
│ │ ├── test-connection-error-remove.js
│ │ ├── test-connection-error.js
│ │ ├── test-connection-fatal-error-remove.js
│ │ ├── test-connection-no-retry.js
│ │ ├── test-connection-order-fatal.js
│ │ ├── test-connection-order.js
│ │ ├── test-connection-random.js
│ │ ├── test-connection-retry-fatal-end.js
│ │ ├── test-connection-retry.js
│ │ ├── test-connection-rr-error.js
│ │ ├── test-connection-rr.js
│ │ ├── test-end-empty.js
│ │ ├── test-internals.js
│ │ ├── test-pattern.js
│ │ ├── test-query-connection-error.js
│ │ ├── test-query-pool-error.js
│ │ ├── test-query-restore.js
│ │ ├── test-query.js
│ │ ├── test-remove-by-name.js
│ │ ├── test-remove-by-pattern.js
│ │ ├── test-remove-fatal-end.js
│ │ ├── test-restore-events.js
│ │ └── test-restore.js
│ │ ├── pool
│ │ ├── test-acquire-after-end.js
│ │ ├── test-acquire-event.js
│ │ ├── test-acquire-timeout-existing.js
│ │ ├── test-acquire-timeout-new.js
│ │ ├── test-change-user-config.js
│ │ ├── test-change-user-restore.js
│ │ ├── test-connection-bad.js
│ │ ├── test-connection-destroy.js
│ │ ├── test-connection-domain.js
│ │ ├── test-connection-event.js
│ │ ├── test-connection-fatal-end.js
│ │ ├── test-connection-limit-no-wait.js
│ │ ├── test-connection-limit.js
│ │ ├── test-connection-no-domain.js
│ │ ├── test-connection-release-after-error.js
│ │ ├── test-connection-reset.js
│ │ ├── test-custom-type-cast.js
│ │ ├── test-debug.js
│ │ ├── test-destroy-connection.js
│ │ ├── test-domain-implicit.js
│ │ ├── test-domains.js
│ │ ├── test-double-release.js
│ │ ├── test-end-empty.js
│ │ ├── test-end-ping.js
│ │ ├── test-end-queued.js
│ │ ├── test-enqueue-event.js
│ │ ├── test-escape-id.js
│ │ ├── test-escape.js
│ │ ├── test-get-connection.js
│ │ ├── test-long-stack-traces.js
│ │ ├── test-pool-connection.js
│ │ ├── test-protocol-stray-packet.js
│ │ ├── test-query-connection-error.js
│ │ ├── test-query-end-after-error.js
│ │ ├── test-query-error.js
│ │ ├── test-query-events.js
│ │ ├── test-query-stream-connection-error.js
│ │ ├── test-query-streaming-rows.js
│ │ ├── test-query.js
│ │ ├── test-queue-limit.js
│ │ └── test-release-event.js
│ │ ├── protocol
│ │ ├── test-Parser.js
│ │ └── test-SqlString.js
│ │ ├── query
│ │ ├── test-args-query-bad-callback.js
│ │ ├── test-args-query-like-object-values.js
│ │ ├── test-args-query-like-object.js
│ │ ├── test-error-event-fatal.js
│ │ ├── test-error-event.js
│ │ ├── test-query-end-after-error.js
│ │ ├── test-query-events.js
│ │ ├── test-result-rows-enumerate.js
│ │ ├── test-stream-before-queue.js
│ │ ├── test-stream-emits-close-after-end.js
│ │ ├── test-stream-emits-close.js
│ │ ├── test-streaming-destroy.js
│ │ ├── test-streaming-quick-pause-resume.js
│ │ └── test-streaming-rows.js
│ │ ├── test-ConnectionConfig.js
│ │ ├── test-Mysql.js
│ │ └── test-PoolConfig.js
└── tool
│ ├── free-port.js
│ ├── generate-error-constants.js
│ ├── generate-type-constants.js
│ ├── install-nyc.js
│ ├── lint-readme.js
│ ├── mysql-version.js
│ ├── version-changes.js
│ └── wait-mysql.js
├── cloudflare-net-polyfill
├── dist
│ ├── index.d.ts
│ ├── index.d.ts.map
│ ├── index.js
│ ├── index.js.map
│ └── interfaces
│ │ ├── CloudflareSocket.d.ts
│ │ ├── CloudflareSocket.d.ts.map
│ │ ├── CloudflareSocket.js
│ │ └── CloudflareSocket.js.map
├── package-lock.json
├── package.json
├── src
│ ├── index.ts
│ └── interfaces
│ │ └── CloudflareSocket.ts
└── tsconfig.json
├── cloudflare-stream-polyfill
├── dist
│ ├── index.d.ts
│ ├── index.d.ts.map
│ ├── index.js
│ └── index.js.map
├── package-lock.json
├── package.json
├── src
│ └── index.ts
└── tsconfig.json
├── example
├── .editorconfig
├── .gitignore
├── .prettierrc
├── package-lock.json
├── package.json
├── src
│ └── worker.ts
├── tsconfig.json
└── wrangler.toml
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | **/node_modules/
2 | node_modules/
3 |
--------------------------------------------------------------------------------
/cloudflare-mysql/.eslintignore:
--------------------------------------------------------------------------------
1 | coverage
2 |
--------------------------------------------------------------------------------
/cloudflare-mysql/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "node": true
4 | },
5 | "rules": {
6 | "comma-dangle": [2, "never"],
7 | "comma-spacing": ["error", { "before": false, "after": true }],
8 | "consistent-return": 2,
9 | "eqeqeq": [2, "allow-null"],
10 | "indent": [2, 2, { "VariableDeclarator": 2, "SwitchCase": 1 }],
11 | "key-spacing": [2, { "align": { "beforeColon": true, "afterColon": true, "on": "colon" } }],
12 | "keyword-spacing": 2,
13 | "new-parens": 2,
14 | "no-cond-assign": 2,
15 | "no-constant-condition": 2,
16 | "no-control-regex": 2,
17 | "no-debugger": 2,
18 | "no-dupe-args": 2,
19 | "no-dupe-keys": 2,
20 | "no-duplicate-case": 2,
21 | "no-empty-character-class": 2,
22 | "no-empty": 2,
23 | "no-ex-assign": 2,
24 | "no-extra-boolean-cast": 2,
25 | "no-extra-semi": 2,
26 | "no-func-assign": 2,
27 | "no-inner-declarations": 2,
28 | "no-invalid-regexp": 2,
29 | "no-irregular-whitespace": 2,
30 | "no-multiple-empty-lines": [2, { "max": 1 }],
31 | "no-negated-in-lhs": 2,
32 | "no-obj-calls": 2,
33 | "no-regex-spaces": 2,
34 | "no-sparse-arrays": 2,
35 | "no-trailing-spaces": 2,
36 | "no-undef": 2,
37 | "no-unexpected-multiline": 2,
38 | "no-unreachable": 2,
39 | "no-unused-vars": 2,
40 | "one-var": ["error", { "initialized": "never" }],
41 | "quotes": [2, "single", { "avoidEscape": true, "allowTemplateLiterals": true }],
42 | "semi": [2, "always"],
43 | "semi-spacing": 2,
44 | "space-infix-ops": 2,
45 | "use-isnan": 2,
46 | "valid-jsdoc": 2,
47 | "valid-typeof": 2
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/cloudflare-mysql/.gitignore:
--------------------------------------------------------------------------------
1 | .nyc_output
2 | coverage/
3 | node_modules/
4 | npm-debug.log
5 | package-lock.json
6 |
--------------------------------------------------------------------------------
/cloudflare-mysql/License:
--------------------------------------------------------------------------------
1 | Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/cloudflare-mysql/benchmark/select-100k-blog-rows.js:
--------------------------------------------------------------------------------
1 | var common = require('../test/common');
2 | var client = common.createConnection({typeCast: false});
3 | var rowsPerRun = 100000;
4 |
5 | client.connect(function(err) {
6 | if (err) throw err;
7 |
8 | client.query('USE node_mysql_test', function(err) {
9 | if (err) throw err;
10 |
11 | selectRows();
12 | });
13 | });
14 |
15 | var firstSelect;
16 | var rowCount = 0;
17 |
18 | console.error('Benchmarking rows per second in hz:');
19 |
20 | function selectRows() {
21 | firstSelect = firstSelect || Date.now();
22 |
23 | client.query('SELECT * FROM posts', function(err, rows) {
24 | if (err) throw err;
25 |
26 | rowCount += rows.length;
27 | if (rowCount < rowsPerRun) {
28 | selectRows();
29 | return;
30 | }
31 |
32 | var duration = (Date.now() - firstSelect) / 1000;
33 | var hz = Math.round(rowCount / duration);
34 |
35 | console.log(hz);
36 |
37 | rowCount = 0;
38 | firstSelect = null;
39 |
40 | selectRows();
41 | });
42 | }
43 |
--------------------------------------------------------------------------------
/cloudflare-mysql/index.d.ts:
--------------------------------------------------------------------------------
1 | export * from "mysql";
2 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/BufferCopy.js:
--------------------------------------------------------------------------------
1 | /**
2 | * From https://github.com/feross/buffer/blob/master/index.js#L1692C25-L1731C2
3 | */
4 | export default function bufferCopy(source, target, targetStart, start, end) {
5 | if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
6 | if (!start) start = 0
7 | if (!end && end !== 0) end = source.length
8 | if (targetStart >= target.length) targetStart = target.length
9 | if (!targetStart) targetStart = 0
10 | if (end > 0 && end < start) end = start
11 |
12 | // Copy 0 bytes; we're done
13 | if (end === start) return 0
14 | if (target.length === 0 || source.length === 0) return 0
15 |
16 | // Fatal error conditions
17 | if (targetStart < 0) {
18 | throw new RangeError('targetStart out of bounds')
19 | }
20 | if (start < 0 || start >= source.length) throw new RangeError('Index out of range')
21 | if (end < 0) throw new RangeError('sourceEnd out of bounds')
22 |
23 | // Are we oob?
24 | if (end > source.length) end = source.length
25 | if (target.length - targetStart < end - start) {
26 | end = target.length - targetStart + start
27 | }
28 |
29 | const len = end - start
30 |
31 | if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
32 | // Use built-in when available, missing from IE11
33 | source.copyWithin(targetStart, start, end)
34 | } else {
35 | Uint8Array.prototype.set.call(
36 | target,
37 | source.subarray(start, end),
38 | targetStart
39 | )
40 | }
41 |
42 | return len
43 | };
44 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/PoolConfig.js:
--------------------------------------------------------------------------------
1 |
2 | var ConnectionConfig = require('./ConnectionConfig');
3 |
4 | module.exports = PoolConfig;
5 | function PoolConfig(options) {
6 | if (typeof options === 'string') {
7 | options = ConnectionConfig.parseUrl(options);
8 | }
9 |
10 | this.acquireTimeout = (options.acquireTimeout === undefined)
11 | ? 10 * 1000
12 | : Number(options.acquireTimeout);
13 | this.connectionConfig = new ConnectionConfig(options);
14 | this.waitForConnections = (options.waitForConnections === undefined)
15 | ? true
16 | : Boolean(options.waitForConnections);
17 | this.connectionLimit = (options.connectionLimit === undefined)
18 | ? 10
19 | : Number(options.connectionLimit);
20 | this.queueLimit = (options.queueLimit === undefined)
21 | ? 0
22 | : Number(options.queueLimit);
23 | }
24 |
25 | PoolConfig.prototype.newConnectionConfig = function newConnectionConfig() {
26 | var connectionConfig = new ConnectionConfig(this.connectionConfig);
27 |
28 | connectionConfig.clientFlags = this.connectionConfig.clientFlags;
29 | connectionConfig.maxPacketSize = this.connectionConfig.maxPacketSize;
30 |
31 | return connectionConfig;
32 | };
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/PoolSelector.js:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * PoolSelector
4 | */
5 | var PoolSelector = module.exports = {};
6 |
7 | PoolSelector.RR = function PoolSelectorRoundRobin() {
8 | var index = 0;
9 |
10 | return function(clusterIds) {
11 | if (index >= clusterIds.length) {
12 | index = 0;
13 | }
14 |
15 | var clusterId = clusterIds[index++];
16 |
17 | return clusterId;
18 | };
19 | };
20 |
21 | PoolSelector.RANDOM = function PoolSelectorRandom() {
22 | return function(clusterIds) {
23 | return clusterIds[Math.floor(Math.random() * clusterIds.length)];
24 | };
25 | };
26 |
27 | PoolSelector.ORDER = function PoolSelectorOrder() {
28 | return function(clusterIds) {
29 | return clusterIds[0];
30 | };
31 | };
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/BufferList.js:
--------------------------------------------------------------------------------
1 |
2 | module.exports = BufferList;
3 | function BufferList() {
4 | this.bufs = [];
5 | this.size = 0;
6 | }
7 |
8 | BufferList.prototype.shift = function shift() {
9 | var buf = this.bufs.shift();
10 |
11 | if (buf) {
12 | this.size -= buf.length;
13 | }
14 |
15 | return buf;
16 | };
17 |
18 | BufferList.prototype.push = function push(buf) {
19 | if (!buf || !buf.length) {
20 | return;
21 | }
22 |
23 | this.bufs.push(buf);
24 | this.size += buf.length;
25 | };
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/PacketHeader.js:
--------------------------------------------------------------------------------
1 | module.exports = PacketHeader;
2 | function PacketHeader(length, number) {
3 | this.length = length;
4 | this.number = number;
5 | }
6 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/ResultSet.js:
--------------------------------------------------------------------------------
1 | module.exports = ResultSet;
2 | function ResultSet(resultSetHeaderPacket) {
3 | this.resultSetHeaderPacket = resultSetHeaderPacket;
4 | this.fieldPackets = [];
5 | this.eofPackets = [];
6 | this.rows = [];
7 | }
8 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/SqlString.js:
--------------------------------------------------------------------------------
1 | module.exports = require('sqlstring');
2 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/Timer.js:
--------------------------------------------------------------------------------
1 | module.exports = Timer;
2 | function Timer(object) {
3 | this._object = object;
4 | this._timeout = null;
5 | this.msecs = 0;
6 | }
7 |
8 | Timer.prototype.active = function active() {
9 | if (this._timeout) {
10 | if (this._timeout.refresh) {
11 | this._timeout.refresh();
12 | } else {
13 | this.start(this.msecs);
14 | }
15 | }
16 | };
17 |
18 | Timer.prototype.start = function start(msecs) {
19 | this.stop();
20 |
21 | this.msecs = msecs;
22 |
23 | if(msecs)
24 | this._timeout = setTimeout(this._onTimeout.bind(this), msecs);
25 | };
26 |
27 | Timer.prototype.stop = function stop() {
28 | if (this._timeout) {
29 | clearTimeout(this._timeout);
30 | this._timeout = null;
31 | }
32 | };
33 |
34 | Timer.prototype._onTimeout = function _onTimeout() {
35 | return this._object._onTimeout();
36 | };
37 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/constants/field_flags.js:
--------------------------------------------------------------------------------
1 | // Manually extracted from mysql-5.5.23/include/mysql_com.h
2 | exports.NOT_NULL_FLAG = 1; /* Field can't be NULL */
3 | exports.PRI_KEY_FLAG = 2; /* Field is part of a primary key */
4 | exports.UNIQUE_KEY_FLAG = 4; /* Field is part of a unique key */
5 | exports.MULTIPLE_KEY_FLAG = 8; /* Field is part of a key */
6 | exports.BLOB_FLAG = 16; /* Field is a blob */
7 | exports.UNSIGNED_FLAG = 32; /* Field is unsigned */
8 | exports.ZEROFILL_FLAG = 64; /* Field is zerofill */
9 | exports.BINARY_FLAG = 128; /* Field is binary */
10 |
11 | /* The following are only sent to new clients */
12 | exports.ENUM_FLAG = 256; /* field is an enum */
13 | exports.AUTO_INCREMENT_FLAG = 512; /* field is a autoincrement field */
14 | exports.TIMESTAMP_FLAG = 1024; /* Field is a timestamp */
15 | exports.SET_FLAG = 2048; /* field is a set */
16 | exports.NO_DEFAULT_VALUE_FLAG = 4096; /* Field doesn't have default value */
17 | exports.ON_UPDATE_NOW_FLAG = 8192; /* Field is set to NOW on UPDATE */
18 | exports.NUM_FLAG = 32768; /* Field is num (for clients) */
19 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/constants/server_status.js:
--------------------------------------------------------------------------------
1 | // Manually extracted from mysql-5.5.23/include/mysql_com.h
2 |
3 | /**
4 | Is raised when a multi-statement transaction
5 | has been started, either explicitly, by means
6 | of BEGIN or COMMIT AND CHAIN, or
7 | implicitly, by the first transactional
8 | statement, when autocommit=off.
9 | */
10 | exports.SERVER_STATUS_IN_TRANS = 1;
11 | exports.SERVER_STATUS_AUTOCOMMIT = 2; /* Server in auto_commit mode */
12 | exports.SERVER_MORE_RESULTS_EXISTS = 8; /* Multi query - next query exists */
13 | exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16;
14 | exports.SERVER_QUERY_NO_INDEX_USED = 32;
15 | /**
16 | The server was able to fulfill the clients request and opened a
17 | read-only non-scrollable cursor for a query. This flag comes
18 | in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands.
19 | */
20 | exports.SERVER_STATUS_CURSOR_EXISTS = 64;
21 | /**
22 | This flag is sent when a read-only cursor is exhausted, in reply to
23 | COM_STMT_FETCH command.
24 | */
25 | exports.SERVER_STATUS_LAST_ROW_SENT = 128;
26 | exports.SERVER_STATUS_DB_DROPPED = 256; /* A database was dropped */
27 | exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512;
28 | /**
29 | Sent to the client if after a prepared statement reprepare
30 | we discovered that the new statement returns a different
31 | number of result set columns.
32 | */
33 | exports.SERVER_STATUS_METADATA_CHANGED = 1024;
34 | exports.SERVER_QUERY_WAS_SLOW = 2048;
35 |
36 | /**
37 | To mark ResultSet containing output parameter values.
38 | */
39 | exports.SERVER_PS_OUT_PARAMS = 4096;
40 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/AuthSwitchRequestPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = AuthSwitchRequestPacket;
2 | function AuthSwitchRequestPacket(options) {
3 | options = options || {};
4 |
5 | this.status = 0xfe;
6 | this.authMethodName = options.authMethodName;
7 | this.authMethodData = options.authMethodData;
8 | }
9 |
10 | AuthSwitchRequestPacket.prototype.parse = function parse(parser) {
11 | this.status = parser.parseUnsignedNumber(1);
12 | this.authMethodName = parser.parseNullTerminatedString();
13 | this.authMethodData = parser.parsePacketTerminatedBuffer();
14 | };
15 |
16 | AuthSwitchRequestPacket.prototype.write = function write(writer) {
17 | writer.writeUnsignedNumber(1, this.status);
18 | writer.writeNullTerminatedString(this.authMethodName);
19 | writer.writeBuffer(this.authMethodData);
20 | };
21 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/AuthSwitchResponsePacket.js:
--------------------------------------------------------------------------------
1 | module.exports = AuthSwitchResponsePacket;
2 | function AuthSwitchResponsePacket(options) {
3 | options = options || {};
4 |
5 | this.data = options.data;
6 | }
7 |
8 | AuthSwitchResponsePacket.prototype.parse = function parse(parser) {
9 | this.data = parser.parsePacketTerminatedBuffer();
10 | };
11 |
12 | AuthSwitchResponsePacket.prototype.write = function write(writer) {
13 | writer.writeBuffer(this.data);
14 | };
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ComChangeUserPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ComChangeUserPacket;
2 | function ComChangeUserPacket(options) {
3 | options = options || {};
4 |
5 | this.command = 0x11;
6 | this.user = options.user;
7 | this.scrambleBuff = options.scrambleBuff;
8 | this.database = options.database;
9 | this.charsetNumber = options.charsetNumber;
10 | }
11 |
12 | ComChangeUserPacket.prototype.parse = function(parser) {
13 | this.command = parser.parseUnsignedNumber(1);
14 | this.user = parser.parseNullTerminatedString();
15 | this.scrambleBuff = parser.parseLengthCodedBuffer();
16 | this.database = parser.parseNullTerminatedString();
17 | this.charsetNumber = parser.parseUnsignedNumber(1);
18 | };
19 |
20 | ComChangeUserPacket.prototype.write = function(writer) {
21 | writer.writeUnsignedNumber(1, this.command);
22 | writer.writeNullTerminatedString(this.user);
23 | writer.writeLengthCodedBuffer(this.scrambleBuff);
24 | writer.writeNullTerminatedString(this.database);
25 | writer.writeUnsignedNumber(2, this.charsetNumber);
26 | };
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ComPingPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ComPingPacket;
2 | function ComPingPacket() {
3 | this.command = 0x0e;
4 | }
5 |
6 | ComPingPacket.prototype.write = function(writer) {
7 | writer.writeUnsignedNumber(1, this.command);
8 | };
9 |
10 | ComPingPacket.prototype.parse = function(parser) {
11 | this.command = parser.parseUnsignedNumber(1);
12 | };
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ComQueryPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ComQueryPacket;
2 | function ComQueryPacket(sql) {
3 | this.command = 0x03;
4 | this.sql = sql;
5 | }
6 |
7 | ComQueryPacket.prototype.write = function(writer) {
8 | writer.writeUnsignedNumber(1, this.command);
9 | writer.writeString(this.sql);
10 | };
11 |
12 | ComQueryPacket.prototype.parse = function(parser) {
13 | this.command = parser.parseUnsignedNumber(1);
14 | this.sql = parser.parsePacketTerminatedString();
15 | };
16 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ComQuitPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ComQuitPacket;
2 | function ComQuitPacket() {
3 | this.command = 0x01;
4 | }
5 |
6 | ComQuitPacket.prototype.parse = function parse(parser) {
7 | this.command = parser.parseUnsignedNumber(1);
8 | };
9 |
10 | ComQuitPacket.prototype.write = function write(writer) {
11 | writer.writeUnsignedNumber(1, this.command);
12 | };
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ComStatisticsPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ComStatisticsPacket;
2 | function ComStatisticsPacket() {
3 | this.command = 0x09;
4 | }
5 |
6 | ComStatisticsPacket.prototype.write = function(writer) {
7 | writer.writeUnsignedNumber(1, this.command);
8 | };
9 |
10 | ComStatisticsPacket.prototype.parse = function(parser) {
11 | this.command = parser.parseUnsignedNumber(1);
12 | };
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/EmptyPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = EmptyPacket;
2 | function EmptyPacket() {
3 | }
4 |
5 | EmptyPacket.prototype.parse = function parse() {
6 | };
7 |
8 | EmptyPacket.prototype.write = function write() {
9 | };
10 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/EofPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = EofPacket;
2 | function EofPacket(options) {
3 | options = options || {};
4 |
5 | this.fieldCount = undefined;
6 | this.warningCount = options.warningCount;
7 | this.serverStatus = options.serverStatus;
8 | this.protocol41 = options.protocol41;
9 | }
10 |
11 | EofPacket.prototype.parse = function(parser) {
12 | this.fieldCount = parser.parseUnsignedNumber(1);
13 | if (this.protocol41) {
14 | this.warningCount = parser.parseUnsignedNumber(2);
15 | this.serverStatus = parser.parseUnsignedNumber(2);
16 | }
17 | };
18 |
19 | EofPacket.prototype.write = function(writer) {
20 | writer.writeUnsignedNumber(1, 0xfe);
21 | if (this.protocol41) {
22 | writer.writeUnsignedNumber(2, this.warningCount);
23 | writer.writeUnsignedNumber(2, this.serverStatus);
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ErrorPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ErrorPacket;
2 | function ErrorPacket(options) {
3 | options = options || {};
4 |
5 | this.fieldCount = options.fieldCount;
6 | this.errno = options.errno;
7 | this.sqlStateMarker = options.sqlStateMarker;
8 | this.sqlState = options.sqlState;
9 | this.message = options.message;
10 | }
11 |
12 | ErrorPacket.prototype.parse = function(parser) {
13 | this.fieldCount = parser.parseUnsignedNumber(1);
14 | this.errno = parser.parseUnsignedNumber(2);
15 |
16 | // sqlStateMarker ('#' = 0x23) indicates error packet format
17 | if (parser.peak() === 0x23) {
18 | this.sqlStateMarker = parser.parseString(1);
19 | this.sqlState = parser.parseString(5);
20 | }
21 |
22 | this.message = parser.parsePacketTerminatedString();
23 | };
24 |
25 | ErrorPacket.prototype.write = function(writer) {
26 | writer.writeUnsignedNumber(1, 0xff);
27 | writer.writeUnsignedNumber(2, this.errno);
28 |
29 | if (this.sqlStateMarker) {
30 | writer.writeString(this.sqlStateMarker);
31 | writer.writeString(this.sqlState);
32 | }
33 |
34 | writer.writeString(this.message);
35 | };
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/Field.js:
--------------------------------------------------------------------------------
1 | var Types = require('../constants/types');
2 |
3 | module.exports = Field;
4 | function Field(options) {
5 | options = options || {};
6 |
7 | this.parser = options.parser;
8 | this.packet = options.packet;
9 | this.db = options.packet.db;
10 | this.table = options.packet.table;
11 | this.name = options.packet.name;
12 | this.type = Types[options.packet.type];
13 | this.length = options.packet.length;
14 | }
15 |
16 | Field.prototype.string = function () {
17 | return this.parser.parseLengthCodedString();
18 | };
19 |
20 | Field.prototype.buffer = function () {
21 | return this.parser.parseLengthCodedBuffer();
22 | };
23 |
24 | Field.prototype.geometry = function () {
25 | return this.parser.parseGeometryValue();
26 | };
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/LocalDataFilePacket.js:
--------------------------------------------------------------------------------
1 | module.exports = LocalDataFilePacket;
2 |
3 | /**
4 | * Create a new LocalDataFilePacket
5 | * @constructor
6 | * @param {Buffer} data The data contents of the packet
7 | * @public
8 | */
9 | function LocalDataFilePacket(data) {
10 | this.data = data;
11 | }
12 |
13 | LocalDataFilePacket.prototype.write = function(writer) {
14 | writer.writeBuffer(this.data);
15 | };
16 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/LocalInfileRequestPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = LocalInfileRequestPacket;
2 | function LocalInfileRequestPacket(options) {
3 | options = options || {};
4 |
5 | this.filename = options.filename;
6 | }
7 |
8 | LocalInfileRequestPacket.prototype.parse = function parse(parser) {
9 | if (parser.parseLengthCodedNumber() !== null) {
10 | var err = new TypeError('Received invalid field length');
11 | err.code = 'PARSER_INVALID_FIELD_LENGTH';
12 | throw err;
13 | }
14 |
15 | this.filename = parser.parsePacketTerminatedString();
16 | };
17 |
18 | LocalInfileRequestPacket.prototype.write = function write(writer) {
19 | writer.writeLengthCodedNumber(null);
20 | writer.writeString(this.filename);
21 | };
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/OkPacket.js:
--------------------------------------------------------------------------------
1 |
2 | // Language-neutral expression to match ER_UPDATE_INFO
3 | var ER_UPDATE_INFO_REGEXP = /^[^:0-9]+: [0-9]+[^:0-9]+: ([0-9]+)[^:0-9]+: [0-9]+[^:0-9]*$/;
4 |
5 | module.exports = OkPacket;
6 | function OkPacket(options) {
7 | options = options || {};
8 |
9 | this.fieldCount = undefined;
10 | this.affectedRows = undefined;
11 | this.insertId = undefined;
12 | this.serverStatus = undefined;
13 | this.warningCount = undefined;
14 | this.message = undefined;
15 | this.protocol41 = options.protocol41;
16 | }
17 |
18 | OkPacket.prototype.parse = function(parser) {
19 | this.fieldCount = parser.parseUnsignedNumber(1);
20 | this.affectedRows = parser.parseLengthCodedNumber();
21 | this.insertId = parser.parseLengthCodedNumber();
22 | if (this.protocol41) {
23 | this.serverStatus = parser.parseUnsignedNumber(2);
24 | this.warningCount = parser.parseUnsignedNumber(2);
25 | }
26 | this.message = parser.parsePacketTerminatedString();
27 | this.changedRows = 0;
28 |
29 | var m = ER_UPDATE_INFO_REGEXP.exec(this.message);
30 | if (m !== null) {
31 | this.changedRows = parseInt(m[1], 10);
32 | }
33 | };
34 |
35 | OkPacket.prototype.write = function(writer) {
36 | writer.writeUnsignedNumber(1, 0x00);
37 | writer.writeLengthCodedNumber(this.affectedRows || 0);
38 | writer.writeLengthCodedNumber(this.insertId || 0);
39 | if (this.protocol41) {
40 | writer.writeUnsignedNumber(2, this.serverStatus || 0);
41 | writer.writeUnsignedNumber(2, this.warningCount || 0);
42 | }
43 | writer.writeString(this.message);
44 | };
45 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/OldPasswordPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = OldPasswordPacket;
2 | function OldPasswordPacket(options) {
3 | options = options || {};
4 |
5 | this.scrambleBuff = options.scrambleBuff;
6 | }
7 |
8 | OldPasswordPacket.prototype.parse = function(parser) {
9 | this.scrambleBuff = parser.parsePacketTerminatedBuffer();
10 | };
11 |
12 | OldPasswordPacket.prototype.write = function(writer) {
13 | writer.writeBuffer(this.scrambleBuff);
14 | };
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/ResultSetHeaderPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = ResultSetHeaderPacket;
2 | function ResultSetHeaderPacket(options) {
3 | options = options || {};
4 |
5 | this.fieldCount = options.fieldCount;
6 | }
7 |
8 | ResultSetHeaderPacket.prototype.parse = function(parser) {
9 | this.fieldCount = parser.parseLengthCodedNumber();
10 | };
11 |
12 | ResultSetHeaderPacket.prototype.write = function(writer) {
13 | writer.writeLengthCodedNumber(this.fieldCount);
14 | };
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/SSLRequestPacket.js:
--------------------------------------------------------------------------------
1 | // http://dev.mysql.com/doc/internals/en/ssl.html
2 | // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest
3 |
4 | var ClientConstants = require('../constants/client');
5 |
6 | module.exports = SSLRequestPacket;
7 |
8 | function SSLRequestPacket(options) {
9 | options = options || {};
10 | this.clientFlags = options.clientFlags | ClientConstants.CLIENT_SSL;
11 | this.maxPacketSize = options.maxPacketSize;
12 | this.charsetNumber = options.charsetNumber;
13 | }
14 |
15 | SSLRequestPacket.prototype.parse = function(parser) {
16 | // TODO: check SSLRequest packet v41 vs pre v41
17 | this.clientFlags = parser.parseUnsignedNumber(4);
18 | this.maxPacketSize = parser.parseUnsignedNumber(4);
19 | this.charsetNumber = parser.parseUnsignedNumber(1);
20 | };
21 |
22 | SSLRequestPacket.prototype.write = function(writer) {
23 | writer.writeUnsignedNumber(4, this.clientFlags);
24 | writer.writeUnsignedNumber(4, this.maxPacketSize);
25 | writer.writeUnsignedNumber(1, this.charsetNumber);
26 | writer.writeFiller(23);
27 | };
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/StatisticsPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = StatisticsPacket;
2 | function StatisticsPacket() {
3 | this.message = undefined;
4 | }
5 |
6 | StatisticsPacket.prototype.parse = function(parser) {
7 | this.message = parser.parsePacketTerminatedString();
8 |
9 | var items = this.message.split(/\s\s/);
10 | for (var i = 0; i < items.length; i++) {
11 | var m = items[i].match(/^(.+)\:\s+(.+)$/);
12 | if (m !== null) {
13 | this[m[1].toLowerCase().replace(/\s/g, '_')] = Number(m[2]);
14 | }
15 | }
16 | };
17 |
18 | StatisticsPacket.prototype.write = function(writer) {
19 | writer.writeString(this.message);
20 | };
21 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/UseOldPasswordPacket.js:
--------------------------------------------------------------------------------
1 | module.exports = UseOldPasswordPacket;
2 | function UseOldPasswordPacket(options) {
3 | options = options || {};
4 |
5 | this.firstByte = options.firstByte || 0xfe;
6 | }
7 |
8 | UseOldPasswordPacket.prototype.parse = function(parser) {
9 | this.firstByte = parser.parseUnsignedNumber(1);
10 | };
11 |
12 | UseOldPasswordPacket.prototype.write = function(writer) {
13 | writer.writeUnsignedNumber(1, this.firstByte);
14 | };
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/packets/index.js:
--------------------------------------------------------------------------------
1 | exports.AuthSwitchRequestPacket = require('./AuthSwitchRequestPacket');
2 | exports.AuthSwitchResponsePacket = require('./AuthSwitchResponsePacket');
3 | exports.ClientAuthenticationPacket = require('./ClientAuthenticationPacket');
4 | exports.ComChangeUserPacket = require('./ComChangeUserPacket');
5 | exports.ComPingPacket = require('./ComPingPacket');
6 | exports.ComQueryPacket = require('./ComQueryPacket');
7 | exports.ComQuitPacket = require('./ComQuitPacket');
8 | exports.ComStatisticsPacket = require('./ComStatisticsPacket');
9 | exports.EmptyPacket = require('./EmptyPacket');
10 | exports.EofPacket = require('./EofPacket');
11 | exports.ErrorPacket = require('./ErrorPacket');
12 | exports.Field = require('./Field');
13 | exports.FieldPacket = require('./FieldPacket');
14 | exports.HandshakeInitializationPacket = require('./HandshakeInitializationPacket');
15 | exports.LocalDataFilePacket = require('./LocalDataFilePacket');
16 | exports.LocalInfileRequestPacket = require('./LocalInfileRequestPacket');
17 | exports.OkPacket = require('./OkPacket');
18 | exports.OldPasswordPacket = require('./OldPasswordPacket');
19 | exports.ResultSetHeaderPacket = require('./ResultSetHeaderPacket');
20 | exports.RowDataPacket = require('./RowDataPacket');
21 | exports.SSLRequestPacket = require('./SSLRequestPacket');
22 | exports.StatisticsPacket = require('./StatisticsPacket');
23 | exports.UseOldPasswordPacket = require('./UseOldPasswordPacket');
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/sequences/Ping.js:
--------------------------------------------------------------------------------
1 | var Sequence = require('./Sequence');
2 | var Util = require('util');
3 | var Packets = require('../packets');
4 |
5 | module.exports = Ping;
6 | Util.inherits(Ping, Sequence);
7 |
8 | function Ping(options, callback) {
9 | if (!callback && typeof options === 'function') {
10 | callback = options;
11 | options = {};
12 | }
13 |
14 | Sequence.call(this, options, callback);
15 | }
16 |
17 | Ping.prototype.start = function() {
18 | this.emit('packet', new Packets.ComPingPacket());
19 | };
20 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/sequences/Quit.js:
--------------------------------------------------------------------------------
1 | var Sequence = require('./Sequence');
2 | var Util = require('util');
3 | var Packets = require('../packets');
4 |
5 | module.exports = Quit;
6 | Util.inherits(Quit, Sequence);
7 | function Quit(options, callback) {
8 | if (!callback && typeof options === 'function') {
9 | callback = options;
10 | options = {};
11 | }
12 |
13 | Sequence.call(this, options, callback);
14 |
15 | this._started = false;
16 | }
17 |
18 | Quit.prototype.end = function end(err) {
19 | if (this._ended) {
20 | return;
21 | }
22 |
23 | if (!this._started) {
24 | Sequence.prototype.end.call(this, err);
25 | return;
26 | }
27 |
28 | if (err && err.code === 'ECONNRESET' && err.syscall === 'read') {
29 | // Ignore read errors after packet sent
30 | Sequence.prototype.end.call(this);
31 | return;
32 | }
33 |
34 | Sequence.prototype.end.call(this, err);
35 | };
36 |
37 | Quit.prototype.start = function() {
38 | this._started = true;
39 | this.emit('packet', new Packets.ComQuitPacket());
40 | };
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/sequences/Statistics.js:
--------------------------------------------------------------------------------
1 | var Sequence = require('./Sequence');
2 | var Util = require('util');
3 | var Packets = require('../packets');
4 |
5 | module.exports = Statistics;
6 | Util.inherits(Statistics, Sequence);
7 | function Statistics(options, callback) {
8 | if (!callback && typeof options === 'function') {
9 | callback = options;
10 | options = {};
11 | }
12 |
13 | Sequence.call(this, options, callback);
14 | }
15 |
16 | Statistics.prototype.start = function() {
17 | this.emit('packet', new Packets.ComStatisticsPacket());
18 | };
19 |
20 | Statistics.prototype['StatisticsPacket'] = function (packet) {
21 | this.end(null, packet);
22 | };
23 |
24 | Statistics.prototype.determinePacket = function determinePacket(firstByte) {
25 | if (firstByte === 0x55) {
26 | return Packets.StatisticsPacket;
27 | }
28 |
29 | return undefined;
30 | };
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/lib/protocol/sequences/index.js:
--------------------------------------------------------------------------------
1 | exports.ChangeUser = require('./ChangeUser');
2 | exports.Handshake = require('./Handshake');
3 | exports.Ping = require('./Ping');
4 | exports.Query = require('./Query');
5 | exports.Quit = require('./Quit');
6 | exports.Sequence = require('./Sequence');
7 | exports.Statistics = require('./Statistics');
8 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/fixtures/data.csv:
--------------------------------------------------------------------------------
1 | 1,Hello World
2 | 2,This is a test
3 | 3,For loading data from a file
4 | 4,中文内容
5 | 5,this is a long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long string
6 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/fixtures/server.crt:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIB3zCCAUgCCQCZc7IfkXLWeDANBgkqhkiG9w0BAQUFADA0MQswCQYDVQQGEwJV
3 | UzEQMA4GA1UECBMHSW5kaWFuYTETMBEGA1UEChMKbm9kZS1teXNxbDAeFw0xNDA1
4 | MTQxODM2NTdaFw0yNDA1MTExODM2NTdaMDQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI
5 | EwdJbmRpYW5hMRMwEQYDVQQKEwpub2RlLW15c3FsMIGfMA0GCSqGSIb3DQEBAQUA
6 | A4GNADCBiQKBgQDX4dUmhwwzqy8zCrNK5WybifZ4Z5vd12CnnrBpLgqw0VWiKa2b
7 | QQ5vmex4LhEPwr5p+tDntS1sbQf4HY69AgjHtcPAdoykWtUBDCrOjnhEBroLGzE2
8 | BbW0XnolsWUp8Zwnlq3nGOceCcvYX3AjUkK89B3L7YY+Rie/1QQ62FSS2wIDAQAB
9 | MA0GCSqGSIb3DQEBBQUAA4GBABNcExz8o1QxcTBuFIcdny4s6H7diTKeweqAtbPo
10 | JefVNokYjTjFDRdZqDOLKKJPgfyPYHCX170SQ/wr/b0qzNYL1QvBsDM7tvckBK5a
11 | OfKg/4TfMfHORNGRECBJAAn2Zi/DWfcdwOb39wIOG3hDk09IGOJ5F3wsUZFC/qiv
12 | 152/
13 | -----END CERTIFICATE-----
14 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/fixtures/server.key:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIICXAIBAAKBgQDX4dUmhwwzqy8zCrNK5WybifZ4Z5vd12CnnrBpLgqw0VWiKa2b
3 | QQ5vmex4LhEPwr5p+tDntS1sbQf4HY69AgjHtcPAdoykWtUBDCrOjnhEBroLGzE2
4 | BbW0XnolsWUp8Zwnlq3nGOceCcvYX3AjUkK89B3L7YY+Rie/1QQ62FSS2wIDAQAB
5 | AoGAUJvTsjIk/ToDQsTRE7s85YsLTAQr8BbW0V/wsSVu+nz/w7BaUalmEYfhAzL4
6 | TfFClmIAFTTShDTmD+BBhxO2YOQW0+aThwU2jyF6sq7VhHxgXnSVDps9ebmVXMjU
7 | jSZEV/Q3lOvxvQfcBYzV3jfEeyi7jNr5oCL7Y6OwxLLx1XkCQQD3Jv9CNBH0J8c1
8 | nIpkj3Mhd0ona7wFna7hKlIfjZjsK0B9aMvj5I5tTGIis16g4uzSISS4zymHv/yp
9 | njCwi54HAkEA35xDXEsfbvS8d/9MsdJEtuMWGQeHEu8Tdxt5U/WnUPo0r00blrD5
10 | G5+zElKYbJgN15QLOLTUpq8U2dvEjGrvjQJAeO84D+jysAmWzIDgpvwaVdHNEyUA
11 | R680lzDiJlZe8ZDoaXUR710y5ABwNJKYRxlC0D8vfM7Bf49NzqF9KaXnmQJAQyeI
12 | y1T8UbRKTbdsbxL48/vrDQVHuZX3QJQNsftajmU2IVeE65KmnXcurlgD0skvjwi0
13 | /gjAvHZkSrFHq+wJmQJBAK32f4/ssi/SQolzL3xVrEUayxOEVhDWslXtwdcr7ZCq
14 | bbOmEU5AoOVXSS+PsWrLmrDRs3gc9BRHxD7yYVBT9ts=
15 | -----END RSA PRIVATE KEY-----
16 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-bad-credentials.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection({password: common.bogusPassword}, function (err) {
5 | if (!err && process.env.NO_GRANT) {
6 | common.skipTest('no grant tables');
7 | }
8 |
9 | assert.ok(err, 'got error');
10 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
11 | assert.ok(/access denied/i.test(err.message), 'message is acccess denied');
12 | });
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-bulk-insert.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 |
4 | var table = 'insert_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`title` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | var items = [];
20 | for (var i = 0; i < 100; i++) {
21 | items[i] = ['test ' + i];
22 | }
23 |
24 | connection.query('INSERT INTO ?? (title) VALUES ?', [table, items], function (err) {
25 | assert.ifError(err);
26 |
27 | connection.query('SELECT title FROM ??', [table], function (err, rows) {
28 | assert.ifError(err);
29 |
30 | var itemsFoundInTable = rows.map(function (r) { return [r.title]; });
31 |
32 | assert.deepEqual(items, itemsFoundInTable);
33 |
34 | connection.end(assert.ifError);
35 | });
36 | });
37 | });
38 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-change-user-charset.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.changeUser({charset: 'KOI8R_GENERAL_CI'}, function (err) {
8 | assert.ifError(err);
9 |
10 | connection.query('SHOW VARIABLES LIKE \'character_set_client\'', function (err, result) {
11 | assert.ifError(err);
12 | assert.strictEqual(result[0]['Value'], 'koi8r');
13 |
14 | connection.destroy();
15 | });
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-change-user-reset.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query('SET @custom = 2', assert.ifError);
8 |
9 | connection.query('SELECT @custom', function (err, result) {
10 | assert.ifError(err);
11 | assert.strictEqual(result[0]['@custom'], 2);
12 | });
13 |
14 | connection.changeUser(assert.ifError);
15 |
16 | connection.query('SELECT @custom', function (err, result) {
17 | assert.ifError(err);
18 | assert.strictEqual(result[0]['@custom'], null);
19 | });
20 |
21 | connection.end(assert.ifError);
22 | });
23 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-connection-destroy.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 | connection.destroy();
7 | });
8 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-connection-thread-id.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 | assert.notStrictEqual(connection.threadId, null);
7 | assert.notStrictEqual(connection.threadId, 0);
8 |
9 | connection.end(function (err) {
10 | assert.ifError(err);
11 | assert.notStrictEqual(connection.threadId, null);
12 | assert.notStrictEqual(connection.threadId, 0);
13 | });
14 | });
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-insert-results.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'insert_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`title` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.query('INSERT INTO ?? SET ?', [table, {title: 'test'}], function (err, result) {
20 | assert.ifError(err);
21 | assert.strictEqual(result.insertId, 1);
22 |
23 | connection.end(assert.ifError);
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-load-data-infile-disable.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var path = common.fixtures + '/data.csv';
5 | var table = 'load_data_test';
6 | var newline = common.detectNewline(path);
7 |
8 | common.getTestConnection({localInfile: false}, function (err, connection) {
9 | assert.ifError(err);
10 |
11 | common.useTestDb(connection);
12 |
13 | connection.query([
14 | 'CREATE TEMPORARY TABLE ?? (',
15 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
16 | '`title` varchar(400),',
17 | 'PRIMARY KEY (`id`)',
18 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
19 | ].join('\n'), [table], assert.ifError);
20 |
21 | var sql =
22 | 'LOAD DATA LOCAL INFILE ? INTO TABLE ?? CHARACTER SET utf8 ' +
23 | 'FIELDS TERMINATED BY ? ' +
24 | 'LINES TERMINATED BY ? ' +
25 | '(id, title)';
26 |
27 | connection.query(sql, [path, table, ',', newline], function (err) {
28 | assert.ok(err);
29 | assert.equal(err.code, 'ER_NOT_ALLOWED_COMMAND');
30 | });
31 |
32 | connection.query('SELECT * FROM ??', [table], function (err, rows) {
33 | assert.ifError(err);
34 | assert.equal(rows.length, 0);
35 | });
36 |
37 | connection.end(assert.ifError);
38 | });
39 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-multiple-statements-streaming.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection({multipleStatements: true}, function (err, connection) {
5 | assert.ifError(err);
6 |
7 | var count = 0;
8 | var query = connection.query('SELECT 1; INVALID SQL; SELECT 3');
9 |
10 | query.on('error', function (err) {
11 | assert.ok(err);
12 | assert.equal(err.code, 'ER_PARSE_ERROR');
13 | assert.equal(err.index, 1);
14 | assert.equal(count, 1);
15 |
16 | connection.end(assert.ifError);
17 | });
18 |
19 | query.on('result', function (result) {
20 | count++;
21 | assert.deepEqual(result, {1: 1});
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-multiple-statements-with-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection({multipleStatements: true}, function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query('SELECT 1; INVALID SQL; SELECT 3', function (err, results) {
8 | assert.ok(err);
9 | assert.equal(err.code, 'ER_PARSE_ERROR');
10 | assert.equal(results.length, 1);
11 | assert.deepEqual(results[0], [{1: 1}]);
12 |
13 | connection.end(assert.ifError);
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-multiple-statements.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection({multipleStatements: true}, function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query('SELECT 1; SELECT 2; SELECT 3', function (err, results) {
8 | assert.ifError(err);
9 | assert.equal(results.length, 3);
10 | assert.deepEqual(results[0], [{1: 1}]);
11 | assert.deepEqual(results[1], [{2: 2}]);
12 | assert.deepEqual(results[2], [{3: 3}]);
13 |
14 | connection.end(assert.ifError);
15 | });
16 | });
17 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-nested-tables-query.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'nested_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`title` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.query('INSERT INTO ?? SET ?', [table, {title: 'test'}], assert.ifError);
20 |
21 | connection.query({nestTables: true, sql: 'SELECT * FROM ??', values: [table]}, function (err, rows) {
22 | assert.ifError(err);
23 | assert.equal(rows.length, 1);
24 | assert.equal(rows[0].nested_test.id, 1);
25 | assert.equal(rows[0].nested_test.title, 'test');
26 | });
27 |
28 | connection.query({nestTables: '_', sql: 'SELECT * FROM ??', values: [table]}, function (err, rows) {
29 | assert.ifError(err);
30 | assert.equal(rows.length, 1);
31 | assert.equal(rows[0].nested_test_id, 1);
32 | assert.equal(rows[0].nested_test_title, 'test');
33 | });
34 |
35 | connection.end(assert.ifError);
36 | });
37 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-ping.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.ping(function (err) {
8 | assert.ifError(err);
9 | connection.end(assert.ifError);
10 | });
11 | });
12 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-procedure-with-multiple-selects.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var procedureName = 'multipleSelectProcedure';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | var input0 = 1;
12 | var input1 = 1000;
13 |
14 | connection.query([
15 | 'CREATE PROCEDURE ?? (IN param0 INT, IN param1 INT)',
16 | 'BEGIN',
17 | 'SELECT param0;',
18 | 'SELECT param1;',
19 | 'END'
20 | ].join('\n'), [procedureName], assert.ifError);
21 |
22 | connection.query('CALL ?? (?,?)', [procedureName, input0, input1], function (err, result) {
23 | assert.ifError(err);
24 | assert.deepEqual(result[0], [{param0: input0}], [{param1: input1}]);
25 |
26 | connection.query('DROP PROCEDURE ??', [procedureName], assert.ifError);
27 | connection.end(assert.ifError);
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-procedure-with-single-select.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var procedureName = 'singleSelectProcedure';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | var input = 1;
12 |
13 | connection.query([
14 | 'CREATE PROCEDURE ?? (IN param INT)',
15 | 'BEGIN',
16 | 'SELECT param;',
17 | 'END'
18 | ].join('\n'), [procedureName], assert.ifError);
19 |
20 | connection.query('CALL ?? (?)', [procedureName, input], function (err, result) {
21 | assert.ifError(err);
22 | assert.deepEqual(result[0], [{param: input}]);
23 |
24 | connection.query('DROP PROCEDURE ??', [procedureName], assert.ifError);
25 | connection.end(assert.ifError);
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-query-changed-rows.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'changed_rows_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query(
12 | 'CREATE TEMPORARY TABLE ?? (`col1` int, `col2` int) ENGINE=InnoDB DEFAULT CHARSET=utf8',
13 | [table], assert.ifError);
14 |
15 | connection.query('INSERT INTO ?? VALUES(1,1)', [table], assert.ifError);
16 |
17 | connection.query('UPDATE ?? SET `col1` = 2', [table], function (error, results) {
18 | assert.ifError(error);
19 | assert.strictEqual(results.affectedRows, 1);
20 | assert.strictEqual(results.changedRows, 1);
21 |
22 | connection.query('UPDATE ?? SET `col1` = 2', [table], function (error, results) {
23 | assert.ifError(error);
24 | assert.strictEqual(results.affectedRows, 1);
25 | assert.strictEqual(results.changedRows, 0);
26 | connection.end(assert.ifError);
27 | });
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-query-empty.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query(function (err) {
8 | assert.ok(err);
9 | assert.equal(err.code, 'ER_EMPTY_QUERY');
10 | connection.end(assert.ifError);
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-query-escape-id.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'escape_id_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`example` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.query('INSERT INTO ?? SET ?? = ?, ?? = ?', [table, 'id', 1, 'example', 'id escape'], assert.ifError);
20 |
21 | connection.query('SELECT * FROM ??', [table], function (err, rows) {
22 | assert.ifError(err);
23 | assert.equal(rows.length, 1);
24 | assert.deepEqual(rows[0], {id: 1, example: 'id escape'});
25 |
26 | connection.end(assert.ifError);
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-query-escaping.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 |
4 | var table = 'escape_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`example` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.query('INSERT INTO ?? SET id = ?, example = ?', [table, 1, 'array escape']);
20 | connection.query('INSERT INTO ?? SET ?', [table, {
21 | id : 2,
22 | example : 'object escape'
23 | }]);
24 |
25 | connection.query('SELECT * FROM ??', [table], function (err, rows) {
26 | assert.ifError(err);
27 | assert.equal(rows.length, 2);
28 | assert.deepEqual(rows[0], {id: 1, example: 'array escape'});
29 | assert.deepEqual(rows[1], {id: 2, example: 'object escape'});
30 | connection.end(assert.ifError);
31 | });
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-query.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query('SELECT 1', function (err, rows, fields) {
8 | assert.ifError(err);
9 | assert.deepEqual(rows, [{1: 1}]);
10 | assert.equal(fields[0].name, '1');
11 | });
12 |
13 | connection.query({ sql: 'SELECT ?' }, [ 1 ], function (err, rows, fields) {
14 | assert.ifError(err);
15 | assert.deepEqual(rows, [{1: 1}]);
16 | assert.equal(fields[0].name, '1');
17 | });
18 |
19 | connection.end(assert.ifError);
20 | });
21 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-select-empty-string.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.query('SELECT ""', function (err, rows) {
8 | assert.ifError(err);
9 | assert.deepEqual(rows, [{'': ''}]);
10 | connection.end(assert.ifError);
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-server-timeout-disconnect.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var timeout = setTimeout(function () {
6 | throw new Error('test timeout');
7 | }, 2000);
8 |
9 | common.getTestConnection(function (err, connection) {
10 | assert.ifError(err);
11 |
12 | var done = after(2, function () {
13 | clearTimeout(timeout);
14 | });
15 |
16 | connection.query('SET wait_timeout = 1', assert.ifError);
17 |
18 | connection.on('end', function (err) {
19 | assert.strictEqual(err.code, 'PROTOCOL_CONNECTION_LOST');
20 | assert.strictEqual(err.fatal, true);
21 | done();
22 | });
23 |
24 | connection.on('error', function (err) {
25 | assert.strictEqual(err.code, 'PROTOCOL_CONNECTION_LOST');
26 | assert.strictEqual(err.fatal, true);
27 | done();
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-statistics.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection(function (err, connection) {
5 | assert.ifError(err);
6 |
7 | connection.statistics(function (err, data) {
8 | assert.ifError(err);
9 | assert.strictEqual(typeof data, 'object');
10 | assert.ok(data.hasOwnProperty('message'));
11 | assert.ok(data.hasOwnProperty('uptime'));
12 | assert.ok(data.hasOwnProperty('threads'));
13 | assert.ok(data.hasOwnProperty('questions'));
14 | assert.ok(data.hasOwnProperty('slow_queries'));
15 | assert.ok(data.hasOwnProperty('opens'));
16 | assert.ok(data.hasOwnProperty('flush_tables'));
17 | assert.ok(data.hasOwnProperty('open_tables'));
18 | assert.ok(data.hasOwnProperty('queries_per_second_avg'));
19 | connection.end(assert.ifError);
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-transaction-commit.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'transaction_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`title` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.beginTransaction(function (err) {
20 | assert.ifError(err);
21 |
22 | var row = {
23 | id : 1,
24 | title : 'Test row'
25 | };
26 |
27 | connection.query('INSERT INTO ?? SET ?', [table, row], function (err) {
28 | assert.ifError(err);
29 |
30 | connection.commit(function (err) {
31 | assert.ifError(err);
32 |
33 | connection.query('SELECT * FROM ??', [table], function (err, rows) {
34 | assert.ifError(err);
35 | assert.equal(rows.length, 1);
36 | connection.end(assert.ifError);
37 | });
38 | });
39 | });
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-transaction-rollback.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'transaction_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`title` varchar(255),',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | connection.beginTransaction(function (err) {
20 | assert.ifError(err);
21 |
22 | var row = {
23 | id : 1,
24 | title : 'Test row'
25 | };
26 |
27 | connection.query('INSERT INTO ?? SET ?', [table, row], function (err) {
28 | assert.ifError(err);
29 |
30 | connection.rollback(function (err) {
31 | assert.ifError(err);
32 |
33 | connection.query('SELECT * FROM ??', [table], function (err, rows) {
34 | assert.ifError(err);
35 | assert.equal(rows.length, 0);
36 | connection.end(assert.ifError);
37 | });
38 | });
39 | });
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-type-cast-null-fields.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'insert_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`date` DATETIME NULL,',
15 | '`number` INT NULL,',
16 | 'PRIMARY KEY (`id`)',
17 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
18 | ].join('\n'), [table], assert.ifError);
19 |
20 | connection.query('INSERT INTO ?? SET ?', [table, {
21 | date : null,
22 | number : null
23 | }]);
24 |
25 | connection.query('SELECT * FROM ??', [table], function (err, results) {
26 | assert.ifError(err);
27 | assert.strictEqual(results[0].date, null);
28 | assert.strictEqual(results[0].number, null);
29 |
30 | connection.end(assert.ifError);
31 | });
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-type-cast-query.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | common.getTestConnection({typeCast: true}, function (err, connection) {
5 | assert.ifError(err);
6 |
7 | var options = {
8 | sql : 'SELECT NOW() as date, POINT(1.2,-3.4) as point',
9 | typeCast : false
10 | };
11 |
12 | connection.query(options, function(err, rows) {
13 | assert.ifError(err);
14 |
15 | var point = rows[0].point;
16 | var byteOrder = point.readUInt8(4);
17 | var wkbType = byteOrder ? point.readUInt32LE(5) : point.readUInt32BE(5);
18 | var x = byteOrder ? point.readDoubleLE(9) : point.readDoubleBE(9);
19 | var y = byteOrder ? point.readDoubleLE(17) : point.readDoubleBE(17);
20 |
21 | assert.strictEqual(typeof rows[0].date, 'object');
22 | assert.equal(Buffer.isBuffer(rows[0].date), true);
23 | assert.strictEqual(typeof point, 'object');
24 | assert.equal(Buffer.isBuffer(point), true);
25 | assert.equal(point.readUInt32LE(0), 0); // unknown
26 | assert.equal(wkbType, 1); // WKBPoint
27 | assert.equal(x, 1.2);
28 | assert.equal(y, -3.4);
29 | });
30 |
31 | connection.end(assert.ifError);
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/integration/connection/test-zerofill-results.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var table = 'zerofill_results_test';
5 |
6 | common.getTestConnection(function (err, connection) {
7 | assert.ifError(err);
8 |
9 | common.useTestDb(connection);
10 |
11 | connection.query([
12 | 'CREATE TEMPORARY TABLE ?? (',
13 | '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
14 | '`num` int(5) UNSIGNED ZEROFILL,',
15 | 'PRIMARY KEY (`id`)',
16 | ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
17 | ].join('\n'), [table], assert.ifError);
18 |
19 | var test_numbers = ['00000', '00001', '00012', '00123', '01234', '12345', null];
20 |
21 | for (var i = 0; i < test_numbers.length; i++) {
22 | connection.query('INSERT INTO ?? SET ?', [table, {
23 | id : (i + 1),
24 | num : (test_numbers[i] !== null ? parseInt(test_numbers[i], 10) : null)
25 | }], assert.ifError);
26 | }
27 |
28 | connection.query('SELECT * FROM ??', [table], function (err, results) {
29 | assert.ifError(err);
30 | assert.strictEqual(results.length, test_numbers.length);
31 |
32 | for (var i = 0; i < results.length; i++) {
33 | assert.strictEqual(test_numbers[results[i].id - 1], (results[i].num !== null ? '' + results[i].num : null));
34 | }
35 |
36 | connection.end(assert.ifError);
37 | });
38 | });
39 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/run.js:
--------------------------------------------------------------------------------
1 | var urun = require('urun');
2 |
3 | var options = {};
4 |
5 | if (process.env.FILTER) {
6 | options.include = new RegExp(process.env.FILTER + '.*\\.js$');
7 | }
8 |
9 | options.reporter = 'BashTapReporter';
10 | options.verbose = process.env.VERBOSE
11 | ? Boolean(JSON.parse(process.env.VERBOSE))
12 | : true;
13 |
14 | urun(__dirname, options);
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-no-old-password.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | user : 'root',
12 | password : null,
13 | insecureAuth : true
14 | });
15 |
16 | connection.connect(function (err) {
17 | assert.ifError(err);
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
23 | server.on('connection', function(incomingConnection) {
24 | incomingConnection.on('clientAuthentication', function () {
25 | this._sendPacket(new common.Packets.UseOldPasswordPacket());
26 | });
27 |
28 | incomingConnection.on('OldPasswordPacket', function (packet) {
29 | if (packet.scrambleBuff.length === 0) {
30 | this.ok();
31 | } else {
32 | this.deny();
33 | }
34 | });
35 |
36 | incomingConnection.handshake();
37 | });
38 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-no-password.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | password : null,
12 | user : 'root'
13 | });
14 |
15 | connection.connect(function (err) {
16 | assert.ifError(err);
17 | connection.destroy();
18 | server.destroy();
19 | });
20 | });
21 |
22 | server.on('connection', function(incomingConnection) {
23 | incomingConnection.on('clientAuthentication', function (packet) {
24 | if (packet.scrambleBuff.length === 0) {
25 | this.ok();
26 | } else {
27 | this.deny();
28 | }
29 | });
30 |
31 | incomingConnection.handshake();
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-old-password.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 | var Auth = require(common.lib + '/protocol/Auth');
4 | var Crypto = require('crypto');
5 |
6 | var random = Crypto.pseudoRandomBytes || Crypto.randomBytes; // Depends on node.js version
7 | var server = common.createFakeServer();
8 |
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var connection = common.createConnection({
13 | port : server.port(),
14 | password : 'oldpw',
15 | insecureAuth : true
16 | });
17 |
18 | connection.connect(function (err) {
19 | assert.ifError(err);
20 | connection.destroy();
21 | server.destroy();
22 | });
23 | });
24 |
25 | server.on('connection', function(incomingConnection) {
26 | random(8, function (err, scramble) {
27 | assert.ifError(err);
28 |
29 | incomingConnection.on('clientAuthentication', function () {
30 | this._sendPacket(new common.Packets.UseOldPasswordPacket());
31 | });
32 |
33 | incomingConnection.on('OldPasswordPacket', function (packet) {
34 | var expected = Auth.scramble323(scramble, 'oldpw');
35 | this._sendAuthResponse(packet.scrambleBuff, expected);
36 | });
37 |
38 | incomingConnection.handshake({
39 | scrambleBuff1: scramble
40 | });
41 | });
42 | });
43 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-password.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 | var Auth = require(common.lib + '/protocol/Auth');
4 | var Crypto = require('crypto');
5 |
6 | var random = Crypto.pseudoRandomBytes || Crypto.randomBytes; // Depends on node.js version
7 | var server = common.createFakeServer();
8 |
9 | server.listen(0, function(err) {
10 | assert.ifError(err);
11 |
12 | var connection = common.createConnection({
13 | port : server.port(),
14 | password : 'passwd'
15 | });
16 |
17 | connection.connect(function (err) {
18 | assert.ifError(err);
19 | connection.destroy();
20 | server.destroy();
21 | });
22 | });
23 |
24 | server.on('connection', function(incomingConnection) {
25 | random(20, function (err, scramble) {
26 | assert.ifError(err);
27 |
28 | incomingConnection.on('clientAuthentication', function (packet) {
29 | this._sendAuthResponse(packet.scrambleBuff, Auth.token('passwd', scramble));
30 | });
31 |
32 | incomingConnection.handshake({
33 | scrambleBuff1 : scramble.slice(0, 8),
34 | scrambleBuff2 : scramble.slice(8, 20)
35 | });
36 | });
37 | });
38 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-switch-native.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var Crypto = require('crypto');
4 |
5 | var random = Crypto.pseudoRandomBytes || Crypto.randomBytes; // Depends on node.js version
6 | var server = common.createFakeServer();
7 |
8 | var connected;
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var connection = common.createConnection({
13 | port : server.port(),
14 | password : 'authswitch'
15 | });
16 |
17 | connection.connect(function (err, result) {
18 | assert.ifError(err);
19 |
20 | connected = result;
21 |
22 | connection.destroy();
23 | server.destroy();
24 | });
25 | });
26 |
27 | server.on('connection', function(incomingConnection) {
28 | random(20, function (err, scramble) {
29 | assert.ifError(err);
30 |
31 | incomingConnection.on('authSwitchResponse', function (packet) {
32 | this._sendAuthResponse(packet.data, common.Auth.token('authswitch', scramble));
33 | });
34 |
35 | incomingConnection.on('clientAuthentication', function () {
36 | this.authSwitchRequest({
37 | authMethodName : 'mysql_native_password',
38 | authMethodData : scramble
39 | });
40 | });
41 |
42 | incomingConnection.handshake();
43 | });
44 | });
45 |
46 | process.on('exit', function() {
47 | assert.equal(connected.fieldCount, 0);
48 | });
49 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-auth-switch-unknown.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var Buffer = require('safe-buffer').Buffer;
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({
11 | port : server.port(),
12 | password : 'authswitch'
13 | });
14 |
15 | connection.connect(function (err) {
16 | assert.ok(err);
17 | assert.equal(err.code, 'UNSUPPORTED_AUTH_METHOD');
18 | assert.equal(err.fatal, true);
19 | assert.ok(/foo_plugin_password/.test(err.message));
20 |
21 | connection.destroy();
22 | server.destroy();
23 | });
24 | });
25 |
26 | server.on('connection', function(incomingConnection) {
27 | incomingConnection.on('clientAuthentication', function () {
28 | this.authSwitchRequest({
29 | authMethodName : 'foo_plugin_password',
30 | authMethodData : Buffer.alloc(0)
31 | });
32 | });
33 |
34 | incomingConnection.handshake();
35 | });
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-callback-errors-are-not-caught.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var error = new Error('uncaught exception');
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var caughtErr = null;
11 | var connection = common.createConnection({port: server.port()});
12 |
13 | connection.connect(function (err) {
14 | assert.ifError(err);
15 |
16 | process.once('uncaughtException', function (err) {
17 | caughtErr = err;
18 | });
19 |
20 | throw error;
21 | });
22 |
23 | connection.end(function (err) {
24 | process.removeAllListeners('uncaughtException');
25 | assert.ifError(err);
26 | assert.strictEqual(caughtErr, error);
27 | server.destroy();
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-callback-primitive-errors-are-not-caught.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var error = undefined;
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var caughtErr = null;
11 | var connection = common.createConnection({port: server.port()});
12 |
13 | connection.connect(function (err) {
14 | assert.ifError(err);
15 |
16 | process.once('uncaughtException', function (err) {
17 | caughtErr = err;
18 | });
19 |
20 | throw error;
21 | });
22 |
23 | connection.end(function (err) {
24 | process.removeAllListeners('uncaughtException');
25 | assert.ifError(err);
26 | assert.strictEqual(caughtErr, error);
27 | server.destroy();
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-database-fatal-error.js:
--------------------------------------------------------------------------------
1 | // This test verifies that changeUser errors are treated as fatal errors. The
2 | // rationale for that is that a failure to execute a changeUser sequence may
3 | // cause unexpected behavior for queries that were enqueued under the
4 | // assumption of changeUser to succeed.
5 |
6 | var assert = require('assert');
7 | var common = require('../../common');
8 |
9 | var server = common.createFakeServer();
10 |
11 | server.listen(0, function (err) {
12 | assert.ifError(err);
13 |
14 | var connection = common.createConnection({port: server.port()});
15 |
16 | connection.changeUser({database: 'does-not-exist'}, function (err) {
17 | assert.ok(err, 'got error');
18 | assert.equal(err.code, 'ER_BAD_DB_ERROR');
19 | assert.equal(err.fatal, true);
20 |
21 | server.destroy();
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-auth-switch-unknown.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var Buffer = require('safe-buffer').Buffer;
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function(err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({
11 | port : server.port(),
12 | user : 'user_1',
13 | password : 'pass_1'
14 | });
15 |
16 | connection.query('SELECT CURRENT_USER()', function (err, result) {
17 | assert.ifError(err);
18 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_1@localhost');
19 |
20 | connection.changeUser({user: 'user_2', password: 'pass_2'}, function (err) {
21 | assert.ok(err);
22 | assert.equal(err.code, 'UNSUPPORTED_AUTH_METHOD');
23 | assert.equal(err.fatal, true);
24 | assert.ok(/foo_plugin_password/.test(err.message));
25 |
26 | connection.destroy();
27 | server.destroy();
28 | });
29 | });
30 | });
31 |
32 | server.on('connection', function (incomingConnection) {
33 | incomingConnection.on('changeUser', function () {
34 | this.authSwitchRequest({
35 | authMethodName : 'foo_plugin_password',
36 | authMethodData : Buffer.alloc(0)
37 | });
38 | });
39 |
40 | incomingConnection.handshake();
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-auth-switch.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var Crypto = require('crypto');
3 | var common = require('../../common');
4 |
5 | var random = Crypto.pseudoRandomBytes || Crypto.randomBytes; // Depends on node.js version
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function(err) {
9 | assert.ifError(err);
10 |
11 | var connection = common.createConnection({
12 | port : server.port(),
13 | user : 'user_1',
14 | password : 'pass_1'
15 | });
16 |
17 | connection.query('SELECT CURRENT_USER()', function (err, result) {
18 | assert.ifError(err);
19 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_1@localhost');
20 |
21 | connection.changeUser({user: 'user_2', password: 'pass_2'}, function (err) {
22 | assert.ifError(err);
23 | connection.destroy();
24 | server.destroy();
25 | });
26 | });
27 | });
28 |
29 | server.on('connection', function (incomingConnection) {
30 | random(20, function (err, scramble) {
31 | assert.ifError(err);
32 |
33 | incomingConnection.on('authSwitchResponse', function (packet) {
34 | this._sendAuthResponse(packet.data, common.Auth.token('pass_2', scramble));
35 | });
36 |
37 | incomingConnection.on('changeUser', function () {
38 | this.authSwitchRequest({
39 | authMethodName : 'mysql_native_password',
40 | authMethodData : scramble
41 | });
42 | });
43 |
44 | incomingConnection.handshake();
45 | });
46 | });
47 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-before-connect.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function(err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | user : 'user_1'
12 | });
13 |
14 | assert.equal(connection.state, 'disconnected');
15 |
16 | connection.changeUser({user: 'user_2'}, function (err) {
17 | assert.ifError(err);
18 |
19 | connection.query('SELECT CURRENT_USER()', function (err, result) {
20 | assert.ifError(err);
21 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_2@localhost');
22 |
23 | connection.destroy();
24 | server.destroy();
25 | });
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-empty-queue.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('SELECT 1', function (err, rows) {
12 | assert.ifError(err);
13 | assert.equal(rows.length, 1);
14 |
15 | // wait till protocol._queue is empty
16 | connection.once('drain', function() {
17 | connection.changeUser({user: 'user_1'}, function (err) {
18 | assert.ifError(err);
19 | connection.destroy();
20 | server.destroy();
21 | });
22 | });
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-fatal-error.js:
--------------------------------------------------------------------------------
1 | // This test verifies that changeUser errors are treated as fatal errors. The
2 | // rationale for that is that a failure to execute a changeUser sequence may
3 | // cause unexpected behavior for queries that were enqueued under the
4 | // assumption of changeUser to succeed.
5 |
6 | var assert = require('assert');
7 | var common = require('../../common');
8 |
9 | var server = common.createFakeServer();
10 |
11 | server.listen(0, function (err) {
12 | assert.ifError(err);
13 |
14 | var connection = common.createConnection({port: server.port()});
15 |
16 | connection.changeUser({user: 'does-not-exist', password: 'wrong-password'}, function (err) {
17 | assert.ok(err, 'got error');
18 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
19 | assert.equal(err.fatal, true);
20 |
21 | server.destroy();
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user-timeout.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var timeout = setTimeout(function () {
5 | throw new Error('test timeout');
6 | }, 5000);
7 |
8 | var server = common.createFakeServer();
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var connection = common.createConnection({
14 | port : server.port(),
15 | user : 'user_1'
16 | });
17 |
18 | connection.query('SELECT CURRENT_USER()', function (err, result) {
19 | assert.ifError(err);
20 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_1@localhost');
21 |
22 | connection.changeUser({user: 'user_2', timeout: 1000}, function (err) {
23 | assert.ok(err);
24 | assert.equal(err.code, 'PROTOCOL_SEQUENCE_TIMEOUT');
25 | assert.equal(err.message, 'ChangeUser inactivity timeout');
26 |
27 | connection.destroy();
28 | server.destroy();
29 | clearTimeout(timeout);
30 | });
31 | });
32 | });
33 |
34 | server.on('connection', function (conn) {
35 | conn.handshake();
36 | conn.on('changeUser', function () {
37 | // do nothing
38 | });
39 | });
40 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-change-user.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function(err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | user : 'user_1'
12 | });
13 |
14 | connection.query('SELECT CURRENT_USER()', function (err, result) {
15 | assert.ifError(err);
16 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_1@localhost');
17 |
18 | connection.changeUser({user: 'user_2'}, function (err) {
19 | assert.ifError(err);
20 |
21 | connection.query('SELECT CURRENT_USER()', function (err, result) {
22 | assert.ifError(err);
23 | assert.strictEqual(result[0]['CURRENT_USER()'], 'user_2@localhost');
24 |
25 | connection.destroy();
26 | server.destroy();
27 | });
28 | });
29 | });
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-domain.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var domain = null;
4 |
5 | try {
6 | domain = require('domain');
7 | } catch (e) {
8 | common.skipTest('node ' + process.version + ' does not support domains');
9 | }
10 |
11 | var d0 = domain.create();
12 | var d1 = domain.create();
13 |
14 | var server = common.createFakeServer();
15 |
16 | server.listen(0, function (err) {
17 | assert.ifError(err);
18 |
19 | var connection = null;
20 | var timer = setInterval(function () {
21 | if (connection.state !== 'authenticated') return;
22 | clearInterval(timer);
23 |
24 | assert.ok(!domain.active, 'no current domain');
25 | connection.query('SELECT 1', function (err) {
26 | assert.ifError(err);
27 | assert.equal(domain.active, d0, 'current domain is d0');
28 |
29 | connection.destroy();
30 | server.destroy();
31 | });
32 | }, 200);
33 |
34 | d0.run(function () {
35 | connection = common.createConnection({port: server.port()});
36 | assert.equal(connection.domain, d0, 'connection belongs to d0');
37 |
38 | d1.run(function () {
39 | connection.connect(function (err) {
40 | assert.ifError(err);
41 | assert.equal(domain.active, d1, 'current domain is d1');
42 | });
43 | });
44 | });
45 | });
46 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-error-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.connect();
12 |
13 | connection.on('error', function (err) {
14 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
15 | assert.ok(err.fatal);
16 |
17 | server.destroy();
18 | });
19 | });
20 |
21 | server.on('connection', function (conn) {
22 | conn.deny();
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.on('connect', function () {
12 | connection.destroy();
13 | server.destroy();
14 | });
15 |
16 | connection.connect(assert.ifError);
17 | });
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-no-domain.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var domain = null;
4 |
5 | try {
6 | domain = require('domain');
7 | } catch (e) {
8 | common.skipTest('node ' + process.version + ' does not support domains');
9 | }
10 |
11 | var d0 = domain.create();
12 |
13 | var server = common.createFakeServer();
14 |
15 | server.listen(0, function (err) {
16 | assert.ifError(err);
17 |
18 | var connection = common.createConnection({port: server.port()});
19 | var timer = setInterval(function () {
20 | if (connection.state !== 'authenticated') return;
21 | clearInterval(timer);
22 |
23 | assert.ok(!domain.active, 'no current domain');
24 | connection.query('SELECT 1', function (err) {
25 | assert.ifError(err);
26 | assert.equal(domain.active, null, 'query is not bound to domain');
27 |
28 | connection.destroy();
29 | server.destroy();
30 | });
31 | }, 200);
32 |
33 | assert.equal(connection.domain, null, 'connection is not bound to domain');
34 |
35 | d0.run(function () {
36 | connection.connect(function (err) {
37 | assert.ifError(err);
38 | assert.equal(domain.active, d0, 'current domain is d0');
39 | });
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-timeout-only.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({connectTimeout: 2000, port: server.port()});
10 |
11 | connection.query('SELECT SLEEP(3)', function (err, rows) {
12 | assert.ifError(err);
13 | assert.deepEqual(rows, [{'SLEEP(3)': 0}]);
14 |
15 | connection.destroy();
16 | server.destroy();
17 | });
18 | });
19 |
20 | server.on('connection', function (conn) {
21 | setTimeout(function () {
22 | conn.handshake();
23 | }, 400);
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connect-timeout.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var os = require('os');
4 | var interfaces = os.networkInterfaces();
5 | var external = Object.keys(interfaces).some(function(name) {
6 | return interfaces[name].some(function(interface) {
7 | return !interface.internal;
8 | });
9 | });
10 |
11 | if (!external) {
12 | common.skipTest('no external network interfaces');
13 | }
14 |
15 | var connection = common.createConnection({host: '10.255.255.1', connectTimeout: 500});
16 |
17 | var testTimeout = setTimeout(function() {
18 | connection.destroy();
19 | }, 5000);
20 |
21 | var connectErr;
22 | connection.connect(function(err) {
23 | connectErr = err;
24 | clearTimeout(testTimeout);
25 | });
26 |
27 | process.on('exit', function() {
28 | assert.ok(connectErr);
29 | assert.equal(connectErr.code, 'ETIMEDOUT');
30 | assert.equal(connectErr.syscall, 'connect');
31 | assert.equal(connectErr.fatal, true);
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var connectErr;
7 | var finalErr;
8 | var queryErr1;
9 | var queryErr2;
10 | var queryErr3;
11 | var timeout;
12 | server.listen(0, function(err) {
13 | if (err) throw err;
14 | var waitCount = 4;
15 |
16 | var connection = common.createConnection({port: server.port()});
17 |
18 | connection.connect(function(err) {
19 | connectErr = err;
20 | if (!--waitCount) end();
21 | });
22 |
23 | connection.query('SELECT 1', function(err) {
24 | queryErr1 = err;
25 | connection.query('SELECT 1', function(err) {
26 | finalErr = err;
27 | if (!--waitCount) end();
28 | });
29 | });
30 |
31 | process.nextTick(function() {
32 | connection.query('SELECT 1', function(err) {
33 | queryErr2 = err;
34 | if (!--waitCount) end();
35 | });
36 | });
37 |
38 | setTimeout(function() {
39 | connection.query('SELECT 1', function(err) {
40 | queryErr3 = err;
41 | if (!--waitCount) end();
42 | });
43 | }, 200);
44 |
45 | timeout = setTimeout(end, 5000);
46 | });
47 |
48 | function end() {
49 | if (timeout) clearTimeout(timeout);
50 | server.destroy();
51 | }
52 |
53 | server.on('connection', function(incomingConnection) {
54 | incomingConnection.deny();
55 | });
56 |
57 | process.on('exit', function() {
58 | assert.ok(connectErr);
59 | assert.ok(queryErr1);
60 | assert.ok(queryErr2);
61 | assert.ok(queryErr3);
62 | assert.ok(finalErr);
63 | assert.equal(finalErr.code, 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR');
64 | });
65 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-ciphers-unknown.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | ssl : {
12 | ca : common.getSSLConfig().ca,
13 | ciphers : 'BOGUS-CIPHER'
14 | }
15 | });
16 |
17 | connection.connect(function (err) {
18 | assert.ok(err);
19 | assert.equal(err.code, 'HANDSHAKE_SSL_ERROR');
20 | assert.equal(err.fatal, true);
21 |
22 | connection.destroy();
23 | server.destroy();
24 | });
25 | });
26 |
27 | server.on('connection', function (incomingConnection) {
28 | incomingConnection.handshake({
29 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
30 | });
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-ciphers.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer({
5 | ssl: {
6 | ciphers: 'ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES128-SHA:HIGH:!MD5:!aNULL:!EDH'
7 | }
8 | });
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var connection = common.createConnection({
14 | port : server.port(),
15 | ssl : {
16 | ca : common.getSSLConfig().ca,
17 | ciphers : 'AES128-SHA'
18 | }
19 | });
20 |
21 | connection.query('SHOW STATUS LIKE \'Ssl_cipher\';', function (err, rows) {
22 | assert.ifError(err);
23 | assert.equal(rows.length, 1);
24 | assert.equal(rows[0].Variable_name, 'Ssl_cipher');
25 | assert.equal(rows[0].Value, 'AES128-SHA');
26 |
27 | connection.destroy();
28 | server.destroy();
29 | });
30 | });
31 |
32 | server.on('connection', function (incomingConnection) {
33 | incomingConnection.handshake({
34 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
35 | });
36 | });
37 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-denied.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var connectErr;
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({
11 | port : server.port(),
12 | ssl : 'Amazon RDS'
13 | });
14 |
15 | connection.connect(function(err) {
16 | connectErr = err;
17 | server.destroy();
18 | });
19 | });
20 |
21 | process.on('exit', function() {
22 | assert.ok(connectErr);
23 | assert.equal(connectErr.code, 'HANDSHAKE_NO_SSL_SUPPORT');
24 | assert.ok(connectErr.fatal);
25 | });
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-ignore.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function(err) {
7 | if (err) throw err;
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | ssl : 'Amazon RDS'
12 | });
13 |
14 | // Ignore bad SSL
15 | connection.config.ssl.rejectUnauthorized = false;
16 |
17 | connection.connect(function(err) {
18 | assert.ifError(err);
19 | connection.destroy();
20 | server.destroy();
21 | });
22 | });
23 |
24 | server.on('connection', function(incomingConnection) {
25 | incomingConnection.handshake({
26 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-max-version-accept.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var tls = require('tls');
4 |
5 | if (!tls.createSecureContext) {
6 | common.skipTest('node ' + process.version + ' does not support tls.createSecureContext()');
7 | }
8 |
9 | if (!tls.DEFAULT_MAX_VERSION) {
10 | common.skipTest('node ' + process.version + ' does not support tls maxVersion');
11 | }
12 |
13 | var server = common.createFakeServer({
14 | ssl: {
15 | maxVersion : tls.DEFAULT_MAX_VERSION,
16 | minVersion : tls.DEFAULT_MAX_VERSION
17 | }
18 | });
19 |
20 | server.listen(0, function (err) {
21 | assert.ifError(err);
22 |
23 | var connection = common.createConnection({
24 | port : server.port(),
25 | ssl : {
26 | ca : common.getSSLConfig().ca,
27 | maxVersion : tls.DEFAULT_MAX_VERSION
28 | }
29 | });
30 |
31 | connection.connect(function (err) {
32 | assert.ifError(err);
33 | connection.destroy();
34 | server.destroy();
35 | });
36 | });
37 |
38 | server.on('connection', function (incomingConnection) {
39 | incomingConnection.handshake({
40 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
41 | });
42 | });
43 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-max-version-reject.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var tls = require('tls');
4 |
5 | if (!tls.createSecureContext) {
6 | common.skipTest('node ' + process.version + ' does not support tls.createSecureContext()');
7 | }
8 |
9 | if (!tls.DEFAULT_MAX_VERSION) {
10 | common.skipTest('node ' + process.version + ' does not support tls maxVersion');
11 | }
12 |
13 | var server = common.createFakeServer({
14 | ssl: {
15 | maxVersion : tls.DEFAULT_MAX_VERSION,
16 | minVersion : tls.DEFAULT_MAX_VERSION
17 | }
18 | });
19 |
20 | server.listen(0, function (err) {
21 | assert.ifError(err);
22 |
23 | var connection = common.createConnection({
24 | port : server.port(),
25 | ssl : {
26 | ca : common.getSSLConfig().ca,
27 | maxVersion : tls.DEFAULT_MIN_VERSION
28 | }
29 | });
30 |
31 | connection.connect(function (err) {
32 | assert.ok(err);
33 | assert.strictEqual(err.code, 'HANDSHAKE_SSL_ERROR');
34 | assert.strictEqual(err.fatal, true);
35 | connection.destroy();
36 | server.destroy();
37 | });
38 | });
39 |
40 | server.on('connection', function (incomingConnection) {
41 | incomingConnection.handshake({
42 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-min-version-accept.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var tls = require('tls');
4 |
5 | if (!tls.createSecureContext) {
6 | common.skipTest('node ' + process.version + ' does not support tls.createSecureContext()');
7 | }
8 |
9 | if (!tls.DEFAULT_MIN_VERSION) {
10 | common.skipTest('node ' + process.version + ' does not support tls minVersion');
11 | }
12 |
13 | var server = common.createFakeServer({
14 | ssl: {
15 | maxVersion : tls.DEFAULT_MIN_VERSION,
16 | minVersion : tls.DEFAULT_MIN_VERSION
17 | }
18 | });
19 |
20 | server.listen(0, function (err) {
21 | assert.ifError(err);
22 |
23 | var connection = common.createConnection({
24 | port : server.port(),
25 | ssl : {
26 | ca : common.getSSLConfig().ca,
27 | minVersion : tls.DEFAULT_MIN_VERSION
28 | }
29 | });
30 |
31 | connection.connect(function (err) {
32 | assert.ifError(err);
33 | connection.destroy();
34 | server.destroy();
35 | });
36 | });
37 |
38 | server.on('connection', function (incomingConnection) {
39 | incomingConnection.handshake({
40 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
41 | });
42 | });
43 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-min-version-reject.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var tls = require('tls');
4 |
5 | if (!tls.createSecureContext) {
6 | common.skipTest('node ' + process.version + ' does not support tls.createSecureContext()');
7 | }
8 |
9 | if (!tls.DEFAULT_MIN_VERSION) {
10 | common.skipTest('node ' + process.version + ' does not support tls minVersion');
11 | }
12 |
13 | var server = common.createFakeServer({
14 | ssl: {
15 | maxVersion : tls.DEFAULT_MIN_VERSION,
16 | minVersion : tls.DEFAULT_MIN_VERSION
17 | }
18 | });
19 |
20 | server.listen(0, function (err) {
21 | assert.ifError(err);
22 |
23 | var connection = common.createConnection({
24 | port : server.port(),
25 | ssl : {
26 | ca : common.getSSLConfig().ca,
27 | minVersion : tls.DEFAULT_MAX_VERSION
28 | }
29 | });
30 |
31 | connection.connect(function (err) {
32 | assert.ok(err);
33 | assert.strictEqual(err.code, 'HANDSHAKE_SSL_ERROR');
34 | assert.strictEqual(err.fatal, true);
35 | connection.destroy();
36 | server.destroy();
37 | });
38 | });
39 |
40 | server.on('connection', function (incomingConnection) {
41 | incomingConnection.handshake({
42 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl-reject.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function(err) {
7 | if (err) throw err;
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | ssl : 'Amazon RDS'
12 | });
13 |
14 | connection.connect(function(err) {
15 | assert.ok(err);
16 | assert.equal(err.code, 'HANDSHAKE_SSL_ERROR');
17 | assert.equal(err.fatal, true);
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
23 | server.on('connection', function(incomingConnection) {
24 | incomingConnection.handshake({
25 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-ssl.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | ssl : {
12 | ca: common.getSSLConfig().ca
13 | }
14 | });
15 |
16 | connection.ping(function(err) {
17 | assert.ifError(err);
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
23 | server.on('connection', function(incomingConnection) {
24 | incomingConnection.handshake({
25 | serverCapabilities1: common.ClientConstants.CLIENT_SSL
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-thread-id-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | assert.strictEqual(connection.threadId, null);
12 |
13 | connection.connect(function (err) {
14 | assert.ok(err);
15 | assert.strictEqual(err.code, 'ER_ACCESS_DENIED_ERROR');
16 | assert.strictEqual(connection.threadId, 42);
17 |
18 | server.destroy();
19 | });
20 | });
21 |
22 | server.on('connection', function (incomingConnection) {
23 | incomingConnection.handshake({threadId: 42});
24 | incomingConnection.on('clientAuthentication', function () {
25 | this.deny();
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-connection-thread-id.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | assert.strictEqual(connection.threadId, null);
12 |
13 | connection.connect(function(err) {
14 | assert.ifError(err);
15 | assert.strictEqual(connection.threadId, 42);
16 |
17 | connection.end(function(err) {
18 | assert.ifError(err);
19 | assert.strictEqual(connection.threadId, 42);
20 | server.destroy();
21 | });
22 | });
23 | });
24 |
25 | server.on('connection', function(incomingConnection) {
26 | incomingConnection.handshake({
27 | threadId: 42
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-custom-query-format.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | function queryFormat(query, values) {
5 | if (!values) {
6 | return query;
7 | }
8 |
9 | var escape = this.escape.bind(this);
10 |
11 | return query.replace(/\:(\w+)/g, function (txt, key) {
12 | if (values.hasOwnProperty(key)) {
13 | return escape(values[key]);
14 | }
15 | return txt;
16 | });
17 | }
18 |
19 | var server = common.createFakeServer();
20 |
21 | server.listen(0, function (err) {
22 | assert.ifError(err);
23 |
24 | var connection = common.createConnection({
25 | port : server.port(),
26 | queryFormat : queryFormat
27 | });
28 |
29 | assert.equal(connection.format('SELECT :a1, :a2', { a1: 1, a2: 'two' }), 'SELECT 1, \'two\'');
30 | assert.equal(connection.format('SELECT :a1', []), 'SELECT :a1');
31 | assert.equal(connection.format('SELECT :a1'), 'SELECT :a1');
32 |
33 | connection.destroy();
34 | server.destroy();
35 | });
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-debug-exclude.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var util = require('util');
4 |
5 | var tid = 0;
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var connection = common.createConnection({
12 | debug : ['OkPacket', 'ComPingPacket'],
13 | port : server.port()
14 | });
15 | var messages = [];
16 |
17 | console.log = function () {
18 | var msg = util.format.apply(this, arguments);
19 | if (String(msg).indexOf('--') !== -1) {
20 | messages.push(msg.split(' {')[0]);
21 | }
22 | };
23 |
24 | connection.ping(function (err) {
25 | assert.ifError(err);
26 | assert.equal(messages.length, 3);
27 | assert.deepEqual(messages, [
28 | '<-- (1) OkPacket',
29 | '--> (1) ComPingPacket',
30 | '<-- (1) OkPacket'
31 | ]);
32 |
33 | connection.destroy();
34 | server.destroy();
35 | });
36 | });
37 |
38 | server.on('connection', function (conn) {
39 | conn.handshake({ threadId: ++tid });
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-debug.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var util = require('util');
4 |
5 | var tid = 0;
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var connection = common.createConnection({debug: true, port: server.port()});
12 | var messages = [];
13 |
14 | console.log = function () {
15 | var msg = util.format.apply(this, arguments);
16 | if (String(msg).indexOf('--') !== -1) {
17 | messages.push(msg.split(' {')[0]);
18 | }
19 | };
20 |
21 | connection.ping(function (err) {
22 | assert.ifError(err);
23 | assert.equal(messages.length, 5);
24 | assert.deepEqual(messages, [
25 | '<-- HandshakeInitializationPacket',
26 | '--> (1) ClientAuthenticationPacket',
27 | '<-- (1) OkPacket',
28 | '--> (1) ComPingPacket',
29 | '<-- (1) OkPacket'
30 | ]);
31 |
32 | connection.destroy();
33 | server.destroy();
34 | });
35 | });
36 |
37 | server.on('connection', function (conn) {
38 | conn.handshake({ threadId: ++tid });
39 | });
40 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-domain-implicit.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var domain = null;
4 |
5 | try {
6 | domain = require('domain');
7 | } catch (e) {
8 | common.skipTest('node ' + process.version + ' does not support domains');
9 | }
10 |
11 | var d0 = domain.create();
12 |
13 | var server = common.createFakeServer();
14 |
15 | server.listen(0, function (err) {
16 | assert.ifError(err);
17 |
18 | d0.run(function () {
19 | var members = d0.members.slice(0);
20 | var conn = common.createConnection({port: server.port()});
21 |
22 | assert.equal(conn.domain, d0, 'connection is bound to domain d0');
23 | assert.equal(d0.members.indexOf(conn), -1, 'connection is not an explicit member of domain d0');
24 | assert.deepEqual(d0.members, members, 'no members added to domain d0');
25 |
26 | conn.query('SELECT 1', function (err) {
27 | assert.ifError(err);
28 | assert.deepEqual(d0.members, members, 'no members added to domain d0');
29 | conn.destroy();
30 | server.destroy();
31 | });
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-double-connect.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | connection.destroy();
14 | server.destroy();
15 | });
16 |
17 | connection.connect(function (err) {
18 | assert.ifError(err);
19 |
20 | connection.connect(function (err) {
21 | assert.ok(err, 'got error');
22 | assert.equal(err.code, 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE');
23 | assert.ok(!err.fatal);
24 | done();
25 | });
26 | });
27 |
28 | connection.connect(function (err) {
29 | assert.ok(err, 'got error');
30 | assert.equal(err.code, 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE');
31 | assert.ok(!err.fatal);
32 | done();
33 | });
34 | });
35 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-drain-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.on('drain', function () {
12 | connection.destroy();
13 | server.destroy();
14 | });
15 |
16 | connection.query('SELECT 1', assert.ifError);
17 | });
18 |
19 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-end-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.on('end', function () {
12 | server.destroy();
13 | });
14 |
15 | connection.end(assert.ifError);
16 | });
17 |
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-enqueue-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 | var count = 0;
11 |
12 | connection.on('enqueue', function () {
13 | count++;
14 | });
15 |
16 | connection.on('drain', function () {
17 | assert.equal(count, 3);
18 | connection.destroy();
19 | server.destroy();
20 | });
21 |
22 | connection.query('SELECT 1', assert.ifError);
23 | connection.ping(assert.ifError);
24 | });
25 |
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-error-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('INVALID SQL');
12 |
13 | connection.on('error', function (err) {
14 | assert.equal(err.code, 'ER_PARSE_ERROR');
15 | assert.ok(!err.fatal);
16 |
17 | connection.destroy();
18 | server.destroy();
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-error-trace-bad-stack.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | // Common mistake to leave in code
12 | Error.prepareStackTrace = function (err, stack) {
13 | return stack;
14 | };
15 |
16 | connection.query('INVALID SQL', function (err) {
17 | assert.ok(err, 'got error');
18 | assert.ok(typeof err.stack !== 'string', 'error stack is not a string');
19 |
20 | connection.destroy();
21 | server.destroy();
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-error-trace-no-stack.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | Error.stackTraceLimit = 0;
12 |
13 | connection.query('INVALID SQL', function (err) {
14 | assert.ok(err, 'got error');
15 | assert.ok(!err.stack || err.stack.indexOf('\n --------------------\n') === -1,
16 | 'error stack does not have delimiter');
17 |
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-error-trace.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('INVALID SQL', function (err) {
12 | assert.ok(err, 'got error');
13 | assert.ok(typeof err.stack === 'string', 'error stack is string');
14 | assert.ok(err.stack.indexOf('\n --------------------\n') !== -1, 'error stack has delimiter');
15 |
16 | connection.destroy();
17 | server.destroy();
18 | });
19 | });
20 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-fatal-connect-error.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var count = 0;
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var connection = common.createConnection({port: server.port()});
12 |
13 | var done = after(3, function () {
14 | server.destroy();
15 | });
16 |
17 | connection.connect(function (err) {
18 | assert.ok(err, 'got error');
19 | assert.ok(err.fatal);
20 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
21 | done();
22 | });
23 |
24 | connection.query('SELECT 1', function (err) {
25 | assert.ok(err, 'got error');
26 | assert.ok(err.fatal);
27 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
28 | done();
29 | });
30 |
31 | connection.ping(function (err) {
32 | assert.ok(err, 'got error');
33 | assert.ok(err.fatal);
34 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
35 | done();
36 | });
37 | });
38 |
39 | server.on('connection', function (conn) {
40 | if (count === 0) {
41 | conn.deny();
42 | return;
43 | }
44 |
45 | count++;
46 | conn.handshake();
47 | });
48 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-fatal-network-error-going-to-all-callbacks.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 | var connection = common.createConnection({port: common.bogusPort});
5 |
6 | var timer = setTimeout(function () {
7 | throw new Error('test timeout');
8 | }, 5000);
9 |
10 | var done = after(2, function () {
11 | clearTimeout(timer);
12 | });
13 |
14 | connection.connect(function (err) {
15 | assert.ok(err, 'got connect error');
16 | assert.equal(err.code, 'ECONNREFUSED');
17 | assert.equal(err.fatal, true);
18 | done();
19 | });
20 |
21 | connection.query('SELECT 1', function (err) {
22 | assert.ok(err, 'got query error');
23 | assert.equal(err.code, 'ECONNREFUSED');
24 | assert.equal(err.fatal, true);
25 | done();
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-fatal-network-error-without-handlers.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var connection = common.createConnection({port: common.bogusPort});
4 |
5 | var timer = setTimeout(function () {
6 | throw new Error('test timeout');
7 | }, 5000);
8 |
9 | connection.connect();
10 | connection.query('SELECT 1');
11 |
12 | connection.on('error', function (err) {
13 | assert.ok(err, 'got connect error');
14 | assert.equal(err.code, 'ECONNREFUSED');
15 | assert.equal(err.fatal, true);
16 | clearTimeout(timer);
17 | });
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-host-denied-error.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var connectErr;
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | connection.connect(function(err) {
13 | connectErr = err;
14 | server.destroy();
15 | });
16 | });
17 |
18 | server.on('connection', function(incomingConnection) {
19 | incomingConnection.deny('You suck.', common.Errors.ER_HOST_NOT_PRIVILEGED);
20 | });
21 |
22 | process.on('exit', function() {
23 | assert.equal(connectErr.code, 'ER_HOST_NOT_PRIVILEGED');
24 | assert.ok(/You suck/.test(connectErr.message));
25 | assert.equal(connectErr.fatal, true);
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-implicit-connect.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('SELECT 1', function (err, rows) {
12 | assert.ifError(err);
13 | assert.deepEqual(rows, [{1: 1}]);
14 |
15 | connection.destroy();
16 | server.destroy();
17 | });
18 | });
19 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-incorrect-packet-sequence.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err){
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.ping(function (err) {
12 | assert.ok(err, 'got error');
13 | assert.equal(err.code, 'PROTOCOL_INCORRECT_PACKET_SEQUENCE');
14 | assert.equal(err.fatal, true);
15 | connection.destroy();
16 | server.destroy();
17 | });
18 | });
19 |
20 | server.on('connection', function (connection) {
21 | connection.handshake();
22 | connection.on('ping', function () {
23 | this._sendPacket(new common.Packets.EofPacket());
24 | this._parser.resetPacketNumber();
25 | });
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-insecure-auth-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | password : 'oldpw'
12 | });
13 |
14 | connection.connect(function (err) {
15 | assert.ok(err);
16 | assert.equal(err.code, 'HANDSHAKE_INSECURE_AUTH');
17 | assert.equal(err.fatal, true);
18 |
19 | connection.destroy();
20 | server.destroy();
21 | });
22 | });
23 |
24 | server.on('connection', function(incomingConnection) {
25 | incomingConnection.on('clientAuthentication', function () {
26 | this._sendPacket(new common.Packets.UseOldPasswordPacket());
27 | });
28 |
29 | incomingConnection.handshake();
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-load-data-infile-disable.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | localInfile : false
12 | });
13 |
14 | connection.query('LOAD DATA LOCAL INFILE ? INTO TABLE ??', ['data.csv', 'foo'], function (err, result) {
15 | assert.ok(err);
16 | assert.equal(err.code, 'LOCAL_FILES_DISABLED');
17 | assert.ok(!err.fatal);
18 | assert.equal(result.affectedRows, 0);
19 |
20 | connection.destroy();
21 | server.destroy();
22 | });
23 | });
24 |
25 | server.on('connection', function(conn) {
26 | conn.on('clientAuthentication', function (packet) {
27 | if (packet.clientFlags & common.ClientConstants.LOCAL_FILES) {
28 | conn.deny();
29 | } else {
30 | conn.ok();
31 | }
32 | });
33 | conn.on('query', function (packet) {
34 | if (packet.sql.indexOf('LOAD DATA LOCAL INFILE') === 0) {
35 | conn.once('EmptyPacket', function () {
36 | conn.ok();
37 | });
38 | this._sendPacket(new common.Packets.LocalInfileRequestPacket({
39 | filename: common.fixtures + '/data.csv'
40 | }));
41 | } else {
42 | this._handleQueryPacket(packet);
43 | }
44 | });
45 | conn.handshake();
46 | });
47 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-long-stack-traces-disabled.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function(err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({
10 | port : server.port(),
11 | trace : false
12 | });
13 |
14 | connection.query('invalid sql', function (err) {
15 | assert.ok(err, 'got error');
16 | assert.ok(err.stack.indexOf(__filename) < 0);
17 |
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-long-stack-traces-for-connection-errors.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var connection = common.createConnection({port: common.bogusPort});
4 |
5 | connection.connect(function (err) {
6 | assert.ok(err, 'got error');
7 | assert.ok(err.stack.indexOf(__filename) > 0);
8 | });
9 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-long-stack-traces.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('invalid sql', function (err) {
12 | assert.ok(err, 'got error');
13 | assert.ok(err.stack.indexOf(__filename) > 0);
14 |
15 | connection.destroy();
16 | server.destroy();
17 | });
18 | });
19 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-packet-out-of-order.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 | var serverConn = null;
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | connection.connect(function(err) {
13 | assert.ifError(err);
14 |
15 | serverConn.ok();
16 |
17 | connection.end(function(err) {
18 | assert.ok(err);
19 | assert.equal(err.code, 'PROTOCOL_PACKETS_OUT_OF_ORDER');
20 | assert.equal(err.fatal, true);
21 | assert.ok(/Packets out of order/.test(err.message));
22 | server.destroy();
23 | });
24 | });
25 | });
26 |
27 | server.on('connection', function(incomingConnection) {
28 | serverConn = incomingConnection;
29 | incomingConnection.handshake();
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-parser-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('SELECT value FROM stuff', function (err) {
12 | assert.ok(err, 'got err');
13 | assert.equal(err.code, 'PARSER_READ_PAST_END');
14 | assert.equal(!!err.fatal, false);
15 | assert.equal(err.offset, 4);
16 | connection.destroy();
17 | server.destroy();
18 | });
19 | });
20 |
21 | server.on('connection', function(conn) {
22 | conn.handshake();
23 | conn.on('query', function(packet) {
24 | switch (packet.sql) {
25 | case 'SELECT value FROM stuff':
26 | this._sendPacket(new common.Packets.ResultSetHeaderPacket({
27 | fieldCount: 1
28 | }));
29 |
30 | var writer = new common.PacketWriter();
31 | writer.writeLengthCodedString('def');
32 | this._socket.write(writer.toBuffer(this._parser));
33 | this._parser.resetPacketNumber();
34 | break;
35 | default:
36 | this._handlePacketQuery(packet);
37 | break;
38 | }
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-protocol-stray-packet.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.on('error', function (err) {
12 | assert.equal(err.code, 'PROTOCOL_STRAY_PACKET');
13 | assert.equal(err.fatal, true);
14 | connection.destroy();
15 | server.destroy();
16 | });
17 |
18 | connection.query('SELECT 1', assert.ifError);
19 | });
20 |
21 | server.on('connection', function(conn) {
22 | conn.handshake();
23 | conn.on('query', function(packet) {
24 | var resetPacketNumber = this._parser.resetPacketNumber;
25 |
26 | // Prevent packet number from being reset
27 | this._parser.resetPacketNumber = function () {};
28 | this._handleQueryPacket(packet);
29 |
30 | this._parser.resetPacketNumber = resetPacketNumber;
31 | this._sendPacket(new common.Packets.ResultSetHeaderPacket({
32 | fieldCount: 1
33 | }));
34 | });
35 | });
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-query-after-destroy.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 | var sync = true;
11 |
12 | connection.destroy();
13 |
14 | connection.query('SELECT 1', function (err) {
15 | assert.ok(!sync);
16 | assert.ok(err);
17 | assert.equal(err.fatal, false);
18 | assert.equal(err.code, 'PROTOCOL_ENQUEUE_AFTER_DESTROY');
19 | server.destroy();
20 | });
21 |
22 | sync = false;
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-query-after-end-without-callback.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | server.destroy();
14 | });
15 |
16 | connection.connect(assert.ifError);
17 |
18 | connection.end(function (err) {
19 | assert.ifError(err);
20 | done();
21 | });
22 |
23 | connection.on('error', function (err) {
24 | assert.ok(err);
25 | assert.equal(err.fatal, false);
26 | assert.equal(err.code, 'PROTOCOL_ENQUEUE_AFTER_QUIT');
27 | done();
28 | });
29 |
30 | connection.query('SELECT 1');
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-query-after-end.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | server.destroy();
14 | });
15 |
16 | connection.connect(assert.ifError);
17 |
18 | connection.end(function (err) {
19 | assert.ifError(err);
20 | done();
21 | });
22 |
23 | connection.query('SELECT 1', function (err) {
24 | assert.ok(err);
25 | assert.equal(err.fatal, false);
26 | assert.equal(err.code, 'PROTOCOL_ENQUEUE_AFTER_QUIT');
27 | done();
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-query-timeout.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 | var timer = setTimeout(function () {
6 | throw new Error('test timeout');
7 | }, 2000);
8 |
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var connection = common.createConnection({port: server.port()});
13 |
14 | connection.query({sql: 'SELECT 1', timeout: 200}, function (err) {
15 | assert.ok(err);
16 | assert.equal(err.code, 'PROTOCOL_SEQUENCE_TIMEOUT');
17 | assert.equal(err.fatal, true);
18 | assert.equal(err.message, 'Query inactivity timeout');
19 | assert.equal(err.timeout, 200);
20 | });
21 | });
22 |
23 | server.on('connection', function(conn) {
24 | conn.handshake();
25 | conn._socket.on('close', function() {
26 | clearTimeout(timer);
27 | server.destroy();
28 | });
29 | conn.on('query', function () {
30 | // Do nothing; timeout
31 | });
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-quit-ok-packet.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.end(function (err) {
12 | assert.ifError(err);
13 | server.destroy();
14 | });
15 | });
16 |
17 | server.on('connection', function (conn) {
18 | conn.handshake();
19 | conn.on('quit', function () {
20 | conn.ok();
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-server-unexpected-disconnect.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var endErr = null;
5 | var queryErr = null;
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var connection = common.createConnection({port: server.port()});
12 |
13 | connection.on('end', function (err) {
14 | assert.ok(!endErr);
15 | endErr = err;
16 | });
17 |
18 | connection.query('SELECT 1', function(err) {
19 | assert.ok(!queryErr);
20 | queryErr = err;
21 | });
22 | });
23 |
24 | server.on('connection', function(connection) {
25 | connection.handshake();
26 |
27 | connection.on('query', function () {
28 | server.destroy();
29 | });
30 | });
31 |
32 | process.on('exit', function() {
33 | assert.strictEqual(queryErr.code, 'PROTOCOL_CONNECTION_LOST');
34 | assert.strictEqual(queryErr.fatal, true);
35 |
36 | assert.strictEqual(endErr, queryErr);
37 | });
38 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/connection/test-unix-domain-socket.js:
--------------------------------------------------------------------------------
1 | /**
2 | * This test is skipped on Windows.
3 | */
4 |
5 | var assert = require('assert');
6 | var common = require('../../common');
7 |
8 | if (process.platform === 'win32') {
9 | common.skipTest('windows does not support unix sockets');
10 | }
11 |
12 | var connection = common.createConnection({socketPath: common.fakeServerSocket});
13 | var server = common.createFakeServer();
14 | var didConnect = false;
15 |
16 | server.listen(common.fakeServerSocket, function (err) {
17 | assert.ifError(err);
18 |
19 | connection.connect(function (err) {
20 | assert.ifError(err);
21 |
22 | assert.equal(didConnect, false);
23 | didConnect = true;
24 |
25 | connection.destroy();
26 | server.destroy();
27 | });
28 | });
29 |
30 | var hadConnection = false;
31 | server.on('connection', function(connection) {
32 | connection.handshake();
33 |
34 | assert.equal(hadConnection, false);
35 | hadConnection = true;
36 | });
37 |
38 | process.on('exit', function() {
39 | assert.equal(didConnect, true);
40 | assert.equal(hadConnection, true);
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-add-after-end.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var cluster = common.createPoolCluster();
4 | var poolConfig = common.getTestConfig();
5 |
6 | assert.doesNotThrow(cluster.add.bind(cluster, 'SLAVE1', poolConfig));
7 |
8 | cluster.end(function (err) {
9 | assert.ifError(err);
10 |
11 | assert.throws(cluster.add.bind(cluster, 'SLAVE3', poolConfig), /PoolCluster is closed/);
12 | });
13 |
14 | assert.throws(cluster.add.bind(cluster, 'SLAVE2', poolConfig), /PoolCluster is closed/);
15 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-add-same-id.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var cluster = common.createPoolCluster();
4 | var poolConfig = common.getTestConfig();
5 |
6 | assert.doesNotThrow(cluster.add.bind(cluster, 'SLAVE1', poolConfig));
7 | assert.throws(cluster.add.bind(cluster, 'SLAVE1', poolConfig), /Node ID "SLAVE1" is already defined in PoolCluster/);
8 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-default-selector.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({defaultSelector: 'ORDER'});
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*');
15 |
16 | pool.getConnection(function (err, conn1) {
17 | assert.ifError(err);
18 | assert.strictEqual(conn1._clusterId, 'SLAVE1');
19 |
20 | pool.getConnection(function (err, conn2) {
21 | assert.ifError(err);
22 | assert.strictEqual(conn2._clusterId, 'SLAVE1');
23 |
24 | conn1.release();
25 | conn2.release();
26 |
27 | cluster.end(function (err) {
28 | assert.ifError(err);
29 | server.destroy();
30 | });
31 | });
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-error-remove.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 1
7 | });
8 |
9 | var connCount = 0;
10 | var server1 = common.createFakeServer();
11 | var server2 = common.createFakeServer();
12 |
13 | server1.listen(0, function (err) {
14 | assert.ifError(err);
15 |
16 | server2.listen(0, function (err) {
17 | assert.ifError(err);
18 |
19 | cluster.add('SLAVE1', common.getTestConfig({port: server1.port()}));
20 | cluster.add('SLAVE2', common.getTestConfig({port: server2.port()}));
21 |
22 | var pool = cluster.of('*', 'RR');
23 | var removedNodeId;
24 |
25 | cluster.on('remove', function (nodeId) {
26 | removedNodeId = nodeId;
27 | });
28 |
29 | pool.getConnection(function (err, connection) {
30 | assert.ifError(err);
31 | assert.equal(connCount, 2);
32 | assert.equal(connection._clusterId, 'SLAVE2');
33 | assert.equal(removedNodeId, 'SLAVE1');
34 |
35 | connection.release();
36 |
37 | cluster.end(function (err) {
38 | assert.ifError(err);
39 | server1.destroy();
40 | server2.destroy();
41 | });
42 | });
43 | });
44 | });
45 |
46 | server1.on('connection', function (conn) {
47 | connCount += 1;
48 | conn.deny();
49 | });
50 |
51 | server2.on('connection', function (conn) {
52 | connCount += 1;
53 | conn.handshake();
54 | });
55 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 5
7 | });
8 | var server = common.createFakeServer();
9 |
10 | var connCount = 0;
11 |
12 | server.listen(0, function (err) {
13 | assert.ifError(err);
14 |
15 | var poolConfig = common.getTestConfig({port: server.port()});
16 | cluster.add('MASTER', poolConfig);
17 |
18 | cluster.getConnection('MASTER', function (err) {
19 | assert.ok(err);
20 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
21 | assert.equal(err.fatal, true);
22 | assert.equal(connCount, 5);
23 |
24 | cluster.end(function (err) {
25 | assert.ifError(err);
26 | server.destroy();
27 | });
28 | });
29 | });
30 |
31 | server.on('connection', function(incomingConnection) {
32 | connCount += 1;
33 | incomingConnection.deny();
34 | });
35 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-fatal-error-remove.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var cluster = common.createPoolCluster({removeNodeErrorCount: 1});
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | cluster.add('MASTER', common.getTestConfig({
11 | acquireTimeout : 100,
12 | port : server.port()
13 | }));
14 |
15 | var pool = cluster.of('*', 'RR');
16 |
17 | pool.getConnection(function (err) {
18 | assert.ok(err, 'got error');
19 | assert.equal(err.code, 'PROTOCOL_SEQUENCE_TIMEOUT');
20 | assert.equal(err.fatal, true);
21 |
22 | cluster.end(function (err) {
23 | assert.ifError(err);
24 | server.destroy();
25 | });
26 | });
27 | });
28 |
29 | server.on('connection', function () {
30 | // Let connection time out
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-no-retry.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({canRetry: false});
5 | var server = common.createFakeServer();
6 |
7 | var connCount = 0;
8 |
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var poolConfig = common.getTestConfig({port: server.port()});
13 | cluster.add('MASTER', poolConfig);
14 |
15 | cluster.getConnection('MASTER', function (err) {
16 | assert.ok(err);
17 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
18 | assert.equal(err.fatal, true);
19 | assert.equal(connCount, 1);
20 |
21 | cluster.end(function (err) {
22 | assert.ifError(err);
23 | server.destroy();
24 | });
25 | });
26 | });
27 |
28 | server.on('connection', function (conn) {
29 | connCount += 1;
30 | conn.deny();
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-order-fatal.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var cluster = common.createPoolCluster();
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var poolConfig1 = common.getTestConfig({port: common.bogusPort});
12 | var poolConfig2 = common.getTestConfig({port: server.port()});
13 | cluster.add('SLAVE1', poolConfig1);
14 | cluster.add('SLAVE2', poolConfig2);
15 |
16 | var pool = cluster.of('SLAVE*', 'ORDER');
17 |
18 | var done = after(2, function () {
19 | cluster.end(function (err) {
20 | assert.ifError(err);
21 | server.destroy();
22 | });
23 | });
24 |
25 | pool.getConnection(function (err, connection) {
26 | assert.ifError(err);
27 | assert.strictEqual(connection._clusterId, 'SLAVE2');
28 | done();
29 | });
30 |
31 | pool.getConnection(function (err, connection) {
32 | assert.ifError(err);
33 | assert.strictEqual(connection._clusterId, 'SLAVE2');
34 | done();
35 | });
36 | });
37 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-order.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*', 'ORDER');
15 |
16 | pool.getConnection(function (err, conn1) {
17 | assert.ifError(err);
18 | assert.strictEqual(conn1._clusterId, 'SLAVE1');
19 |
20 | pool.getConnection(function (err, conn2) {
21 | assert.ifError(err);
22 | assert.strictEqual(conn2._clusterId, 'SLAVE1');
23 |
24 | conn1.release();
25 | conn2.release();
26 |
27 | cluster.end(function (err) {
28 | assert.ifError(err);
29 | server.destroy();
30 | });
31 | });
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-random.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var seedrandom = require('seedrandom');
4 |
5 | var cluster = common.createPoolCluster();
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var poolConfig = common.getTestConfig({port: server.port()});
12 | cluster.add('SLAVE1', poolConfig);
13 | cluster.add('SLAVE2', poolConfig);
14 | cluster.add('SLAVE3', poolConfig);
15 |
16 | var count = 7;
17 | var order = [];
18 | var pool = cluster.of('SLAVE*', 'RANDOM');
19 |
20 | seedrandom('cluster random rest', {
21 | global: true
22 | });
23 |
24 | next();
25 |
26 | function done() {
27 | assert.deepEqual(order, [
28 | 'SLAVE2',
29 | 'SLAVE3',
30 | 'SLAVE2',
31 | 'SLAVE2',
32 | 'SLAVE1',
33 | 'SLAVE2',
34 | 'SLAVE1'
35 | ]);
36 | cluster.end(function (err) {
37 | assert.ifError(err);
38 | server.destroy();
39 | });
40 | }
41 |
42 | function next() {
43 | pool.getConnection(function (err, conn) {
44 | assert.ifError(err);
45 | order.push(conn._clusterId);
46 | conn.release();
47 |
48 | if (--count > 0) {
49 | next();
50 | } else {
51 | done();
52 | }
53 | });
54 | }
55 | });
56 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-retry-fatal-end.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 1
7 | });
8 |
9 | var connCount = 0;
10 | var server = common.createFakeServer();
11 |
12 | server.listen(0, function (err) {
13 | assert.ifError(err);
14 |
15 | var poolConfig = common.getTestConfig({port: server.port()});
16 | cluster.add('MASTER', poolConfig);
17 |
18 | cluster.getConnection('MASTER', function (err) {
19 | assert.ifError(err);
20 |
21 | cluster.getConnection('MASTER', function (err) {
22 | assert.ok(err);
23 |
24 | cluster.end(function (err) {
25 | assert.ifError(err);
26 | server.destroy();
27 | });
28 | });
29 | });
30 | });
31 |
32 | server.on('connection', function (conn) {
33 | connCount += 1;
34 |
35 | if (connCount < 2) {
36 | conn.handshake();
37 | } else {
38 | conn.destroy();
39 | server.destroy();
40 | }
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-retry.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 5
7 | });
8 |
9 | var connCount = 0;
10 | var server = common.createFakeServer();
11 |
12 | server.listen(0, function (err) {
13 | assert.ifError(err);
14 |
15 | var poolConfig = common.getTestConfig({port: server.port()});
16 | cluster.add('MASTER', poolConfig);
17 |
18 | cluster.getConnection('MASTER', function (err, connection) {
19 | assert.ifError(err);
20 | assert.equal(connCount, 2);
21 | assert.equal(connection._clusterId, 'MASTER');
22 |
23 | connection.release();
24 |
25 | cluster.end(function (err) {
26 | assert.ifError(err);
27 | server.destroy();
28 | });
29 | });
30 | });
31 |
32 | server.on('connection', function (conn) {
33 | connCount += 1;
34 |
35 | if (connCount < 2) {
36 | conn.destroy();
37 | } else {
38 | conn.handshake();
39 | }
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-rr-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 5
7 | });
8 |
9 | var connCount = 0;
10 | var server1 = common.createFakeServer();
11 | var server2 = common.createFakeServer();
12 |
13 | server1.listen(0, function (err) {
14 | assert.ifError(err);
15 |
16 | server2.listen(0, function (err) {
17 | assert.ifError(err);
18 |
19 | cluster.add('SLAVE1', common.getTestConfig({port: server1.port()}));
20 | cluster.add('SLAVE2', common.getTestConfig({port: server2.port()}));
21 |
22 | var pool = cluster.of('SLAVE*', 'RR');
23 |
24 | pool.getConnection(function (err, connection) {
25 | assert.ifError(err);
26 | assert.equal(connCount, 2);
27 | assert.equal(connection._clusterId, 'SLAVE2');
28 |
29 | connection.release();
30 |
31 | cluster.end(function (err) {
32 | assert.ifError(err);
33 | server1.destroy();
34 | server2.destroy();
35 | });
36 | });
37 | });
38 | });
39 |
40 | server1.on('connection', function (conn) {
41 | connCount += 1;
42 | conn.destroy();
43 | });
44 |
45 | server2.on('connection', function (conn) {
46 | connCount += 1;
47 | conn.handshake();
48 | });
49 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-connection-rr.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var cluster = common.createPoolCluster();
6 | var server = common.createFakeServer();
7 |
8 | var count = 5;
9 | var order = [];
10 |
11 | var done = after(count, function () {
12 | assert.deepEqual(order, [
13 | 'SLAVE1',
14 | 'SLAVE2',
15 | 'SLAVE1',
16 | 'SLAVE2',
17 | 'SLAVE1'
18 | ]);
19 | cluster.end(function (err) {
20 | assert.ifError(err);
21 | server.destroy();
22 | });
23 | });
24 |
25 | server.listen(0, function (err) {
26 | assert.ifError(err);
27 |
28 | var poolConfig = common.getTestConfig({port: server.port()});
29 | cluster.add('SLAVE1', poolConfig);
30 | cluster.add('SLAVE2', poolConfig);
31 |
32 | var pool = cluster.of('SLAVE*', 'RR');
33 |
34 | function getConnection(i) {
35 | pool.getConnection(function (err, conn) {
36 | assert.ifError(err);
37 | order[i] = conn._clusterId;
38 | conn.release();
39 | done();
40 | });
41 | }
42 |
43 | for (var i = 0; i < count; i++) {
44 | getConnection(i);
45 | }
46 | });
47 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-end-empty.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var cluster = common.createPoolCluster();
4 |
5 | var testTimeout = setTimeout(function() {
6 | throw new Error('Cluster did not end');
7 | }, 5000);
8 |
9 | cluster.end(function (err) {
10 | clearTimeout(testTimeout);
11 | assert.ifError(err);
12 | });
13 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-internals.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add(poolConfig);
12 | cluster.add('MASTER', poolConfig);
13 | cluster.add('SLAVE1', poolConfig);
14 | cluster.add('SLAVE2', poolConfig);
15 |
16 | // added nodes
17 | assert.deepEqual(Object.keys(cluster._nodes), ['CLUSTER::1', 'MASTER', 'SLAVE1', 'SLAVE2']);
18 |
19 | // _findNodeIds
20 | assert.deepEqual(cluster._findNodeIds('MASTER'), ['MASTER']);
21 | assert.deepEqual(cluster._findNodeIds('MA*ER'), ['MASTER']);
22 | assert.deepEqual(cluster._findNodeIds('*TER*'), ['CLUSTER::1', 'MASTER']);
23 | assert.deepEqual(cluster._findNodeIds('SLAVE*'), ['SLAVE1', 'SLAVE2']);
24 | assert.deepEqual(cluster._findNodeIds(/slave[1-2]/i), ['SLAVE1', 'SLAVE2']);
25 |
26 | // of singletone instance
27 | var poolNamespace = cluster.of('*', 'RR');
28 | var poolNamespace2 = cluster.of('*');
29 | assert.strictEqual(poolNamespace, poolNamespace2);
30 |
31 | // empty pattern
32 | var emptyPoolNamespace = cluster.of();
33 | assert.strictEqual(poolNamespace, emptyPoolNamespace);
34 |
35 | // wrong selector
36 | var wrongPoolNamespace = cluster.of('*', 'RR2');
37 | assert.strictEqual(poolNamespace, wrongPoolNamespace);
38 |
39 | server.destroy();
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-pattern.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('MASTER', poolConfig);
12 | cluster.add('SLAVE', poolConfig);
13 | cluster.add('SLAVE1', poolConfig);
14 | cluster.add('SLAVE2', poolConfig);
15 |
16 | cluster.getConnection('SLAVE4', function (err) {
17 | assert.ok(err);
18 | assert.equal(err.message, 'Pool does not exist.');
19 |
20 | cluster.end(function (err) {
21 | assert.ifError(err);
22 | server.destroy();
23 | });
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-query-connection-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 |
13 | var pool = cluster.of('SLAVE*', 'ORDER');
14 |
15 | pool.query('SELECT 1', function (err) {
16 | assert.ok(err, 'got error');
17 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
18 | server.destroy();
19 | });
20 | });
21 |
22 | server.on('connection', function (conn) {
23 | conn.deny();
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-query-pool-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var pool = cluster.of('SLAVE*', 'ORDER');
11 |
12 | pool.query('SELECT 1', function (err) {
13 | assert.ok(err, 'got error');
14 | assert.equal(err.code, 'POOL_NOEXIST');
15 | server.destroy();
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-query-restore.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster({
5 | canRetry : true,
6 | removeNodeErrorCount : 2,
7 | restoreNodeTimeout : 100
8 | });
9 | var server = common.createFakeServer();
10 |
11 | var connCount = 0;
12 | var offline = true;
13 |
14 | server.listen(0, function (err) {
15 | assert.ifError(err);
16 |
17 | var poolConfig = common.getTestConfig({port: server.port()});
18 | cluster.add('MASTER', poolConfig);
19 |
20 | var pool = cluster.of('MASTER', 'ORDER');
21 |
22 | pool.query('SELECT 1', function (err) {
23 | assert.ok(err);
24 | assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
25 | assert.equal(err.fatal, true);
26 | assert.equal(connCount, 2);
27 |
28 | pool.query('SELECT 1', function (err) {
29 | assert.ok(err);
30 | assert.equal(err.code, 'POOL_NONEONLINE');
31 |
32 | offline = false;
33 | });
34 |
35 | setTimeout(function () {
36 | pool.query('SELECT 1', function (err) {
37 | assert.ifError(err);
38 | cluster.end(function (err) {
39 | assert.ifError(err);
40 | server.destroy();
41 | });
42 | });
43 | }, 200);
44 | });
45 | });
46 |
47 | server.on('connection', function (conn) {
48 | connCount += 1;
49 |
50 | if (offline) {
51 | conn.destroy();
52 | } else {
53 | conn.handshake();
54 | }
55 | });
56 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-query.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*', 'ORDER');
15 |
16 | pool.query('SELECT 1', function (err, rows) {
17 | assert.ifError(err);
18 | assert.equal(rows.length, 1);
19 | assert.equal(rows[0]['1'], 1);
20 |
21 | cluster.end(function (err) {
22 | assert.ifError(err);
23 | server.destroy();
24 | });
25 | });
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-remove-by-name.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*', 'ORDER');
15 |
16 | pool.getConnection(function (err, connection) {
17 | assert.ifError(err);
18 | assert.strictEqual(connection._clusterId, 'SLAVE1');
19 |
20 | connection.release();
21 | cluster.remove('SLAVE1');
22 |
23 | pool.getConnection(function (err, connection) {
24 | assert.ifError(err);
25 | assert.strictEqual(connection._clusterId, 'SLAVE2');
26 |
27 | connection.release();
28 | cluster.remove('SLAVE2');
29 |
30 | pool.getConnection(function (err) {
31 | assert.ok(err);
32 | assert.equal(err.code, 'POOL_NOEXIST');
33 |
34 | cluster.remove('SLAVE1');
35 | cluster.remove('SLAVE2');
36 |
37 | cluster.end(function (err) {
38 | assert.ifError(err);
39 | server.destroy();
40 | });
41 | });
42 | });
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-remove-by-pattern.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*', 'ORDER');
15 |
16 | pool.getConnection(function (err, connection) {
17 | assert.ifError(err);
18 | assert.strictEqual(connection._clusterId, 'SLAVE1');
19 |
20 | connection.release();
21 | cluster.remove('SLAVE*');
22 |
23 | pool.getConnection(function (err) {
24 | assert.ok(err);
25 | assert.equal(err.code, 'POOL_NOEXIST');
26 |
27 | cluster.remove('SLAVE*');
28 |
29 | cluster.end(function (err) {
30 | assert.ifError(err);
31 | server.destroy();
32 | });
33 | });
34 | });
35 | });
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-remove-fatal-end.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var cluster = common.createPoolCluster();
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var poolConfig = common.getTestConfig({port: server.port()});
11 | cluster.add('SLAVE1', poolConfig);
12 | cluster.add('SLAVE2', poolConfig);
13 |
14 | var pool = cluster.of('SLAVE*', 'ORDER');
15 |
16 | pool.getConnection(function (err, connection) {
17 | assert.ifError(err);
18 | assert.strictEqual(connection._clusterId, 'SLAVE1');
19 |
20 | connection.release();
21 | server.destroy();
22 | cluster.remove('SLAVE*');
23 |
24 | cluster.end(assert.ifError);
25 | });
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool-cluster/test-restore.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var cluster = common.createPoolCluster({
4 | canRetry : true,
5 | removeNodeErrorCount : 2,
6 | restoreNodeTimeout : 100
7 | });
8 | var server = common.createFakeServer();
9 |
10 | var connCount = 0;
11 | var offline = true;
12 |
13 | server.listen(0, function (err) {
14 | assert.ifError(err);
15 |
16 | var poolConfig = common.getTestConfig({port: server.port()});
17 | cluster.add('MASTER', poolConfig);
18 |
19 | cluster.getConnection('MASTER', function (err) {
20 | assert.ok(err);
21 | assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
22 | assert.equal(err.fatal, true);
23 | assert.equal(connCount, 2);
24 |
25 | cluster.getConnection('MASTER', function (err) {
26 | assert.ok(err);
27 | assert.equal(err.code, 'POOL_NONEONLINE');
28 |
29 | offline = false;
30 | });
31 |
32 | setTimeout(function () {
33 | cluster.getConnection('MASTER', function (err, conn) {
34 | assert.ifError(err);
35 |
36 | conn.release();
37 |
38 | cluster.end(function (err) {
39 | assert.ifError(err);
40 | server.destroy();
41 | });
42 | });
43 | }, 200);
44 | });
45 | });
46 |
47 | server.on('connection', function (conn) {
48 | connCount += 1;
49 |
50 | if (offline) {
51 | conn.destroy();
52 | } else {
53 | conn.handshake();
54 | }
55 | });
56 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-acquire-after-end.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.getConnection(function (err, connection) {
12 | assert.ifError(err);
13 | assert.ok(connection);
14 |
15 | connection.release();
16 | pool.end(function (err) {
17 | assert.ifError(err);
18 | pool.getConnection(function (err, connection) {
19 | assert.ok(err);
20 | assert.equal(err.code, 'POOL_CLOSED');
21 | assert.equal(err.message, 'Pool is closed.');
22 | assert.ok(!connection);
23 | server.destroy();
24 | });
25 | });
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-acquire-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port()
12 | });
13 |
14 | var count = 0;
15 | var threadId = -1;
16 | pool.on('acquire', function (connection) {
17 | count++;
18 | threadId = connection.threadId;
19 | });
20 |
21 | pool.getConnection(function (err, connection) {
22 | assert.ifError(err);
23 | assert.ok(connection);
24 | assert.equal(count, 1);
25 | assert.equal(threadId, connection.threadId);
26 | connection.release();
27 | });
28 |
29 | pool.getConnection(function (err, connection) {
30 | assert.ifError(err);
31 | assert.ok(connection);
32 | assert.equal(count, 2);
33 | assert.equal(threadId, connection.threadId);
34 | connection.release();
35 | pool.end(function (err) {
36 | assert.ifError(err);
37 | server.destroy();
38 | });
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-acquire-timeout-existing.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var fail = false;
7 | var seq = 0;
8 | var tid = 0;
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var pool = common.createPool({
14 | acquireTimeout : 200,
15 | connectionLimit : 1,
16 | port : server.port()
17 | });
18 |
19 | pool.getConnection(function (err, conn) {
20 | assert.ifError(err);
21 | assert.equal(conn.threadId, 1);
22 | conn.release();
23 |
24 | // lag the next ping
25 | fail = true;
26 |
27 | pool.getConnection(function(err, conn){
28 | assert.ifError(err);
29 | assert.equal(++seq, 1);
30 | assert.equal(conn.threadId, 2);
31 | assert.equal(fail, false);
32 | conn.ping(function(err){
33 | assert.ifError(err);
34 | conn.release();
35 | });
36 | });
37 |
38 | pool.getConnection(function(err, conn){
39 | assert.ifError(err);
40 | assert.equal(++seq, 2);
41 | assert.equal(conn.threadId, 2);
42 | server.destroy();
43 | });
44 | });
45 | });
46 |
47 | server.on('connection', function(incomingConnection) {
48 | incomingConnection.handshake({
49 | threadId: ++tid
50 | });
51 | incomingConnection.on('ping', function() {
52 | if (!fail) {
53 | this.ok();
54 | }
55 |
56 | fail = false;
57 | });
58 | });
59 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-acquire-timeout-new.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | acquireTimeout : 100,
11 | connectionLimit : 1,
12 | port : server.port()
13 | });
14 |
15 | pool.getConnection(function (err) {
16 | assert.ok(err, 'got error');
17 | assert.equal(err.code, 'PROTOCOL_SEQUENCE_TIMEOUT');
18 | assert.equal(err.fatal, true);
19 | assert.equal(err.message, 'Handshake inactivity timeout');
20 | server.destroy();
21 | });
22 | });
23 |
24 | server.on('connection', function () {
25 | // timeout handshake
26 | });
27 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-change-user-config.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | user : 'user_1',
11 | port : server.port()
12 | });
13 |
14 | assert.strictEqual(pool.config.connectionConfig.user, 'user_1');
15 |
16 | pool.getConnection(function(err, conn) {
17 | assert.ifError(err);
18 | assert.strictEqual(conn.config.user, 'user_1');
19 |
20 | conn.changeUser({user: 'user_2'}, function(err) {
21 | assert.ifError(err);
22 | assert.strictEqual(conn.config.user, 'user_2');
23 | assert.strictEqual(pool.config.connectionConfig.user, 'user_1');
24 |
25 | conn.destroy();
26 | server.destroy();
27 | });
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-bad.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var fail = false;
7 | var seq = 0;
8 | var tid = 0;
9 |
10 | server.listen(0, function (err){
11 | assert.ifError(err);
12 |
13 | var pool = common.createPool({
14 | connectionLimit : 1,
15 | port : server.port()
16 | });
17 |
18 | pool.getConnection(function(err, conn){
19 | assert.ifError(err);
20 | assert.equal(conn.threadId, 1);
21 | conn.release();
22 |
23 | // fail the next ping
24 | fail = true;
25 |
26 | pool.getConnection(function(err, conn){
27 | assert.ifError(err);
28 | assert.equal(++seq, 1);
29 | assert.equal(conn.threadId, 2);
30 | assert.equal(fail, false);
31 | conn.ping(function(err){
32 | assert.ifError(err);
33 | conn.release();
34 | });
35 | });
36 |
37 | pool.getConnection(function(err, conn){
38 | assert.ifError(err);
39 | assert.equal(++seq, 2);
40 | assert.equal(conn.threadId, 2);
41 | server.destroy();
42 | });
43 | });
44 | });
45 |
46 | server.on('connection', function(incomingConnection) {
47 | incomingConnection.handshake({
48 | threadId: ++tid
49 | });
50 | incomingConnection.on('ping', function() {
51 | if (fail) {
52 | setTimeout(this.destroy.bind(this), 100);
53 | } else {
54 | this.ok();
55 | }
56 |
57 | fail = false;
58 | });
59 | });
60 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-destroy.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.getConnection(function (err, connection) {
12 | assert.ifError(err);
13 | assert.notEqual(connection.state, 'disconnected');
14 |
15 | connection.on('enqueue', function () {
16 | throw new Error('Unexpected sequence enqueued after connection destroy');
17 | });
18 |
19 | connection.destroy();
20 | assert.equal(connection.state, 'disconnected');
21 |
22 | pool.end(function (err) {
23 | assert.ifError(err);
24 | server.destroy();
25 | });
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-event.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var pool = common.createPool({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | pool.end(function (err) {
14 | assert.ifError(err);
15 | server.destroy();
16 | });
17 | });
18 |
19 | pool.on('connection', function (connection) {
20 | assert.ok(connection);
21 | done();
22 | });
23 |
24 | pool.getConnection(function (err, connection) {
25 | assert.ifError(err);
26 | assert.ok(connection);
27 | connection.release();
28 | done();
29 | });
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-fatal-end.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var pool = common.createPool({
4 | connectionLimit : 1,
5 | port : common.bogusPort
6 | });
7 |
8 | pool.getConnection(function (err) {
9 | assert.ok(err);
10 | assert.ok(err.fatal);
11 | assert.equal(err.code, 'ECONNREFUSED');
12 |
13 | pool.end(function (err) {
14 | assert.ifError(err);
15 | });
16 | });
17 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-limit-no-wait.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port(),
12 | waitForConnections : false
13 | });
14 |
15 | pool.getConnection(function (err, connection) {
16 | assert.ifError(err);
17 | assert.ok(connection);
18 |
19 | pool.getConnection(function (err) {
20 | assert.ok(err);
21 | assert.equal(err.message, 'No connections available.');
22 | assert.equal(err.code, 'POOL_CONNLIMIT');
23 |
24 | connection.destroy();
25 | server.destroy();
26 | });
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-limit.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var index = 0;
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var pool = common.createPool({
11 | connectionLimit : 1,
12 | port : server.port()
13 | });
14 |
15 | pool.getConnection(function (err, connection) {
16 | assert.ifError(err);
17 | assert.ok(connection);
18 | assert.equal(++index, 1);
19 |
20 | pool.getConnection(function (err) {
21 | assert.ifError(err);
22 | assert.equal(++index, 3);
23 |
24 | connection.destroy();
25 | server.destroy();
26 | });
27 |
28 | process.nextTick(function () {
29 | assert.equal(++index, 2);
30 | connection.release();
31 | });
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-no-domain.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 | var domain = null;
5 |
6 | try {
7 | domain = require('domain');
8 | } catch (e) {
9 | common.skipTest('node ' + process.version + ' does not support domains');
10 | }
11 |
12 | var d0 = domain.create();
13 |
14 | var server = common.createFakeServer();
15 |
16 | var pool = null;
17 | var done = after(2, function () {
18 | pool.end(function (err) {
19 | assert.ifError(err);
20 | server.destroy();
21 | });
22 | });
23 |
24 | server.listen(0, function (err) {
25 | assert.ifError(err);
26 |
27 | var released = false;
28 | var timer = setInterval(function () {
29 | if (!released) return;
30 | clearInterval(timer);
31 |
32 | assert.ok(!domain.active, 'no current domain');
33 | pool.getConnection(function (err, conn) {
34 | assert.ifError(err);
35 | assert.ok(!domain.active, 'no current domain');
36 | assert.equal(conn.domain, null, 'connection is not bound to domain');
37 | conn.release();
38 | done();
39 | });
40 | }, 200);
41 |
42 | pool = common.createPool({port: server.port(), connectionLimit: 1});
43 | assert.equal(pool.domain, null, 'pool is not bound to domain');
44 |
45 | d0.run(function () {
46 | pool.getConnection(function (err, conn) {
47 | assert.ifError(err);
48 | assert.equal(domain.active, d0, 'current domain is d0');
49 | assert.equal(conn.domain, null, 'connection is not bound to domain');
50 | conn.release();
51 | released = true;
52 | done();
53 | });
54 | });
55 | });
56 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-release-after-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | process.on('uncaughtException', function (err) {
7 | if (err.code !== 'ER_PARSE_ERROR') throw err;
8 | });
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var pool = common.createPool({port: server.port()});
14 |
15 | pool.getConnection(function (err, conn) {
16 | assert.ifError(err);
17 |
18 | var query = conn.query('SELECT INVALID');
19 |
20 | query.on('end', function () {
21 | conn.release();
22 | pool.end(function (err) {
23 | assert.ifError(err);
24 | server.destroy();
25 | });
26 | });
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-connection-reset.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | var seq = 0;
7 | var serverConn = null;
8 | var tid = 0;
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var pool = common.createPool({
14 | connectionLimit : 1,
15 | port : server.port()
16 | });
17 |
18 | pool.getConnection(function(err, conn){
19 | assert.ifError(err);
20 | assert.equal(conn.threadId, 1);
21 | conn.release();
22 |
23 | // server destroys connection in pool
24 | // read ECONNRESET
25 | serverConn.destroy();
26 |
27 | pool.getConnection(function(err, conn){
28 | assert.ifError(err);
29 | assert.equal(++seq, 1);
30 | assert.equal(conn.threadId, 2);
31 | conn.ping(function(err){
32 | assert.ifError(err);
33 | conn.release();
34 | });
35 | });
36 |
37 | pool.getConnection(function(err, conn){
38 | assert.ifError(err);
39 | assert.equal(++seq, 2);
40 | assert.equal(conn.threadId, 2);
41 | server.destroy();
42 | });
43 | });
44 | });
45 |
46 | server.on('connection', function(incomingConnection) {
47 | serverConn = incomingConnection;
48 | incomingConnection.handshake({
49 | threadId: ++tid
50 | });
51 | });
52 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-destroy-connection.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.getConnection(function (err, connection) {
12 | assert.ifError(err);
13 |
14 | assert.strictEqual(connection, pool._allConnections[0]);
15 | connection.destroy();
16 |
17 | assert.strictEqual(pool._allConnections.length, 0);
18 | assert.ok(!connection._pool);
19 |
20 | assert.doesNotThrow(function () { connection.release(); });
21 |
22 | server.destroy();
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-double-release.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port()
12 | });
13 |
14 | pool.getConnection(function(err, conn){
15 | assert.ifError(err);
16 | conn.release();
17 |
18 | try {
19 | conn.release();
20 | } catch (e) {
21 | err = e;
22 | }
23 |
24 | assert.ok(err);
25 | server.destroy();
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-end-empty.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.end(function (err) {
12 | assert.ifError(err);
13 | server.destroy();
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-end-ping.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port(),
12 | queueLimit : 5,
13 | waitForConnections : true
14 | });
15 |
16 | pool.getConnection(function (err, conn) {
17 | assert.ifError(err);
18 | conn.release();
19 |
20 | pool.getConnection(function (err) {
21 | assert.ok(err);
22 | assert.equal(err.message, 'Pool is closed.');
23 | assert.equal(err.code, 'POOL_CLOSED');
24 | });
25 |
26 | pool.end(function (err) {
27 | assert.ifError(err);
28 | server.destroy();
29 | });
30 | });
31 | });
32 |
33 | server.on('connection', function (conn) {
34 | conn.handshake();
35 | conn.on('ping', function () {
36 | setTimeout(function () {
37 | conn.ok();
38 | }, 100);
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-end-queued.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 |
4 | var conn1Err = null;
5 | var conn2Err = null;
6 | var poolEnded = false;
7 | var server = common.createFakeServer();
8 |
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var pool = common.createPool({
13 | connectionLimit : 1,
14 | port : server.port(),
15 | queueLimit : 5,
16 | waitForConnections : true
17 | });
18 |
19 | pool.getConnection(function(err, conn){
20 | if (err) throw err;
21 |
22 | pool.end(function(err) {
23 | poolEnded = true;
24 | server.destroy();
25 | if (err) throw err;
26 | });
27 |
28 | conn.release();
29 | });
30 |
31 | pool.getConnection(function (err) {
32 | conn1Err = err;
33 | });
34 |
35 | pool.getConnection(function (err) {
36 | conn2Err = err;
37 | });
38 | });
39 |
40 | process.on('exit', function() {
41 | assert.ok(poolEnded);
42 | assert.ok(conn1Err);
43 | assert.ok(conn2Err);
44 | assert.equal(conn1Err.message, 'Pool is closed.');
45 | assert.equal(conn2Err.code, 'POOL_CLOSED');
46 | assert.equal(conn1Err.message, 'Pool is closed.');
47 | assert.equal(conn2Err.code, 'POOL_CLOSED');
48 | });
49 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-enqueue-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var index = 0;
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var count = 0;
11 | var pool = common.createPool({
12 | connectionLimit : 1,
13 | port : server.port()
14 | });
15 |
16 | pool.on('enqueue', function () {
17 | count++;
18 | });
19 |
20 | pool.getConnection(function (err, connection) {
21 | assert.ifError(err);
22 | assert.ok(connection);
23 | assert.equal(++index, 1);
24 | assert.equal(count, 0);
25 |
26 | pool.getConnection(function (err) {
27 | assert.ifError(err);
28 | assert.equal(++index, 2);
29 | assert.equal(count, 2);
30 |
31 | connection.release();
32 | });
33 |
34 | pool.getConnection(function (err) {
35 | assert.ifError(err);
36 | assert.equal(++index, 3);
37 | assert.equal(count, 2);
38 |
39 | connection.destroy();
40 | server.destroy();
41 | });
42 |
43 | process.nextTick(function () {
44 | assert.equal(count, 2);
45 | connection.release();
46 | });
47 | });
48 | });
49 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-escape-id.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | assert.equal(pool.escapeId('id'), '`id`');
12 |
13 | pool.end(function (err) {
14 | assert.ifError(err);
15 | server.destroy();
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-escape.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 | var pool2 = common.createPool({port: server.port(), stringifyObjects: true});
11 |
12 | assert.equal(pool.escape('Super'), "'Super'");
13 | assert.equal(pool.escape({ a: 123 }), '`a` = 123');
14 |
15 | assert.equal(pool2.escape('Super'), "'Super'");
16 | assert.equal(pool2.escape({ a: 123 }), "'[object Object]'");
17 |
18 | pool.end(function (err) {
19 | assert.ifError(err);
20 | pool2.end(function (err) {
21 | assert.ifError(err);
22 | server.destroy();
23 | });
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-get-connection.js:
--------------------------------------------------------------------------------
1 | var common = require('../../common');
2 | var assert = require('assert');
3 | var Connection = common.Connection;
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var pool = common.createPool({port: server.port()});
11 |
12 | pool.getConnection(function (err, connection) {
13 | assert.ifError(err);
14 | assert.ok(connection instanceof Connection);
15 |
16 | connection.destroy();
17 | server.destroy();
18 | });
19 | });
20 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-long-stack-traces.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({connectionLimit: 1, port: server.port(0)});
10 |
11 | pool.getConnection(function (err, conn) {
12 | assert.ifError(err);
13 |
14 | pool.query('invalid sql', function (err) {
15 | assert.ok(err, 'got error');
16 | assert.ok(err.stack.indexOf(__filename) > 0);
17 |
18 | pool.end(function (err) {
19 | assert.ifError(err);
20 | server.destroy();
21 | });
22 | });
23 |
24 | process.nextTick(function() {
25 | conn.release();
26 | });
27 | });
28 | });
29 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-pool-connection.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var Connection = common.Connection;
4 | var EventEmitter = require('events').EventEmitter;
5 | var PoolConnection = common.PoolConnection;
6 |
7 | var server = common.createFakeServer();
8 |
9 | server.listen(0, function (err) {
10 | assert.ifError(err);
11 |
12 | var pool = common.createPool({port: server.port()});
13 |
14 | pool.getConnection(function (err, connection) {
15 | assert.ifError(err);
16 |
17 | assert(connection instanceof PoolConnection);
18 | assert(connection instanceof Connection);
19 | assert(connection instanceof EventEmitter);
20 |
21 | connection.destroy();
22 | server.destroy();
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-protocol-stray-packet.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var connCount = 0;
5 | var connection = null;
6 | var server = common.createFakeServer();
7 |
8 | server.listen(0, function (err) {
9 | assert.ifError(err);
10 |
11 | var pool = common.createPool({port: server.port()});
12 |
13 | pool.on('error', function (err) {
14 | assert.equal(err.code, 'PROTOCOL_STRAY_PACKET');
15 | assert.equal(err.fatal, true);
16 | connection.destroy();
17 | server.destroy();
18 | });
19 |
20 | pool.query('SELECT 1', function (err) {
21 | assert.ifError(err);
22 |
23 | pool.getConnection(function (err, conn) {
24 | assert.ifError(err);
25 | assert.equal(connCount, 2);
26 |
27 | connection = conn;
28 |
29 | pool.end(function (err) {
30 | assert.ifError(err);
31 | server.destroy();
32 | });
33 | });
34 | });
35 | });
36 |
37 | server.on('connection', function (conn) {
38 | connCount++;
39 | conn.handshake();
40 | conn.on('query', function(packet) {
41 | var resetPacketNumber = this._parser.resetPacketNumber;
42 |
43 | // Prevent packet number from being reset
44 | this._parser.resetPacketNumber = function () {};
45 | this._handleQueryPacket(packet);
46 |
47 | this._parser.resetPacketNumber = resetPacketNumber;
48 | this._sendPacket(new common.Packets.ResultSetHeaderPacket({
49 | fieldCount: 1
50 | }));
51 | this._parser.resetPacketNumber();
52 | });
53 | });
54 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query-connection-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.query('SELECT 1', function (err) {
12 | assert.ok(err, 'got error');
13 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
14 | assert.equal(err.fatal, true);
15 | server.destroy();
16 | });
17 | });
18 |
19 | server.on('connection', function (conn) {
20 | conn.deny();
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query-end-after-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | process.on('uncaughtException', function (err) {
7 | if (err.code !== 'ER_PARSE_ERROR') throw err;
8 | });
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var pool = common.createPool({port: server.port()});
14 |
15 | var query = pool.query('SELECT INVALID');
16 |
17 | query.on('end', function () {
18 | pool.end(function (err) {
19 | assert.ifError(err);
20 | server.destroy();
21 | });
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port(),
12 | waitForConnections : false
13 | });
14 |
15 | pool.getConnection(function (err, conn) {
16 | assert.ifError(err);
17 |
18 | conn.query('SELECT INVALID');
19 | conn.on('error', function () {
20 | pool.getConnection(function (err) {
21 | assert.ok(err);
22 | assert.equal(err.message, 'No connections available.');
23 |
24 | conn.release();
25 | pool.end(function (err) {
26 | assert.ifError(err);
27 | server.destroy();
28 | });
29 | });
30 | });
31 | });
32 | });
33 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query-stream-connection-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | var query = pool.query('SELECT 1');
12 |
13 | query.on('error', function (err) {
14 | assert.ok(err, 'got error');
15 | assert.equal(err.code, 'ER_ACCESS_DENIED_ERROR');
16 | assert.equal(err.fatal, true);
17 | server.destroy();
18 | });
19 | });
20 |
21 | server.on('connection', function (conn) {
22 | conn.deny();
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query-streaming-rows.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var pool = common.createPool({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | pool.end(function (err) {
14 | assert.ifError(err);
15 | server.destroy();
16 | });
17 | });
18 |
19 | pool.getConnection(function (err, connection) {
20 | assert.ifError(err);
21 |
22 | var count = 0;
23 | var paused = false;
24 | var query = connection.query('SELECT * FROM stream LIMIT 5');
25 |
26 | query.on('fields', function (fields) {
27 | assert.ok(fields, 'got fields');
28 | done();
29 | });
30 |
31 | query.on('result', function (row) {
32 | count++;
33 |
34 | assert.equal(paused, false);
35 | assert.equal(row.id, count);
36 |
37 | paused = true;
38 | connection.pause();
39 |
40 | setTimeout(function () {
41 | paused = false;
42 | connection.resume();
43 | }, 50);
44 | });
45 |
46 | query.on('end', function () {
47 | connection.release();
48 | done();
49 | });
50 | });
51 | });
52 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-query.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({port: server.port()});
10 |
11 | pool.query('SELECT 1', function (err, rows) {
12 | assert.ifError(err);
13 | assert.equal(rows.length, 1);
14 | assert.equal(rows[0]['1'], 1);
15 |
16 | // Should work without error
17 | pool.query('SELECT SQL_ERROR');
18 |
19 | pool.end(function(err) {
20 | assert.ifError(err);
21 | server.destroy();
22 | });
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-queue-limit.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var index = 0;
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var error = null;
11 | var pool = common.createPool({
12 | connectionLimit : 1,
13 | port : server.port(),
14 | queueLimit : 1,
15 | waitForConnections : true
16 | });
17 |
18 | pool.getConnection(function (err, connection) {
19 | assert.ifError(err);
20 | assert.equal(++index, 1);
21 | connection.release();
22 | });
23 |
24 | pool.getConnection(function (err, connection) {
25 | assert.ifError(err);
26 | assert.equal(++index, 2);
27 | connection.release();
28 |
29 | pool.end(function (err) {
30 | assert.ifError(err);
31 | assert.ok(error);
32 | assert.equal(error.message, 'Queue limit reached.');
33 | assert.equal(error.code, 'POOL_ENQUEUELIMIT');
34 | server.destroy();
35 | });
36 | });
37 |
38 | pool.getConnection(function (err) {
39 | error = err;
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/pool/test-release-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var pool = common.createPool({
10 | connectionLimit : 1,
11 | port : server.port()
12 | });
13 |
14 | var count = 0;
15 | var threadId = -1;
16 | pool.on('release', function (connection) {
17 | count++;
18 | threadId = connection.threadId;
19 | });
20 |
21 | pool.getConnection(function (err, connection) {
22 | assert.ifError(err);
23 | assert.ok(connection);
24 | assert.equal(count, 0);
25 | connection.release();
26 | assert.equal(count, 1);
27 | assert.equal(threadId, connection.threadId);
28 | });
29 |
30 | pool.getConnection(function (err, connection) {
31 | assert.ifError(err);
32 | assert.ok(connection);
33 | assert.equal(count, 1);
34 | connection.release();
35 | assert.equal(count, 2);
36 | assert.equal(threadId, connection.threadId);
37 | pool.end(function (err) {
38 | assert.ifError(err);
39 | server.destroy();
40 | });
41 | });
42 | });
43 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-args-query-bad-callback.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | assert.throws(function () {
12 | connection.query('SELECT ?', [1], 'oops');
13 | }, /TypeError: argument callback must be a function when provided/);
14 |
15 | assert.throws(function () {
16 | connection.query({ sql: 'SELECT ?' }, [1], 'oops');
17 | }, /TypeError: argument callback must be a function when provided/);
18 |
19 | connection.destroy();
20 | server.destroy();
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-args-query-like-object-values.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 | var sqlQuery = Object.create(null, {
6 | sql: {
7 | enumerable : false,
8 | value : 'SELECT ?',
9 | writable : false
10 | },
11 | values: {
12 | enumerable : false,
13 | value : [42],
14 | writable : false
15 | }
16 | });
17 |
18 | server.listen(0, function (err) {
19 | assert.ifError(err);
20 |
21 | var connection = common.createConnection({port: server.port()});
22 |
23 | connection.query(sqlQuery, [99], function (err, rows) {
24 | assert.ifError(err);
25 | assert.strictEqual(rows.length, 1);
26 | assert.strictEqual(rows[0]['99'], 99);
27 | connection.destroy();
28 | server.destroy();
29 | });
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-args-query-like-object.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 | var sqlQuery = Object.create(null, {
6 | sql: {
7 | enumerable : false,
8 | value : 'SELECT ?',
9 | writable : false
10 | },
11 | values: {
12 | enumerable : false,
13 | value : [42],
14 | writable : false
15 | }
16 | });
17 |
18 | server.listen(0, function (err) {
19 | assert.ifError(err);
20 |
21 | var connection = common.createConnection({port: server.port()});
22 |
23 | connection.query(sqlQuery, function (err, rows) {
24 | assert.ifError(err);
25 | assert.strictEqual(rows.length, 1);
26 | assert.strictEqual(rows[0]['42'], 42);
27 | connection.destroy();
28 | server.destroy();
29 | });
30 | });
31 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-error-event-fatal.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 | var connection = common.createConnection({port: common.bogusPort});
4 |
5 | var query = connection.query('SELECT 1');
6 |
7 | query.on('error', function (err) {
8 | assert.ok(err, 'got error');
9 | assert.equal(err.code, 'ECONNREFUSED');
10 | assert.equal(err.fatal, true);
11 | });
12 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-error-event.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | var query = connection.query('INVALID SQL');
12 |
13 | query.on('error', function (err) {
14 | assert.ok(err, 'got error');
15 | assert.equal(err.code, 'ER_PARSE_ERROR');
16 | assert.equal(err.sql, 'INVALID SQL');
17 | assert.ok(!err.fatal);
18 | connection.destroy();
19 | server.destroy();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-query-end-after-error.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | process.on('uncaughtException', function (err) {
7 | if (err.code !== 'ER_PARSE_ERROR') throw err;
8 | });
9 |
10 | server.listen(0, function (err) {
11 | assert.ifError(err);
12 |
13 | var connection = common.createConnection({port: server.port()});
14 |
15 | var query = connection.query('SELECT INVALID');
16 |
17 | query.on('end', function () {
18 | connection.end(function (err) {
19 | assert.ifError(err);
20 | server.destroy();
21 | });
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-query-events.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | var rows = [];
12 | var fields = [];
13 |
14 | var query = connection.query('SELECT 1');
15 |
16 | query.on('error', assert.ifError);
17 | query.on('fields', function (_fields) {
18 | fields = _fields;
19 | });
20 | query.on('result', function (_rows) {
21 | rows.push(_rows);
22 | });
23 |
24 | connection.end(function (err) {
25 | assert.ifError(err);
26 | assert.deepEqual(rows, [{1: 1}]);
27 | assert.equal(fields.length, 1);
28 | assert.equal(fields[0].name, '1');
29 | server.destroy();
30 | });
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-result-rows-enumerate.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | connection.query('SELECT CURRENT_USER()', function (err, rows) {
12 | assert.ifError(err);
13 | assert.equal(rows.length, 1);
14 |
15 | var row = rows[0];
16 | var keys = Object.keys(row).sort();
17 |
18 | assert.equal(keys.length, 1);
19 | assert.deepEqual(keys, ['CURRENT_USER()']);
20 |
21 | var forin = [];
22 | for (var column in row) {
23 | forin.push(column);
24 | }
25 |
26 | assert.deepEqual(forin, keys);
27 |
28 | connection.destroy();
29 | server.destroy();
30 | });
31 | });
32 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-stream-before-queue.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var query = common.createQuery('SELECT 1');
5 | var stream = query.stream();
6 |
7 | assert.doesNotThrow(function () {
8 | // put the stream into flowing mode
9 | stream.on('data', function () { });
10 | });
11 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-stream-emits-close-after-end.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(3, function () {
13 | server.destroy();
14 | });
15 |
16 | var closed = false;
17 | var ended = false;
18 | var query = connection.query('SELECT * FROM stream LIMIT 2');
19 | var stream = query.stream();
20 |
21 | stream.once('close', function () {
22 | assert.ok(ended);
23 | closed = true;
24 | done();
25 | });
26 |
27 | stream.once('end', function () {
28 | assert.ok(!closed);
29 | ended = true;
30 | done();
31 | });
32 |
33 | stream.on('data', function noop() {});
34 |
35 | connection.end(function (err) {
36 | assert.ifError(err);
37 | done();
38 | });
39 | });
40 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-stream-emits-close.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | server.destroy();
14 | });
15 |
16 | var query = connection.query('SELECT * FROM stream LIMIT 2');
17 | var stream = query.stream();
18 |
19 | stream.once('close', done);
20 |
21 | stream.on('data', function noop() {});
22 |
23 | connection.end(function (err) {
24 | assert.ifError(err);
25 | done();
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-streaming-destroy.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | var count = 0;
12 | var query = connection.query('SELECT * FROM stream LIMIT 10');
13 |
14 | query.on('result', function () {
15 | count++;
16 | assert.equal(count, 1);
17 | connection.destroy();
18 |
19 | process.nextTick(function () {
20 | server.destroy();
21 | });
22 | });
23 | });
24 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-streaming-quick-pause-resume.js:
--------------------------------------------------------------------------------
1 | var assert = require('assert');
2 | var common = require('../../common');
3 |
4 | var server = common.createFakeServer();
5 |
6 | server.listen(0, function (err) {
7 | assert.ifError(err);
8 |
9 | var connection = common.createConnection({port: server.port()});
10 |
11 | var count = 0;
12 | var query = connection.query('SELECT * FROM stream LIMIT 10');
13 |
14 | query.on('result', function (row) {
15 | count++;
16 | connection.pause();
17 | connection.resume();
18 | assert.equal(row.id, count);
19 | assert.equal(row.title, 'Row #' + count);
20 | });
21 |
22 | query.on('end', function () {
23 | assert.equal(count, 10);
24 | connection.end(function (err) {
25 | assert.ifError(err);
26 | server.destroy();
27 | });
28 | });
29 | });
30 |
--------------------------------------------------------------------------------
/cloudflare-mysql/test/unit/query/test-streaming-rows.js:
--------------------------------------------------------------------------------
1 | var after = require('after');
2 | var assert = require('assert');
3 | var common = require('../../common');
4 |
5 | var server = common.createFakeServer();
6 |
7 | server.listen(0, function (err) {
8 | assert.ifError(err);
9 |
10 | var connection = common.createConnection({port: server.port()});
11 |
12 | var done = after(2, function () {
13 | server.destroy();
14 | });
15 |
16 | var count = 0;
17 | var paused = false;
18 | var query = connection.query('SELECT * FROM stream LIMIT 5');
19 |
20 | query.on('fields', function (fields) {
21 | assert.ok(fields, 'got fields');
22 | done();
23 | });
24 |
25 | query.on('result', function (row) {
26 | count++;
27 |
28 | assert.equal(paused, false);
29 | assert.equal(row.id, count);
30 |
31 | paused = true;
32 | connection.pause();
33 |
34 | setTimeout(function () {
35 | paused = false;
36 | connection.resume();
37 | }, 50);
38 | });
39 |
40 | query.on('end', function () {
41 | connection.destroy();
42 | done();
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/cloudflare-mysql/tool/free-port.js:
--------------------------------------------------------------------------------
1 | var Net = require('net');
2 |
3 | var PORT_END = 60000;
4 | var PORT_START = 1000;
5 | var TCP_TIMEOUT = 1000;
6 |
7 | process.nextTick(run);
8 |
9 | function check(port, callback) {
10 | var socket = Net.createConnection(port, 'localhost');
11 | var timer = setTimeout(function () {
12 | socket.destroy();
13 | callback(undefined);
14 | }, TCP_TIMEOUT);
15 |
16 | socket.on('connect', function () {
17 | clearTimeout(timer);
18 | socket.destroy();
19 | callback(true);
20 | });
21 |
22 | socket.on('error', function (err) {
23 | clearTimeout(timer);
24 | if (err.syscall === 'connect' && err.code === 'ECONNREFUSED') {
25 | callback(false);
26 | } else {
27 | callback(undefined);
28 | }
29 | });
30 | }
31 |
32 | function run() {
33 | function next() {
34 | var port = PORT_START + Math.floor(Math.random() * (PORT_END - PORT_START + 1));
35 |
36 | check(port, function (used) {
37 | if (used === false) {
38 | console.log('%d', port);
39 | process.exit(0);
40 | } else {
41 | setTimeout(next, 0);
42 | }
43 | });
44 | }
45 |
46 | next();
47 | }
48 |
--------------------------------------------------------------------------------
/cloudflare-mysql/tool/mysql-version.js:
--------------------------------------------------------------------------------
1 | var common = require('../test/common');
2 |
3 | process.nextTick(run);
4 |
5 | function run() {
6 | var conn = common.createConnection();
7 |
8 | conn.connect(function () {
9 | conn.destroy();
10 |
11 | try {
12 | console.log(conn._protocol._handshakeInitializationPacket.serverVersion);
13 | process.exit(0);
14 | } catch (e) {
15 | console.error('unable to get mysql version');
16 | process.exit(1);
17 | }
18 | });
19 | }
20 |
--------------------------------------------------------------------------------
/cloudflare-mysql/tool/version-changes.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | var fs = require('fs');
3 | var path = require('path');
4 |
5 | var changesFilePath = path.join(__dirname, '..', 'Changes.md');
6 | var changesFileContents = fs.readFileSync(changesFilePath, 'utf-8');
7 | var changesHeadRegexp = /^## HEAD$/m;
8 | var date = getLocaleDate();
9 | var version = process.env.npm_package_version;
10 |
11 | if (!changesHeadRegexp.test(changesFileContents)) {
12 | console.error('Changes.md missing version marker.');
13 | process.exit(1);
14 | }
15 |
16 | fs.writeFileSync(changesFilePath,
17 | changesFileContents.replace(changesHeadRegexp, '## v' + version + ' (' + date + ')'));
18 |
19 | function getLocaleDate() {
20 | var now = new Date();
21 |
22 | return zeroPad(now.getFullYear(), 4) + '-' +
23 | zeroPad(now.getMonth() + 1, 2) + '-' +
24 | zeroPad(now.getDate(), 2);
25 | }
26 |
27 | function zeroPad(number, length) {
28 | number = number.toString();
29 |
30 | while (number.length < length) {
31 | number = '0' + number;
32 | }
33 |
34 | return number;
35 | }
36 |
--------------------------------------------------------------------------------
/cloudflare-mysql/tool/wait-mysql.js:
--------------------------------------------------------------------------------
1 | var Net = require('net');
2 |
3 | var CHECK_INTERVAL_MS = 200;
4 | var CHECK_TIMEOUT = 120000;
5 | var TCP_TIMEOUT = 1000;
6 |
7 | process.nextTick(run);
8 |
9 | function check(host, port, callback) {
10 | var socket = Net.createConnection(port, host);
11 | var timer = setTimeout(function () {
12 | socket.destroy();
13 | callback(false);
14 | }, TCP_TIMEOUT);
15 |
16 | socket.once('data', function () {
17 | clearTimeout(timer);
18 | socket.destroy();
19 | callback(true);
20 | });
21 |
22 | socket.on('error', function () {
23 | clearTimeout(timer);
24 | callback(false);
25 | });
26 | }
27 |
28 | function run() {
29 | var host = process.argv[3] || 'localhost';
30 | var port = Number(process.argv[2]);
31 |
32 | function next() {
33 | check(host, port, function (connected) {
34 | if (connected) {
35 | console.log('connected to %s:%d', host, port);
36 | process.exit(0);
37 | } else {
38 | setTimeout(next, CHECK_INTERVAL_MS);
39 | }
40 | });
41 | }
42 |
43 | setTimeout(function () {
44 | console.error('timeout waiting for %s:%d', host, port);
45 | process.exit(1);
46 | }, CHECK_TIMEOUT);
47 |
48 | next();
49 | }
50 |
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/dist/interfaces/CloudflareSocket.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | export default interface CloudflareSocket {
3 | get readable(): ReadableStream;
4 | get writable(): WritableStream;
5 | get closed(): Promise;
6 | close(): Promise;
7 | startTls(options?: TlsOptions): Socket;
8 | }
9 | //# sourceMappingURL=CloudflareSocket.d.ts.map
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/dist/interfaces/CloudflareSocket.d.ts.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"CloudflareSocket.d.ts","sourceRoot":"","sources":["../../src/interfaces/CloudflareSocket.ts"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,WAAW,gBAAgB;IACvC,IAAI,QAAQ,IAAI,cAAc,CAAC;IAC/B,IAAI,QAAQ,IAAI,cAAc,CAAC;IAC/B,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CACxC"}
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/dist/interfaces/CloudflareSocket.js:
--------------------------------------------------------------------------------
1 | ;
2 | export {};
3 | //# sourceMappingURL=CloudflareSocket.js.map
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/dist/interfaces/CloudflareSocket.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"CloudflareSocket.js","sourceRoot":"","sources":["../../src/interfaces/CloudflareSocket.ts"],"names":[],"mappings":"AAMC,CAAC"}
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cloudflare-net-polyfill",
3 | "version": "0.9.0",
4 | "main": "dist/index.js",
5 | "scripts": {
6 | "build": "npx tsc"
7 | },
8 | "devDependencies": {
9 | "@cloudflare/workers-types": "^4.20230821.0",
10 | "typescript": "^5.0.4"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/nora-soderlund/cloudflare-mysql.git"
15 | },
16 | "dependencies": {
17 | "cloudflare-stream-polyfill": "^0.9.0"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/cloudflare-net-polyfill/src/interfaces/CloudflareSocket.ts:
--------------------------------------------------------------------------------
1 | export default interface CloudflareSocket {
2 | get readable(): ReadableStream;
3 | get writable(): WritableStream;
4 | get closed(): Promise;
5 | close(): Promise;
6 | startTls(options?: TlsOptions): Socket;
7 | };
8 |
--------------------------------------------------------------------------------
/cloudflare-stream-polyfill/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cloudflare-stream-polyfill",
3 | "version": "0.9.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "cloudflare-stream-polyfill",
9 | "version": "0.9.0",
10 | "devDependencies": {
11 | "@cloudflare/workers-types": "^4.20230821.0",
12 | "typescript": "^5.0.4"
13 | }
14 | },
15 | "node_modules/@cloudflare/workers-types": {
16 | "version": "4.20230821.0",
17 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230821.0.tgz",
18 | "integrity": "sha512-lVQSyr5E4CEkQw7WIdsrMTj+kHjsm28mJ0B5AhNFByKR+16KTFsU/RW/nGLKHHW2jxT5lvYI+HjNQMzC9QR8Ng==",
19 | "dev": true
20 | },
21 | "node_modules/typescript": {
22 | "version": "5.2.2",
23 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
24 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
25 | "dev": true,
26 | "bin": {
27 | "tsc": "bin/tsc",
28 | "tsserver": "bin/tsserver"
29 | },
30 | "engines": {
31 | "node": ">=14.17"
32 | }
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/cloudflare-stream-polyfill/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cloudflare-stream-polyfill",
3 | "version": "0.9.0",
4 | "main": "dist/index.js",
5 | "scripts": {
6 | "build": "npx tsc"
7 | },
8 | "devDependencies": {
9 | "@cloudflare/workers-types": "^4.20230821.0",
10 | "typescript": "^5.0.4"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/nora-soderlund/cloudflare-mysql.git"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/example/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = tab
6 | tab_width = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.yml]
13 | indent_style = space
14 |
--------------------------------------------------------------------------------
/example/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 |
--------------------------------------------------------------------------------
/example/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 140,
3 | "singleQuote": true,
4 | "semi": true,
5 | "useTabs": true
6 | }
7 |
--------------------------------------------------------------------------------
/example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "worker",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "deploy": "wrangler deploy",
7 | "start": "wrangler dev"
8 | },
9 | "devDependencies": {
10 | "@cloudflare/workers-types": "^4.20230821.0",
11 | "typescript": "^5.0.4",
12 | "wrangler": "^3.0.0"
13 | },
14 | "dependencies": {
15 | "cloudflare-mysql": "^0.9.4"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/example/src/worker.ts:
--------------------------------------------------------------------------------
1 | import { createConnection } from "cloudflare-mysql";
2 |
3 | export interface Env {
4 | MYSQL_HOST: string;
5 | MYSQL_USER_NAME: string;
6 | MYSQL_USER_PASSWORD?: string;
7 | MYSQL_DATABASE?: string;
8 | };
9 |
10 | export default {
11 | async fetch(request: Request, env: Env, context: ExecutionContext): Promise {
12 | const result = await new Promise((resolve) => {
13 | const connection = createConnection({
14 | host: env.MYSQL_HOST,
15 | user: env.MYSQL_USER_NAME,
16 | password: env.MYSQL_USER_PASSWORD,
17 | database: env.MYSQL_DATABASE
18 | });
19 |
20 | connection.on("error", (error) => console.error(error));
21 |
22 | connection.connect((error) => {
23 | if(error)
24 | throw new Error(error.message);
25 |
26 | connection.query("SELECT id, title FROM articles WHERE title LIKE ?", [ "%Google%" ], (error, rows, fields) => {
27 | if(error)
28 | throw new Error(error.message);
29 |
30 | const articles = { fields, rows };
31 |
32 | connection.query(`SELECT * FROM article_tags WHERE article IN (${rows.map((row: any) => connection.escape(row.id)).join(', ')})`, (error, rows, fields) => {
33 | if(error)
34 | throw new Error(error.message);
35 |
36 | connection.end();
37 |
38 | resolve({ articles, articleTags: { fields, rows } });
39 | });
40 | });
41 | });
42 | });
43 |
44 | return new Response(JSON.stringify(result, undefined, 4));
45 | }
46 | };
47 |
--------------------------------------------------------------------------------
/example/wrangler.toml:
--------------------------------------------------------------------------------
1 | name = "mysql"
2 | main = "src/worker.ts"
3 | compatibility_date = "2023-08-21"
4 | node_compat = true
5 |
6 | [vars]
7 | MYSQL_DATABASE = "developer_blog"
8 | MYSQL_USER_NAME = "newuser"
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cloudflare-mysql",
3 | "version": "0.9.4",
4 | "description": "A Cloudflare Workers compatible MySQL package based on the MySQL Node package.",
5 | "main": "cloudflare-mysql/index.js",
6 | "directories": {
7 | "example": "example"
8 | },
9 | "scripts": {
10 | "test": "echo \"Error: no test specified\" && exit 1"
11 | },
12 | "dependencies": {
13 | "@types/mysql": "^2.15.21",
14 | "bignumber.js": "9.0.2",
15 | "cloudflare-net-polyfill": "^0.9.0",
16 | "cloudflare-stream-polyfill": "^0.9.0",
17 | "readable-stream": "2.3.7",
18 | "safe-buffer": "5.2.1",
19 | "sqlstring": "2.3.3"
20 | },
21 | "devDependencies": {
22 | "@cloudflare/workers-types": "^4.20230821.0",
23 | "after": "0.8.2",
24 | "eslint": "7.32.0",
25 | "seedrandom": "3.0.5",
26 | "typescript": "^5.2.2",
27 | "urun": "0.0.8",
28 | "utest": "0.0.8"
29 | },
30 | "repository": {
31 | "type": "git",
32 | "url": "git+https://github.com/nora-soderlund/cloudflare-mysql.git"
33 | },
34 | "keywords": [
35 | "mysql",
36 | "cloudflare",
37 | "workers",
38 | "edge"
39 | ],
40 | "author": "Nora Söderlund",
41 | "license": "MIT",
42 | "types": "./cloudflare-mysql/index.d.ts",
43 | "bugs": {
44 | "url": "https://github.com/nora-soderlund/cloudflare-mysql/issues"
45 | },
46 | "homepage": "https://github.com/nora-soderlund/cloudflare-mysql#readme"
47 | }
48 |
--------------------------------------------------------------------------------