banshee r3790 - in trunk/banshee: . src/Libraries/Hyena/Hyena.Data.Sqlite tests tests/Hyena



Author: scottp
Date: Thu Apr 17 07:47:49 2008
New Revision: 3790
URL: http://svn.gnome.org/viewvc/banshee?rev=3790&view=rev

Log:
* src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs: Look
for DB-bound members amoung the public fields. Don't know what we
didn't do that before.

* src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs: Don't
throw an exception if we can't retrieve a schema due to the table
not existing. This is important because the Provider uses
Scheme.Count == 0 to detect a non-existant table!

* tests/Hyena/DbBoundType.cs: A type which can be used with an
SqliteModelProvider for testing purposes.

* tests/Hyena/SqliteModelProviderTests.cs: Logical tests for the
SqliteModelProvider.

Added:
   trunk/banshee/tests/Hyena/DbBoundType.cs
   trunk/banshee/tests/Hyena/SqliteModelProviderTests.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelProvider.cs
   trunk/banshee/tests/Makefile.am

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 Apr 17 07:47:49 2008
@@ -90,7 +90,7 @@
         {
             lock (command) {
                 command.CommandType = HyenaCommandType.Reader;
-                QueueCommand(command);
+                QueueCommand (command);
                 return command.WaitForResult (this) as SqliteDataReader;
             }
         }
@@ -116,7 +116,7 @@
             object result = null;
             lock (command) {
                 command.CommandType = HyenaCommandType.Scalar;
-                QueueCommand(command);
+                QueueCommand (command);
                 result = command.WaitForResult (this);
             }
 
@@ -250,8 +250,7 @@
             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", table_name));
+                return;
             }
             sql = sql.Substring (sql.IndexOf ('(') + 1);
             foreach (string column_def in sql.Split (',')) {

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 Apr 17 07:47:49 2008
@@ -75,6 +75,11 @@
 
         protected void Init ()
         {
+            foreach (FieldInfo field in typeof(T).GetFields (BindingFlags.Instance | BindingFlags.Public)) {
+                foreach (Attribute attribute in field.GetCustomAttributes (true)) {
+                    AddColumn (field, attribute);
+                }
+            }
             foreach (FieldInfo field in typeof(T).GetFields (BindingFlags.Instance | BindingFlags.NonPublic)) {
                 foreach (Attribute attribute in field.GetCustomAttributes (true)) {
                     AddColumn (field, attribute);

Added: trunk/banshee/tests/Hyena/DbBoundType.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/tests/Hyena/DbBoundType.cs	Thu Apr 17 07:47:49 2008
@@ -0,0 +1,283 @@
+using System;
+using Hyena.Data.Sqlite;
+
+public enum IntEnum : int
+{
+    Zero,
+    One,
+    Two,
+    Three
+}
+
+public enum LongEnum : long
+{
+    Cero,
+    Uno,
+    Dos,
+    Tres
+}
+
+public class ModelProvider : SqliteModelProvider<DbBoundType>
+{
+    public ModelProvider (HyenaSqliteConnection connection) : base (connection)
+    {
+        Init ();
+    }
+    
+    public override string TableName {
+        get { return "TestTable"; }
+    }
+    protected override int ModelVersion {
+        get { return 1; }
+    }
+    protected override int DatabaseVersion {
+        get { return 1; }
+    }
+    
+    protected override void MigrateTable (int old_version)
+    {
+    }
+    protected override void MigrateDatabase (int old_version)
+    {
+    }
+    protected override DbBoundType MakeNewObject (int offset)
+    {
+        return new DbBoundType ();
+    }
+}
+
+public class DbBoundType
+{
+    [DatabaseColumn ("PrimaryKey", Constraints = DatabaseColumnConstraints.PrimaryKey)]
+    public int PrimaryKey;
+    
+    [DatabaseColumn ("PublicIntField")]
+    public int PublicIntField;
+    [DatabaseColumn ("PublicLongField")]
+    public long PublicLongField;
+    [DatabaseColumn ("PublicStringField")]
+    public string PublicStringField;
+    [DatabaseColumn ("PublicDateTimeField")]
+    public DateTime PublicDateTimeField;
+    [DatabaseColumn ("PublicTimeSpanField")]
+    public TimeSpan PublicTimeSpanField;
+    [DatabaseColumn ("PublicIntEnumField")]
+    public IntEnum PublicIntEnumField;
+    [DatabaseColumn ("PublicLongEnumField")]
+    public LongEnum PublicLongEnumField;
+    
+    private int public_int_property_field;
+    [DatabaseColumn ("PublicIntProperty")]
+    public int PublicIntProperty {
+        get { return public_int_property_field; }
+        set { public_int_property_field = value; }
+    }
+    private long public_long_property_field;
+    [DatabaseColumn ("PublicLongProperty")]
+    public long PublicLongProperty {
+        get { return public_long_property_field; }
+        set { public_long_property_field = value; }
+    }
+    private string public_string_property_field;
+    [DatabaseColumn ("PublicStringProperty")]
+    public string PublicStringProperty {
+        get { return public_string_property_field; }
+        set { public_string_property_field = value; }
+    }
+    private DateTime public_date_time_proprety_field;
+    [DatabaseColumn ("PublicDateTimeProperty")]
+    public DateTime PublicDateTimeProperty {
+        get { return public_date_time_proprety_field; }
+        set { public_date_time_proprety_field = value; }
+    }
+    private TimeSpan public_time_span_property_field;
+    [DatabaseColumn ("PublicTimeSpanProperty")]
+    public TimeSpan PublicTimeSpanProperty {
+        get { return public_time_span_property_field; }
+        set { public_time_span_property_field = value; }
+    }
+    private IntEnum public_int_enum_property_field;
+    [DatabaseColumn ("PublicIntEnumProperty")]
+    public IntEnum PublicIntEnumProperty {
+        get { return public_int_enum_property_field; }
+        set { public_int_enum_property_field = value; }
+    }
+    private LongEnum public_long_enum_property_field;
+    [DatabaseColumn ("PublicLongEnumProperty")]
+    public LongEnum PublicLongEnumProperty {
+        get { return public_long_enum_property_field; }
+        set { public_long_enum_property_field = value; }
+    }
+    
+    [DatabaseColumn ("PrivateIntField")]
+    private int private_int_field;
+    [DatabaseColumn ("PrivateLongField")]
+    private long private_long_field;
+    [DatabaseColumn ("PrivateStringField")]
+    private string private_string_field;
+    [DatabaseColumn ("PrivateDateTimeField")]
+    private DateTime private_date_time_field;
+    [DatabaseColumn ("PrivateTimeSpanField")]
+    private TimeSpan private_time_span_field;
+    [DatabaseColumn ("PrivateIntEnumField")]
+    private IntEnum private_int_enum_field;
+    [DatabaseColumn ("PrivateLongEnumField")]
+    private LongEnum private_long_enum_field;
+    
+    public int GetPrivateIntField ()
+    {
+        return private_int_field;
+    }
+    public void SetPrivateIntField (int value)
+    {
+        private_int_field = value;
+    }
+    public long GetPrivateLongField ()
+    {
+        return private_long_field;
+    }
+    public void SetPrivateLongField (long value)
+    {
+        private_long_field = value;
+    }
+    public string GetPrivateStringField ()
+    {
+        return private_string_field;
+    }
+    public void SetPrivateStringField (string value)
+    {
+        private_string_field = value;
+    }
+    public DateTime GetPrivateDateTimeField ()
+    {
+        return private_date_time_field;
+    }
+    public void SetPrivateDateTimeField (DateTime value)
+    {
+        private_date_time_field = value;
+    }
+    public TimeSpan GetPrivateTimeSpanField ()
+    {
+        return private_time_span_field;
+    }
+    public void SetPrivateTimeSpanField (TimeSpan value)
+    {
+        private_time_span_field = value;
+    }
+    public IntEnum GetPrivateIntEnumField ()
+    {
+        return private_int_enum_field;
+    }
+    public void SetPrivateIntEnumField (IntEnum value)
+    {
+        private_int_enum_field = value;
+    }
+    public LongEnum GetPrivateLongEnumField ()
+    {
+        return private_long_enum_field;
+    }
+    public void SetPrivateLongEnumField (LongEnum value)
+    {
+        private_long_enum_field = value;
+    }
+    
+    private int private_int_property_field;
+    [DatabaseColumn ("PrivateIntProperty")]
+    private int private_int_property {
+        get { return private_int_property_field; }
+        set { private_int_property_field = value; }
+    }
+    private long private_long_property_field;
+    [DatabaseColumn ("PrivateLongProperty")]
+    private long private_long_property {
+        get { return private_long_property_field; }
+        set { private_long_property_field = value; }
+    }
+    private string private_string_property_field;
+    [DatabaseColumn ("PrivateStringProperty")]
+    private string private_string_property {
+        get { return private_string_property_field; }
+        set { private_string_property_field = value; }
+    }
+    private DateTime private_date_time_property_field;
+    [DatabaseColumn ("PrivateDateTimeProperty")]
+    private DateTime private_date_time_property {
+        get { return private_date_time_property_field; }
+        set { private_date_time_property_field = value; }
+    }
+    private TimeSpan private_time_span_property_field;
+    [DatabaseColumn ("PrivateTimeSpanProperty")]
+    private TimeSpan private_time_span_property {
+        get { return private_time_span_property_field; }
+        set { private_time_span_property_field = value; }
+    }
+    private IntEnum private_int_enum_property_field;
+    [DatabaseColumn ("PrivateIntEnumProperty")]
+    private IntEnum private_int_enum_property {
+        get { return private_int_enum_property_field; }
+        set { private_int_enum_property_field = value; }
+    }
+    private LongEnum private_long_enum_property_field;
+    [DatabaseColumn ("PrivateLongEnumProperty")]
+    private LongEnum private_long_enum_property {
+        get { return private_long_enum_property_field; }
+        set { private_long_enum_property_field = value; }
+    }
+    
+    public int GetPrivateIntProperty ()
+    {
+        return private_int_property;
+    }
+    public void SetPrivateIntProperty (int value)
+    {
+        private_int_property = value;
+    }
+    public long GetPrivateLongProperty ()
+    {
+        return private_long_property;
+    }
+    public void SetPrivateLongProperty (long value)
+    {
+        private_long_property = value;
+    }
+    public string GetPrivateStringProperty ()
+    {
+        return private_string_property;
+    }
+    public void SetPrivateStringProperty (string value)
+    {
+        private_string_property = value;
+    }
+    public DateTime GetPrivateDateTimeProperty ()
+    {
+        return private_date_time_property;
+    }
+    public void SetPrivateDateTimeProperty (DateTime value)
+    {
+        private_date_time_property = value;
+    }
+    public TimeSpan GetPrivateTimeSpanProperty ()
+    {
+        return private_time_span_property;
+    }
+    public void SetPrivateTimeSpanProperty (TimeSpan value)
+    {
+        private_time_span_property = value;
+    }
+    public IntEnum GetPrivateIntEnumProperty ()
+    {
+        return private_int_enum_property;
+    }
+    public void SetPrivateIntEnumProperty (IntEnum value)
+    {
+        private_int_enum_property = value;
+    }
+    public LongEnum GetPrivateLongEnumProperty ()
+    {
+        return private_long_enum_property;
+    }
+    public void SetPrivateLongEnumProperty (LongEnum value)
+    {
+        private_long_enum_property = value;
+    }
+}
\ No newline at end of file

Added: trunk/banshee/tests/Hyena/SqliteModelProviderTests.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/tests/Hyena/SqliteModelProviderTests.cs	Thu Apr 17 07:47:49 2008
@@ -0,0 +1,177 @@
+using System;
+using System.Data;
+using System.IO;
+using NUnit.Framework;
+using Hyena.Data.Sqlite;
+
+[TestFixture]
+public class SqliteModelProviderTests
+{
+    private HyenaSqliteConnection connection;
+    private ModelProvider provider;
+    
+    [TestFixtureSetUp]
+    public void Init ()
+    {
+        connection = new HyenaSqliteConnection ("test.db");
+        provider = new ModelProvider (connection);
+    }
+    
+    [TestFixtureTearDown]
+    public void Dispose ()
+    {
+        connection.Dispose ();
+        File.Delete ("test.db");
+    }
+    
+    [Test]
+    public void TestIntMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicIntField = 3141592;
+        newed_item.PublicIntProperty = 13;
+        newed_item.SetPrivateIntField (128);
+        newed_item.SetPrivateIntProperty (42);
+        
+        provider.Save (newed_item);
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicIntField, loaded_item.PublicIntField);
+        Assert.AreEqual (newed_item.PublicIntProperty, loaded_item.PublicIntProperty);
+        Assert.AreEqual (newed_item.GetPrivateIntField (), loaded_item.GetPrivateIntField ());
+        Assert.AreEqual (newed_item.GetPrivateIntProperty (), loaded_item.GetPrivateIntProperty ());
+    }
+    
+    [Test]
+    public void TestLongMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicLongField = 4926227057;
+        newed_item.PublicLongProperty = -932;
+        newed_item.SetPrivateLongField (3243);
+        newed_item.SetPrivateLongProperty (1);
+        
+        provider.Save (newed_item);
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicLongField, loaded_item.PublicLongField);
+        Assert.AreEqual (newed_item.PublicLongProperty, loaded_item.PublicLongProperty);
+        Assert.AreEqual (newed_item.GetPrivateLongField (), loaded_item.GetPrivateLongField ());
+        Assert.AreEqual (newed_item.GetPrivateLongProperty (), loaded_item.GetPrivateLongProperty ());
+    }
+    
+    [Test]
+    public void TestStringMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicStringField = "Surely you're joking, Mr. Feynman.";
+        newed_item.PublicStringProperty = "Even as a splitted bark, so sunder we: This way fall I to death.";
+        newed_item.SetPrivateStringField ("Who is John Galt?");
+        newed_item.SetPrivateStringProperty ("The most formidable weapon against errors of every kind is Reason.");
+        
+        provider.Save (newed_item);
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicStringField, loaded_item.PublicStringField);
+        Assert.AreEqual (newed_item.PublicStringProperty, loaded_item.PublicStringProperty);
+        Assert.AreEqual (newed_item.GetPrivateStringField (), loaded_item.GetPrivateStringField ());
+        Assert.AreEqual (newed_item.GetPrivateStringProperty (), loaded_item.GetPrivateStringProperty ());
+    }
+    
+    // Some fidelity is lost in the conversion from DT to DB time format
+    private void AssertArePrettyClose (DateTime time1, DateTime time2)
+    {
+        Assert.AreEqual (time1.Year, time2.Year);
+        Assert.AreEqual (time1.Month, time2.Month);
+        Assert.AreEqual (time1.Day, time2.Day);
+        Assert.AreEqual (time1.Hour, time2.Hour);
+        Assert.AreEqual (time1.Minute, time2.Minute);
+        Assert.AreEqual (time1.Second, time2.Second);
+    }
+    
+    [Test]
+    public void TestDateTimeMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicDateTimeField = DateTime.Now;
+        newed_item.PublicDateTimeProperty = new DateTime (1986, 4, 23);
+        newed_item.SetPrivateDateTimeField (DateTime.MinValue);
+        newed_item.SetPrivateDateTimeProperty (DateTime.Now);
+        
+        provider.Save (newed_item);
+        
+        string command = String.Format ("SELECT PrivateDateTimeField FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey);
+        
+        using (IDataReader reader = connection.Query (command)) {
+            reader.Read ();
+            Assert.IsTrue (reader.IsDBNull (0));
+        }
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        AssertArePrettyClose (newed_item.PublicDateTimeField, loaded_item.PublicDateTimeField);
+        AssertArePrettyClose (newed_item.PublicDateTimeProperty, loaded_item.PublicDateTimeProperty);
+        AssertArePrettyClose (newed_item.GetPrivateDateTimeField (), loaded_item.GetPrivateDateTimeField ());
+        AssertArePrettyClose (newed_item.GetPrivateDateTimeProperty (), loaded_item.GetPrivateDateTimeProperty ());
+    }
+    
+    [Test]
+    public void TestTimeSpanMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicTimeSpanField = new TimeSpan (0, 0, 1);
+        newed_item.PublicTimeSpanProperty = new TimeSpan (1, 0, 0);
+        newed_item.SetPrivateTimeSpanField (new TimeSpan (1, 39, 12));
+        newed_item.SetPrivateTimeSpanProperty (TimeSpan.MinValue);
+        
+        provider.Save (newed_item);
+        
+        string command = String.Format ("SELECT PrivateTimeSpanProperty FROM {0} WHERE PrimaryKey = {1}", provider.TableName, newed_item.PrimaryKey);
+        using (IDataReader reader = connection.Query (command)) {
+            reader.Read ();
+            Assert.IsTrue (reader.IsDBNull (0));
+        }
+        
+        // NUnit boxes and uses reference equality, rather than Equals()
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicTimeSpanField, loaded_item.PublicTimeSpanField);
+        Assert.AreEqual (newed_item.PublicTimeSpanProperty, loaded_item.PublicTimeSpanProperty);
+        Assert.AreEqual (newed_item.GetPrivateTimeSpanField (), loaded_item.GetPrivateTimeSpanField ());
+        Assert.AreEqual (newed_item.GetPrivateTimeSpanProperty (), loaded_item.GetPrivateTimeSpanProperty ());
+    }
+    
+    [Test]
+    public void TestIntEnumMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicIntEnumField = IntEnum.Zero;
+        newed_item.PublicIntEnumProperty = IntEnum.One;
+        newed_item.SetPrivateIntEnumField (IntEnum.Two);
+        newed_item.SetPrivateIntEnumProperty (IntEnum.Three);
+        
+        provider.Save (newed_item);
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicIntEnumField, loaded_item.PublicIntEnumField);
+        Assert.AreEqual (newed_item.PublicIntEnumProperty, loaded_item.PublicIntEnumProperty);
+        Assert.AreEqual (newed_item.GetPrivateIntEnumField (), loaded_item.GetPrivateIntEnumField ());
+        Assert.AreEqual (newed_item.GetPrivateIntEnumProperty (), loaded_item.GetPrivateIntEnumProperty ());
+    }
+    
+    [Test]
+    public void TestLongEnumMembers ()
+    {
+        DbBoundType newed_item = new DbBoundType ();
+        newed_item.PublicLongEnumField = LongEnum.Cero;
+        newed_item.PublicLongEnumProperty = LongEnum.Uno;
+        newed_item.SetPrivateLongEnumField (LongEnum.Dos);
+        newed_item.SetPrivateLongEnumProperty (LongEnum.Tres);
+        
+        provider.Save (newed_item);
+        
+        DbBoundType loaded_item = provider.FetchSingle (newed_item.PrimaryKey);
+        Assert.AreEqual (newed_item.PublicLongEnumField, loaded_item.PublicLongEnumField);
+        Assert.AreEqual (newed_item.PublicLongEnumProperty, loaded_item.PublicLongEnumProperty);
+        Assert.AreEqual (newed_item.GetPrivateLongEnumField (), loaded_item.GetPrivateLongEnumField ());
+        Assert.AreEqual (newed_item.GetPrivateLongEnumProperty (), loaded_item.GetPrivateLongEnumProperty ());
+    }
+}

Modified: trunk/banshee/tests/Makefile.am
==============================================================================
--- trunk/banshee/tests/Makefile.am	(original)
+++ trunk/banshee/tests/Makefile.am	Thu Apr 17 07:47:49 2008
@@ -7,9 +7,11 @@
 ASSEMBLY = $(ASSEMBLY_NAME).dll
 ASSEMBLY_CSFILES =  \
 	$(srcdir)/Hyena/CryptoUtilTests.cs \
+	$(srcdir)/Hyena/DbBoundType.cs \
 	$(srcdir)/Hyena/RangeCollectionTests.cs \
 	$(srcdir)/Hyena/StringUtilTests.cs \
 	$(srcdir)/Hyena/SqliteCommandTests.cs \
+	$(srcdir)/Hyena/SqliteModelProviderTests.cs \
 	$(srcdir)/Hyena/QueryTests.cs \
 	$(srcdir)/Banshee.Core/TaglibReadWriteTests.cs
 



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