Missing 2.0 APIs
[mono.git] / mcs / class / System.Data / System.Data.Odbc / OdbcTypeConverter.cs
1 //
2 // OdbcTypeConvert.cs : helps conversion between various odbc types.
3 //
4 // Author:
5 //   Sureshkumar T <tsureshkumar@novell.com>
6 //
7
8 //
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 //
31 //
32 // For mapping between types, refer OdbcTypeMap.cs
33 //
34 //
35
36
37 using System.Data;
38 using System.Collections;
39 using System.Data.Common;
40
41 namespace System.Data.Odbc
42
43         internal class OdbcTypeConverter  
44         {
45                 public static OdbcTypeMap GetTypeMap (OdbcType odbcType)
46                 {
47                         return (OdbcTypeMap) OdbcTypeMap.Maps [odbcType];
48                 }
49
50                 public static OdbcTypeMap InferFromValue (object value)
51                 {
52
53                         if (value.GetType ().IsArray)
54                                 if (value.GetType ().GetElementType () == typeof (byte))
55                                         return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
56                                 else
57                                         return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar]; // change
58
59                         switch (Type.GetTypeCode (value.GetType ())) {
60                         case TypeCode.Empty:
61                         case TypeCode.Object:
62                         case TypeCode.DBNull:
63                                 throw new ArgumentException (String.Format ("Infering OdbcType from {0} is not supported",
64                                                                             Type.GetTypeCode (value.GetType ())));
65                         case TypeCode.Boolean:
66                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
67                         case TypeCode.Char:
68                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
69                         case TypeCode.SByte:
70                                 throw new ArgumentException ("infering OdbcType from SByte is not supported");
71                         case TypeCode.Byte:
72                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
73                         case TypeCode.Int16:
74                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
75                         case TypeCode.UInt16:
76                         case TypeCode.Int32:
77                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
78                         case TypeCode.UInt32:
79                         case TypeCode.Int64:
80                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
81                         case TypeCode.UInt64:
82                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
83                         case TypeCode.Single:
84                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
85                         case TypeCode.Double:
86                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
87                         case TypeCode.Decimal:
88                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
89                         case TypeCode.DateTime:
90                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
91                         case TypeCode.String:
92                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
93                         }
94
95                         // FIXME : Guid
96                         // FIXME : TimeSpan
97                         // FIXME : DateTime
98
99                         return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
100                 }
101
102                 public static OdbcTypeMap GetTypeMap (SQL_TYPE sqlType) 
103                 {
104                         switch (sqlType) {
105                         case SQL_TYPE.BINARY:
106                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Binary];
107                         case SQL_TYPE.BIT:
108                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Bit];
109                         case SQL_TYPE.CHAR:
110                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Char];
111                         case SQL_TYPE.DATE:
112                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Date];
113                         case SQL_TYPE.DECIMAL:
114                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Decimal];
115                         case SQL_TYPE.DOUBLE:
116                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Double];
117                         case SQL_TYPE.GUID:
118                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.UniqueIdentifier];
119                         case SQL_TYPE.INTEGER:
120                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Int];
121                         case SQL_TYPE.INTERVAL_DAY:
122                         case SQL_TYPE.INTERVAL_DAY_TO_HOUR:
123                         case SQL_TYPE.INTERVAL_DAY_TO_MINUTE:
124                         case SQL_TYPE.INTERVAL_DAY_TO_SECOND:
125                         case SQL_TYPE.INTERVAL_HOUR:
126                         case SQL_TYPE.INTERVAL_HOUR_TO_MINUTE:
127                         case SQL_TYPE.INTERVAL_HOUR_TO_SECOND:
128                         case SQL_TYPE.INTERVAL_MINUTE:
129                         case SQL_TYPE.INTERVAL_MINUTE_TO_SECOND:
130                         case SQL_TYPE.INTERVAL_MONTH:
131                         case SQL_TYPE.INTERVAL_SECOND:
132                         case SQL_TYPE.INTERVAL_YEAR:
133                         case SQL_TYPE.INTERVAL_YEAR_TO_MONTH:
134                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.DateTime];
135                         case SQL_TYPE.LONGVARBINARY:
136                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Image];
137                         case SQL_TYPE.LONGVARCHAR:
138                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Text];
139                         case SQL_TYPE.NUMERIC:
140                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Numeric];
141                         case SQL_TYPE.REAL:
142                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.Real];
143                         case SQL_TYPE.SMALLINT:
144                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.SmallInt];
145                         case SQL_TYPE.TIME:
146                         case SQL_TYPE.TIMESTAMP:
147                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.DateTime];
148                         case SQL_TYPE.TINYINT:
149                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.TinyInt];
150                         case SQL_TYPE.TYPE_DATE:
151                         case SQL_TYPE.TYPE_TIME:
152                         case SQL_TYPE.TYPE_TIMESTAMP:
153                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.DateTime];
154                         case SQL_TYPE.VARBINARY:
155                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.VarBinary];
156                         case SQL_TYPE.VARCHAR:
157                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.VarChar];
158                         case SQL_TYPE.WCHAR:
159                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.NChar];
160                         case SQL_TYPE.WLONGVARCHAR:
161                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.NText];
162                         case SQL_TYPE.WVARCHAR:
163                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.NVarChar];
164                         case SQL_TYPE.UNASSIGNED:
165                                 return (OdbcTypeMap)  OdbcTypeMap.Maps [OdbcType.VarChar];
166                         }
167                         return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
168                 }
169
170                 public static OdbcTypeMap GetTypeMap (DbType dbType) 
171                 {
172                         switch (dbType) {
173                         case DbType.AnsiString:
174                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
175                         case DbType.Binary:
176                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Binary];
177                         case DbType.Byte:
178                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.TinyInt];
179                         case DbType.Boolean:
180                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Bit];
181                         case DbType.Currency:
182                                 throw new NotSupportedException ("Infering OdbcType from DbType.Currency is not" +
183                                                                  " supported");
184                         case DbType.Date:
185                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Date];
186                         case DbType.DateTime:
187                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.DateTime];
188                         case DbType.Decimal:
189                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
190                         case DbType.Double:
191                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Double];
192                         case DbType.Guid:
193                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.UniqueIdentifier];
194                         case DbType.Int16:
195                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.SmallInt];
196                         case DbType.Int32:
197                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
198                         case DbType.Int64:
199                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
200                         case DbType.Object:
201                                 throw new NotSupportedException ("Infering OdbcType from DbType.Object is not" +
202                                                                  " supported");
203                         case DbType.SByte:
204                                 throw new NotSupportedException ("Infering OdbcType from DbType.SByte is not" +
205                                                                  " supported");
206                         case DbType.Single:
207                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Real];
208                         case DbType.String:
209                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NVarChar];
210                         case DbType.Time:
211                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Time];
212                         case DbType.UInt16:
213                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Int];
214                         case DbType.UInt32:
215                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.BigInt];
216                         case DbType.UInt64:
217                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Numeric];
218                         case DbType.VarNumeric:
219                                 throw new NotSupportedException ("Infering OdbcType from DbType.VarNumeric is not" +
220                                                                  " supported");
221                         case DbType.AnsiStringFixedLength:
222                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.Char];
223                         case DbType.StringFixedLength:
224                                 return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.NChar];
225                         }
226                         return (OdbcTypeMap) OdbcTypeMap.Maps [OdbcType.VarChar];
227                 }
228         }
229 }