2 // PostgresTypes.cs - holding methods to convert
\r
3 // between PostgreSQL types and .NET types
\r
6 // Daniel Morgan <danmorg@sc.rr.com>
\r
8 // (c)copyright 2002 Daniel Morgan
\r
11 // Note: this might become PostgresType and PostgresTypeCollection
\r
12 // also, the PostgresTypes that exist as an inner internal class
\r
13 // within SqlConnection maybe moved here in the future
\r
16 using System.Collections;
\r
18 using System.Data.Common;
\r
19 using System.Data.SqlClient;
\r
22 namespace System.Data.SqlClient {
\r
24 internal struct PostgresType {
\r
26 public string typname;
\r
27 public DbType dbType;
\r
30 sealed internal class PostgresHelper {
32 // translates the PostgreSQL typname to System.Data.DbType
33 public static DbType TypnameToSqlDbType(string typname) {
\r
36 // FIXME: use hashtable here?
\r
41 sqlType = DbType.Int32;
\r
45 sqlType = DbType.String;
\r
49 sqlType = DbType.String;
\r
53 sqlType = DbType.Boolean;
\r
57 sqlType = DbType.String;
\r
61 sqlType = DbType.String;
\r
65 sqlType = DbType.String;
\r
69 sqlType = DbType.String;
\r
73 sqlType = DbType.String;
\r
77 sqlType = DbType.String;
\r
81 sqlType = DbType.Date;
\r
85 sqlType = DbType.Single;
\r
89 sqlType = DbType.Double;
\r
93 sqlType = DbType.String;
\r
97 sqlType = DbType.Int16;
\r
101 sqlType = DbType.Int32;
\r
105 sqlType = DbType.Int64;
\r
109 sqlType = DbType.String;
\r
113 sqlType = DbType.String;
\r
117 sqlType = DbType.String;
\r
121 sqlType = DbType.String;
\r
125 sqlType = DbType.Decimal;
\r
129 sqlType = DbType.String;
\r
133 sqlType = DbType.Decimal;
\r
137 sqlType = DbType.Int32;
\r
141 sqlType = DbType.String;
\r
145 sqlType = DbType.String;
\r
149 sqlType = DbType.String;
\r
153 sqlType = DbType.String;
\r
157 sqlType = DbType.String;
\r
161 sqlType = DbType.String;
\r
165 sqlType = DbType.Time;
\r
169 sqlType = DbType.DateTime;
\r
172 case "timestamptz":
\r
173 sqlType = DbType.DateTime;
\r
177 sqlType = DbType.DateTime;
\r
181 sqlType = DbType.String;
\r
185 sqlType = DbType.String;
\r
189 sqlType = DbType.String;
\r
193 sqlType = DbType.String;
\r
199 // Converts data value from database to .NET System type.
\r
200 public static object ConvertDbTypeToSystem (DbType typ, String value) {
203 // FIXME: more types need
205 // from PostgreSQL oid type
206 // to .NET System.<type>
208 // FIXME: need to handle a NULL for each type
209 // maybe setting obj to System.DBNull.Value ?
213 //Console.WriteLine("ConvertDbTypeToSystemDbType typ: " +
214 // typ + " value is null");
217 else if(value.Equals("")) {
218 //Console.WriteLine("ConvertDbTypeToSystemDbType typ: " +
219 // typ + " value is string empty");
223 //Console.WriteLine("ConvertDbTypeToSystemDbType typ: " +
224 // typ + " value: " + value);
226 // Date, Time, and DateTime
227 // are parsed based on ISO format
228 // "YYYY-MM-DD hh:mi:ss.ms"
232 obj = String.Copy(value);
235 obj = value.Equals("t");
238 obj = Int16.Parse(value);
\r
241 obj = Int32.Parse(value);
\r
244 obj = Int64.Parse(value);
\r
246 case DbType.Decimal:
\r
247 obj = Decimal.Parse(value);
\r
249 case DbType.Single:
\r
250 obj = Single.Parse(value);
\r
252 case DbType.Double:
\r
253 obj = Double.Parse(value);
\r
256 String[] sd = value.Split(new Char[] {'-'});
\r
257 obj = new DateTime(
\r
258 Int32.Parse(sd[0]), Int32.Parse(sd[1]), Int32.Parse(sd[2]),
\r
262 String[] st = value.Split(new Char[] {':'});
\r
263 obj = new DateTime(0001,01,01,
\r
264 Int32.Parse(st[0]),Int32.Parse(st[1]),Int32.Parse(st[2]));
\r
266 case DbType.DateTime:
\r
267 Int32 YYYY,MM,DD,hh,mi,ss,ms;
\r
268 YYYY = Int32.Parse(value.Substring(0,4));
\r
269 MM = Int32.Parse(value.Substring(5,2));
\r
270 DD = Int32.Parse(value.Substring(8,2));
\r
271 hh = Int32.Parse(value.Substring(11,2));
\r
272 mi = Int32.Parse(value.Substring(14,2));
\r
273 ss = Int32.Parse(value.Substring(17,2));
\r
274 ms = Int32.Parse(value.Substring(20,2));
\r
275 obj = new DateTime(YYYY,MM,DD,hh,mi,ss,ms);
\r
278 obj = String.Copy(value);
\r
285 // Translates System.Data.DbType to System.Type
286 public static Type DbTypeToSystemType (DbType dType) {
287 // FIXME: more types need
289 // from PostgreSQL oid type
290 // to .NET System.<type>
296 typ = typeof(String);
299 typ = typeof(Boolean);
301 case DbType.Int16:
\r
302 typ = typeof(Int16);
\r
305 typ = typeof(Int32);
\r
308 typ = typeof(Int64);
\r
310 case DbType.Decimal:
\r
311 typ = typeof(Decimal);
\r
313 case DbType.Single:
\r
314 typ = typeof(Single);
\r
316 case DbType.Double:
\r
317 typ = typeof(Double);
\r
321 case DbType.DateTime:
\r
322 typ = typeof(DateTime);
\r
325 typ = typeof(String);
\r
331 // Find DbType for oid
332 // which requires a look up of PostgresTypes
333 // DbType <-> typname <-> oid
334 public static string OidToTypname (int oid, ArrayList pgTypes) {
335 // FIXME: more types need
337 // from PostgreSQL oid type
338 // to .NET System.<type>
340 string typname = "text"; // default
342 for(i = 0; i < pgTypes.Count; i++) {
343 PostgresType pt = (PostgresType) pgTypes[i];
345 typname = pt.typname;
353 // Convert a .NET System value type (Int32, String, Boolean, etc)
354 // to a string that can be included within a SQL statement.
355 // This is to methods provides the parameters support
356 // for the PostgreSQL .NET Data provider
357 public static string ObjectToString(DbType dbtype, object obj) {
\r
359 // TODO: how do we handle a NULL?
\r
360 //if(isNull == true)
\r
365 // Date, Time, and DateTime are expressed in ISO format
\r
366 // which is "YYYY-MM-DD hh:mm:ss.ms";
\r
370 const string zero = "0";
\r
377 if((bool)obj == true)
383 s = obj.ToString();
\r
386 s = obj.ToString();
\r
389 s = obj.ToString();
\r
391 case DbType.Decimal:
\r
392 s = obj.ToString();
\r
394 case DbType.Single:
\r
395 s = obj.ToString();
\r
397 case DbType.Double:
\r
398 s = obj.ToString();
\r
401 dt = (DateTime) obj;
\r
402 sb = new StringBuilder();
\r
406 sb.Append("000" + dt.Year);
\r
407 else if(dt.Year < 100)
\r
408 sb.Append("00" + dt.Year);
\r
409 else if(dt.Year < 1000)
\r
410 sb.Append("0" + dt.Year);
\r
412 sb.Append(dt.Year);
\r
416 sb.Append(zero + dt.Month);
\r
418 sb.Append(dt.Month);
\r
422 sb.Append(zero + dt.Day);
\r
429 dt = (DateTime) obj;
\r
430 sb = new StringBuilder();
\r
434 sb.Append(zero + dt.Hour);
\r
436 sb.Append(dt.Hour);
\r
440 sb.Append(zero + dt.Minute);
\r
442 sb.Append(dt.Minute);
\r
446 sb.Append(zero + dt.Second);
\r
448 sb.Append(dt.Second);
\r
452 case DbType.DateTime:
\r
453 dt = (DateTime) obj;
\r
454 sb = new StringBuilder();
\r
458 sb.Append("000" + dt.Year);
\r
459 else if(dt.Year < 100)
\r
460 sb.Append("00" + dt.Year);
\r
461 else if(dt.Year < 1000)
\r
462 sb.Append("0" + dt.Year);
\r
464 sb.Append(dt.Year);
\r
468 sb.Append(zero + dt.Month);
\r
470 sb.Append(dt.Month);
\r
474 sb.Append(zero + dt.Day);
\r
480 sb.Append(zero + dt.Hour);
\r
482 sb.Append(dt.Hour);
\r
486 sb.Append(zero + dt.Minute);
\r
488 sb.Append(dt.Minute);
\r
492 sb.Append(zero + dt.Second);
\r
494 sb.Append(dt.Second);
\r
497 if(dt.Millisecond < 10)
\r
498 sb.Append(zero + dt.Millisecond);
\r
500 sb.Append(dt.Millisecond);
\r
505 // default to DbType.String
\r
506 s = "'" + obj + "'";
\r