[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; } |