├── .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 | --------------------------------------------------------------------------------