Update Fix
This commit is contained in:
42
node_modules/mysql2/lib/base/connection.js
generated
vendored
42
node_modules/mysql2/lib/base/connection.js
generated
vendored
@@ -21,7 +21,7 @@ const Timers = require('timers');
|
||||
const EventEmitter = require('events').EventEmitter;
|
||||
const Readable = require('stream').Readable;
|
||||
const Queue = require('denque');
|
||||
const SqlString = require('sqlstring');
|
||||
const SqlString = require('sql-escaper');
|
||||
const { createLRU } = require('lru.min');
|
||||
const PacketParser = require('../packet_parser.js');
|
||||
const Packets = require('../packets/index.js');
|
||||
@@ -835,27 +835,31 @@ class BaseConnection extends EventEmitter {
|
||||
if (!cb) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._fatalError || this._protocolError) {
|
||||
return cb(this._fatalError || this._protocolError);
|
||||
}
|
||||
|
||||
if (this._handshakePacket) {
|
||||
return cb(null, this);
|
||||
}
|
||||
let connectCalled = 0;
|
||||
function callbackOnce(isErrorHandler) {
|
||||
return function (param) {
|
||||
if (!connectCalled) {
|
||||
if (isErrorHandler) {
|
||||
cb(param);
|
||||
} else {
|
||||
cb(null, param);
|
||||
}
|
||||
}
|
||||
connectCalled = 1;
|
||||
};
|
||||
}
|
||||
this.once('error', callbackOnce(true));
|
||||
this.once('connect', callbackOnce(false));
|
||||
|
||||
/* eslint-disable prefer-const */
|
||||
let onError, onConnect;
|
||||
|
||||
onError = (param) => {
|
||||
this.removeListener('connect', onConnect);
|
||||
cb(param);
|
||||
};
|
||||
|
||||
onConnect = (param) => {
|
||||
this.removeListener('error', onError);
|
||||
cb(null, param);
|
||||
};
|
||||
/* eslint-enable prefer-const */
|
||||
|
||||
this.once('error', onError);
|
||||
this.once('connect', onConnect);
|
||||
}
|
||||
|
||||
// ===================================
|
||||
@@ -922,6 +926,12 @@ class BaseConnection extends EventEmitter {
|
||||
return this.addCommand(new Commands.ServerHandshake(args));
|
||||
}
|
||||
|
||||
[Symbol.dispose]() {
|
||||
if (!this._closing) {
|
||||
this.end();
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================================================
|
||||
end(callback) {
|
||||
if (this.config.isServer) {
|
||||
|
||||
55
node_modules/mysql2/lib/base/pool.js
generated
vendored
55
node_modules/mysql2/lib/base/pool.js
generated
vendored
@@ -1,11 +1,27 @@
|
||||
'use strict';
|
||||
|
||||
const process = require('process');
|
||||
const SqlString = require('sqlstring');
|
||||
const SqlString = require('sql-escaper');
|
||||
const EventEmitter = require('events').EventEmitter;
|
||||
const PoolConnection = require('../pool_connection.js');
|
||||
const Queue = require('denque');
|
||||
const BaseConnection = require('./connection.js');
|
||||
const Errors = require('../constants/errors.js');
|
||||
|
||||
// Source: https://github.com/go-sql-driver/mysql/blob/76c00e35a8d48f8f70f0e7dffe584692bd3fa612/packets.go#L598-L613
|
||||
function isReadOnlyError(err) {
|
||||
if (!err || !err.errno) {
|
||||
return false;
|
||||
}
|
||||
// 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION
|
||||
// 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover)
|
||||
// 1836: ER_READ_ONLY_MODE
|
||||
return (
|
||||
err.errno === Errors.ER_OPTION_PREVENTS_STATEMENT ||
|
||||
err.errno === Errors.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION ||
|
||||
err.errno === Errors.ER_READ_ONLY_MODE
|
||||
);
|
||||
}
|
||||
|
||||
function spliceConnection(queue, connection) {
|
||||
const len = queue.length;
|
||||
@@ -92,6 +108,12 @@ class BasePool extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
[Symbol.dispose]() {
|
||||
if (!this._closed) {
|
||||
this.end();
|
||||
}
|
||||
}
|
||||
|
||||
end(cb) {
|
||||
this._closed = true;
|
||||
clearTimeout(this._removeIdleTimeoutConnectionsTimer);
|
||||
@@ -146,8 +168,24 @@ class BasePool extends EventEmitter {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
let queryError = null;
|
||||
const origOnResult = cmdQuery.onResult;
|
||||
if (origOnResult) {
|
||||
cmdQuery.onResult = function (err, rows, fields) {
|
||||
queryError = err || null;
|
||||
origOnResult(err, rows, fields);
|
||||
};
|
||||
} else {
|
||||
cmdQuery.once('error', (err) => {
|
||||
queryError = err;
|
||||
});
|
||||
}
|
||||
conn.query(cmdQuery).once('end', () => {
|
||||
conn.release();
|
||||
if (isReadOnlyError(queryError)) {
|
||||
conn.destroy();
|
||||
} else {
|
||||
conn.release();
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
conn.release();
|
||||
@@ -169,9 +207,16 @@ class BasePool extends EventEmitter {
|
||||
return cb(err);
|
||||
}
|
||||
try {
|
||||
conn.execute(sql, values, cb).once('end', () => {
|
||||
conn.release();
|
||||
});
|
||||
conn
|
||||
.execute(sql, values, (err, rows, fields) => {
|
||||
if (isReadOnlyError(err)) {
|
||||
conn.destroy();
|
||||
}
|
||||
cb(err, rows, fields);
|
||||
})
|
||||
.once('end', () => {
|
||||
conn.release();
|
||||
});
|
||||
} catch (e) {
|
||||
conn.release();
|
||||
return cb(e);
|
||||
|
||||
11
node_modules/mysql2/lib/base/pool_connection.js
generated
vendored
11
node_modules/mysql2/lib/base/pool_connection.js
generated
vendored
@@ -29,10 +29,14 @@ class BasePoolConnection extends BaseConnection {
|
||||
this._pool.releaseConnection(this);
|
||||
}
|
||||
|
||||
end() {
|
||||
[Symbol.dispose]() {
|
||||
this.release();
|
||||
}
|
||||
|
||||
end(callback) {
|
||||
if (this.config.gracefulEnd) {
|
||||
this._removeFromPool();
|
||||
super.end();
|
||||
super.end(callback);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -46,6 +50,9 @@ class BasePoolConnection extends BaseConnection {
|
||||
this.emit('warn', err);
|
||||
console.warn(err.message);
|
||||
this.release();
|
||||
if (typeof callback === 'function') {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
|
||||
Reference in New Issue
Block a user