banshee r3237 - in trunk/banshee: . src/Extensions/Banshee.Lastfm/Banshee.Lastfm src/Libraries/Hyena src/Libraries/Hyena/Hyena.Data.Sqlite
- From: gburt svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3237 - in trunk/banshee: . src/Extensions/Banshee.Lastfm/Banshee.Lastfm src/Libraries/Hyena src/Libraries/Hyena/Hyena.Data.Sqlite
- Date: Thu, 14 Feb 2008 18:23:14 +0000 (GMT)
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]