Thread: [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-serv25243 Modified Files: PgDbClient.cs PgOutputPacket.cs PgResponsePacket.cs PgStatement.cs Log Message: * Added support for array parameters ( not finished needs testing ). Index: PgDbClient.cs =================================================================== RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgDbClient.cs,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** PgDbClient.cs 17 Sep 2003 14:45:43 -0000 1.15 --- PgDbClient.cs 19 Sep 2003 17:04:39 -0000 1.16 *************** *** 668,673 **** types.Add(829 , "macaddr" , DbType.String , Type.GetType("System.String") , 0, 0, 6, false); types.Add(869 , "inet" , DbType.String , Type.GetType("System.String") , 0, 0, 0, false); ! types.Add(1005 , "_int2" , DbType.Object , Type.GetType("System.Array") , 21, 1, 0, false); ! types.Add(1007 , "_int4" , DbType.Object , Type.GetType("System.Array") , 23, 1, 0, false); types.Add(1009 , "_text" , DbType.Object , Type.GetType("System.Array") , 25, 1, 0, false); types.Add(1021 , "_float4" , DbType.Object , Type.GetType("System.Array") , 700, 1, 4, false); --- 668,673 ---- types.Add(829 , "macaddr" , DbType.String , Type.GetType("System.String") , 0, 0, 6, false); types.Add(869 , "inet" , DbType.String , Type.GetType("System.String") , 0, 0, 0, false); ! types.Add(1005 , "_int2" , DbType.Object , Type.GetType("System.Array") , 21, 1, 2, false); ! types.Add(1007 , "_int4" , DbType.Object , Type.GetType("System.Array") , 23, 1, 4, false); types.Add(1009 , "_text" , DbType.Object , Type.GetType("System.Array") , 25, 1, 0, false); types.Add(1021 , "_float4" , DbType.Object , Type.GetType("System.Array") , 700, 1, 4, false); Index: PgOutputPacket.cs =================================================================== RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgOutputPacket.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PgOutputPacket.cs 15 Sep 2003 21:33:45 -0000 1.3 --- PgOutputPacket.cs 19 Sep 2003 17:04:39 -0000 1.4 *************** *** 146,150 **** int size = parameter.DataType.Size; ! if (parameter.Value == System.DBNull.Value || parameter.Value == null) { // -1 indicates a NULL argument value --- 146,151 ---- int size = parameter.DataType.Size; ! if (parameter.Value == System.DBNull.Value || ! parameter.Value == null) { // -1 indicates a NULL argument value *************** *** 153,234 **** else { ! // Write parameter value ! switch (parameter.DataType.DbType) { ! case DbType.Binary: ! Write((byte[])parameter.Value); ! break; ! case DbType.Byte: ! WriteInt(size); ! Write((byte)parameter.Value); ! break; ! case DbType.Int16: ! WriteInt(size); ! WriteShort(Convert.ToInt16(parameter.Value)); ! break; ! case DbType.Int32: ! WriteInt(size); ! WriteInt(Convert.ToInt32(parameter.Value)); ! break; ! case DbType.Int64: ! WriteInt(size); ! WriteLong(Convert.ToInt64(parameter.Value)); ! break; ! case DbType.Decimal: { ! /* ! WriteInt(size); ! Write(Convert.ToDecimal(parameter.Value)); ! */ ! string paramValue = parameter.Value.ToString(); ! WriteInt(encoding.GetByteCount(paramValue)); ! Write(paramValue.ToCharArray()); } break; ! case DbType.Double: ! WriteInt(size); ! WriteDouble(Convert.ToDouble(parameter.Value)); ! break; ! ! case DbType.Single: ! WriteInt(size); ! WriteFloat(Convert.ToSingle(parameter.Value)); ! break; ! case DbType.Currency: ! WriteInt(size); ! WriteInt(Convert.ToInt32(Convert.ToSingle(parameter.Value)*100)); ! break; ! case DbType.Date: ! WriteInt(size); ! WriteDate((DateTime)parameter.Value); ! break; ! case DbType.DateTime: ! WriteInt(size); ! WriteTimestamp((DateTime)parameter.Value); ! break; ! case DbType.Time: ! WriteInt(size); ! WriteTime((DateTime)parameter.Value); ! break; ! case DbType.String: ! case DbType.StringFixedLength: ! { ! string paramValue = parameter.Value.ToString(); ! WriteInt(encoding.GetByteCount(paramValue + PgCodes.NULL_TERMINATOR)); ! WriteString(paramValue); ! } break; } } } --- 154,282 ---- else { ! if (parameter.DataType.DbType == DbType.Object) { ! // Handle this type as Array values ! System.Array array = (System.Array)parameter.Value; ! ! // Get array elements type info ! PgType elementType = PgDbClient.Types[parameter.DataType.ArrayType]; ! size = elementType.Size; ! // Create a new packet for write array parameter information ! PgOutputPacket packet = new PgOutputPacket(); ! // Write the number of dimensions ! packet.WriteInt(array.Rank); ! // Write flags (always 0) ! packet.WriteInt(0); ! // Write base type of the array elements ! packet.WriteInt(parameter.DataType.ArrayType); ! // Write lengths and lower bounds ! for (int i = 0; i < array.Rank; i ++) { ! packet.WriteInt(array.GetLength(i)); ! packet.WriteInt(array.GetLowerBound(i) + 1); ! } ! ! // Write array values (at this moment only for first dimension) ! for (int i = array.GetLowerBound(0); i < array.GetLength(0); i++) ! { ! this.writeParameter(packet, elementType.DbType, size, array.GetValue(i)); } + + // Write parameter size + this.WriteInt(packet.GetByteCount()); + // Write parameter data + this.Write(packet.GetBytes()); + } + else + { + writeParameter(this, parameter.DataType.DbType, size, parameter.Value); + } + } + } + + #endregion + + #region PRIVATE_METHODS + + private void writeParameter(PgOutputPacket packet, DbType dbType, int size, object value) + { + switch (dbType) + { + case DbType.Binary: + packet.WriteInt(((byte[])value).Length); + packet.Write((byte[])value); break; ! case DbType.Byte: ! packet.WriteInt(size); ! packet.Write((byte)value); ! break; ! case DbType.Int16: ! packet.WriteInt(size); ! packet.WriteShort(Convert.ToInt16(value)); ! break; ! case DbType.Int32: ! packet.WriteInt(size); ! packet.WriteInt(Convert.ToInt32(value)); ! break; ! case DbType.Int64: ! packet.WriteInt(size); ! packet.WriteLong(Convert.ToInt64(value)); ! break; ! case DbType.Decimal: ! { ! string paramValue = value.ToString(); ! packet.WriteInt(encoding.GetByteCount(paramValue)); ! packet.Write(paramValue.ToCharArray()); ! } ! break; ! case DbType.Double: ! packet.WriteInt(size); ! packet.WriteDouble(Convert.ToDouble(value)); ! break; ! ! case DbType.Single: ! packet.WriteInt(size); ! packet.WriteFloat(Convert.ToSingle(value)); break; + + case DbType.Currency: + packet.WriteInt(size); + packet.WriteInt(Convert.ToInt32(Convert.ToSingle(value)*100)); + break; + + case DbType.Date: + packet.WriteInt(size); + packet.WriteDate((DateTime)value); + break; + + case DbType.DateTime: + packet.WriteInt(size); + packet.WriteTimestamp((DateTime)value); + break; + + case DbType.Time: + packet.WriteInt(size); + packet.WriteTime((DateTime)value); + break; + + case DbType.String: + case DbType.StringFixedLength: + { + string paramValue = value.ToString(); + packet.WriteInt(encoding.GetByteCount(paramValue + PgCodes.NULL_TERMINATOR)); + packet.WriteString(paramValue); } + break; } } Index: PgResponsePacket.cs =================================================================== RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgResponsePacket.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** PgResponsePacket.cs 15 Sep 2003 21:33:45 -0000 1.4 --- PgResponsePacket.cs 19 Sep 2003 17:04:39 -0000 1.5 *************** *** 173,182 **** public float ReadMoney() { - /* - FloatLayout floatValue = new FloatLayout(); - - floatValue.f = base.ReadSingle(); - floatValue.i0 = IPAddress.HostToNetworkOrder(floatValue.i0); - */ float val = (float)ReadInt(); --- 173,176 ---- *************** *** 231,234 **** --- 225,229 ---- int[] lowerBounds; + // Read te number of dimensions int ndims = ReadInt(); *************** *** 236,245 **** lowerBounds = new int[ndims]; ! int flags = ReadInt(); if (flags != 0) { throw new NotSupportedException("Invalid flags value"); } elementType = PgDbClient.Types[ReadInt()]; for (int i = 0; i < ndims; i++) { --- 231,242 ---- lowerBounds = new int[ndims]; ! int flags = ReadInt(); if (flags != 0) { throw new NotSupportedException("Invalid flags value"); } + // Read array element type elementType = PgDbClient.Types[ReadInt()]; + // Read array lengths and lower bounds for (int i = 0; i < ndims; i++) { *************** *** 250,253 **** --- 247,251 ---- data = Array.CreateInstance(elementType.SystemType, lengths, lowerBounds); + // Read array data byte[] sourceArray = decodeArrayData(elementType, data.Length, length); *************** *** 310,322 **** case DbType.Decimal: - /* - Data sent by PostgreSQL In binary mode - short ndigits = ReadShort(); - short weight = ReadShort(); - short sign = ReadShort(); - short dscale = ReadShort(); - short[] digits = new short[ndigits]; - */ - string numericValue = ReadString(length); return Decimal.Parse(numericValue, NumberFormatInfo.InvariantInfo); --- 308,311 ---- *************** *** 393,397 **** { byte[] elementData = null; ! int elementLen = ReadInt(); switch (type.DbType) --- 382,386 ---- { byte[] elementData = null; ! int elementLen = ReadInt(); switch (type.DbType) Index: PgStatement.cs =================================================================== RCS file: /cvsroot/pgsqlclient/pgsqlclient_10/PostgreSql.Data.PgSqlClient/source/NPgClient/PgStatement.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** PgStatement.cs 15 Sep 2003 21:33:45 -0000 1.6 --- PgStatement.cs 19 Sep 2003 17:04:39 -0000 1.7 *************** *** 284,288 **** --- 284,290 ---- PgOutputPacket packet = new PgOutputPacket(db.Settings.Encoding); + // Destination portal name packet.WriteString(PortalName); + // Prepared statement name packet.WriteString(ParseName); |