banshee r3790 - in trunk/banshee: . src/Libraries/Hyena/Hyena.Data.Sqlite tests tests/Hyena
- From: scottp svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3790 - in trunk/banshee: . src/Libraries/Hyena/Hyena.Data.Sqlite tests tests/Hyena
- Date: Thu, 17 Apr 2008 07:47:49 +0100 (BST)
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]