banshee r3237 - in trunk/banshee: . src/Extensions/Banshee.Lastfm/Banshee.Lastfm src/Libraries/Hyena src/Libraries/Hyena/Hyena.Data.Sqlite



Author: gburt
Date: Thu Feb 14 18:23:14 2008
New Revision: 3237
URL: http://svn.gnome.org/viewvc/banshee?rev=3237&view=rev

Log:
2008-02-14  Gabriel Burt  <gabriel burt gmail com>

	* src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs:
	* src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs:
	* src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs:
	* src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs:
	* src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs:
	* src/Libraries/Hyena/Hyena.mdp:
	* src/Libraries/Hyena/Makefile.am: The last commit reverted some of
	scottp's changes due to svn mv'ing files that weren't up to date.


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.mdp
   trunk/banshee/src/Libraries/Hyena/Makefile.am

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm/StationSource.cs	Thu Feb 14 18:23:14 2008
@@ -547,7 +547,7 @@
                 ");
             } else {
                 try {
-                    ServiceManager.DbConnection.QueryInt32 ("SELECT PlayCount FROM LastfmStations LIMIT 1");
+                    ServiceManager.DbConnection.Query<int> ("SELECT PlayCount FROM LastfmStations LIMIT 1");
                 } catch {
                     Log.Debug ("Adding new database column", "Table: LastfmStations, Column: PlayCount INTEGER");
                     ServiceManager.DbConnection.Execute ("ALTER TABLE LastfmStations ADD PlayCount INTEGER");

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/DatabaseColumn.cs	Thu Feb 14 18:23:14 2008
@@ -41,13 +41,13 @@
         private readonly string column_type;
         private readonly string name;
         
-        public AbstractDatabaseColumn (FieldInfo field_info, AbstractDatabaseColumnAttribute attribute)
+        protected AbstractDatabaseColumn (FieldInfo field_info, AbstractDatabaseColumnAttribute attribute)
             : this (attribute, field_info, field_info.FieldType)
         {
             this.field_info = field_info;
         }
         
-        public AbstractDatabaseColumn (PropertyInfo property_info, AbstractDatabaseColumnAttribute attribute) :
+        protected AbstractDatabaseColumn (PropertyInfo property_info, AbstractDatabaseColumnAttribute attribute) :
             this (attribute, property_info, property_info.PropertyType)
         {
             if (!property_info.CanRead || !property_info.CanWrite) {
@@ -63,17 +63,11 @@
         
         private AbstractDatabaseColumn (AbstractDatabaseColumnAttribute attribute, MemberInfo member_info, Type type)
         {
-            if (type == typeof (string)) {
-                column_type = "TEXT";
-            } else if (type == typeof (int) || type == typeof (long)) {
-                column_type = "INTEGER";
-            } else {
-                throw new Exception (String.Format (
-                    "{0}.{1}: The type {2} cannot be bound to a database column.",
-                    member_info.DeclaringType,
-                    member_info.Name,
-                    type.Name)
-                );
+            try {
+                column_type = SqliteUtils.GetType (type);
+            } catch (Exception e) {
+                throw new Exception(string.Format(
+                    "{0}.{1}: {3}", member_info.DeclaringType, member_info.Name, e.Message));
             }
             this.name = attribute.ColumnName ?? member_info.Name;
             this.type = type;
@@ -81,9 +75,10 @@
         
         public object GetValue (object target)
         {
-            return field_info != null
+            object result = field_info != null
                 ? field_info.GetValue (target)
                 : property_info.GetValue (target, null);
+            return SqliteUtils.ToDbFormat (type, result);
         }
         
         public void SetValue (object target, IDataReader reader, int column)
@@ -103,7 +98,7 @@
                     ? reader.GetInt64 (column)
                     : 0;
             }
-
+            result = SqliteUtils.FromDbFormat (type, result);
             SetValue (target, result);
         }
         
@@ -155,24 +150,7 @@
         
         public string Schema {
             get {
-                StringBuilder builder = new StringBuilder ();
-                builder.Append (Name);
-                builder.Append (' ');
-                builder.Append (Type);
-                if ((attribute.Constraints & DatabaseColumnConstraints.NotNull) > 0) {
-                    builder.Append (" NOT NULL");
-                }
-                if ((attribute.Constraints & DatabaseColumnConstraints.Unique) > 0) {
-                    builder.Append (" UNIQUE");
-                }
-                if ((attribute.Constraints & DatabaseColumnConstraints.PrimaryKey) > 0) {
-                    builder.Append (" PRIMARY KEY");
-                }
-                if (attribute.DefaultValue != null) {
-                    builder.Append (" DEFAULT ");
-                    builder.Append (attribute.DefaultValue);
-                }
-                return builder.ToString ();
+                return SqliteUtils.BuildColumnSchema (Type, Name, attribute.DefaultValue, attribute.Constraints);
             }
         }
         
@@ -216,4 +194,18 @@
             get { return attribute.ForeignKey; }
         }
     }
+    
+    public struct DbColumn
+    {
+        public readonly string Name;
+        public readonly DatabaseColumnConstraints Constraints;
+        public readonly string DefaultValue;
+        
+        public DbColumn(string name, DatabaseColumnConstraints constraints, string default_value)
+        {
+            Name = name;
+            Constraints = constraints;
+            DefaultValue = default_value;
+        }
+    }
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs	Thu Feb 14 18:23:14 2008
@@ -107,7 +107,7 @@
         private bool Exists (string type, string name)
         {
             return
-                QueryInt32 (
+                Query<int> (
                     String.Format (@"
                         SELECT COUNT(*)
                             FROM sqlite_master
@@ -116,22 +116,43 @@
                 ) > 0;
         }
         
-        private static readonly char [] ws_chars = new char [] { ' ', '\t', '\n', '\r' };
-        public Dictionary<string, string> GetSchema (string name)
+        private delegate void SchemaHandler (string column);
+        
+        private void SchemaClosure (string table_name, SchemaHandler code)
         {
-            string sql = QueryString (String.Format (
-                "SELECT sql FROM sqlite_master WHERE Name='{0}'", name));
+            string sql = Query<string> (String.Format (
+                "SELECT sql FROM sqlite_master WHERE Name='{0}'", table_name));
             if (String.IsNullOrEmpty (sql)) {
                 throw new Exception (String.Format (
-                    "Cannot get schema for {0} because it does not exist", name));
+                    "Cannot get schema for {0} because it does not exist", table_name));
             }
-            Dictionary<string, string> schema = new Dictionary<string, string> ();
             sql = sql.Substring (sql.IndexOf ('(') + 1);
             foreach (string column_def in sql.Split (',')) {
                 string column_def_t = column_def.Trim ();
                 int ws_index = column_def_t.IndexOfAny (ws_chars);
-                schema.Add (column_def_t.Substring (0, ws_index), null);
+                code (column_def_t.Substring (0, ws_index));
             }
+        }
+        
+        public bool ColumnExists (string tableName, string columnName)
+        {
+            bool value = false;
+            SchemaClosure (tableName, delegate (string column) {
+                if (column == columnName) {
+                    value = true;
+                    return;
+                }
+            });
+            return value;
+        }
+        
+        private static readonly char [] ws_chars = new char [] { ' ', '\t', '\n', '\r' };
+        public Dictionary<string, string> GetSchema (string table_name)
+        {
+            Dictionary<string, string> schema = new Dictionary<string,string> ();
+            SchemaClosure (table_name, delegate (string column) {
+                schema.Add (column, null);
+            });
             return schema;
         }
 
@@ -189,34 +210,20 @@
             return ExecuteScalar (new SqliteCommand (command.ToString ()));
         }
         
-        public Int32 QueryInt32 (SqliteCommand command)
+        public T Query<T> (SqliteCommand command)
         {
-            return Convert.ToInt32 (ExecuteScalar (command));
+            return (T) SqliteUtils.FromDbFormat (typeof (T),
+                Convert.ChangeType (ExecuteScalar (command), typeof (T)));
         }
         
-        public Int32 QueryInt32 (HyenaSqliteCommand command)
+        public T Query<T> (HyenaSqliteCommand command)
         {
-            return QueryInt32 (command.Command);
+            return Query<T> (command.Command);
         }
 
-        public Int32 QueryInt32 (object command)
-        {
-            return QueryInt32 (new SqliteCommand (command.ToString ()));
-        }
-        
-        public string QueryString (SqliteCommand command)
-        {
-            return Convert.ToString (ExecuteScalar (command));
-        }
-        
-        public string QueryString (HyenaSqliteCommand command)
-        {
-            return QueryString (command.Command);
-        }
-        
-        public string QueryString (object command)
+        public T Query<T> (object command)
         {
-            return QueryString (new SqliteCommand (command.ToString ()));
+            return Query<T> (new SqliteCommand (command.ToString ()));
         }
 
         public int Execute (SqliteCommand command)

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs	Thu Feb 14 18:23:14 2008
@@ -144,12 +144,12 @@
                 return -1;
             }
             select_single_command.ApplyValues (item_id);
-            int target_id = connection.QueryInt32 (select_single_command);
+            int target_id = connection.Query<int> (select_single_command);
             if (target_id == 0) {
                 return -1;
             }
             if (first_order_id == -1) {
-                first_order_id = connection.QueryInt32 (select_first_command);
+                first_order_id = connection.Query<int> (select_first_command);
             }
             return target_id - first_order_id;
         }
@@ -194,7 +194,7 @@
         
         private void FindOrCreateCacheModelId (string id)
         {
-            uid = connection.QueryInt32 (String.Format (
+            uid = connection.Query<int> (String.Format (
                 "SELECT CacheID FROM {0} WHERE ModelID = '{1}'",
                 CacheModelsTableName, id
             ));

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs	Thu Feb 14 18:23:14 2008
@@ -113,7 +113,7 @@
                         InsertVersion (TableName, ModelVersion);
                     }
                 }
-                int db_version = connection.QueryInt32 (SelectVersionSql (HYENA_DATABASE_NAME));
+                int db_version = connection.Query<int> (SelectVersionSql (HYENA_DATABASE_NAME));
                 if (db_version < DatabaseVersion) {
                     MigrateDatabase (db_version);
                     UpdateVersion (HYENA_DATABASE_NAME, DatabaseVersion);
@@ -161,10 +161,7 @@
             if (schema.Count > 0) {
                 foreach (DatabaseColumn column in columns) {
                     if (!schema.ContainsKey (column.Name)) {
-                        connection.Execute (String.Format (
-                            "ALTER TABLE {0} ADD {1}",
-                            TableName, column.Schema)
-                        );
+                        AddColumnToTable (column.Schema);
                     }
                     if (column.Index != null && !connection.IndexExists (column.Index)) {
                         connection.Execute (String.Format (
@@ -564,5 +561,55 @@
             from = from_builder.ToString ();
             where = where_builder.ToString ();
         }
+        
+        public U GetProperty <U> (T item, DbColumn column)
+        {
+            CheckProperty (typeof (U), column);
+            
+            return connection.Query<U> (String.Format (
+                "SELECT {0} FROM {1} WHERE {2}={3}",
+                column.Name, TableName, key.Name, key.GetValue (item)));
+        }
+        
+        public void SetProperty <U> (T item, U value, DbColumn column)
+        {
+            CheckProperty (typeof (U), column);
+            
+            connection.Execute (String.Format (
+                "UPDATE {0} SET {1}='{2}' WHERE {3}={4}",
+                TableName, column.Name,
+                SqliteUtils.ToDbFormat (typeof (U), value),
+                key.Name, key.GetValue (item)));
+        }
+        
+        public void ClearProperty <U> (DbColumn column)
+        {
+            if (!connection.ColumnExists (TableName, column.Name)) {
+                AddColumnToTable (SqliteUtils.BuildColumnSchema (
+                    SqliteUtils.GetType (typeof (U)),
+                    column.Name, column.DefaultValue, column.Constraints));
+            } else {
+                connection.Execute (string.Format (
+                    "UPDATE {0} SET {1}='{2}'",
+                    TableName, column.Name, column.DefaultValue));
+            }
+        }
+        
+        private void CheckProperty (Type type, DbColumn column)
+        {
+            if (!connection.ColumnExists (TableName, column.Name)) {
+                AddColumnToTable (SqliteUtils.BuildColumnSchema (
+                    SqliteUtils.GetType (type),
+                    column.Name, column.DefaultValue, column.Constraints));
+            }
+        }
+                                              
+        private void AddColumnToTable (string column_schema)
+        {
+            connection.Execute (String.Format (
+                "ALTER TABLE {0} ADD {1}",
+                TableName, column_schema)
+            );
+        }
 	}
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.mdp	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.mdp	Thu Feb 14 18:23:14 2008
@@ -75,6 +75,9 @@
     <File name="Hyena.Data/DictionaryModelCache.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/AliasedObjectSet.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/StringUtil.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Query/QueryLimit.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Query/QueryOrder.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Data.Sqlite/SqliteUtils.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/Log.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>

Modified: trunk/banshee/src/Libraries/Hyena/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena/Makefile.am	Thu Feb 14 18:23:14 2008
@@ -18,6 +18,7 @@
 	Hyena.Data.Sqlite/ICacheableDatabaseModel.cs \
 	Hyena.Data.Sqlite/SqliteModelCache.cs \
 	Hyena.Data.Sqlite/SqliteModelProvider.cs \
+	Hyena.Data.Sqlite/SqliteUtils.cs \
 	Hyena.Data/ArrayModelCache.cs \
 	Hyena.Data/ColumnDescription.cs \
 	Hyena.Data/DictionaryModelCache.cs \



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