Skip to content

Commit

Permalink
Removed 'Messages' submodule, split everything to encoder and decoder
Browse files Browse the repository at this point in the history
  • Loading branch information
Frans-Willem committed Aug 26, 2010
1 parent ab05634 commit e2aa3a8
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 69 deletions.
20 changes: 9 additions & 11 deletions lib/PostgresClient.js
Expand Up @@ -8,9 +8,7 @@ var sys=require("sys"),
PostgresReader=require("./PostgresReader").PostgresReader,
BufferQueueReader=require("bufferlib/BufferQueueReader").BufferQueueReader,
EventEmitter=require("events").EventEmitter,
Constants=require("./PostgresConstants"),
Messages=require("./PostgresMessages");

Constants=require("./PostgresConstants");
/*
TODO:
- Handle Asynchronous messages (46.2.6)
Expand All @@ -29,7 +27,7 @@ function createPostgresConnectHandler(self) {
}
var reader,authType,output;
if (type===Constants.MessageTypes.Backend.ErrorResponse) {
throw Messages.DecodeErrorResponse(data);
throw (new PostgresReader(data)).popErrorResponse();
} else if (type===Constants.MessageTypes.Backend.Authentication) {
reader=new PostgresReader(data);
authType=reader.popIntBE(4);
Expand Down Expand Up @@ -267,7 +265,7 @@ function createQueryHandler(rowinfoCallback,rowCallback,commandCallback,finalCal
if (type===Constants.MessageTypes.Backend.ErrorResponse) {
if (!returned) {
returned=true;
finalCallback(Messages.DecodeErrorResponse(data));
finalCallback((new PostgresReader(data)).popErrorResponse());
}
} else if (
type===Constants.MessageTypes.Backend.ParseComplete ||
Expand All @@ -276,15 +274,15 @@ function createQueryHandler(rowinfoCallback,rowCallback,commandCallback,finalCal
{
//Ignore these
} else if (type===Constants.MessageTypes.Backend.RowDescription) {
latestRowInfo=Messages.DecodeRowDescription(data);
latestRowInfo=(new PostgresReader(data)).popRowDescription();
if (rowinfoCallback) {
rowinfoCallback(latestRowInfo);
}
if (!rowCallback) {
savedArgs.push(latestRows=[]);
}
} else if (type===Constants.MessageTypes.Backend.DataRow) {
var p=Messages.DecodeDataRow(data);
var p=(new PostgresReader(data)).popDataRow();
if (rowCallback) {
rowCallback((latestRowInfo && !rowinfoCallback)?parseDataRow(p,latestRowInfo):p.map(String));
} else {
Expand All @@ -294,7 +292,7 @@ function createQueryHandler(rowinfoCallback,rowCallback,commandCallback,finalCal
latestRows.push(latestRowInfo?parseDataRow(p,latestRowInfo):p.map(String));
}
} else if (type===Constants.MessageTypes.Backend.CommandComplete) {
temp=Messages.DecodeCommandComplete(data);
temp=(new PostgresReader(data)).popCommandComplete();
if (commandCallback) {
commandCallback(temp);
} else {
Expand Down Expand Up @@ -360,7 +358,7 @@ function createParseHandler(finalCallback,name) {
case Constants.MessageTypes.Backend.ErrorResponse:
if (!returned) {
returned=true;
finalCallback(Messages.DecodeErrorResponse(data));
finalCallback((new PostgresReader(data)).popErrorResponse());
}
return false;
case Constants.MessageTypes.Backend.ParseComplete:
Expand Down Expand Up @@ -413,7 +411,7 @@ function createCloseHandler(finalCallback) {
case Constants.MessageTypes.Backend.ErrorResponse:
if (!returned) {
returned=true;
finalCallback(Messages.DecodeErrorResponse(data));
finalCallback((new PostgresReader(data)).popErrorResponse());
}
return false;
case Constants.MessageTypes.Backend.CloseComplete:
Expand Down Expand Up @@ -524,7 +522,7 @@ PostgresClient.prototype.end=function() {
//Graceful exit?
this.closing=true;
if (this.connected) {
this.socket.write(Messages.Terminate());
this.socket.write(PostgresEncoder.create().pushTerminate().toBuffer());
this.socket.end();
} else {
this.socket.end();
Expand Down
1 change: 1 addition & 0 deletions lib/PostgresConstants.js
Expand Up @@ -82,6 +82,7 @@ exports.AuthenticationTypes={
MD5Password: 5,
SCMCredential: 6,
GSS: 7,
GSSContinue: 8,
SSPI: 9
};
exports.AuthenticationTypesLookup=CreateLookup(exports.AuthenticationTypes);
Expand Down
55 changes: 0 additions & 55 deletions lib/PostgresMessages.js

This file was deleted.

140 changes: 137 additions & 3 deletions lib/PostgresReader.js
@@ -1,5 +1,6 @@
var BufferReader=require("bufferlib/BufferReader").BufferReader;
var sys=require("sys");
var BufferReader=require("bufferlib/BufferReader").BufferReader,
Constants=require("./PostgresConstants"),
sys=require("sys");

function PostgresReader(buffer) {
BufferReader.call(this,buffer);
Expand All @@ -12,4 +13,137 @@ PostgresReader.prototype.popMultiStringZero=function(encoding) {
while ((cur=this.popStringZero(encoding)).length>0)
ret.push(cur);
return ret;
}
};
PostgresReader.prototype.popAuthentication=function() {
var ret={},
type=ret.type=this.popIntBE(4);
ret.typeName=Constants.AuthenticationTypesLookup[type];
switch (type) {
case Constants.AuthenticationTypes.Ok:
case Constants.AuthenticationTypes.KerberosV5:
case Constants.AuthenticationTypes.CleartextPassword:
case Constants.AuthenticationTypes.SCMCredential:
case Constants.AuthenticationTypes.GSS:
case Constants.AuthenticationTypes.SSPI:
break;
case Constants.AuthenticationTypes.MD5Password:
ret.salt=this.popBuffer(4);
break;
case Constants.AuthenticationTypes.GSSContinue:
ret.data=this.popBuffer(this.length);
break;
}
return ret;
};
PostgresReader.prototype.popBackendKeyData=function() {
return {
pid: this.popIntBE(4),
key: this.popIntBE(4)
};
};
//BindComplete
//CloseComplete
PostgresReader.prototype.popCommandComplete=function(encoding) {
return this.popStringZero(encoding);
};
//CopyData
//CopyDone
PostgresReader.prototype.popCopyInResponse=function() {
var numcolumns,ret={
format: this.popByte(),
columns: []
};
numcolumns=this.popIntBE(2);
while (numcolumns--) {
ret.columns.push(this.popIntBE(2));
}
return ret;
};
PostgresReader.prototype.popCopyOutResponse=PostgresReader.prototype.popCopyInResponse;
PostgresReader.prototype.popDataRow=function() {
var ret=[],cols=this.popIntBE(2),len;
while (cols--) {
len=this.popIntBE(4);
if (len>>0 === -1) {
ret.push(null);
} else {
ret.push(this.popBuffer(len));
}
}
return ret;
};
PostgresReader.prototype.popErrorResponse=function() {
var fields={},type,value;
while ((type = this.popByte())!==0) {
type=Constants.MessageFieldsLookup[type];
value=this.popStringZero('utf8');
if (type) {
fields[type]=value;
}
}
var e=new Error(fields.Message);
Object.keys(fields).forEach(function(k) {
e[k]=fields[k];
});
return e;
};
//EmptyQueryResponse
PostgresReader.prototype.popFunctionCallResponse=function() {
var len=this.popIntBE(4);
if (len>>0 === -1) {
return null;
} else {
return this.popBuffer(len);
}
}
//NoData: Byte1('B'),
PostgresReader.prototype.popNoticeResponse=function() {
var fields={},type,value;
while ((type = this.popByte())!==0) {
type=Constants.MessageFieldsLookup[type];
value=this.popStringZero('utf8');
if (type) {
fields[type]=value;
}
}
return fields;
};
PostgresReader.prototype.popNotificationResponse=function(encoding) {
return {
pid: this.popIntBE(4),
name: this.popStringZero(encoding),
payload: this.popStringZero(encoding)
};
};
PostgresReader.prototype.popParameterDescription=function() {
var ret=[],cols=this.popIntBE(2);
while (cols--) {
ret.push(this.popIntBE(4));
}
return ret;
};
PostgresReader.prototype.popParameterStatus=function(encoding) {
return {
name: this.popStringZero(encoding),
value: this.popStringZero(encoding)
};
};
//ParseComplete
//PortalSuspend
//ReadyForQuery
PostgresReader.prototype.popRowDescription=function() {
var nFields=this.popIntBE(2),
fields=[];
while (nFields--) {
fields.push({
fieldName: this.popStringZero('utf8'),
tableOID: this.popIntBE(4),
columnAttribute: this.popIntBE(2),
datatypeOID: this.popIntBE(4),
datatypesize: this.popIntBE(2),
typemodifier: this.popIntBE(4),
formatcode: this.popIntBE(2)
});
}
return fields;
};

0 comments on commit e2aa3a8

Please sign in to comment.