[pgsqlclient-checkins] pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient PgDbClient.cs,1.1
Status: Inactive
Brought to you by:
carlosga_fb
Update of /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient
In directory sc8-pr-cvs1:/tmp/cvs-serv7360
Modified Files:
PgDbClient.cs PgOutputPacket.cs PgResponsePacket.cs
PgStatement.cs
Log Message:
* Added some improvements to TLS connections.
* Fixed some problems in Database Schema support.
Index: PgDbClient.cs
===================================================================
RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgDbClient.cs,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** PgDbClient.cs 15 Sep 2003 11:56:19 -0000 1.12
--- PgDbClient.cs 15 Sep 2003 21:33:45 -0000 1.13
***************
*** 229,281 ****
PgResponsePacket responsePacket = null;
- if (buffer.Length == 0 || buffer.EOF)
- {
- buffer = new PgResponsePacket(receive.ReadBytes());
- }
-
- // Seems that in TLS mode PostgreSQL sends messages with length 0
- // if we have a packet like this we will return an empty packet in
- // response
- if (buffer.Length == 0)
- {
- return new PgResponsePacket('\0', new byte[0]{});
- }
-
lock (this)
{
! char type = buffer.ReadChar();
!
! if (sslRequest.Length == 0 || !sslRequest[0])
{
! int length = buffer.ReadInt() - 4;
! if (length > (buffer.Length - buffer.Position))
! {
! PgOutputPacket w = new PgOutputPacket();
! w.Write(buffer.ReadBytes(length));
! while (true)
! {
! byte[] b = receive.ReadBytes();
! w.Write(b);
!
! if (b.Length != 0)
! {
! break;
! }
! }
!
! buffer.Reset();
! buffer = new PgResponsePacket(w.GetBytes());
! w.Reset();
! }
! responsePacket = new PgResponsePacket(type, buffer.ReadBytes(length));
}
else
{
! responsePacket = new PgResponsePacket(type, new byte[0]{});
}
- responsePacket.Encoding = Settings.Encoding;
! switch (type)
{
case PgBackendCodes.ERROR_RESPONSE:
--- 229,250 ----
PgResponsePacket responsePacket = null;
lock (this)
{
! bool isSslRequest = false;
! if (sslRequest.Length != 0)
{
! isSslRequest = sslRequest[0];
! }
! if (settings.SSL)
! {
! responsePacket = this.receiveTLSPacket(isSslRequest);
}
else
{
! responsePacket = this.receiveStandardPacket(isSslRequest);
}
! switch (responsePacket.Message)
{
case PgBackendCodes.ERROR_RESPONSE:
***************
*** 308,311 ****
--- 277,362 ----
return responsePacket;
+ }
+
+ private PgResponsePacket receiveStandardPacket(bool isSslRequest)
+ {
+ PgResponsePacket responsePacket = null;
+
+ int length = 0;
+ char type = this.receive.ReadChar();
+ if (!isSslRequest)
+ {
+ length = IPAddress.HostToNetworkOrder(this.receive.ReadInt32()) - 4;
+ }
+ if (isSslRequest || length == 0)
+ {
+ responsePacket = new PgResponsePacket(type, new byte[0]{});
+ }
+ else
+ {
+ responsePacket = new PgResponsePacket(type,
+ this.receive.ReadBytes(length));
+ }
+ responsePacket.Encoding = Settings.Encoding;
+
+ return responsePacket;
+ }
+
+ private PgResponsePacket receiveTLSPacket(bool isSslRequest)
+ {
+ PgResponsePacket responsePacket = null;
+ if (buffer.Length == 1 ||
+ buffer.Pending < 4 ||
+ buffer.EOF)
+ {
+ updateBuffer();
+ }
+
+ // Seems that in TLS mode PostgreSQL sends messages with length 0
+ // if we have a packet like this we will return an empty packet in
+ // response
+ if (buffer.Length == 0)
+ {
+ return new PgResponsePacket(' ', new byte[0]{});
+ }
+
+ char type = buffer.ReadChar();
+ if (isSslRequest)
+ {
+ responsePacket = new PgResponsePacket(type, new byte[0]{});
+ }
+ else
+ {
+ int length = buffer.ReadInt() - 4;
+ while (length > buffer.Pending)
+ {
+ this.updateBuffer();
+ }
+ responsePacket = new PgResponsePacket(type, buffer.ReadBytes(length));
+ }
+ responsePacket.Encoding = Settings.Encoding;
+
+ return responsePacket;
+ }
+
+ private void updateBuffer()
+ {
+ PgOutputPacket w = new PgOutputPacket();
+ w.Write(buffer.ReadBytes((int)buffer.Pending));
+ while (true)
+ {
+ byte[] b = receive.ReadBytes();
+ w.Write(b);
+
+ if (b.Length != 0)
+ {
+ break;
+ }
+ }
+
+ buffer.Reset();
+ buffer = new PgResponsePacket(w.GetBytes());
+
+ w.Reset();
}
Index: PgOutputPacket.cs
===================================================================
RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgOutputPacket.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** PgOutputPacket.cs 15 Aug 2003 17:50:09 -0000 1.2
--- PgOutputPacket.cs 15 Sep 2003 21:33:45 -0000 1.3
***************
*** 39,43 ****
{
get { return ((MemoryStream)BaseStream).Position; }
! set { ((MemoryStream)BaseStream).Position = value; }
}
--- 39,47 ----
{
get { return ((MemoryStream)BaseStream).Position; }
! }
!
! public long Length
! {
! get { return ((MemoryStream)BaseStream).Length; }
}
Index: PgResponsePacket.cs
===================================================================
RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgResponsePacket.cs,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** PgResponsePacket.cs 14 Sep 2003 14:43:01 -0000 1.3
--- PgResponsePacket.cs 15 Sep 2003 21:33:45 -0000 1.4
***************
*** 74,77 ****
--- 74,82 ----
}
+ public long Pending
+ {
+ get { return Length - Position; }
+ }
+
#endregion
Index: PgStatement.cs
===================================================================
RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgStatement.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** PgStatement.cs 15 Sep 2003 12:21:15 -0000 1.5
--- PgStatement.cs 15 Sep 2003 21:33:45 -0000 1.6
***************
*** 357,361 ****
{
response = db.ReceiveResponsePacket();
! processSqlPacket(response);
}
--- 357,361 ----
{
response = db.ReceiveResponsePacket();
! processSqlPacket(response);
}
***************
*** 405,410 ****
// Receive response
! PgResponsePacket response = db.ReceiveResponsePacket();
! processSqlPacket(response);
// Update status
--- 405,414 ----
// Receive response
! PgResponsePacket response = new PgResponsePacket();
! while (response.Message != PgBackendCodes.READY_FOR_QUERY)
! {
! response = db.ReceiveResponsePacket();
! processSqlPacket(response);
! }
// Update status
***************
*** 685,691 ****
private void processDataRow(PgResponsePacket packet)
{
! int fieldCount = packet.ReadShort();
!
! object[] values = new object[fieldCount];
for (int i = 0; i < values.Length; i++)
--- 689,694 ----
private void processDataRow(PgResponsePacket packet)
{
! int fieldCount = packet.ReadShort();
! object[] values = new object[fieldCount];
for (int i = 0; i < values.Length; i++)
***************
*** 704,709 ****
default:
values[i] = packet.ReadValue(
! rowDescriptor.Fields[i].DataType,
! length);
break;
}
--- 707,712 ----
default:
values[i] = packet.ReadValue(
! rowDescriptor.Fields[i].DataType,
! length);
break;
}
|