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 <[EMAIL PROTECTED]> * 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 \ _______________________________________________ SVN-commits-list mailing list (read only) http://mail.gnome.org/mailman/listinfo/svn-commits-list Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want. Module maintainer? It is possible to set the reply-to to your development mailing list. Email [EMAIL PROTECTED] if interested.