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