From 56b7c4168d5aa084b2821279ee88d437a2b7636d Mon Sep 17 00:00:00 2001 From: Brian Carlson Date: Wed, 7 Aug 2013 12:20:51 -0500 Subject: [PATCH] Create message in each parsing function --- lib/connection.js | 126 +++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/lib/connection.js b/lib/connection.js index 3a6ad7ca..c3bd4484 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -312,6 +312,11 @@ Connection.prototype.readSslResponse = function() { }; }; +var Message = function(name, length) { + this.name = name; + this.length = length; +}; + Connection.prototype.parseMessage = function() { var remaining = this.buffer.length - (this.offset); if(remaining < 5) { @@ -335,40 +340,32 @@ Connection.prototype.parseMessage = function() { return false; } - var msg = { - length: length - }; + var buffer = this.buffer; switch(id) { case 0x52: //R - msg.name = 'authenticationOk'; - msg = this.parseR(msg); + msg = this.parseR(buffer, length); break; case 0x53: //S - msg.name = 'parameterStatus'; - msg = this.parseS(msg); + msg = this.parseS(buffer, length); break; case 0x4b: //K - msg.name = 'backendKeyData'; - msg = this.parseK(msg); + msg = this.parseK(buffer, length); break; case 0x43: //C - msg.name = 'commandComplete'; - msg = this.parseC(msg); + msg = this.parseC(buffer, length); break; case 0x5a: //Z - msg.name = 'readyForQuery'; - msg = this.parseZ(msg); + msg = this.parseZ(buffer, length); break; case 0x54: //T - msg.name = 'rowDescription'; - msg = this.parseT(msg); + msg = this.parseT(buffer, msg); break; case 0x44: //D @@ -376,64 +373,58 @@ Connection.prototype.parseMessage = function() { break; case 0x45: //E - msg.name = 'error'; - msg = this.parseE(msg); + msg = this.parseE(buffer, length); break; case 0x4e: //N - msg.name = 'notice'; - msg = this.parseN(msg); + msg = this.parseN(buffer, length); break; case 0x31: //1 - msg.name = 'parseComplete'; + msg = new Message('parseComplete', length); break; case 0x32: //2 - msg.name = 'bindComplete'; + msg = new Message('bindComplete', length); break; case 0x41: //A - msg.name = 'notification'; - msg = this.parseA(msg); + msg = this.parseA(buffer, length); break; case 0x6e: //n - msg.name = 'noData'; + msg = new Message('noData', length); break; case 0x49: //I - msg.name = 'emptyQuery'; + msg = new Message('emptyQuery', length); break; case 0x73: //s - msg.name = 'portalSuspended'; + msg = new Message('portalSuspended', length); break; case 0x47: //G - msg.name = 'copyInResponse'; - msg = this.parseGH(msg); + msg = this.parseG(buffer, length); break; case 0x48: //H - msg.name = 'copyOutResponse'; - msg = this.parseGH(msg); + msg = this.parseH(buffer, length); break; case 0x63: //c - msg.name = 'copyDone'; + msg = new Message('copyDone', length); break; case 0x64: //d - msg.name = 'copyData'; - msg = this.parsed(msg); + msg = this.parsed(buffer, length); break; } return msg; }; -Connection.prototype.parseR = function(msg) { +Connection.prototype.parseR = function(buffer, length) { var code = 0; - var buffer = this.buffer; + var msg = new Message('authenticationOk', length); if(msg.length === 8) { code = this.parseInt32(buffer); if(code === 3) { @@ -454,34 +445,35 @@ Connection.prototype.parseR = function(msg) { throw new Error("Unknown authenticatinOk message type" + util.inspect(msg)); }; -Connection.prototype.parseS = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseS = function(buffer, length) { + var msg = new Message('parameterStatus', length); msg.parameterName = this.parseCString(buffer); msg.parameterValue = this.parseCString(buffer); return msg; }; -Connection.prototype.parseK = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseK = function(buffer, length) { + var msg = new Message('backendKeyData', length); msg.processID = this.parseInt32(buffer); msg.secretKey = this.parseInt32(buffer); return msg; }; -Connection.prototype.parseC = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseC = function(buffer, length) { + var msg = new Message('commandComplete', length); msg.text = this.parseCString(buffer); return msg; }; -Connection.prototype.parseZ = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseZ = function(buffer, length) { + var msg = new Message('readyForQuery', length); + msg.name = 'readyForQuery'; msg.status = this.readString(buffer, 1); return msg; }; -Connection.prototype.parseT = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseT = function(buffer, length) { + var msg = new Message('rowDescription', length); msg.fieldCount = this.parseInt16(buffer); var fields = []; for(var i = 0; i < msg.fieldCount; i++){ @@ -512,11 +504,6 @@ Connection.prototype.parseField = function(buffer) { return field; }; -var Message = function(name, length) { - this.name = name; - this.length = length; -}; - var DataRowMessage = function(name, length, fieldCount) { this.name = name; this.length = length; @@ -544,10 +531,11 @@ Connection.prototype._readValue = function(buffer) { }; //parses error -Connection.prototype.parseE = function(input) { +Connection.prototype.parseE = function(buffer, length) { var buffer = this.buffer; var fields = {}; var msg, item; + var input = new Message('error', length); var fieldType = this.readString(buffer, 1); while(fieldType != '\0') { fields[fieldType] = this.parseCString(buffer); @@ -582,18 +570,31 @@ Connection.prototype.parseE = function(input) { }; //same thing, different name -Connection.prototype.parseN = Connection.prototype.parseE; +Connection.prototype.parseN = function(buffer, length) { + var msg = this.parseE(msg); + msg.name = 'notice'; + return msg; +} -Connection.prototype.parseA = function(msg) { - var buffer = this.buffer; +Connection.prototype.parseA = function(buffer, length) { + var msg = new Message('notification', length); msg.processId = this.parseInt32(buffer); msg.channel = this.parseCString(buffer); msg.payload = this.parseCString(buffer); return msg; }; -Connection.prototype.parseGH = function (msg) { - var buffer = this.buffer; +Connection.prototype.parseG = function (buffer, length) { + var msg = new Message('copyInResponse', length); + return this.parseGH(buffer, msg);; +}; + +Connection.prototype.parseH = function(buffer, length) { + var msg = new Message('copyOutResponse', length); + return this.parseGH(buffer, msg);; +}; + +Connection.prototype.parseGH = function (buffer, msg) { var isBinary = this.buffer[this.offset] !== 0; this.offset++; msg.binary = isBinary; @@ -605,6 +606,12 @@ Connection.prototype.parseGH = function (msg) { return msg; }; +Connection.prototype.parsed = function (buffer, length) { + var msg = new Message('copyData', length); + msg.chunk = this.readBytes(buffer, msg.length - 4); + return msg; +}; + Connection.prototype.parseInt32 = function(buffer) { var value = buffer.readInt32BE(this.offset, true); this.offset += 4; @@ -630,12 +637,5 @@ Connection.prototype.parseCString = function(buffer) { while(buffer[this.offset++] !== 0) { } return buffer.toString(this.encoding, start, this.offset - 1); }; - -Connection.prototype.parsed = function (msg) { - this.buffer = buffer; - //exclude length field - msg.chunk = this.readBytes(buffer, msg.length - 4); - return msg; -}; //end parsing methods module.exports = Connection;