Author: gbayon
Date: Sat Feb 18 13:18:09 2006
New Revision: 378778

URL: http://svn.apache.org/viewcvs?rev=378778&view=rev
Log:
- Added support for readOnly & serialize attribut on CacheModel (à la Java)

Added:
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
Modified:
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/LineItem.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Order.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Scope/RequestScope.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs Sat Feb 
18 13:18:09 2006
@@ -5,6 +5,7 @@
        /// <summary>
        /// Description résumée de Account.
        /// </summary>
+       [Serializable]
        public class Account
        {
                private int _id;

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/LineItem.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/LineItem.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/LineItem.cs 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/LineItem.cs Sat Feb 
18 13:18:09 2006
@@ -8,6 +8,7 @@
        /// <summary>
        /// Description résumée de LineItem.
        /// </summary>
+       [Serializable]
        public class LineItem
        {
                private int _id;

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Order.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Order.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Order.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Order.cs Sat Feb 18 
13:18:09 2006
@@ -9,6 +9,7 @@
        /// <summary>
        /// Description résumée de Order.
        /// </summary>
+       [Serializable]
        public class Order
        {
                private int _id;

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
 Sat Feb 18 13:18:09 2006
@@ -767,6 +767,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = 
"NUnit\SqlMapTests\CacheController\CacheModelTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = 
"NUnit\SqlMapTests\CacheController\FifoCacheControllerTest.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -11,12 +11,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!-- <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
-               </cacheModel> -->
+               </cacheModel>
                
     </cacheModels>
        
@@ -102,8 +100,13 @@
                        from Accounts
                        order by Account_ID
                </select>
-               
-       <select id="SelectWithProperty"
+
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+                               
+               <select id="SelectWithProperty"
                                        resultMap="account-result">
                        select *
                        from Accounts

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -11,12 +11,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!-- <cacheModel id="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property id="CacheSize" value="50"/>
-               </cacheModel> -->
+               </cacheModel>
                
     </cacheModels>
        
@@ -107,6 +105,11 @@
                        select *
                        from Accounts
                        order by Account_ID
+               </select>
+  
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
                </select>
   
        <select id="GetNoAccountWithCache"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -11,12 +11,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!-- <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
-               </cacheModel> -->
+               </cacheModel>
                
     </cacheModels>
  
@@ -116,6 +114,11 @@
                        order by Account_ID
                </select>
 
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+               
                <select id="GetNoAccountWithCache"
                                                parameterClass="Integer"
                                                
resultMap="account-hashtable-result"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
 Sat Feb 18 13:18:09 2006
@@ -57,6 +57,11 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
+                       <flushInterval hours="24"/>
+                       <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
+               </cacheModel>
+  
                <!-- <cacheModel name="account-cache" implementation="LRU" >
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
@@ -135,6 +140,11 @@
                        select *
                        from Accounts
                        order by Account_ID
+               </select>
+  
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
                </select>
   
                <select id="GetNoAccountWithCache"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -54,14 +54,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!-- 
-               <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
-               </cacheModel> 
-               -->
+               </cacheModel>
                
     </cacheModels>
        
@@ -162,6 +158,11 @@
                        order by Account_ID
                </select>
 
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+               
        <select id="GetNoAccountWithCache"
                                                parameterClass="Integer"
                                                
resultMap="account-hashtable-result"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -54,14 +54,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!--
-               <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
                </cacheModel>
-               -->
                
     </cacheModels>
        
@@ -161,7 +157,12 @@
                        from Accounts
                        order by Account_ID
                </select>
-
+               
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+               
        <select id="GetNoAccountWithCache"
                                                parameterClass="Integer"
                                                
resultMap="account-hashtable-result"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml 
Sat Feb 18 13:18:09 2006
@@ -55,14 +55,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!--
-               <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
                </cacheModel>
-               -->
                
     </cacheModels>
     
@@ -161,7 +157,12 @@
                        from Accounts
                        order by Account_ID
                </select>
-               
+
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+                               
                <select id="GetNoAccountWithCache"
                                                parameterClass="Integer"
                                                
resultMap="account-hashtable-result"

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
 Sat Feb 18 13:18:09 2006
@@ -54,12 +54,10 @@
                        <property name="Type" value="Weak"/>
                </cacheModel>
                
-               <!-- <cacheModel name="account-cache" implementation="LRU" >
+               <cacheModel id="rw-account-cache" implementation="FIFO" 
serialize="true" readOnly="false">
                        <flushInterval hours="24"/>
                        <flushOnExecute 
statement="UpdateAccountViaInlineParameters"/>
-                       <flushOnExecute 
statement="UpdateAccountViaParameterMap"/>
-                       <property name="CacheSize" value="50"/>
-               </cacheModel> -->
+               </cacheModel>
                
     </cacheModels>
        
@@ -158,7 +156,12 @@
                        from Accounts
                        order by Account_ID
                </select>
-  
+ 
+               <select id="GetRWCachedAccountsViaResultMap"
+                               resultMap="account-result"
+                               cacheModel="rw-account-cache" 
extends="GetCachedAccountsViaResultMap">
+               </select>
+                
                <select id="GetNoAccountWithCache"
                                                parameterClass="Integer"
                                                
resultMap="account-hashtable-result"

Added: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs?rev=378778&view=auto
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
 (added)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
 Sat Feb 18 13:18:09 2006
@@ -0,0 +1,106 @@
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using IBatisNet.Common.Utilities;
+using IBatisNet.DataMapper.Configuration.Cache;
+using IBatisNet.DataMapper.Configuration.Cache.Lru;
+using NUnit.Framework;
+
+using IBatisNet.DataMapper.Test.Domain;
+
+namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.CacheController
+{
+       /// <summary>
+       /// Summary description for CacheKeyTest.
+       /// </summary>
+       [TestFixture]
+       public class CacheModelTest
+       {
+               [Test]
+               /// <summary>
+               /// Returns reference to same instance of cached object
+               /// </summary>
+               public void TestReturnInstanceOfCachedOject()
+               {
+                       ICacheController cacheController = new 
LruCacheController();
+                       IDictionary props = new HybridDictionary();
+                       props.Add("CacheSize", "1");
+                       cacheController.Configure(props);
+
+                       FlushInterval interval = new FlushInterval();
+                       interval.Hours = 1;
+                       interval.Initialize();
+
+                       CacheModel cacheModel = new CacheModel();
+                       cacheModel.FlushInterval = interval;
+                       cacheModel.CacheController = cacheController;
+                       cacheModel.IsReadOnly = true;
+                       cacheModel.IsSerializable = false;
+
+                       Order order = new Order(); 
+                       order.CardNumber = "CardNumber";
+                       order.Date = DateTime.Now;
+                       order.LineItems = new ArrayList();
+                       LineItem item = new LineItem();
+                       item.Code = "Code1";
+                       order.LineItems.Add( item );
+                       item = new LineItem();
+                       item.Code = "Code2";
+                       order.LineItems.Add( item );
+
+                       CacheKey key = new CacheKey();
+                       key.Update(order);
+
+                       int firstId = 
HashCodeProvider.GetIdentityHashCode(order);
+                       cacheModel[ key ] = order;
+
+                       Order order2 = cacheModel[ key ] as Order;
+                       int secondId = 
HashCodeProvider.GetIdentityHashCode(order2);
+                       Assert.AreEqual(firstId, secondId, "hasCode different");
+               }
+
+               [Test]
+               /// <summary>
+               /// Returns copy of cached object
+               /// </summary>
+               public void TestReturnCopyOfCachedOject()
+               {
+                       ICacheController cacheController = new 
LruCacheController();
+                       IDictionary props = new HybridDictionary();
+                       props.Add("CacheSize", "1");
+                       cacheController.Configure(props);
+
+                       FlushInterval interval = new FlushInterval();
+                       interval.Hours = 1;
+                       interval.Initialize();
+
+                       CacheModel cacheModel = new CacheModel();
+                       cacheModel.FlushInterval = interval;
+                       cacheModel.CacheController = cacheController;
+                       cacheModel.IsReadOnly = false;
+                       cacheModel.IsSerializable = true;
+
+                       Order order = new Order(); 
+                       order.CardNumber = "CardNumber";
+                       order.Date = DateTime.Now;
+                       order.LineItems = new ArrayList();
+                       LineItem item = new LineItem();
+                       item.Code = "Code1";
+                       order.LineItems.Add( item );
+                       item = new LineItem();
+                       item.Code = "Code2";
+                       order.LineItems.Add( item );
+
+                       CacheKey key = new CacheKey();
+                       key.Update(order);
+
+                       int firstId = 
HashCodeProvider.GetIdentityHashCode(order);
+                       cacheModel[ key ] = order;
+
+                       Order order2 = cacheModel[ key ] as Order;
+                       int secondId = 
HashCodeProvider.GetIdentityHashCode(order2);
+                       Assert.AreNotEqual(firstId, secondId, "hasCode equal");
+
+               }
+       }
+}

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs 
Sat Feb 18 13:18:09 2006
@@ -128,18 +128,17 @@
                [Test]
                public void TestMappedStatementQueryWithThreadedCache() 
                {
-                       Hashtable results1 = new Hashtable();
-                       Hashtable results2 = new Hashtable();
+                       Hashtable results = new Hashtable();
 
-                       TestCacheThread.StartThread(sqlMap, results1, 
"GetCachedAccountsViaResultMap");
-                       int firstId = (int) results1["id"];
+                       TestCacheThread.StartThread(sqlMap, results, 
"GetCachedAccountsViaResultMap");
+                       int firstId = (int) results["id"];
 
-                       TestCacheThread.StartThread(sqlMap, results2, 
"GetCachedAccountsViaResultMap");
-                       int secondId = (int) results2["id"];
+                       TestCacheThread.StartThread(sqlMap, results, 
"GetCachedAccountsViaResultMap");
+                       int secondId = (int) results["id"];
 
                        Assert.AreEqual(firstId, secondId);
 
-                       IList list = (IList) results1["list"];
+                       IList list = (IList) results["list"];
 
                        Account account = (Account) list[1];
                        account.EmailAddress = "[EMAIL PROTECTED]";
@@ -152,6 +151,34 @@
                        Assert.IsTrue(firstId != thirdId);
                }
 
+               /// <summary>
+               /// Test MappedStatement Query With Threaded Read Write Cache
+               /// </summary>
+               [Test]
+               public void TestMappedStatementQueryWithThreadedReadWriteCache()
+               {
+                       Hashtable results = new Hashtable();
+
+                       TestCacheThread.StartThread(sqlMap, results, 
"GetRWCachedAccountsViaResultMap");
+                       int firstId = (int) results["id"];
+
+                       TestCacheThread.StartThread(sqlMap, results, 
"GetRWCachedAccountsViaResultMap");
+                       int secondId = (int) results["id"];
+
+                       Assert.AreNotEqual(firstId, secondId);
+
+                       IList list = (IList) results["list"];
+
+                       Account account = (Account) list[1];
+                       account.EmailAddress = "[EMAIL PROTECTED]";
+                       sqlMap.Update("UpdateAccountViaInlineParameters", 
account);
+
+                       list = 
sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
+
+                       int thirdId = 
HashCodeProvider.GetIdentityHashCode(list);
+
+                       Assert.AreNotEqual(firstId, thirdId);
+               }
 
                /// <summary>
                /// Test Cache Null Object
@@ -307,8 +334,8 @@
                                        list = 
statement.ExecuteQueryForList(session, null);
                                        int secondId = 
HashCodeProvider.GetIdentityHashCode(list);
 
-                                       _results.Add("id", secondId );
-                                       _results.Add("list", list);
+                                       _results["id"] = secondId ;
+                                       _results["list"] = list;
                                        session.CloseConnection();
                                } 
                                catch (Exception e) 

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt Sat Feb 18 
13:18:09 2006
@@ -3,6 +3,7 @@
 ------------------------------
 1.4 - XX/XX/XXX
 ------------------------------
+- Added support for readOnly & serialize attribut on CacheModel
 - Added Support for .NET V2 and Generic
        
        public T QueryForObject<T>(string statementName, object 
parameterObject);

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs 
Sat Feb 18 13:18:09 2006
@@ -29,8 +29,10 @@
 using System;
 using System.Collections;
 using System.Collections.Specialized;
+using System.IO;
 using System.Reflection;
 using System.Runtime.CompilerServices;
+using System.Runtime.Serialization.Formatters.Binary;
 using System.Xml.Serialization;
 using IBatisNet.Common.Exceptions;
 using IBatisNet.Common.Logging;
@@ -88,9 +90,9 @@
                [NonSerialized]
                private string _implementation = string.Empty;
                [NonSerialized]
-               private bool _readOnly = false;
+               private bool _isReadOnly = true;
                [NonSerialized]
-               private bool _serialize = false;
+               private bool _isSerializable = false;
 
                #endregion
 
@@ -128,6 +130,14 @@
                }
 
                /// <summary>
+               /// Set the cache controller
+               /// </summary>
+               public ICacheController CacheController
+               {
+                       set{ _controller =value; }      
+               }
+
+               /// <summary>
                /// Set or get the flushInterval (in Ticks)
                /// </summary>
                [XmlElement("flushInterval",typeof(FlushInterval))]
@@ -136,6 +146,35 @@
                        get { return _flushInterval; }
                        set { _flushInterval = value; }
                }
+
+               /// <summary>
+               /// Specifie how the cache content should be returned.
+               /// If true a deep copy is returned.
+               /// </summary>
+               /// <remarks>
+               /// Combinaison
+               /// IsReadOnly=true/IsSerializable=false : Returned instance of 
cached object
+               /// IsReadOnly=false/IsSerializable=true : Returned coopy of 
cached object
+               /// </remarks>
+               public bool IsSerializable
+               {
+                       get { return _isSerializable; }
+                       set { _isSerializable = value; }
+               }
+
+               /// <summary>
+               /// Determines if the cache will be used as a read-only cache.
+               /// Tells the cache model that is allowed to pass back a 
reference to the object
+               /// existing in the cache.
+               /// </summary>
+               /// <remarks>
+               /// The IsReadOnly properties works in conjonction with the 
IsSerializable propertie.
+               /// </remarks>
+               public bool IsReadOnly
+               {
+                       get { return _isReadOnly; }
+                       set { _isReadOnly = value; }
+               }
                #endregion
 
                #region Constructor (s) / Destructor
@@ -258,6 +297,23 @@
                                        value = _controller[key];
                                }
 
+                               if(_isSerializable && !_isReadOnly &&
+                                       (value != NULL_OBJECT && value != null))
+                               {
+                                       try
+                                       {
+                                               MemoryStream stream = new 
MemoryStream((byte[]) value);
+                                               stream.Position = 0;
+                                               BinaryFormatter formatter = new 
BinaryFormatter();
+                                               value = formatter.Deserialize( 
stream );
+                                       }
+                                       catch(Exception ex)
+                                       {
+                                               throw new 
IBatisNetException("Error caching serializable object.  Be sure you're not 
attempting to use " +
+                                                       "a serialized cache for 
an object that may be taking advantage of lazy loading.  Cause: "+ex.Message, 
ex);
+                                       }
+                               }
+
                                lock(_statLock) 
                                {
                                        _requests++;
@@ -270,7 +326,21 @@
                        }
                        set
                        {
-                               if (null == value) value = NULL_OBJECT;
+                               if (null == value) {value = NULL_OBJECT;}
+                               if(_isSerializable && !_isReadOnly && value != 
NULL_OBJECT)
+                               {
+                                       try
+                                       {
+                                               MemoryStream stream = new 
MemoryStream();
+                                               BinaryFormatter formatter = new 
BinaryFormatter();
+                                               formatter.Serialize(stream, 
value);
+                                               value = stream.ToArray();
+                                       }
+                                       catch(Exception ex)
+                                       {
+                                               throw new 
IBatisNetException("Error caching serializable object. Cause: "+ex.Message, ex);
+                                       }
+                               }
                                _controller[key] = value;
                        }
                }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs
 Sat Feb 18 13:18:09 2006
@@ -54,6 +54,8 @@
                        model.Id = NodeUtils.GetStringAttribute(prop, "id");
                        model.Implementation = 
NodeUtils.GetStringAttribute(prop, "implementation");
                        model.Implementation = 
configScope.SqlMapper.TypeHandlerFactory.GetTypeAlias(model.Implementation).Class.AssemblyQualifiedName;
+                       model.IsReadOnly = NodeUtils.GetBooleanAttribute(prop, 
"readOnly", true);
+                       model.IsSerializable = 
NodeUtils.GetBooleanAttribute(prop, "serialize", false);
 
                        for(int i=0;i<node.ChildNodes.Count;i++)
                        {

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs
 Sat Feb 18 13:18:09 2006
@@ -446,6 +446,11 @@
                        
cacheKey.Update(_mappedStatement.SqlMap.DataSource.ConnectionString);
                        cacheKey.Update(request.IDbCommand.CommandText);
 
+                       CacheModel cacheModel = 
_mappedStatement.Statement.CacheModel;
+                       if (!cacheModel.IsReadOnly && 
!cacheModel.IsSerializable) 
+                       {
+                               cacheKey.Update(request);
+                       }
                        return cacheKey;
                }
        }

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Scope/RequestScope.cs
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Scope/RequestScope.cs?rev=378778&r1=378777&r2=378778&view=diff
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Scope/RequestScope.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Scope/RequestScope.cs Sat Feb 
18 13:18:09 2006
@@ -28,6 +28,7 @@
 
 using System.Collections;
 using System.Data;
+using System.Runtime.CompilerServices;
 using IBatisNet.DataMapper.Configuration.ParameterMapping;
 using IBatisNet.DataMapper.Configuration.ResultMapping;
 using IBatisNet.DataMapper.Configuration.Statements;
@@ -50,20 +51,10 @@
                private IDbCommand _command = null;
                private Queue _properties = new Queue();
                bool _rowDataFound= false;
-
+               private static long _nextId = 0;
+               private long _id = 0;
                #endregion
        
-               #region Constructors
-
-               /// <summary>
-               /// Default constructor
-               /// </summary>
-               public RequestScope()
-               {
-                       _errorContext = new ErrorContext();
-               }
-               #endregion 
-
                #region Properties
 
                /// <summary>
@@ -132,8 +123,45 @@
                }
                #endregion
 
+               #region Constructors
+
+               /// <summary>
+               /// Default constructor
+               /// </summary>
+               public RequestScope()
+               {
+                       _errorContext = new ErrorContext();
+                        _id = GetNextId();
+               }
+               #endregion 
+
                #region Method
 
+               /// <summary>
+               /// Check if the specify object is equal to the current object.
+               /// </summary>
+               /// <param name="obj"></param>
+               /// <returns></returns>
+               public override bool Equals(object obj)
+               {
+                       if (this == obj) {return true;}
+                       if (!(obj is RequestScope)) {return false;}
+
+                       RequestScope scope = (RequestScope) obj;
+
+                       if (_id != scope._id) return false;
+
+                       return true;
+               }
+
+               /// <summary>
+               /// Get the HashCode for this RequestScope
+               /// </summary>
+               /// <returns></returns>
+               public override int GetHashCode() 
+               {
+                        return (int) (_id ^ (_id >> 32));
+               }
 
                /// <summary>
                /// Check if the ResultMap is well set, process case of subMap 
resultMap.
@@ -145,6 +173,15 @@
                        return _resultMap.ResolveSubMap(dataReader);
                }
 
+               /// <summary>
+               /// Method to get a unique ID
+               /// </summary>
+               /// <returns>The new ID</returns>
+               [MethodImpl(MethodImplOptions.Synchronized)]
+               public static long GetNextId() 
+               {
+                       return _nextId++;
+               }
                #endregion
        }
 }


Reply via email to