[bugfix]667855 - Fix handling of oracle raw data types sanely.
authorVeerapuram Varadhan <vvaradhan@gmail.com>
Mon, 14 Feb 2011 19:51:28 +0000 (01:21 +0530)
committerVeerapuram Varadhan <vvaradhan@gmail.com>
Mon, 14 Feb 2011 20:00:56 +0000 (01:30 +0530)
mcs/class/System.Data.OracleClient/System.Data.OracleClient/ChangeLog
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleParameter.cs

index 4d1b27677ea62ac89b9e214bb10109f4d07ddc36..95ff6319490152550d4d4981877e7a1bcb2841e3 100644 (file)
@@ -1,3 +1,10 @@
+2010-02-14  Veerapuram Varadhan  <vvaradhan@novell.com>
+
+       ** Fixes 667855
+       * OracleParameter.cs (InferSize): For Raw types, use the appropriate 
+       methods to convert value to bytearray and use them to bind.
+       (Bind): Fix index parameters in call to Array.ConstrainedCopy. 
+       
 2010-01-30  Veerapuram Varadhan  <vvaradhan@novell.com>
 
        ** Fixes #667236 - Based on patch by Kalyanov.Dmitry@gmail.com
index 8979761a29bc018918a11e772ee3a63dedf7a39f..c5973ff2712de2023903f343fa945e05ab79bd7f 100644 (file)
@@ -763,7 +763,11 @@ namespace System.Data.OracleClient
                                        if (direction == ParameterDirection.Input || 
                                                direction == ParameterDirection.InputOutput) {
                                                byteCount = 0;
-                                               byte[] val = v as byte[];
+                                               byte[] val;
+                                               if (dbType == DbType.Guid)
+                                                       val = ((Guid)v).ToByteArray();
+                                               else
+                                                       val = v as byte[];
                                                if (val.Length > 0) {   
                                                        byteCount = val.Length;
                                                        // LONG VARRAW prepends a 4-byte length
@@ -771,7 +775,7 @@ namespace System.Data.OracleClient
                                                                byteArrayLen = BitConverter.GetBytes ((ushort) byteCount);
                                                                bytes[0] = byteArrayLen[0];
                                                                bytes[1] = byteArrayLen[1];
-                                                               Array.ConstrainedCopy (val, 2, bytes, 0, byteCount);
+                                                               Array.ConstrainedCopy (val, 0, bytes, 2, byteCount);
                                                        }
                                                }
                                        }
@@ -795,7 +799,7 @@ namespace System.Data.OracleClient
                                                                bytes[1] = byteArrayLen[1];
                                                                bytes[2] = byteArrayLen[2];
                                                                bytes[3] = byteArrayLen[3];
-                                                               Array.ConstrainedCopy (val, 4, bytes, 0, byteCount);
+                                                               Array.ConstrainedCopy (val, 0, bytes, 4, byteCount);
                                                        }
                                                }
                                        }
@@ -1022,6 +1026,12 @@ namespace System.Data.OracleClient
                        case OciDataType.RSet: // REF CURSOR
                                newSize = -1;
                                break;
+                       case OciDataType.Raw:
+                               if (dbType == DbType.Guid)
+                                       newSize = ((Guid)value).ToByteArray().Length;
+                               else
+                                       newSize = (value as byte[]).Length;
+                               break;
                        default:
                                if (value == null || value == DBNull.Value)
                                        newSize = 0;
@@ -1107,6 +1117,7 @@ namespace System.Data.OracleClient
                private void SetOracleType (OracleType type, bool inferring)
                {
                        FreeHandle ();
+                       Type valType = value.GetType ();
                        string exception = String.Format ("No mapping exists from OracleType {0} to a known DbType.", type);
                        switch (type) {
                        case OracleType.BFile:
@@ -1116,7 +1127,10 @@ namespace System.Data.OracleClient
                                break;
                        case OracleType.LongRaw:
                        case OracleType.Raw:
-                               dbType = DbType.Binary;
+                               if (valType.FullName == "System.Guid")
+                                       dbType = DbType.Guid;
+                               else
+                                       dbType = DbType.Binary;
                                ociType = OciDataType.Raw;
                                break;
                        case OracleType.Byte: