@@ -312,6 +312,11 @@ Connection.prototype.readSslResponse = function() {
312
312
} ;
313
313
} ;
314
314
315
+ var Message = function ( name , length ) {
316
+ this . name = name ;
317
+ this . length = length ;
318
+ } ;
319
+
315
320
Connection . prototype . parseMessage = function ( ) {
316
321
var remaining = this . buffer . length - ( this . offset ) ;
317
322
if ( remaining < 5 ) {
@@ -335,105 +340,91 @@ Connection.prototype.parseMessage = function() {
335
340
return false ;
336
341
}
337
342
338
- var msg = {
339
- length : length
340
- } ;
343
+ var buffer = this . buffer ;
341
344
switch ( id )
342
345
{
343
346
344
347
case 0x52 : //R
345
- msg . name = 'authenticationOk' ;
346
- msg = this . parseR ( msg ) ;
348
+ msg = this . parseR ( buffer , length ) ;
347
349
break ;
348
350
349
351
case 0x53 : //S
350
- msg . name = 'parameterStatus' ;
351
- msg = this . parseS ( msg ) ;
352
+ msg = this . parseS ( buffer , length ) ;
352
353
break ;
353
354
354
355
case 0x4b : //K
355
- msg . name = 'backendKeyData' ;
356
- msg = this . parseK ( msg ) ;
356
+ msg = this . parseK ( buffer , length ) ;
357
357
break ;
358
358
359
359
case 0x43 : //C
360
- msg . name = 'commandComplete' ;
361
- msg = this . parseC ( msg ) ;
360
+ msg = this . parseC ( buffer , length ) ;
362
361
break ;
363
362
364
363
case 0x5a : //Z
365
- msg . name = 'readyForQuery' ;
366
- msg = this . parseZ ( msg ) ;
364
+ msg = this . parseZ ( buffer , length ) ;
367
365
break ;
368
366
369
367
case 0x54 : //T
370
- msg . name = 'rowDescription' ;
371
- msg = this . parseT ( msg ) ;
368
+ msg = this . parseT ( buffer , msg ) ;
372
369
break ;
373
370
374
371
case 0x44 : //D
375
372
msg = this . parseD ( buffer , length ) ;
376
373
break ;
377
374
378
375
case 0x45 : //E
379
- msg . name = 'error' ;
380
- msg = this . parseE ( msg ) ;
376
+ msg = this . parseE ( buffer , length ) ;
381
377
break ;
382
378
383
379
case 0x4e : //N
384
- msg . name = 'notice' ;
385
- msg = this . parseN ( msg ) ;
380
+ msg = this . parseN ( buffer , length ) ;
386
381
break ;
387
382
388
383
case 0x31 : //1
389
- msg . name = 'parseComplete' ;
384
+ msg = new Message ( 'parseComplete' , length ) ;
390
385
break ;
391
386
392
387
case 0x32 : //2
393
- msg . name = 'bindComplete' ;
388
+ msg = new Message ( 'bindComplete' , length ) ;
394
389
break ;
395
390
396
391
case 0x41 : //A
397
- msg . name = 'notification' ;
398
- msg = this . parseA ( msg ) ;
392
+ msg = this . parseA ( buffer , length ) ;
399
393
break ;
400
394
401
395
case 0x6e : //n
402
- msg . name = 'noData' ;
396
+ msg = new Message ( 'noData' , length ) ;
403
397
break ;
404
398
405
399
case 0x49 : //I
406
- msg . name = 'emptyQuery' ;
400
+ msg = new Message ( 'emptyQuery' , length ) ;
407
401
break ;
408
402
409
403
case 0x73 : //s
410
- msg . name = 'portalSuspended' ;
404
+ msg = new Message ( 'portalSuspended' , length ) ;
411
405
break ;
412
406
413
407
case 0x47 : //G
414
- msg . name = 'copyInResponse' ;
415
- msg = this . parseGH ( msg ) ;
408
+ msg = this . parseG ( buffer , length ) ;
416
409
break ;
417
410
418
411
case 0x48 : //H
419
- msg . name = 'copyOutResponse' ;
420
- msg = this . parseGH ( msg ) ;
412
+ msg = this . parseH ( buffer , length ) ;
421
413
break ;
422
414
case 0x63 : //c
423
- msg . name = 'copyDone' ;
415
+ msg = new Message ( 'copyDone' , length ) ;
424
416
break ;
425
417
426
418
case 0x64 : //d
427
- msg . name = 'copyData' ;
428
- msg = this . parsed ( msg ) ;
419
+ msg = this . parsed ( buffer , length ) ;
429
420
break ;
430
421
}
431
422
return msg ;
432
423
} ;
433
424
434
- Connection . prototype . parseR = function ( msg ) {
425
+ Connection . prototype . parseR = function ( buffer , length ) {
435
426
var code = 0 ;
436
- var buffer = this . buffer ;
427
+ var msg = new Message ( 'authenticationOk' , length ) ;
437
428
if ( msg . length === 8 ) {
438
429
code = this . parseInt32 ( buffer ) ;
439
430
if ( code === 3 ) {
@@ -454,34 +445,35 @@ Connection.prototype.parseR = function(msg) {
454
445
throw new Error ( "Unknown authenticatinOk message type" + util . inspect ( msg ) ) ;
455
446
} ;
456
447
457
- Connection . prototype . parseS = function ( msg ) {
458
- var buffer = this . buffer ;
448
+ Connection . prototype . parseS = function ( buffer , length ) {
449
+ var msg = new Message ( 'parameterStatus' , length ) ;
459
450
msg . parameterName = this . parseCString ( buffer ) ;
460
451
msg . parameterValue = this . parseCString ( buffer ) ;
461
452
return msg ;
462
453
} ;
463
454
464
- Connection . prototype . parseK = function ( msg ) {
465
- var buffer = this . buffer ;
455
+ Connection . prototype . parseK = function ( buffer , length ) {
456
+ var msg = new Message ( 'backendKeyData' , length ) ;
466
457
msg . processID = this . parseInt32 ( buffer ) ;
467
458
msg . secretKey = this . parseInt32 ( buffer ) ;
468
459
return msg ;
469
460
} ;
470
461
471
- Connection . prototype . parseC = function ( msg ) {
472
- var buffer = this . buffer ;
462
+ Connection . prototype . parseC = function ( buffer , length ) {
463
+ var msg = new Message ( 'commandComplete' , length ) ;
473
464
msg . text = this . parseCString ( buffer ) ;
474
465
return msg ;
475
466
} ;
476
467
477
- Connection . prototype . parseZ = function ( msg ) {
478
- var buffer = this . buffer ;
468
+ Connection . prototype . parseZ = function ( buffer , length ) {
469
+ var msg = new Message ( 'readyForQuery' , length ) ;
470
+ msg . name = 'readyForQuery' ;
479
471
msg . status = this . readString ( buffer , 1 ) ;
480
472
return msg ;
481
473
} ;
482
474
483
- Connection . prototype . parseT = function ( msg ) {
484
- var buffer = this . buffer ;
475
+ Connection . prototype . parseT = function ( buffer , length ) {
476
+ var msg = new Message ( 'rowDescription' , length ) ;
485
477
msg . fieldCount = this . parseInt16 ( buffer ) ;
486
478
var fields = [ ] ;
487
479
for ( var i = 0 ; i < msg . fieldCount ; i ++ ) {
@@ -512,11 +504,6 @@ Connection.prototype.parseField = function(buffer) {
512
504
return field ;
513
505
} ;
514
506
515
- var Message = function ( name , length ) {
516
- this . name = name ;
517
- this . length = length ;
518
- } ;
519
-
520
507
var DataRowMessage = function ( name , length , fieldCount ) {
521
508
this . name = name ;
522
509
this . length = length ;
@@ -544,10 +531,11 @@ Connection.prototype._readValue = function(buffer) {
544
531
} ;
545
532
546
533
//parses error
547
- Connection . prototype . parseE = function ( input ) {
534
+ Connection . prototype . parseE = function ( buffer , length ) {
548
535
var buffer = this . buffer ;
549
536
var fields = { } ;
550
537
var msg , item ;
538
+ var input = new Message ( 'error' , length ) ;
551
539
var fieldType = this . readString ( buffer , 1 ) ;
552
540
while ( fieldType != '\0' ) {
553
541
fields [ fieldType ] = this . parseCString ( buffer ) ;
@@ -582,18 +570,31 @@ Connection.prototype.parseE = function(input) {
582
570
} ;
583
571
584
572
//same thing, different name
585
- Connection . prototype . parseN = Connection . prototype . parseE ;
573
+ Connection . prototype . parseN = function ( buffer , length ) {
574
+ var msg = this . parseE ( msg ) ;
575
+ msg . name = 'notice' ;
576
+ return msg ;
577
+ }
586
578
587
- Connection . prototype . parseA = function ( msg ) {
588
- var buffer = this . buffer ;
579
+ Connection . prototype . parseA = function ( buffer , length ) {
580
+ var msg = new Message ( 'notification' , length ) ;
589
581
msg . processId = this . parseInt32 ( buffer ) ;
590
582
msg . channel = this . parseCString ( buffer ) ;
591
583
msg . payload = this . parseCString ( buffer ) ;
592
584
return msg ;
593
585
} ;
594
586
595
- Connection . prototype . parseGH = function ( msg ) {
596
- var buffer = this . buffer ;
587
+ Connection . prototype . parseG = function ( buffer , length ) {
588
+ var msg = new Message ( 'copyInResponse' , length ) ;
589
+ return this . parseGH ( buffer , msg ) ; ;
590
+ } ;
591
+
592
+ Connection . prototype . parseH = function ( buffer , length ) {
593
+ var msg = new Message ( 'copyOutResponse' , length ) ;
594
+ return this . parseGH ( buffer , msg ) ; ;
595
+ } ;
596
+
597
+ Connection . prototype . parseGH = function ( buffer , msg ) {
597
598
var isBinary = this . buffer [ this . offset ] !== 0 ;
598
599
this . offset ++ ;
599
600
msg . binary = isBinary ;
@@ -605,6 +606,12 @@ Connection.prototype.parseGH = function (msg) {
605
606
return msg ;
606
607
} ;
607
608
609
+ Connection . prototype . parsed = function ( buffer , length ) {
610
+ var msg = new Message ( 'copyData' , length ) ;
611
+ msg . chunk = this . readBytes ( buffer , msg . length - 4 ) ;
612
+ return msg ;
613
+ } ;
614
+
608
615
Connection . prototype . parseInt32 = function ( buffer ) {
609
616
var value = buffer . readInt32BE ( this . offset , true ) ;
610
617
this . offset += 4 ;
@@ -630,12 +637,5 @@ Connection.prototype.parseCString = function(buffer) {
630
637
while ( buffer [ this . offset ++ ] !== 0 ) { }
631
638
return buffer . toString ( this . encoding , start , this . offset - 1 ) ;
632
639
} ;
633
-
634
- Connection . prototype . parsed = function ( msg ) {
635
- this . buffer = buffer ;
636
- //exclude length field
637
- msg . chunk = this . readBytes ( buffer , msg . length - 4 ) ;
638
- return msg ;
639
- } ;
640
640
//end parsing methods
641
641
module . exports = Connection ;
0 commit comments