diff --git a/lib/connection.js b/lib/connection.js index 7bd838bf..910e3baf 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -295,6 +295,7 @@ Connection.prototype.setBuffer = function(buffer) { buffer.copy(combinedBuffer, remaining, 0); buffer = combinedBuffer; } + this.lastBuffer = false; this.buffer = buffer; this.offset = 0; }; @@ -344,81 +345,62 @@ Connection.prototype.parseMessage = function() { { case 0x52: //R - msg = this.parseR(buffer, length); - break; + return this.parseR(buffer, length); case 0x53: //S - msg = this.parseS(buffer, length); - break; + return this.parseS(buffer, length); case 0x4b: //K - msg = this.parseK(buffer, length); - break; + return this.parseK(buffer, length); case 0x43: //C - msg = this.parseC(buffer, length); - break; + return this.parseC(buffer, length); case 0x5a: //Z - msg = this.parseZ(buffer, length); - break; + return this.parseZ(buffer, length); case 0x54: //T - msg = this.parseT(buffer, msg); - break; + return this.parseT(buffer, length); case 0x44: //D - msg = this.parseD(buffer, length); - break; + return this.parseD(buffer, length); case 0x45: //E - msg = this.parseE(buffer, length); - break; + return this.parseE(buffer, length); case 0x4e: //N - msg = this.parseN(buffer, length); - break; + return this.parseN(buffer, length); case 0x31: //1 - msg = new Message('parseComplete', length); - break; + return new Message('parseComplete', length); case 0x32: //2 - msg = new Message('bindComplete', length); - break; + return new Message('bindComplete', length); case 0x41: //A - msg = this.parseA(buffer, length); - break; + return this.parseA(buffer, length); case 0x6e: //n - msg = new Message('noData', length); - break; + return new Message('noData', length); case 0x49: //I - msg = new Message('emptyQuery', length); - break; + return new Message('emptyQuery', length); case 0x73: //s - msg = new Message('portalSuspended', length); - break; + return new Message('portalSuspended', length); case 0x47: //G - msg = this.parseG(buffer, length); - break; + return this.parseG(buffer, length); case 0x48: //H - msg = this.parseH(buffer, length); - break; + return this.parseH(buffer, length); + case 0x63: //c - msg = new Message('copyDone', length); - break; + return new Message('copyDone', length); case 0x64: //d - msg = this.parsed(buffer, length); - break; + return this.parsed(buffer, length); } - return msg; }; Connection.prototype.parseR = function(buffer, length) { @@ -523,7 +505,7 @@ var DataRowMessage = function(name, length, fieldCount) { //extremely hot-path code -Connection.prototype[0x44] = Connection.prototype.parseD = function(buffer, length) { +Connection.prototype.parseD = function(buffer, length) { var fieldCount = this.parseInt16(buffer); var msg = new DataRowMessage(length, fieldCount); for(var i = 0; i < fieldCount; i++) { diff --git a/lib/result.js b/lib/result.js index 194862b2..c9a777ec 100644 --- a/lib/result.js +++ b/lib/result.js @@ -64,24 +64,9 @@ Result.prototype.addRow = function(row) { this.rows.push(row); }; -var inlineParsers = function(dataTypeID, index, format) { - var access = "rowData["+ index + "]"; - var accessNotNull = access + ' == null ? null : '; - if(format != 'text') { - return accessNotNull + "parsers["+index+"]("+access+")"; - } - switch (dataTypeID) { - case 21: //integers - case 22: - case 23: - return accessNotNull + "parseInt("+access+")"; - case 16: //boolean - return accessNotNull + access + "=='t'"; - case 25: //string - return access; - default: - return accessNotNull + "parsers["+index+"]("+access+")"; - } +var inlineParser = function(fieldName, i) { + return "\nthis['" + fieldName + "'] = " + + "rowData[" + i + "] == null ? null : parsers[" + i + "](rowData[" + i + "]);"; }; Result.prototype.addFields = function(fieldDescriptions) { @@ -94,7 +79,6 @@ Result.prototype.addFields = function(fieldDescriptions) { this._parsers = []; } var ctorBody = ""; - var parse = ""; for(var i = 0; i < fieldDescriptions.length; i++) { var desc = fieldDescriptions[i]; this.fields.push(desc); @@ -102,7 +86,7 @@ Result.prototype.addFields = function(fieldDescriptions) { this._parsers.push(parser); //this is some craziness to compile the row result parsing //results in ~60% speedup on large query result sets - ctorBody += "\nthis['" + desc.name + "'] = " + inlineParsers(desc.dataTypeID, i, desc.format) + ';'; + ctorBody += inlineParser(desc.name, i); } this.RowCtor = Function("parsers", "rowData", ctorBody); }; diff --git a/lib/types/index.js b/lib/types/index.js index d58bc992..b731433c 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -17,7 +17,6 @@ var getTypeParser = function(oid, format) { if (!typeParsers[format]) { return noParse; } - return typeParsers[format][oid] || noParse; }; @@ -30,9 +29,7 @@ var setTypeParser = function(oid, format, parseFn) { }; textParsers.init(function(oid, converter) { - typeParsers.text[oid] = function(value) { - return converter(String(value)); - }; + typeParsers.text[oid] = converter; }); binaryParsers.init(function(oid, converter) {