[hyena/sqlite] [Hyena.Data.Sqlite] Consolidate type conversion



commit c9acfebfb1a65f5dd4094d0a2d1968f50e66db06
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Wed Nov 10 23:59:10 2010 -0600

    [Hyena.Data.Sqlite] Consolidate type conversion
    
    Instead of taking the value the db returns and converting it in the
    SqliteModelProvider, have the IDataReader do it.

 .../Hyena.Data.Sqlite/DatabaseColumn.cs            |   20 ++++----------------
 Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs      |   18 +++++++++++++-----
 .../Hyena.Data.Sqlite/SqliteModelProvider.cs       |    8 ++++----
 3 files changed, 21 insertions(+), 25 deletions(-)
---
diff --git a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumn.cs b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumn.cs
index e4461e9..9021672 100644
--- a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumn.cs
+++ b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/DatabaseColumn.cs
@@ -79,18 +79,10 @@ namespace Hyena.Data.Sqlite
 
         public object GetValue (object target)
         {
-            object result = field_info != null
-                ? field_info.GetValue (target)
-                : property_info.GetValue (target, null);
+            object result = GetRawValue (target);
             return SqliteUtils.ToDbFormat (type, result);
         }
 
-        public void SetFromDbValue (object target, object value)
-        {
-            // FIXME should we insist on nullable types?
-            SetValue (target, SqliteUtils.FromDbFormat(type, value));
-        }
-
         public void SetValue (object target, object value)
         {
             if (field_info != null) {
@@ -100,13 +92,9 @@ namespace Hyena.Data.Sqlite
             }
         }
 
-        public string Name {
-            get { return name; }
-        }
-
-        public string Type {
-            get { return column_type; }
-        }
+        public string Name { get { return name; } }
+        public string Type { get { return column_type; } }
+        public Type ValueType { get { return type; } }
     }
 
     public sealed class DatabaseColumn : AbstractDatabaseColumn
diff --git a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs
index 89d4bf0..1b285ac 100644
--- a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs
+++ b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/Sqlite.cs
@@ -152,6 +152,7 @@ namespace Hyena.Data.Sqlite
         object this[string columnName] { get; }
         T Get<T> (int i);
         T Get<T> (string columnName);
+        object Get (int i, Type asType);
         int FieldCount { get; }
     }
 
@@ -409,13 +410,20 @@ namespace Hyena.Data.Sqlite
 
         public T Get<T> (int i)
         {
-            var type = typeof (T);
-            var o = GetAs (this[i], type);
+            return (T) Get (i, typeof(T));
+        }
+
+        public object Get (int i, Type asType)
+        {
+            var o = this[i];
+            if (o != null && o.GetType () == asType)
+                return o;
 
-            if (o is T)
-                return (T) o;
+            o = GetAs (o, asType);
+            if (o != null && o.GetType () == asType)
+                return o;
 
-            return (T) SqliteUtils.FromDbFormat (type, o);
+            return SqliteUtils.FromDbFormat (asType, o);
         }
 
         private object GetAs (object o, Type type)
diff --git a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelProvider.cs b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelProvider.cs
index f396ce4..d3ed819 100644
--- a/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelProvider.cs
+++ b/Hyena.Data.Sqlite/Hyena.Data.Sqlite/SqliteModelProvider.cs
@@ -360,14 +360,14 @@ namespace Hyena.Data.Sqlite
 
             AbstractDatabaseColumn bad_column = null;
             try {
-                foreach (DatabaseColumn column in select_columns) {
+                foreach (var column in select_columns) {
                     bad_column = column;
-                    column.SetFromDbValue (target, reader[i++]);
+                    column.SetValue (target, reader.Get (i++, column.ValueType));
                 }
 
-                foreach (VirtualDatabaseColumn column in virtual_columns) {
+                foreach (var column in virtual_columns) {
                     bad_column = column;
-                    column.SetFromDbValue (target, reader[i++]);
+                    column.SetValue (target, reader.Get (i++, column.ValueType));
                 }
             } catch (Exception e) {
                 Log.Debug (



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]