You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by gb...@apache.org on 2006/03/14 22:07:28 UTC

svn commit: r385889 - in /ibatis/trunk/cs/mapper: IBatisNet.Common.Test/ IBatisNet.Common.Test/Domain/ IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ IBatisNet.Common/ IBatisNet.Common/Utilities/Objects/ IBatisNet.DataMapper.Test/NUnit/SqlMapTests/...

Author: gbayon
Date: Tue Mar 14 13:07:25 2006
New Revision: 385889

URL: http://svn.apache.org/viewcvs?rev=385889&view=rev
Log:
- Updated unit test for IpropertyAccessor
- Added factory for IpropertyAccessor object

Added:
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs   (with props)
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs   (with props)
Modified:
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
    ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj
    ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs
    ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ReflectionPropertyAccessor.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/bin/Debug/providers.config
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Account.cs Tue Mar 14 13:07:25 2006
@@ -16,62 +16,32 @@
 
 		public int Id
 		{
-			get
-			{
-				return _id; 
-			}
-			set
-			{ 
-				_id = value; 
-			}
+			get { return _id; }
+			set { _id = value; }
 		}
 
 		public string FirstName
 		{
-			get
-			{
-				return _firstName; 
-			}
-			set
-			{ 
-				_firstName = value; 
-			}
+			get { return _firstName; }
+			set { _firstName = value; }
 		}
 
 		public string LastName
 		{
-			get
-			{
-				return _lastName; 
-			}
-			set
-			{ 
-				_lastName = value; 
-			}
+			get { return _lastName; }
+			set { _lastName = value; }
 		}
 
 		public string EmailAddress
 		{
-			get
-			{
-				return _emailAddress; 
-			}
-			set
-			{ 
-				_emailAddress = value; 
-			}
+			get { return _emailAddress; }
+			set { _emailAddress = value; }
 		}
 
 		public int[] Ids
 		{
-			get
-			{
-				return _ids; 
-			}
-			set
-			{ 
-				_ids = value; 
-			}
+			get { return _ids; }
+			set { _ids = value; }
 		}
 	}
 }

Added: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs?rev=385889&view=auto
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs (added)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs Tue Mar 14 13:07:25 2006
@@ -0,0 +1,118 @@
+using System;
+
+namespace IBatisNet.Common.Test.Domain
+{
+	/// <summary>
+	/// Summary description for Property.
+	/// </summary>
+	public class Property
+	{
+		private string _string = string.Empty;
+		private int _int = int.MinValue;
+		private DateTime _dateTime = DateTime.MinValue;
+		private decimal _decimal = decimal.MinValue;
+		private sbyte _sbyte = sbyte.MinValue;
+		private byte _byte = byte.MinValue;
+		private char _char = char.MinValue;
+		private short _short = short.MinValue;
+		private ushort _ushort = ushort.MinValue;
+		private uint _uint = uint.MinValue;
+		private long _long = long.MinValue;
+		private ulong _ulong = ulong.MinValue;
+		private bool _bool = false;
+		private double _double = double.MinValue;
+		private float _float = float.MinValue;
+
+		public string String
+		{
+			get { return _string; }
+			set { _string = value; }
+		}
+
+		public int Int
+		{
+			get { return _int; }
+			set { _int = value; }
+		}
+
+		public DateTime DateTime
+		{
+			get { return _dateTime; }
+			set { _dateTime = value; }
+		}
+
+		public decimal Decimal
+		{
+			get { return _decimal; }
+			set { _decimal = value; }
+		}
+
+		public sbyte SByte
+		{
+			get { return _sbyte; }
+			set { _sbyte = value; }
+		}
+
+		public byte Byte
+		{
+			get { return _byte; }
+			set { _byte = value; }
+		}
+
+		public char Char
+		{
+			get { return _char; }
+			set { _char = value; }
+		}
+
+		public short Short
+		{
+			get { return _short; }
+			set { _short = value; }
+		}
+
+		public ushort UShort
+		{
+			get { return _ushort; }
+			set { _ushort = value; }
+		}
+
+		public uint UInt
+		{
+			get { return _uint; }
+			set { _uint = value; }
+		}
+
+		public long Long
+		{
+			get { return _long; }
+			set { _long = value; }
+		}
+
+		public ulong ULong
+		{
+			get { return _ulong; }
+			set { _ulong = value; }
+		}
+
+		public bool Bool
+		{
+			get { return _bool; }
+			set { _bool = value; }
+		}
+
+		public double Double
+		{
+			get { return _double; }
+			set { _double = value; }
+		}
+
+		public float Float
+		{
+			get { return _float; }
+			set { _float = value; }
+		}
+
+
+	}
+}

Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/Domain/Property.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj Tue Mar 14 13:07:25 2006
@@ -103,6 +103,7 @@
     <Compile Include="Domain\Account.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Domain\Property.cs" />
     <Compile Include="Domain\Simple.cs" />
     <Compile Include="NUnit\CommonTests\ConfigWatcher\ConfigWatcherTest.cs">
       <SubType>Code</SubType>

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj Tue Mar 14 13:07:25 2006
@@ -212,6 +212,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "Domain\Property.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "Domain\Simple.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs Tue Mar 14 13:07:25 2006
@@ -1,6 +1,7 @@
 using System;
 using System.Reflection;
 using IBatisNet.Common.Test.Domain;
+using IBatisNet.Common.Utilities;
 using IBatisNet.Common.Utilities.Objects;
 using NUnit.Framework;
 
@@ -30,6 +31,36 @@
 
         #endregion
 
+		/// <summary>
+		/// Test PropertyAccessorFactory
+		/// </summary>
+		[Test]
+		public void TestPropertyAccessorFactory()
+		{
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor1 = factory.CreatePropertyAccessor(typeof(Property), "Int");
+			IPropertyAccessor propertyAccessor2 = factory.CreatePropertyAccessor(typeof(Property), "Int");
+
+			Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(propertyAccessor1), HashCodeProvider.GetIdentityHashCode(propertyAccessor2) );
+		}
+
+		/// <summary>
+		/// Test multiple PropertyAccessorFactory
+		/// </summary>
+		[Test]
+		public void TestMultiplePropertyAccessorFactory()
+		{
+			Property prop = new Property();
+			PropertyAccessorFactory factory1 = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor1 = factory1.CreatePropertyAccessor(typeof(Property), "Int");
+
+			PropertyAccessorFactory factory2 = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor2 = factory2.CreatePropertyAccessor(typeof(Property), "Int");
+
+			Assert.AreEqual(int.MinValue, propertyAccessor1.Get(prop));
+			Assert.AreEqual(int.MinValue, propertyAccessor2.Get(prop));
+		}
+
         /// <summary>
 		/// Test integer property access performance
 		/// </summary>
@@ -37,8 +68,8 @@
         public void TestGetIntegerPerformance()
         {
             const int TEST_ITERATIONS = 1000000;
-        	Account account = new Account();
-            int test = -1;
+			Property prop = new Property();
+			int test = -1;
 			Timer timer = new Timer();
 
 			#region Direct access (fastest)
@@ -49,8 +80,8 @@
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
 				test = -1;
-				test = account.Id;
-				Assert.AreEqual(0, test);
+				test = prop.Int;
+				Assert.AreEqual(int.MinValue, test);
 			}
 			timer.Stop();
 			double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -60,13 +91,14 @@
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
 
-			IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
 				test = -1;
-				test = (int)propertyAccessor.Get(account);
-				Assert.AreEqual(0, test);
+				test = (int)propertyAccessor.Get(prop);
+				Assert.AreEqual(int.MinValue, test);
 			}
 			timer.Stop();
 			double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -77,14 +109,14 @@
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
 
-			ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(account.GetType());
+			ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(prop.GetType());
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
 				test = -1;
-				PropertyInfo propertyInfo = reflectionInfo.GetGetter("Id");
-				test = (int)propertyInfo.GetValue(account, null);
-				Assert.AreEqual(0, test);
+				PropertyInfo propertyInfo = reflectionInfo.GetGetter("Int");
+				test = (int)propertyInfo.GetValue(prop, null);
+				Assert.AreEqual(int.MinValue, test);
 			}
 			timer.Stop();
 			double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -95,14 +127,14 @@
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
 
-			Type type = account.GetType();
+			Type type = prop.GetType();
 			timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
 				test = -1;
-				PropertyInfo propertyInfo = type.GetProperty("Id", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
-				test = (int)propertyInfo.GetValue(account, null);
-				Assert.AreEqual(0, test);
+				PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+				test = (int)propertyInfo.GetValue(prop, null);
+				Assert.AreEqual(int.MinValue, test);
 			}
 			timer.Stop();
 			double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -117,10 +149,10 @@
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
 				test = -1;
-				test = (int)type.InvokeMember("Id",
+				test = (int)type.InvokeMember("Int",
 					BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance,
-					null, account, null);
-				Assert.AreEqual(0, test);
+					null, prop, null);
+				Assert.AreEqual(int.MinValue, test);
 			}
 			timer.Stop();
 			double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -136,6 +168,7 @@
 			Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
         }
         
+
 		/// <summary>
         /// Test the performance of getting an integer property.
         /// </summary>
@@ -143,8 +176,8 @@
         public void TestSetIntegerPerformance()
         {
             const int TEST_ITERATIONS = 1000000;
-            Account account = new Account();
-            int value = 123;
+			Property prop = new Property();
+			int value = 123;
             Timer timer = new Timer();
 
 			#region Direct access (fastest)
@@ -154,7 +187,7 @@
             timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				account.Id = value;
+				prop.Int = value;
 			}
             timer.Stop();
             double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -164,11 +197,12 @@
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
 
-            IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-            timer.Start();
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+			timer.Start();
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
-                propertyAccessor.Set(account, value);
+                propertyAccessor.Set(prop, value);
             }
             timer.Stop();
             double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -179,13 +213,13 @@
 			GC.Collect();
 			GC.WaitForPendingFinalizers();
 
-			Type type = account.GetType();
+			Type type = prop.GetType();
 			ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(type);
             timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				PropertyInfo propertyInfo = reflectionInfo.GetSetter("Id");
-				propertyInfo.SetValue(account, value, null);
+				PropertyInfo propertyInfo = reflectionInfo.GetSetter("Int");
+				propertyInfo.SetValue(prop, value, null);
 			}
             timer.Stop();
             double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -199,8 +233,8 @@
             timer.Start();
 			for (int i = 0; i < TEST_ITERATIONS; i++)
 			{
-				PropertyInfo propertyInfo = type.GetProperty("Id", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
-				propertyInfo.SetValue(account, value, null);
+				PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance);
+				propertyInfo.SetValue(prop, value, null);
 			}
             timer.Stop();
             double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -214,9 +248,9 @@
             timer.Start();
             for (int i = 0; i < TEST_ITERATIONS; i++)
             {
-                type.InvokeMember("Id",
+                type.InvokeMember("Int",
                     BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance,
-                    null, account, new object[] { value });
+                    null, prop, new object[] { value });
             }
             timer.Stop();
             double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS);
@@ -232,19 +266,153 @@
             Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3"));
         }
        
+
 		/// <summary>
         /// Test the performance of getting an integer property.
         /// </summary>
         [Test]
         public void TestSetNullOnIntegerProperty()
         {
-            Account account = new Account();
-            account.Id = -99;
+            Property prop = new Property();
+            prop.Int = -99;
 
             // Property accessor
-            IPropertyAccessor propertyAccessor = ILPropertyAccessor.CreatePropertyAccessor(typeof(Account), "Id");
-            propertyAccessor.Set(account, null);
-            Assert.IsTrue(account.Id == 0);
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+            propertyAccessor.Set(prop, null);
+            Assert.AreEqual(0, prop.Int);
         }
+
+		/// <summary>
+		/// Test setting an integer property.
+		/// </summary>
+		[Test]
+		public void TestSetInteger()
+		{
+			Property prop = new Property();
+			prop.Int = -99;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+			int test = 57;
+			propertyAccessor.Set(prop, test);
+			Assert.AreEqual(test, prop.Int);
+		}
+
+		/// <summary>
+		/// Test getting an integer property.
+		/// </summary>
+		[Test]
+		public void TestGetInteger()
+		{
+			int test = -99;
+			Property prop = new Property();
+			prop.Int = test;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Int");
+			Assert.AreEqual(test, propertyAccessor.Get(prop));
+		}
+
+		/// <summary>
+		/// Test the performance of getting an Long property.
+		/// </summary>
+		[Test]
+		public void TestSetNullOnLongProperty()
+		{
+			Property prop = new Property();
+			prop.Long = 78945566664213223;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Long");
+			propertyAccessor.Set(prop, null);
+			Assert.AreEqual((long)0, prop.Long);
+		}
+
+		/// <summary>
+		/// Test setting an Long property.
+		/// </summary>
+		[Test]
+		public void TestSetLong()
+		{
+			Property prop = new Property();
+			prop.Long = 78945566664213223;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Long");
+			long test = 123456789987456;
+			propertyAccessor.Set(prop, test);
+			Assert.AreEqual(test, prop.Long);
+		}
+
+		/// <summary>
+		/// Test getting an long property.
+		/// </summary>
+		[Test]
+		public void TestGetLong()
+		{
+			long test = 78945566664213223;
+			Property prop = new Property();
+			prop.Long = test;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "Long");
+			Assert.AreEqual(test, propertyAccessor.Get(prop));
+		}
+
+
+		/// <summary>
+		/// Test the performance of getting an sbyte property.
+		/// </summary>
+		[Test]
+		public void TestSetNullOnSbyteProperty()
+		{
+			Property prop = new Property();
+			prop.SByte = 78;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "SByte");
+			propertyAccessor.Set(prop, null);
+			Assert.AreEqual((sbyte)0, prop.SByte);
+		}
+
+		/// <summary>
+		/// Test setting an sbyte property.
+		/// </summary>
+		[Test]
+		public void TestSetSbyte()
+		{
+			Property prop = new Property();
+			prop.SByte = 78;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "SByte");
+			sbyte test = 19;
+			propertyAccessor.Set(prop, test);
+			Assert.AreEqual(test, prop.SByte);
+		}
+
+		/// <summary>
+		/// Test getting an sbyte property.
+		/// </summary>
+		[Test]
+		public void TestGetSbyte()
+		{
+			sbyte test = 78;
+			Property prop = new Property();
+			prop.SByte = test;
+
+			// Property accessor
+			PropertyAccessorFactory factory = new PropertyAccessorFactory(true);
+			IPropertyAccessor propertyAccessor = factory.CreatePropertyAccessor(typeof(Property), "SByte");
+			Assert.AreEqual(test, propertyAccessor.Get(prop));
+		}
     }
 }

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.2005.csproj Tue Mar 14 13:07:25 2006
@@ -204,6 +204,7 @@
     <Compile Include="Utilities\Objects\ObjectProbe.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Utilities\Objects\PropertyAccessorFactory.cs" />
     <Compile Include="Utilities\Objects\ReflectionInfo.cs">
       <SubType>Code</SubType>
     </Compile>

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/IBatisNet.Common.csproj Tue Mar 14 13:07:25 2006
@@ -350,6 +350,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "Utilities\Objects\PropertyAccessorFactory.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "Utilities\Objects\ReflectionInfo.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs Tue Mar 14 13:07:25 2006
@@ -38,7 +38,6 @@
 		private FactoryBuilder _factoryBuilder = null;
 		private object _padlock = new object();
 
-
 		/// <summary>
 		/// 
 		/// </summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ILPropertyAccessor.cs Tue Mar 14 13:07:25 2006
@@ -42,32 +42,34 @@
         private string _propertyName = string.Empty;
         private Type _propertyType = null;
         private IPropertyAccessor _emittedPropertyAccessor = null;
-        private static IDictionary _typeToOpcode = new HybridDictionary();
-        private static AssemblyBuilder _assemblyBuilder = null;
-        private static ModuleBuilder _moduleBuilder = null;
-        private static IDictionary _cachedIPropertyAccessor = new HybridDictionary();
+		private AssemblyBuilder _assemblyBuilder = null;
+		private ModuleBuilder _moduleBuilder = null;
+
+		private static IDictionary _typeToOpcode = new HybridDictionary();
         private static IDictionary _defaultValueType = new HybridDictionary();
 
         /// <summary>
         /// Static constructor
         /// "Initialize a private hashtable with type-opCode pairs 
-        /// so we dont have to write a long if/else statement when outputting msil"
         /// </summary>
         static ILPropertyAccessor()
         {
-            _defaultValueType[typeof(sbyte)] = 0;
-            _defaultValueType[typeof(byte)] = 0;
-            _defaultValueType[typeof(char)] = '\0';
-            _defaultValueType[typeof(short)] = 0;
-            _defaultValueType[typeof(ushort)] = 0;
-            _defaultValueType[typeof(int)] = 0;
-            _defaultValueType[typeof(uint)] = 0;
+            _defaultValueType[typeof(sbyte)] = (sbyte)0;
+            _defaultValueType[typeof(byte)] = (byte)0;
+            _defaultValueType[typeof(char)] = (char)'\0';
+            _defaultValueType[typeof(short)] = (short)0;
+            _defaultValueType[typeof(ushort)] = (ushort)0;
+            _defaultValueType[typeof(int)] = (int)0;
+            _defaultValueType[typeof(uint)] = (uint)0;
             _defaultValueType[typeof(long)] = 0L;
             _defaultValueType[typeof(ulong)] = 0L;
             _defaultValueType[typeof(bool)] = false;
             _defaultValueType[typeof(double)] = 0.0D;
             _defaultValueType[typeof(float)] = 0.0F;
-           // _defaultValueType[typeof(decimal)] = 0.0M;
+			_defaultValueType[typeof(decimal)] = 0.0M;
+//			_defaultValueType[typeof(DateTime)] = 0.0M;
+//			_defaultValueType[typeof(Guid)] = 0.0M;
+//			_defaultValueType[typeof(TimeSpan)] = 0.0M;
 
             _typeToOpcode[typeof(sbyte)] = OpCodes.Ldind_I1;
             _typeToOpcode[typeof(byte)] = OpCodes.Ldind_U1;
@@ -81,48 +83,20 @@
             _typeToOpcode[typeof(bool)] = OpCodes.Ldind_I1;
             _typeToOpcode[typeof(double)] = OpCodes.Ldind_R8;
             _typeToOpcode[typeof(float)] = OpCodes.Ldind_R4;
-
-        	AssemblyName assemblyName = new AssemblyName();
-            assemblyName.Name = "iBATIS.FastPropertyAccessor";
-
-            // Create a new assembly with one module
-            _assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
-            _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll");
         }
 
-        
-		/// <summary>
-        /// Generate the IPropertyAccessor object
-        /// </summary>
-        /// <param name="targetType">Target object type.</param>
-        /// <param name="propertyName">Property name.</param>
-        /// <returns>null if the generation fail</returns>
-        public static IPropertyAccessor CreatePropertyAccessor(Type targetType, string propertyName)
-        {
-            string key = targetType.FullName+propertyName;
-            lock (_assemblyBuilder)
-            {
-                if (_cachedIPropertyAccessor.Contains(key))
-                {
-                    return (IPropertyAccessor)_cachedIPropertyAccessor[key];
-                }
-                else
-                {
-                    IPropertyAccessor propertyAccessor = new ILPropertyAccessor(targetType, propertyName);
-                    _cachedIPropertyAccessor[key] = propertyAccessor;
-                    return propertyAccessor;
-                }
-            }
-        }
-
-		
+        		
 		/// <summary>
 		/// Creates a new IL property accessor.
 		/// </summary>
 		/// <param name="targetType">Target object type.</param>
         /// <param name="propertyName">Property name.</param>
-        private ILPropertyAccessor(Type targetType, string propertyName)
+        /// <param name="assemblyBuilder"></param>
+        /// <param name="moduleBuilder"></param>
+        public ILPropertyAccessor(Type targetType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder)
 		{
+			this._assemblyBuilder = assemblyBuilder;
+			this._moduleBuilder = moduleBuilder;
 			this._targetType = targetType;
             this._propertyName = propertyName;
 
@@ -173,24 +147,6 @@
 
 
 		/// <summary>
-		/// The Type of object this property accessor was
-		/// created for.
-		/// </summary>
-		public Type TargetType
-		{
-			get { return this._targetType; }
-		}
-
-		/// <summary>
-		/// The Type of the Property being accessed.
-		/// </summary>
-		public Type PropertyType
-		{
-			get { return this._propertyType; }
-		}
-
-
-		/// <summary>
 		/// This method generates creates a new assembly containing
 		/// the Type that will provide dynamic access.
 		/// </summary>
@@ -199,7 +155,7 @@
 			// Create the assembly and an instance of the property accessor class.
             EmitType();
 
-            _emittedPropertyAccessor = _assemblyBuilder.CreateInstance("PropertyAccessorFor" + _propertyName) as IPropertyAccessor;
+            _emittedPropertyAccessor = _assemblyBuilder.CreateInstance("PropertyAccessorFor" + _targetType.FullName + _propertyName) as IPropertyAccessor;
 
 			if(_emittedPropertyAccessor == null)
 			{
@@ -212,8 +168,8 @@
 		/// </summary>
 		private void EmitType()
 		{
-			//  Define a public class named "Property" in the assembly.
-            TypeBuilder typeBuilder = _moduleBuilder.DefineType("PropertyAccessorFor" + _propertyName, TypeAttributes.Public);
+			//  Define a public class named "Property..." in the assembly.
+            TypeBuilder typeBuilder = _moduleBuilder.DefineType("PropertyAccessorFor" + _targetType.FullName + _propertyName, TypeAttributes.Public);
 
 			// Mark the class as implementing IPropertyAccessor. 
 			typeBuilder.AddInterfaceImplementation(typeof(IPropertyAccessor));
@@ -261,11 +217,10 @@
 
 			// Define a method for the set operation.
 			Type[] setParamTypes = new Type[] {typeof(object), typeof(object)};
-			Type setReturnType = null;
 			MethodBuilder setMethod = 
 				typeBuilder.DefineMethod("Set", 
 				MethodAttributes.Public | MethodAttributes.Virtual, 
-				setReturnType, 
+				null, 
 				setParamTypes);
 
 			// From the method, get an ILGenerator. This is used to
@@ -280,12 +235,10 @@
 				setIL.DeclareLocal(paramType);
 				setIL.Emit(OpCodes.Ldarg_1);						//Load the first argument 
 																	//(target object)
-
 				setIL.Emit(OpCodes.Castclass, this._targetType);	//Cast to the source type
 
 				setIL.Emit(OpCodes.Ldarg_2);						//Load the second argument 
 																	//(value object)
-
 				if(paramType.IsValueType)
 				{
 					setIL.Emit(OpCodes.Unbox, paramType);			//Unbox it 	
@@ -311,7 +264,6 @@
 			{
 				setIL.ThrowException(typeof(MissingMethodException));
 			}
-
 			setIL.Emit(OpCodes.Ret);
 
 			// Load the type

Added: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs?rev=385889&view=auto
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs (added)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs Tue Mar 14 13:07:25 2006
@@ -0,0 +1,111 @@
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace IBatisNet.Common.Utilities.Objects
+{
+	/// <summary>
+	/// Summary description for PropertyAccessorFactory.
+	/// </summary>
+	public class PropertyAccessorFactory
+	{
+		private IDictionary _cachedIPropertyAccessor = new HybridDictionary();
+		private delegate IPropertyAccessor CreateIPropertyAccessor(Type targetType, string propertyName);
+		private CreateIPropertyAccessor _createPropertyAccessor;
+		private AssemblyBuilder _assemblyBuilder = null;
+		private ModuleBuilder _moduleBuilder = null;
+		private object _padlock = new object();
+
+		/// <summary>
+		/// Constructor
+		/// </summary>
+		/// <param name="allowCodeGeneration"></param>
+		public PropertyAccessorFactory(bool allowCodeGeneration)
+		{
+			if (allowCodeGeneration)
+			{
+				AssemblyName assemblyName = new AssemblyName();
+				assemblyName.Name = "iBATIS.FastPropertyAccessor"+HashCodeProvider.GetIdentityHashCode(this).ToString();
+
+				// Create a new assembly with one module
+				_assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
+				_moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll");
+
+				// Detect runtime environment and create the appropriate factory
+				if (Environment.Version.Major >= 2)
+				{
+					// To Do : a custom factory for .NET V2
+					// optimize with DynamicMethod or Delegate.CreateDelegate
+					_createPropertyAccessor = new CreateIPropertyAccessor(CreateILPropertyAccessor);
+					
+				}
+				else
+				{
+					_createPropertyAccessor = new CreateIPropertyAccessor(CreateILPropertyAccessor);
+				}
+			}
+			else
+			{
+				_createPropertyAccessor = new CreateIPropertyAccessor(CreateReflectionPropertyAccessor);
+			}
+
+		}
+
+		/// <summary>
+		/// Generate an IPropertyAccessor object
+		/// </summary>
+		/// <param name="targetType">Target object type.</param>
+		/// <param name="propertyName">Property name.</param>
+		/// <returns>null if the generation fail</returns>
+		public IPropertyAccessor CreatePropertyAccessor(Type targetType, string propertyName)
+		{
+			string key = targetType.FullName+propertyName;
+			
+			if (_cachedIPropertyAccessor.Contains(key))
+			{
+				return (IPropertyAccessor)_cachedIPropertyAccessor[key];
+			}
+			else
+			{
+				IPropertyAccessor propertyAccessor = null;
+				lock (_padlock)
+				{
+					if (!_cachedIPropertyAccessor.Contains(key))
+					{
+						propertyAccessor = _createPropertyAccessor(targetType, propertyName);
+						_cachedIPropertyAccessor[key] = propertyAccessor;
+					}
+					else
+					{
+						propertyAccessor = (IPropertyAccessor)_cachedIPropertyAccessor[key];
+					}
+				}
+				return propertyAccessor;
+			}
+		}
+
+		/// <summary>
+		/// Generate a ILPropertyAccessor object
+		/// </summary>
+		/// <param name="targetType">Target object type.</param>
+		/// <param name="propertyName">Property name.</param>
+		/// <returns>null if the generation fail</returns>
+		private IPropertyAccessor CreateILPropertyAccessor(Type targetType, string propertyName)
+		{
+			return  new ILPropertyAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder);
+		}
+
+		/// <summary>
+		/// Generate a ReflectionPropertyAccessor object
+		/// </summary>
+		/// <param name="targetType">Target object type.</param>
+		/// <param name="propertyName">Property name.</param>
+		/// <returns>null if the generation fail</returns>
+		private IPropertyAccessor CreateReflectionPropertyAccessor(Type targetType, string propertyName)
+		{
+			return  new ReflectionPropertyAccessor(targetType, propertyName);
+		}
+	}
+}

Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/PropertyAccessorFactory.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ReflectionPropertyAccessor.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ReflectionPropertyAccessor.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ReflectionPropertyAccessor.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.Common/Utilities/Objects/ReflectionPropertyAccessor.cs Tue Mar 14 13:07:25 2006
@@ -34,6 +34,16 @@
     /// </summary>
     public class ReflectionPropertyAccessor : IPropertyAccessor
     {
+
+		/// <summary>
+		/// Creates a new Reflection property accessor.
+		/// </summary>
+		/// <param name="targetType">Target object type.</param>
+		/// <param name="propertyName">Property name.</param>
+		public ReflectionPropertyAccessor(Type targetType, string propertyName)
+		{
+		}
+
         /// <summary>
         /// Gets the value stored in the property for 
         /// the specified target.

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs Tue Mar 14 13:07:25 2006
@@ -375,6 +375,9 @@
             double ibatis = 0;
             double adonet = 0;
 
+            IDbConnection _connection = sqlMap.DataSource.DbProvider.CreateConnection();
+            _connection.ConnectionString = sqlMap.DataSource.ConnectionString;
+
             for (int n = 2; n < 4000; n *= 2)
             {
                 Simple[] simples = new Simple[n];
@@ -390,8 +393,6 @@
                 Ibatis(simples, n, "h0");
                 sqlMap.CloseConnection();
 
-                IDbConnection _connection = sqlMap.DataSource.DbProvider.CreateConnection();
-                _connection.ConnectionString = sqlMap.DataSource.ConnectionString;
 
                 _connection.Open();
                 DirectAdoNet(_connection, simples, n, "j0");

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/bin/Debug/providers.config
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/bin/Debug/providers.config?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/bin/Debug/providers.config (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/bin/Debug/providers.config Tue Mar 14 13:07:25 2006
@@ -37,7 +37,7 @@
 	  usePositionalParameters="false" 
 	  useParameterPrefixInSql="true" 
 	  useParameterPrefixInParameter="true" 
-    allowPreparingCommands="true"
+    allowPreparingCommands="false"
 	  parameterPrefix="@"
   />
 <provider

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs
URL: http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs?rev=385889&r1=385888&r2=385889&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs Tue Mar 14 13:07:25 2006
@@ -651,7 +651,7 @@
 			Reset();
 
             // To do, analyse config file to set allowCodeGeneration on object factory
-			_configScope.SqlMapper = new SqlMapper( new ObjectFactory(false), new TypeHandlerFactory() );
+			_configScope.SqlMapper = new SqlMapper( new ObjectFactory(true), new TypeHandlerFactory() );
 
 
 			#region Cache Alias