Skip to content

Commit 6764af3

Browse files
committed
sped up parser ~70% (http://jsperf.com/case-v-method)
1 parent 75da13a commit 6764af3

File tree

1 file changed

+68
-22
lines changed

1 file changed

+68
-22
lines changed

lib/connection.js

Lines changed: 68 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -189,37 +189,19 @@ p.setBuffer = function(buffer) {
189189
this.offset = 0;
190190
};
191191

192-
var messageNames = {
193-
R: 'authenticationOk',
194-
S: 'parameterStatus',
195-
K: 'backendKeyData',
196-
C: 'commandComplete',
197-
Z: 'readyForQuery',
198-
T: 'rowDescription',
199-
D: 'dataRow',
200-
E: 'error',
201-
N: 'notice',
202-
1: 'parseComplete',
203-
2: 'bindComplete',
204-
A: 'notification',
205-
n: 'noData',
206-
I: 'emptyQuery'
207-
};
208-
209192
p.parseMessage = function() {
210193
var remaining = this.buffer.length - (this.offset);
211194
if(remaining < 5) {
212195
//cannot read id + length without at least 5 bytes
213196
//just abort the read now
214197
this.lastBuffer = this.buffer;
215198
this.lastOffset = this.offset;
216-
return;
199+
return false;
217200
}
218201

219-
var id = this.readChar();
202+
var messageType = this.buffer[this.offset++];
220203

221204
var message = {
222-
name: messageNames[id],
223205
length: this.parseInt32()
224206
};
225207

@@ -229,8 +211,72 @@ p.parseMessage = function() {
229211
this.lastOffset = this.offset-5;
230212
return false;
231213
}
232-
233-
return this["parse"+id](message);
214+
215+
switch(messageType)
216+
{
217+
218+
case 0x52: //R
219+
message.name = 'authenticationOk';
220+
return this.parseR(message);
221+
222+
case 0x53: //S
223+
message.name = 'parameterStatus';
224+
return this.parseS(message);
225+
226+
case 0x4b: //K
227+
message.name = 'backendKeyData';
228+
return this.parseK(message);
229+
230+
case 0x43: //C
231+
message.name = 'commandComplete';
232+
return this.parseC(message);
233+
234+
case 0x5a: //Z
235+
message.name = 'readyForQuery';
236+
return this.parseZ(message);
237+
238+
case 0x54: //T
239+
message.name = 'rowDescription';
240+
return this.parseT(message);
241+
242+
case 0x44: //D
243+
message.name = 'dataRow';
244+
return this.parseD(message);
245+
246+
case 0x45: //E
247+
message.name = 'error';
248+
return this.parseE(message);
249+
250+
case 0x4e: //N
251+
message.name = 'notice';
252+
return this.parseN(message);
253+
254+
case 0x31: //1
255+
message.name = 'parseComplete';
256+
return this.parse1(message);
257+
258+
case 0x32: //2
259+
message.name = 'bindComplete';
260+
return this.parse2(message);
261+
262+
case 0x41: //A
263+
message.name = 'notification';
264+
return this.parseA(message);
265+
266+
case 0x6e: //n
267+
message.name = 'noData';
268+
return this.parsen(message);
269+
270+
case 0x49: //I
271+
message.name = 'emptyQuery';
272+
return this.parseI(message);
273+
274+
default:
275+
throw new Error("Unrecognized message code " + messageType);
276+
}
277+
278+
279+
234280
};
235281

236282
p.parseR = function(msg) {

0 commit comments

Comments
 (0)