Comparing version 2.1.1 to 2.2.0
@@ -7,4 +7,20 @@ # Changes | ||
## HEAD | ||
## v2.2.0 (2014-04-27) | ||
* Use indexOf instead of for loops removing conn from pool #611 | ||
* Make callback to `pool.query` optional like `conn.query` #585 | ||
* Prevent enqueuing sequences after fatal error #400 | ||
* Fix geometry parser for empty fields #742 | ||
* Accept lower-case charset option | ||
* Throw on unknown charset option #789 | ||
* Update known charsets | ||
* Remove console.warn from PoolCluster #744 | ||
* Fix `pool.end` to handle queued connections #797 | ||
* Fix `pool.releaseConnection` to keep connection queue flowing #797 | ||
* Fix SSL handshake error to be catchable #800 | ||
* Add `connection.threadId` to get MySQL connection ID #602 | ||
* Ensure `pool.getConnection` retrieves good connections #434 #557 #778 | ||
* Fix pool cluster wildcard matching #627 | ||
* Pass query values through to `SqlString.format` #590 | ||
## v2.1.1 (2014-03-13) | ||
@@ -11,0 +27,0 @@ |
@@ -20,2 +20,3 @@ var Net = require('net'); | ||
this.state = "disconnected"; | ||
this.threadId = null; | ||
} | ||
@@ -164,3 +165,3 @@ | ||
query.sql = this.format(query.sql, query.values || []); | ||
query.sql = this.format(query.sql, query.values); | ||
@@ -287,4 +288,5 @@ return this._protocol._enqueue(query); | ||
Connection.prototype._handleProtocolHandshake = function() { | ||
this.state = "authenticated"; | ||
Connection.prototype._handleProtocolHandshake = function _handleProtocolHandshake(packet) { | ||
this.state = "authenticated"; | ||
this.threadId = packet.threadId; | ||
}; | ||
@@ -291,0 +293,0 @@ |
@@ -87,4 +87,10 @@ var urlParse = require('url').parse; | ||
ConnectionConfig.getCharsetNumber = function(charset) { | ||
return Charsets[charset]; | ||
ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) { | ||
var num = Charsets[charset.toUpperCase()]; | ||
if (num === undefined) { | ||
throw new TypeError('Unknown charset \'' + charset + '\''); | ||
} | ||
return num; | ||
}; | ||
@@ -91,0 +97,0 @@ |
@@ -1,5 +0,5 @@ | ||
var mysql = require('../'); | ||
var Connection = require('./Connection'); | ||
var EventEmitter = require('events').EventEmitter; | ||
var Util = require('util'); | ||
var mysql = require('../'); | ||
var Connection = require('./Connection'); | ||
var EventEmitter = require('events').EventEmitter; | ||
var Util = require('util'); | ||
var PoolConnection = require('./PoolConnection'); | ||
@@ -34,5 +34,3 @@ | ||
return process.nextTick(function(){ | ||
cb(null, connection); | ||
}); | ||
return this.acquireConnection(connection, cb); | ||
} | ||
@@ -73,19 +71,47 @@ | ||
Pool.prototype.releaseConnection = function (connection) { | ||
var cb; | ||
Pool.prototype.acquireConnection = function acquireConnection(connection, cb) { | ||
if (connection._pool !== this) { | ||
throw new Error('Connection acquired from wrong pool.'); | ||
} | ||
if (!connection._pool) { | ||
// The connection has been removed from the pool and is no longer good. | ||
if (this._connectionQueue.length) { | ||
cb = this._connectionQueue.shift(); | ||
var pool = this; | ||
process.nextTick(this.getConnection.bind(this, cb)); | ||
connection._pool = null; | ||
connection.ping(function(err){ | ||
if (!err) { | ||
connection._pool = pool; | ||
cb(null, connection); | ||
return; | ||
} | ||
} else if (this._connectionQueue.length) { | ||
cb = this._connectionQueue.shift(); | ||
process.nextTick(cb.bind(null, null, connection)); | ||
} else { | ||
connection.destroy(); | ||
pool._connectionQueue.unshift(cb); | ||
pool._removeConnection(connection); | ||
}); | ||
}; | ||
Pool.prototype.releaseConnection = function releaseConnection(connection) { | ||
var cb; | ||
if (connection._pool) { | ||
if (connection._pool !== this) { | ||
throw new Error('Connection released to wrong pool'); | ||
} | ||
// add connection to end of free queue | ||
this._freeConnections.push(connection); | ||
} | ||
while (this._closed && this._connectionQueue.length) { | ||
// empty the connection queue | ||
cb = this._connectionQueue.shift(); | ||
process.nextTick(cb.bind(null, new Error('Pool is closed.'))); | ||
} | ||
if (this._connectionQueue.length) { | ||
cb = this._connectionQueue.shift(); | ||
this.getConnection(cb); | ||
} | ||
}; | ||
@@ -121,5 +147,7 @@ | ||
for (var i = 0; i < this._allConnections.length; i++) { | ||
connection = this._allConnections[i]; | ||
while (this._allConnections.length) { | ||
connection = this._allConnections[0]; | ||
connection._pool = null; | ||
connection._realEnd(endCB); | ||
this._removeConnection(connection); | ||
} | ||
@@ -134,2 +162,7 @@ }; | ||
if (!cb) { | ||
// Ignore results and errors if no cb supplied; matches connection.query | ||
cb = function () {}; | ||
} | ||
var connection; | ||
@@ -155,16 +188,12 @@ var query = Connection.createQuery(sql, values, function (err, rows, fields) { | ||
Pool.prototype._removeConnection = function(connection) { | ||
var i; | ||
var index; | ||
for (i = 0; i < this._allConnections.length; i++) { | ||
if (this._allConnections[i] === connection) { | ||
this._allConnections.splice(i, 1); | ||
break; | ||
} | ||
if ((index = this._allConnections.indexOf(connection)) !== -1) { | ||
// Remove connection from all connections | ||
this._allConnections.splice(index, 1); | ||
} | ||
for (i = 0; i < this._freeConnections.length; i++) { | ||
if (this._freeConnections[i] === connection) { | ||
this._freeConnections.splice(i, 1); | ||
break; | ||
} | ||
if ((index = this._freeConnections.indexOf(connection)) !== -1) { | ||
// Remove connection from free connections | ||
this._freeConnections.splice(index, 1); | ||
} | ||
@@ -171,0 +200,0 @@ |
@@ -31,3 +31,3 @@ var Pool = require('./Pool'); | ||
pattern = pattern || '*'; | ||
selector = selector || this._defaultSelector; | ||
@@ -38,3 +38,3 @@ selector = selector.toUpperCase(); | ||
} | ||
var key = pattern + selector; | ||
@@ -63,3 +63,3 @@ | ||
this._serviceableNodeIds.push(id); | ||
this._clearFindCaches(); | ||
@@ -102,3 +102,3 @@ } | ||
} | ||
var foundNodeIds; | ||
@@ -110,3 +110,4 @@ | ||
foundNodeIds = [pattern]; | ||
} else { // wild matching | ||
} else if (pattern[pattern.length - 1] === '*') { | ||
// wild matching | ||
var keyword = pattern.substring(pattern.length - 1, 0); | ||
@@ -117,6 +118,8 @@ | ||
}); | ||
} else { | ||
foundNodeIds = []; | ||
} | ||
this._findCaches[pattern] = foundNodeIds; | ||
return foundNodeIds; | ||
@@ -135,5 +138,5 @@ }; | ||
delete this._nodes[node.id]; | ||
this._clearFindCaches(); | ||
node.pool.end(); | ||
@@ -156,7 +159,6 @@ | ||
node.pool.getConnection(function (err, connection) { | ||
if (err) { | ||
if (err) { | ||
self._increaseErrorCount(node); | ||
if (self._canRetry) { | ||
console.warn('[Error] PoolCluster : ' + err); | ||
return cb(null, 'retry'); | ||
@@ -176,3 +178,3 @@ } else { | ||
PoolCluster.prototype._clearFindCaches = function() { | ||
PoolCluster.prototype._clearFindCaches = function() { | ||
this._findCaches = {}; | ||
@@ -194,3 +196,3 @@ }; | ||
if (clusterNode === null) { | ||
return cb(new Error('Pool does Not exists.')); | ||
return cb(new Error('Pool does not exist.')); | ||
} | ||
@@ -197,0 +199,0 @@ |
@@ -1,195 +0,220 @@ | ||
exports.BIG5_CHINESE_CI = 1; | ||
exports.LATIN2_CZECH_CS = 2; | ||
exports.DEC8_SWEDISH_CI = 3; | ||
exports.CP850_GENERAL_CI = 4; | ||
exports.LATIN1_GERMAN1_CI = 5; | ||
exports.HP8_ENGLISH_CI = 6; | ||
exports.KOI8R_GENERAL_CI = 7; | ||
exports.LATIN1_SWEDISH_CI = 8; | ||
exports.LATIN2_GENERAL_CI = 9; | ||
exports.SWE7_SWEDISH_CI = 10; | ||
exports.ASCII_GENERAL_CI = 11; | ||
exports.UJIS_JAPANESE_CI = 12; | ||
exports.SJIS_JAPANESE_CI = 13; | ||
exports.CP1251_BULGARIAN_CI = 14; | ||
exports.LATIN1_DANISH_CI = 15; | ||
exports.HEBREW_GENERAL_CI = 16; | ||
exports.TIS620_THAI_CI = 18; | ||
exports.EUCKR_KOREAN_CI = 19; | ||
exports.LATIN7_ESTONIAN_CS = 20; | ||
exports.LATIN2_HUNGARIAN_CI = 21; | ||
exports.KOI8U_GENERAL_CI = 22; | ||
exports.CP1251_UKRAINIAN_CI = 23; | ||
exports.GB2312_CHINESE_CI = 24; | ||
exports.GREEK_GENERAL_CI = 25; | ||
exports.CP1250_GENERAL_CI = 26; | ||
exports.LATIN2_CROATIAN_CI = 27; | ||
exports.GBK_CHINESE_CI = 28; | ||
exports.CP1257_LITHUANIAN_CI = 29; | ||
exports.LATIN5_TURKISH_CI = 30; | ||
exports.LATIN1_GERMAN2_CI = 31; | ||
exports.ARMSCII8_GENERAL_CI = 32; | ||
exports.UTF8_GENERAL_CI = 33; | ||
exports.CP1250_CZECH_CS = 34; | ||
exports.UCS2_GENERAL_CI = 35; | ||
exports.CP866_GENERAL_CI = 36; | ||
exports.KEYBCS2_GENERAL_CI = 37; | ||
exports.MACCE_GENERAL_CI = 38; | ||
exports.MACROMAN_GENERAL_CI = 39; | ||
exports.CP852_GENERAL_CI = 40; | ||
exports.LATIN7_GENERAL_CI = 41; | ||
exports.LATIN7_GENERAL_CS = 42; | ||
exports.MACCE_BIN = 43; | ||
exports.CP1250_CROATIAN_CI = 44; | ||
exports.UTF8MB4_GENERAL_CI = 45; | ||
exports.UTF8MB4_BIN = 46; | ||
exports.LATIN1_BIN = 47; | ||
exports.LATIN1_GENERAL_CI = 48; | ||
exports.LATIN1_GENERAL_CS = 49; | ||
exports.CP1251_BIN = 50; | ||
exports.CP1251_GENERAL_CI = 51; | ||
exports.CP1251_GENERAL_CS = 52; | ||
exports.MACROMAN_BIN = 53; | ||
exports.UTF16_GENERAL_CI = 54; | ||
exports.UTF16_BIN = 55; | ||
exports.CP1256_GENERAL_CI = 57; | ||
exports.CP1257_BIN = 58; | ||
exports.CP1257_GENERAL_CI = 59; | ||
exports.UTF32_GENERAL_CI = 60; | ||
exports.UTF32_BIN = 61; | ||
exports.BINARY = 63; | ||
exports.ARMSCII8_BIN = 64; | ||
exports.ASCII_BIN = 65; | ||
exports.CP1250_BIN = 66; | ||
exports.CP1256_BIN = 67; | ||
exports.CP866_BIN = 68; | ||
exports.DEC8_BIN = 69; | ||
exports.GREEK_BIN = 70; | ||
exports.HEBREW_BIN = 71; | ||
exports.HP8_BIN = 72; | ||
exports.KEYBCS2_BIN = 73; | ||
exports.KOI8R_BIN = 74; | ||
exports.KOI8U_BIN = 75; | ||
exports.LATIN2_BIN = 77; | ||
exports.LATIN5_BIN = 78; | ||
exports.LATIN7_BIN = 79; | ||
exports.CP850_BIN = 80; | ||
exports.CP852_BIN = 81; | ||
exports.SWE7_BIN = 82; | ||
exports.UTF8_BIN = 83; | ||
exports.BIG5_BIN = 84; | ||
exports.EUCKR_BIN = 85; | ||
exports.GB2312_BIN = 86; | ||
exports.GBK_BIN = 87; | ||
exports.SJIS_BIN = 88; | ||
exports.TIS620_BIN = 89; | ||
exports.UCS2_BIN = 90; | ||
exports.UJIS_BIN = 91; | ||
exports.GEOSTD8_GENERAL_CI = 92; | ||
exports.GEOSTD8_BIN = 93; | ||
exports.LATIN1_SPANISH_CI = 94; | ||
exports.CP932_JAPANESE_CI = 95; | ||
exports.CP932_BIN = 96; | ||
exports.EUCJPMS_JAPANESE_CI = 97; | ||
exports.EUCJPMS_BIN = 98; | ||
exports.CP1250_POLISH_CI = 99; | ||
exports.UTF16_UNICODE_CI = 101; | ||
exports.UTF16_ICELANDIC_CI = 102; | ||
exports.UTF16_LATVIAN_CI = 103; | ||
exports.UTF16_ROMANIAN_CI = 104; | ||
exports.UTF16_SLOVENIAN_CI = 105; | ||
exports.UTF16_POLISH_CI = 106; | ||
exports.UTF16_ESTONIAN_CI = 107; | ||
exports.UTF16_SPANISH_CI = 108; | ||
exports.UTF16_SWEDISH_CI = 109; | ||
exports.UTF16_TURKISH_CI = 110; | ||
exports.UTF16_CZECH_CI = 111; | ||
exports.UTF16_DANISH_CI = 112; | ||
exports.UTF16_LITHUANIAN_CI = 113; | ||
exports.UTF16_SLOVAK_CI = 114; | ||
exports.UTF16_SPANISH2_CI = 115; | ||
exports.UTF16_ROMAN_CI = 116; | ||
exports.UTF16_PERSIAN_CI = 117; | ||
exports.UTF16_ESPERANTO_CI = 118; | ||
exports.UTF16_HUNGARIAN_CI = 119; | ||
exports.UTF16_SINHALA_CI = 120; | ||
exports.UCS2_UNICODE_CI = 128; | ||
exports.UCS2_ICELANDIC_CI = 129; | ||
exports.UCS2_LATVIAN_CI = 130; | ||
exports.UCS2_ROMANIAN_CI = 131; | ||
exports.UCS2_SLOVENIAN_CI = 132; | ||
exports.UCS2_POLISH_CI = 133; | ||
exports.UCS2_ESTONIAN_CI = 134; | ||
exports.UCS2_SPANISH_CI = 135; | ||
exports.UCS2_SWEDISH_CI = 136; | ||
exports.UCS2_TURKISH_CI = 137; | ||
exports.UCS2_CZECH_CI = 138; | ||
exports.UCS2_DANISH_CI = 139; | ||
exports.UCS2_LITHUANIAN_CI = 140; | ||
exports.UCS2_SLOVAK_CI = 141; | ||
exports.UCS2_SPANISH2_CI = 142; | ||
exports.UCS2_ROMAN_CI = 143; | ||
exports.UCS2_PERSIAN_CI = 144; | ||
exports.UCS2_ESPERANTO_CI = 145; | ||
exports.UCS2_HUNGARIAN_CI = 146; | ||
exports.UCS2_SINHALA_CI = 147; | ||
exports.UTF32_UNICODE_CI = 160; | ||
exports.UTF32_ICELANDIC_CI = 161; | ||
exports.UTF32_LATVIAN_CI = 162; | ||
exports.UTF32_ROMANIAN_CI = 163; | ||
exports.UTF32_SLOVENIAN_CI = 164; | ||
exports.UTF32_POLISH_CI = 165; | ||
exports.UTF32_ESTONIAN_CI = 166; | ||
exports.UTF32_SPANISH_CI = 167; | ||
exports.UTF32_SWEDISH_CI = 168; | ||
exports.UTF32_TURKISH_CI = 169; | ||
exports.UTF32_CZECH_CI = 170; | ||
exports.UTF32_DANISH_CI = 171; | ||
exports.UTF32_LITHUANIAN_CI = 172; | ||
exports.UTF32_SLOVAK_CI = 173; | ||
exports.UTF32_SPANISH2_CI = 174; | ||
exports.UTF32_ROMAN_CI = 175; | ||
exports.UTF32_PERSIAN_CI = 176; | ||
exports.UTF32_ESPERANTO_CI = 177; | ||
exports.UTF32_HUNGARIAN_CI = 178; | ||
exports.UTF32_SINHALA_CI = 179; | ||
exports.UTF8_UNICODE_CI = 192; | ||
exports.UTF8_ICELANDIC_CI = 193; | ||
exports.UTF8_LATVIAN_CI = 194; | ||
exports.UTF8_ROMANIAN_CI = 195; | ||
exports.UTF8_SLOVENIAN_CI = 196; | ||
exports.UTF8_POLISH_CI = 197; | ||
exports.UTF8_ESTONIAN_CI = 198; | ||
exports.UTF8_SPANISH_CI = 199; | ||
exports.UTF8_SWEDISH_CI = 200; | ||
exports.UTF8_TURKISH_CI = 201; | ||
exports.UTF8_CZECH_CI = 202; | ||
exports.UTF8_DANISH_CI = 203; | ||
exports.UTF8_LITHUANIAN_CI = 204; | ||
exports.UTF8_SLOVAK_CI = 205; | ||
exports.UTF8_SPANISH2_CI = 206; | ||
exports.UTF8_ROMAN_CI = 207; | ||
exports.UTF8_PERSIAN_CI = 208; | ||
exports.UTF8_ESPERANTO_CI = 209; | ||
exports.UTF8_HUNGARIAN_CI = 210; | ||
exports.UTF8_SINHALA_CI = 211; | ||
exports.UTF8MB4_UNICODE_CI = 224; | ||
exports.UTF8MB4_ICELANDIC_CI = 225; | ||
exports.UTF8MB4_LATVIAN_CI = 226; | ||
exports.UTF8MB4_ROMANIAN_CI = 227; | ||
exports.UTF8MB4_SLOVENIAN_CI = 228; | ||
exports.UTF8MB4_POLISH_CI = 229; | ||
exports.UTF8MB4_ESTONIAN_CI = 230; | ||
exports.UTF8MB4_SPANISH_CI = 231; | ||
exports.UTF8MB4_SWEDISH_CI = 232; | ||
exports.UTF8MB4_TURKISH_CI = 233; | ||
exports.UTF8MB4_CZECH_CI = 234; | ||
exports.UTF8MB4_DANISH_CI = 235; | ||
exports.UTF8MB4_LITHUANIAN_CI = 236; | ||
exports.UTF8MB4_SLOVAK_CI = 237; | ||
exports.UTF8MB4_SPANISH2_CI = 238; | ||
exports.UTF8MB4_ROMAN_CI = 239; | ||
exports.UTF8MB4_PERSIAN_CI = 240; | ||
exports.UTF8MB4_ESPERANTO_CI = 241; | ||
exports.UTF8MB4_HUNGARIAN_CI = 242; | ||
exports.UTF8MB4_SINHALA_CI = 243; | ||
exports.BIG5_CHINESE_CI = 1; | ||
exports.LATIN2_CZECH_CS = 2; | ||
exports.DEC8_SWEDISH_CI = 3; | ||
exports.CP850_GENERAL_CI = 4; | ||
exports.LATIN1_GERMAN1_CI = 5; | ||
exports.HP8_ENGLISH_CI = 6; | ||
exports.KOI8R_GENERAL_CI = 7; | ||
exports.LATIN1_SWEDISH_CI = 8; | ||
exports.LATIN2_GENERAL_CI = 9; | ||
exports.SWE7_SWEDISH_CI = 10; | ||
exports.ASCII_GENERAL_CI = 11; | ||
exports.UJIS_JAPANESE_CI = 12; | ||
exports.SJIS_JAPANESE_CI = 13; | ||
exports.CP1251_BULGARIAN_CI = 14; | ||
exports.LATIN1_DANISH_CI = 15; | ||
exports.HEBREW_GENERAL_CI = 16; | ||
exports.TIS620_THAI_CI = 18; | ||
exports.EUCKR_KOREAN_CI = 19; | ||
exports.LATIN7_ESTONIAN_CS = 20; | ||
exports.LATIN2_HUNGARIAN_CI = 21; | ||
exports.KOI8U_GENERAL_CI = 22; | ||
exports.CP1251_UKRAINIAN_CI = 23; | ||
exports.GB2312_CHINESE_CI = 24; | ||
exports.GREEK_GENERAL_CI = 25; | ||
exports.CP1250_GENERAL_CI = 26; | ||
exports.LATIN2_CROATIAN_CI = 27; | ||
exports.GBK_CHINESE_CI = 28; | ||
exports.CP1257_LITHUANIAN_CI = 29; | ||
exports.LATIN5_TURKISH_CI = 30; | ||
exports.LATIN1_GERMAN2_CI = 31; | ||
exports.ARMSCII8_GENERAL_CI = 32; | ||
exports.UTF8_GENERAL_CI = 33; | ||
exports.CP1250_CZECH_CS = 34; | ||
exports.UCS2_GENERAL_CI = 35; | ||
exports.CP866_GENERAL_CI = 36; | ||
exports.KEYBCS2_GENERAL_CI = 37; | ||
exports.MACCE_GENERAL_CI = 38; | ||
exports.MACROMAN_GENERAL_CI = 39; | ||
exports.CP852_GENERAL_CI = 40; | ||
exports.LATIN7_GENERAL_CI = 41; | ||
exports.LATIN7_GENERAL_CS = 42; | ||
exports.MACCE_BIN = 43; | ||
exports.CP1250_CROATIAN_CI = 44; | ||
exports.UTF8MB4_GENERAL_CI = 45; | ||
exports.UTF8MB4_BIN = 46; | ||
exports.LATIN1_BIN = 47; | ||
exports.LATIN1_GENERAL_CI = 48; | ||
exports.LATIN1_GENERAL_CS = 49; | ||
exports.CP1251_BIN = 50; | ||
exports.CP1251_GENERAL_CI = 51; | ||
exports.CP1251_GENERAL_CS = 52; | ||
exports.MACROMAN_BIN = 53; | ||
exports.UTF16_GENERAL_CI = 54; | ||
exports.UTF16_BIN = 55; | ||
exports.UTF16LE_GENERAL_CI = 56; | ||
exports.CP1256_GENERAL_CI = 57; | ||
exports.CP1257_BIN = 58; | ||
exports.CP1257_GENERAL_CI = 59; | ||
exports.UTF32_GENERAL_CI = 60; | ||
exports.UTF32_BIN = 61; | ||
exports.UTF16LE_BIN = 62; | ||
exports.BINARY = 63; | ||
exports.ARMSCII8_BIN = 64; | ||
exports.ASCII_BIN = 65; | ||
exports.CP1250_BIN = 66; | ||
exports.CP1256_BIN = 67; | ||
exports.CP866_BIN = 68; | ||
exports.DEC8_BIN = 69; | ||
exports.GREEK_BIN = 70; | ||
exports.HEBREW_BIN = 71; | ||
exports.HP8_BIN = 72; | ||
exports.KEYBCS2_BIN = 73; | ||
exports.KOI8R_BIN = 74; | ||
exports.KOI8U_BIN = 75; | ||
exports.LATIN2_BIN = 77; | ||
exports.LATIN5_BIN = 78; | ||
exports.LATIN7_BIN = 79; | ||
exports.CP850_BIN = 80; | ||
exports.CP852_BIN = 81; | ||
exports.SWE7_BIN = 82; | ||
exports.UTF8_BIN = 83; | ||
exports.BIG5_BIN = 84; | ||
exports.EUCKR_BIN = 85; | ||
exports.GB2312_BIN = 86; | ||
exports.GBK_BIN = 87; | ||
exports.SJIS_BIN = 88; | ||
exports.TIS620_BIN = 89; | ||
exports.UCS2_BIN = 90; | ||
exports.UJIS_BIN = 91; | ||
exports.GEOSTD8_GENERAL_CI = 92; | ||
exports.GEOSTD8_BIN = 93; | ||
exports.LATIN1_SPANISH_CI = 94; | ||
exports.CP932_JAPANESE_CI = 95; | ||
exports.CP932_BIN = 96; | ||
exports.EUCJPMS_JAPANESE_CI = 97; | ||
exports.EUCJPMS_BIN = 98; | ||
exports.CP1250_POLISH_CI = 99; | ||
exports.UTF16_UNICODE_CI = 101; | ||
exports.UTF16_ICELANDIC_CI = 102; | ||
exports.UTF16_LATVIAN_CI = 103; | ||
exports.UTF16_ROMANIAN_CI = 104; | ||
exports.UTF16_SLOVENIAN_CI = 105; | ||
exports.UTF16_POLISH_CI = 106; | ||
exports.UTF16_ESTONIAN_CI = 107; | ||
exports.UTF16_SPANISH_CI = 108; | ||
exports.UTF16_SWEDISH_CI = 109; | ||
exports.UTF16_TURKISH_CI = 110; | ||
exports.UTF16_CZECH_CI = 111; | ||
exports.UTF16_DANISH_CI = 112; | ||
exports.UTF16_LITHUANIAN_CI = 113; | ||
exports.UTF16_SLOVAK_CI = 114; | ||
exports.UTF16_SPANISH2_CI = 115; | ||
exports.UTF16_ROMAN_CI = 116; | ||
exports.UTF16_PERSIAN_CI = 117; | ||
exports.UTF16_ESPERANTO_CI = 118; | ||
exports.UTF16_HUNGARIAN_CI = 119; | ||
exports.UTF16_SINHALA_CI = 120; | ||
exports.UTF16_GERMAN2_CI = 121; | ||
exports.UTF16_CROATIAN_MYSQL561_CI = 122; | ||
exports.UTF16_UNICODE_520_CI = 123; | ||
exports.UTF16_VIETNAMESE_CI = 124; | ||
exports.UCS2_UNICODE_CI = 128; | ||
exports.UCS2_ICELANDIC_CI = 129; | ||
exports.UCS2_LATVIAN_CI = 130; | ||
exports.UCS2_ROMANIAN_CI = 131; | ||
exports.UCS2_SLOVENIAN_CI = 132; | ||
exports.UCS2_POLISH_CI = 133; | ||
exports.UCS2_ESTONIAN_CI = 134; | ||
exports.UCS2_SPANISH_CI = 135; | ||
exports.UCS2_SWEDISH_CI = 136; | ||
exports.UCS2_TURKISH_CI = 137; | ||
exports.UCS2_CZECH_CI = 138; | ||
exports.UCS2_DANISH_CI = 139; | ||
exports.UCS2_LITHUANIAN_CI = 140; | ||
exports.UCS2_SLOVAK_CI = 141; | ||
exports.UCS2_SPANISH2_CI = 142; | ||
exports.UCS2_ROMAN_CI = 143; | ||
exports.UCS2_PERSIAN_CI = 144; | ||
exports.UCS2_ESPERANTO_CI = 145; | ||
exports.UCS2_HUNGARIAN_CI = 146; | ||
exports.UCS2_SINHALA_CI = 147; | ||
exports.UCS2_GERMAN2_CI = 148; | ||
exports.UCS2_CROATIAN_MYSQL561_CI = 149; | ||
exports.UCS2_UNICODE_520_CI = 150; | ||
exports.UCS2_VIETNAMESE_CI = 151; | ||
exports.UCS2_GENERAL_MYSQL500_CI = 159; | ||
exports.UTF32_UNICODE_CI = 160; | ||
exports.UTF32_ICELANDIC_CI = 161; | ||
exports.UTF32_LATVIAN_CI = 162; | ||
exports.UTF32_ROMANIAN_CI = 163; | ||
exports.UTF32_SLOVENIAN_CI = 164; | ||
exports.UTF32_POLISH_CI = 165; | ||
exports.UTF32_ESTONIAN_CI = 166; | ||
exports.UTF32_SPANISH_CI = 167; | ||
exports.UTF32_SWEDISH_CI = 168; | ||
exports.UTF32_TURKISH_CI = 169; | ||
exports.UTF32_CZECH_CI = 170; | ||
exports.UTF32_DANISH_CI = 171; | ||
exports.UTF32_LITHUANIAN_CI = 172; | ||
exports.UTF32_SLOVAK_CI = 173; | ||
exports.UTF32_SPANISH2_CI = 174; | ||
exports.UTF32_ROMAN_CI = 175; | ||
exports.UTF32_PERSIAN_CI = 176; | ||
exports.UTF32_ESPERANTO_CI = 177; | ||
exports.UTF32_HUNGARIAN_CI = 178; | ||
exports.UTF32_SINHALA_CI = 179; | ||
exports.UTF32_GERMAN2_CI = 180; | ||
exports.UTF32_CROATIAN_MYSQL561_CI = 181; | ||
exports.UTF32_UNICODE_520_CI = 182; | ||
exports.UTF32_VIETNAMESE_CI = 183; | ||
exports.UTF8_UNICODE_CI = 192; | ||
exports.UTF8_ICELANDIC_CI = 193; | ||
exports.UTF8_LATVIAN_CI = 194; | ||
exports.UTF8_ROMANIAN_CI = 195; | ||
exports.UTF8_SLOVENIAN_CI = 196; | ||
exports.UTF8_POLISH_CI = 197; | ||
exports.UTF8_ESTONIAN_CI = 198; | ||
exports.UTF8_SPANISH_CI = 199; | ||
exports.UTF8_SWEDISH_CI = 200; | ||
exports.UTF8_TURKISH_CI = 201; | ||
exports.UTF8_CZECH_CI = 202; | ||
exports.UTF8_DANISH_CI = 203; | ||
exports.UTF8_LITHUANIAN_CI = 204; | ||
exports.UTF8_SLOVAK_CI = 205; | ||
exports.UTF8_SPANISH2_CI = 206; | ||
exports.UTF8_ROMAN_CI = 207; | ||
exports.UTF8_PERSIAN_CI = 208; | ||
exports.UTF8_ESPERANTO_CI = 209; | ||
exports.UTF8_HUNGARIAN_CI = 210; | ||
exports.UTF8_SINHALA_CI = 211; | ||
exports.UTF8_GERMAN2_CI = 212; | ||
exports.UTF8_CROATIAN_MYSQL561_CI = 213; | ||
exports.UTF8_UNICODE_520_CI = 214; | ||
exports.UTF8_VIETNAMESE_CI = 215; | ||
exports.UTF8_GENERAL_MYSQL500_CI = 223; | ||
exports.UTF8MB4_UNICODE_CI = 224; | ||
exports.UTF8MB4_ICELANDIC_CI = 225; | ||
exports.UTF8MB4_LATVIAN_CI = 226; | ||
exports.UTF8MB4_ROMANIAN_CI = 227; | ||
exports.UTF8MB4_SLOVENIAN_CI = 228; | ||
exports.UTF8MB4_POLISH_CI = 229; | ||
exports.UTF8MB4_ESTONIAN_CI = 230; | ||
exports.UTF8MB4_SPANISH_CI = 231; | ||
exports.UTF8MB4_SWEDISH_CI = 232; | ||
exports.UTF8MB4_TURKISH_CI = 233; | ||
exports.UTF8MB4_CZECH_CI = 234; | ||
exports.UTF8MB4_DANISH_CI = 235; | ||
exports.UTF8MB4_LITHUANIAN_CI = 236; | ||
exports.UTF8MB4_SLOVAK_CI = 237; | ||
exports.UTF8MB4_SPANISH2_CI = 238; | ||
exports.UTF8MB4_ROMAN_CI = 239; | ||
exports.UTF8MB4_PERSIAN_CI = 240; | ||
exports.UTF8MB4_ESPERANTO_CI = 241; | ||
exports.UTF8MB4_HUNGARIAN_CI = 242; | ||
exports.UTF8MB4_SINHALA_CI = 243; | ||
exports.UTF8MB4_GERMAN2_CI = 244; | ||
exports.UTF8MB4_CROATIAN_MYSQL561_CI = 245; | ||
exports.UTF8MB4_UNICODE_520_CI = 246; | ||
exports.UTF8MB4_VIETNAMESE_CI = 247; | ||
exports.UTF8_GENERAL50_CI = 253; |
module.exports = ComQuitPacket; | ||
function ComQuitPacket(sql) { | ||
this.command = 0x01; | ||
} | ||
ComQuitPacket.prototype.write = function(writer) { | ||
writer.writeUnsignedNumber(1, 0x01); | ||
ComQuitPacket.prototype.parse = function parse(parser) { | ||
this.command = parser.parseUnsignedNumber(1); | ||
}; | ||
ComQuitPacket.prototype.write = function write(writer) { | ||
writer.writeUnsignedNumber(1, this.command); | ||
}; |
@@ -259,3 +259,3 @@ var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; | ||
if (buffer === null) { | ||
if (buffer === null || !buffer.length) { | ||
return null; | ||
@@ -262,0 +262,0 @@ } |
@@ -146,3 +146,6 @@ var Parser = require('./Parser'); | ||
if (this._quitSequence) { | ||
if (this._fatalError) { | ||
err = new Error(prefixAfter + 'fatal error.'); | ||
err.code = 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'; | ||
} else if (this._quitSequence) { | ||
err = new Error(prefixAfter + 'invoking quit.'); | ||
@@ -230,3 +233,3 @@ err.code = 'PROTOCOL_ENQUEUE_AFTER_QUIT'; | ||
this._handshaked = true; | ||
this.emit('handshake'); | ||
this.emit('handshake', this._handshakeInitializationPacket); | ||
} | ||
@@ -233,0 +236,0 @@ return Packets.OkPacket; |
@@ -38,4 +38,12 @@ var Sequence = require('./Sequence'); | ||
if (this._config.ssl) { | ||
if (!serverSSLSupport) | ||
throw new Error('Server does not support secure connnection'); | ||
if (!serverSSLSupport) { | ||
var err = new Error('Server does not support secure connnection'); | ||
err.code = 'HANDSHAKE_NO_SSL_SUPPORT'; | ||
err.fatal = true; | ||
this.end(err); | ||
return; | ||
} | ||
this._config.clientFlags |= ClientConstants.CLIENT_SSL; | ||
@@ -42,0 +50,0 @@ this.emit('packet', new Packets.SSLRequestPacket({ |
@@ -7,3 +7,3 @@ var Sequence = require('./Sequence'); | ||
var fs = require('fs'); | ||
var Readable = require('stream').Readable || require('readable-stream'); | ||
var Readable = require('readable-stream'); | ||
@@ -10,0 +10,0 @@ module.exports = Query; |
@@ -68,3 +68,3 @@ var SqlString = exports; | ||
SqlString.format = function(sql, values, stringifyObjects, timeZone) { | ||
values = [].concat(values); | ||
values = values == null ? [] : [].concat(values); | ||
@@ -71,0 +71,0 @@ return sql.replace(/\?\??/g, function(match) { |
@@ -5,3 +5,3 @@ { | ||
"description": "A node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.", | ||
"version": "2.1.1", | ||
"version": "2.2.0", | ||
"homepage": "https://github.com/felixge/node-mysql", | ||
@@ -14,18 +14,17 @@ "repository": { | ||
"scripts": { | ||
"test": "make test" | ||
"test": "node test/run.js" | ||
}, | ||
"engines": { | ||
"node": "*" | ||
}, | ||
"dependencies": { | ||
"require-all": "0.0.3", | ||
"bignumber.js": "1.0.1", | ||
"readable-stream": "~1.1.9" | ||
"bignumber.js": "1.3.0", | ||
"readable-stream": "~1.1.13", | ||
"require-all": "0.0.8" | ||
}, | ||
"devDependencies": { | ||
"utest": "0.0.6", | ||
"urun": "0.0.6", | ||
"underscore": "1.3.1" | ||
"underscore": "1.6.0", | ||
"urun": "0.0.7", | ||
"utest": "0.0.8" | ||
}, | ||
"optionalDependencies": {} | ||
"engines": { | ||
"node": ">= 0.8" | ||
} | ||
} |
136
Readme.md
# node-mysql | ||
[![Build Status](https://secure.travis-ci.org/felixge/node-mysql.png)](http://travis-ci.org/felixge/node-mysql) | ||
[![Build Status](https://travis-ci.org/felixge/node-mysql.svg?branch=master)](https://travis-ci.org/felixge/node-mysql) | ||
@@ -108,3 +108,8 @@ ## Install | ||
connection.connect(function(err) { | ||
// connected! (unless `err` is set) | ||
if (err) { | ||
console.error('error connecting: ' + err.stack); | ||
return; | ||
} | ||
console.log('connected as id ' + connection.threadId); | ||
}); | ||
@@ -142,3 +147,3 @@ ``` | ||
* `database`: Name of the database to use for this connection (Optional). | ||
* `charset`: The charset for the connection. (Default: `'UTF8_GENERAL_CI'`. Value needs to be all in upper case letters!) | ||
* `charset`: The charset for the connection. (Default: `'UTF8_GENERAL_CI'`) | ||
* `timezone`: The timezone used to store local dates. (Default: `'local'`) | ||
@@ -172,4 +177,3 @@ * `connectTimeout`: The milliseconds before a timeout occurs during the initial connection | ||
also possible to blacklist default ones. For more information, check [Connection Flags](#connection-flags). | ||
* `ssl`: object with ssl parameters ( same format as [crypto.createCredentials](http://nodejs.org/api/crypto.html#crypto_crypto_createcredentials_details) argument ) | ||
or a string containing name of ssl profile. Currently only 'Amazon RDS' profile is bundled, containing CA from https://rds.amazonaws.com/doc/rds-ssl-ca-cert.pem | ||
* `ssl`: object with ssl parameters or a string containing name of ssl profile. See [SSL options](#ssl-options). | ||
@@ -187,2 +191,24 @@ | ||
### SSL options | ||
The `ssl` option in the connection options takes a string or an object. When given a string, | ||
it uses one of the predefined SSL profiles included. The following profiles are included: | ||
* `"Amazon RDS"`: this profile is for connecting to an Amazon RDS server and contains the | ||
ca from https://rds.amazonaws.com/doc/rds-ssl-ca-cert.pem | ||
When connecting to other servers, you will need to provide an object of options, in the | ||
same format as [crypto.createCredentials](http://nodejs.org/api/crypto.html#crypto_crypto_createcredentials_details). | ||
Please note the arguments expect a string of the certificate, not a file name to the | ||
certificate. Here is a simple example: | ||
```js | ||
var connection = mysql.createConnection({ | ||
host : 'localhost', | ||
ssl : { | ||
ca : fs.readFileSync(__dirname + '/mysql-ca.crt') | ||
} | ||
}); | ||
``` | ||
## Terminating connections | ||
@@ -285,2 +311,5 @@ | ||
When a previous connection is retrieved from the pool, a ping packet is sent | ||
to the server to check if the connection is still good. | ||
## Pool options | ||
@@ -390,42 +419,5 @@ | ||
A good way to handle such unexpected disconnects is shown below: | ||
Re-connecting a connection is done by establishing a new connection. Once | ||
terminated, an existing connection object cannot be re-connected by design. | ||
```js | ||
var db_config = { | ||
host: 'localhost', | ||
user: 'root', | ||
password: '', | ||
database: 'example' | ||
}; | ||
var connection; | ||
function handleDisconnect() { | ||
connection = mysql.createConnection(db_config); // Recreate the connection, since | ||
// the old one cannot be reused. | ||
connection.connect(function(err) { // The server is either down | ||
if(err) { // or restarting (takes a while sometimes). | ||
console.log('error when connecting to db:', err); | ||
setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect, | ||
} // to avoid a hot loop, and to allow our node script to | ||
}); // process asynchronous requests in the meantime. | ||
// If you're also serving http, display a 503 error. | ||
connection.on('error', function(err) { | ||
console.log('db error', err); | ||
if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually | ||
handleDisconnect(); // lost due to either server restart, or a | ||
} else { // connnection idle timeout (the wait_timeout | ||
throw err; // server variable configures this) | ||
} | ||
}); | ||
} | ||
handleDisconnect(); | ||
``` | ||
As you can see in the example above, re-connecting a connection is done by | ||
establishing a new connection. Once terminated, an existing connection object | ||
cannot be re-connected by design. | ||
With Pool, disconnected connections will be removed from the pool freeing up | ||
@@ -460,2 +452,5 @@ space for a new connection to be created on the next getConnection call. | ||
**Caution** This also differs from prepared statements in that all `?` are | ||
replaced, even those contained in comments and strings. | ||
Different value types are escaped differently, here is how: | ||
@@ -588,2 +583,41 @@ | ||
## Getting the number of affected rows. | ||
You can get the number of affected rows from an insert, update or delete statement. | ||
```js | ||
connection.query('DELETE FROM posts WHERE title = "wrong"', function (err, result) { | ||
if (err) throw err; | ||
console.log('deleted ' + result.affectedRows + ' rows'); | ||
}) | ||
``` | ||
## Getting the number of changed rows. | ||
You can get the number of changed rows from an update statement. | ||
"changedRows" differs from "affectedRows" in that it does not count updated rows | ||
whose values were not changed. | ||
```js | ||
connection.query('UPDATE posts SET ...', function (err, response) { | ||
if (err) throw err; | ||
console.log('changed ' + result.changedRows + ' rows'); | ||
}) | ||
``` | ||
## Getting the connection ID | ||
You can get the MySQL connection ID ("thread ID") of a given connection using the `threadId` | ||
property. | ||
```js | ||
connection.connect(function(err) { | ||
if (err) throw err; | ||
console.log('connected as id ' + connection.threadId); | ||
}); | ||
``` | ||
## Executing queries in parallel | ||
@@ -1041,3 +1075,3 @@ | ||
Set the environment variables `MYSQL_DATABASE`, `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_USER` and `MYSQL_PASSWORD`. (You may want to put these in a `config.sh` file and source it when you run the tests). Then run `make test`. | ||
Set the environment variables `MYSQL_DATABASE`, `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_USER` and `MYSQL_PASSWORD`. Then run `npm test`. | ||
@@ -1048,17 +1082,9 @@ For example, if you have an installation of mysql running on localhost:3306 and no password set for the `root` user, run: | ||
mysql -u root -e "CREATE DATABASE IF NOT EXISTS node_mysql_test" | ||
MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_DATABASE=node_mysql_test MYSQL_USER=root MYSQL_PASSWORD= make test | ||
MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_DATABASE=node_mysql_test MYSQL_USER=root MYSQL_PASSWORD= npm test | ||
``` | ||
## Running unit tests on windows | ||
* Edit the variables in the file ```make.bat``` according to your system and mysql-settings. | ||
* Make sure the database (e.g. 'test') you want to use exists and the user you entered has the proper rights to use the test database. (E.g. do not forget to execute the SQL-command ```FLUSH PRIVILEGES``` after you have created the user.) | ||
* In a DOS-box (or CMD-shell) in the folder of your application run ```npm install mysql --dev``` or in the mysql folder (```node_modules\mysql```), run ```npm install --dev```. (This will install additional developer-dependencies for node-mysql.) | ||
* Run ```npm test mysql``` in your applications folder or ```npm test``` in the mysql subfolder. | ||
* If you want to log the output into a file use ```npm test mysql > test.log``` or ```npm test > test.log```. | ||
## Todo | ||
* Prepared statements | ||
* setTimeout() for Connection / Query | ||
* setTimeout() for Query | ||
* Support for encodings other than UTF-8 / ASCII |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
190983
3849
1081
57
+ Addedbignumber.js@1.3.0(transitive)
+ Addedrequire-all@0.0.8(transitive)
- Removedbignumber.js@1.0.1(transitive)
- Removedrequire-all@0.0.3(transitive)
Updatedbignumber.js@1.3.0
Updatedreadable-stream@~1.1.13
Updatedrequire-all@0.0.8