2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Npgsql / NpgsqlTypes / NpgsqlTypesHelper.cs
index a709eee6c4b424ae80745b932333855e65c693b9..0547242168f94eae38f6e76cabc79ff34bf5f533 100755 (executable)
@@ -160,14 +160,15 @@ namespace NpgsqlTypes
 
                 NativeTypeMapping = new NpgsqlNativeTypeMapping();
 
-                NativeTypeMapping.AddType("text", NpgsqlDbType.Text, DbType.String, true,
-                new ConvertNativeToBackendHandler(BasicNativeToBackendTypeConverter.ToString));
+                NativeTypeMapping.AddType("text", NpgsqlDbType.Text, DbType.String, true, null);
 
                 NativeTypeMapping.AddDbTypeAlias("text", DbType.StringFixedLength);
                 NativeTypeMapping.AddDbTypeAlias("text", DbType.AnsiString);
                 NativeTypeMapping.AddDbTypeAlias("text", DbType.AnsiStringFixedLength);
                 NativeTypeMapping.AddTypeAlias("text", typeof(String));
 
+               NativeTypeMapping.AddType("varchar", NpgsqlDbType.Varchar, DbType.String, true, null);
+
                 NativeTypeMapping.AddType("bytea", NpgsqlDbType.Bytea, DbType.Binary, true,
                 new ConvertNativeToBackendHandler(BasicNativeToBackendTypeConverter.ToBinary));
 
@@ -183,6 +184,8 @@ namespace NpgsqlTypes
 
                 NativeTypeMapping.AddTypeAlias("int2", typeof(Int16));
                 
+                NativeTypeMapping.AddDbTypeAlias("int2", DbType.Byte);
+
                 NativeTypeMapping.AddType("int4", NpgsqlDbType.Integer, DbType.Int32, false,
                 null);
 
@@ -293,7 +296,7 @@ namespace NpgsqlTypes
                     new NpgsqlBackendTypeInfo(0, "bpchar", NpgsqlDbType.Text, DbType.String, typeof(String),
                         null),
 
-                    new NpgsqlBackendTypeInfo(0, "varchar", NpgsqlDbType.Text, DbType.String, typeof(String),
+                    new NpgsqlBackendTypeInfo(0, "varchar", NpgsqlDbType.Varchar, DbType.String, typeof(String),
                         null),
 
                     new NpgsqlBackendTypeInfo(0, "text", NpgsqlDbType.Text, DbType.String, typeof(String),
@@ -439,7 +442,7 @@ namespace NpgsqlTypes
     /// </summary>
     internal class NpgsqlBackendTypeInfo
     {
-        private event ConvertBackendToNativeHandler _ConvertBackendToNative;
+        private ConvertBackendToNativeHandler _ConvertBackendToNative;
 
         internal Int32           _OID;
         private String           _Name;
@@ -455,8 +458,7 @@ namespace NpgsqlTypes
         /// <param name="NpgsqlDbType">NpgsqlDbType</param>
         /// <param name="Type">System type to convert fields of this type to.</param>
         /// <param name="ConvertBackendToNative">Data conversion handler.</param>
-        public NpgsqlBackendTypeInfo(Int32 OID, String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Type Type,
-                              ConvertBackendToNativeHandler ConvertBackendToNative)
+        public NpgsqlBackendTypeInfo(Int32 OID, String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Type Type, ConvertBackendToNativeHandler ConvertBackendToNative)
         {
             _OID = OID;
             _Name = Name;
@@ -510,7 +512,7 @@ namespace NpgsqlTypes
                 return _ConvertBackendToNative(this, BackendData, TypeSize, TypeModifier);
             } else {
                 try {
-                    return Convert.ChangeType(BackendData, Type, CultureInfo.InvariantCulture);
+                       return Convert.ChangeType(BackendData, Type, CultureInfo.InvariantCulture);
                 } catch {
                     return BackendData;
                 }
@@ -524,12 +526,20 @@ namespace NpgsqlTypes
     /// </summary>
     internal class NpgsqlNativeTypeInfo
     {
-        private event ConvertNativeToBackendHandler _ConvertNativeToBackend;
+        private static NumberFormatInfo ni;
+                        
+        private ConvertNativeToBackendHandler _ConvertNativeToBackend;
 
         private String           _Name;
         private NpgsqlDbType     _NpgsqlDbType;
         private DbType           _DbType;
         private Boolean          _Quote;
+        
+        static NpgsqlNativeTypeInfo()
+        {
+            ni = new CultureInfo("en-US").NumberFormat;
+            ni.NumberGroupSeparator = "";
+        }
 
         /// <summary>
         /// Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
@@ -540,8 +550,7 @@ namespace NpgsqlTypes
         /// <param name="Type">System type to convert fields of this type to.</param>
         /// <param name="ConvertBackendToNative">Data conversion handler.</param>
         /// <param name="ConvertNativeToBackend">Data conversion handler.</param>
-        public NpgsqlNativeTypeInfo(String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Boolean Quote,
-                              ConvertNativeToBackendHandler ConvertNativeToBackend)
+        public NpgsqlNativeTypeInfo(String Name, NpgsqlDbType NpgsqlDbType, DbType DbType, Boolean Quote, ConvertNativeToBackendHandler ConvertNativeToBackend)
         {
             _Name = Name;
             _NpgsqlDbType = NpgsqlDbType;
@@ -578,28 +587,89 @@ namespace NpgsqlTypes
         /// <summary>
         /// Perform a data conversion from a native object to
         /// a backend representation.
-        /// DBNull will always be converted to "NULL".
+        /// DBNull and null values are handled differently depending if a plain query is used
+        /// When 
         /// </summary>
         /// <param name="NativeData">Native .NET object to be converted.</param>
-        /// <param name="SuppressQuoting">Never add quotes (only applies to certain types).</param>
-        public String ConvertToBackend(Object NativeData, Boolean SuppressQuoting)
+        /// <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for 
+               /// plain queries or extended queries</param>
+        public String ConvertToBackend(Object NativeData, Boolean ForExtendedQuery)
+        {
+            if (ForExtendedQuery)
+                return ConvertToBackendExtendedQuery(NativeData);
+            else
+                return ConvertToBackendPlainQuery(NativeData);
+            
+        }
+       
+          private String ConvertToBackendPlainQuery(Object NativeData)
+          {
+            if ((NativeData == DBNull.Value) || (NativeData == null))
+                return "NULL";  // Plain queries exptects null values as string NULL. 
+            
+            if (_ConvertNativeToBackend != null)
+                return QuoteString(_ConvertNativeToBackend(this, NativeData));
+            else
+            {
+                
+                
+                if (NativeData is System.Enum)
+                {
+                    // Do a special handling of Enum values.
+                    // Translate enum value to its underlying type. 
+                    return QuoteString((String)Convert.ChangeType(Enum.Format(NativeData.GetType(), NativeData, "d"), typeof(String), CultureInfo.InvariantCulture));
+                }
+                else if (NativeData is Double) 
+                {
+                    return QuoteString(((Double)NativeData).ToString("N", ni).Replace("'", "''").Replace("\\", "\\\\"));
+                    
+                }
+                else if (NativeData is Decimal) 
+                {
+                    return QuoteString(((Decimal)NativeData).ToString("N", ni).Replace("'", "''").Replace("\\", "\\\\"));
+                } 
+                // Do special handling of strings when in simple query. Escape quotes and backslashes.
+                return QuoteString(NativeData.ToString().Replace("'", "''").Replace("\\", "\\\\"));
+                
+            }
+    
+        }
+        
+        private String ConvertToBackendExtendedQuery(Object NativeData)
         {
-            if (NativeData == DBNull.Value) {
-                return "NULL";
-            } else if (_ConvertNativeToBackend != null) {
-                return QuoteString(! SuppressQuoting, _ConvertNativeToBackend(this, NativeData));
-            } else {
-                return QuoteString(! SuppressQuoting, (String)Convert.ChangeType(NativeData, typeof(String), CultureInfo.InvariantCulture));
+            if ((NativeData == DBNull.Value) || (NativeData == null))
+                return null;    // Extended query expects null values be represented as null.
+            
+            if (_ConvertNativeToBackend != null)
+                return _ConvertNativeToBackend(this, NativeData);
+            else
+            {
+                if (NativeData is System.Enum)
+                {
+                    // Do a special handling of Enum values.
+                    // Translate enum value to its underlying type. 
+                    return (String)Convert.ChangeType(Enum.Format(NativeData.GetType(), NativeData, "d"), typeof(String), CultureInfo.InvariantCulture);
+                }
+                else if (NativeData is Double) 
+                {
+                    return ((Double)NativeData).ToString("N", ni);
+                    
+                }
+                else if (NativeData is Decimal) 
+                {
+                    return ((Decimal)NativeData).ToString("N", ni);
+                } 
+                
+                return NativeData.ToString();
+                
             }
+        
         }
 
-        private static String QuoteString(Boolean Quote, String S)
+        private static String QuoteString(String S)
         {
-            if (Quote) {
-                return String.Format("'{0}'", S);
-            } else {
-                return S;
-            }
+            return String.Format("'{0}'", S);
+            
         }
     }