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 2008/05/31 15:52:06 UTC

svn commit: r662026 - in /ibatis/trunk/cs/V3/src: Apache.Ibatis.DataMapper.SqlClient.Test.2005/ Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/ Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ Apache.Ibatis.DataMapper.SqlClient...

Author: gbayon
Date: Sat May 31 06:52:05 2008
New Revision: 662026

URL: http://svn.apache.org/viewvc?rev=662026&view=rev
Log:
fix IBATISNET-267

Added:
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/ps_InsertAccountWithDefault.sql
Modified:
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Apache.Ibatis.DataMapper.SqlClient.Test.2005.csproj
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/Account.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ProcedureTest.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/account-init.sql
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildStatements.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ParameterMapping/InlineParameterMapParser.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Dynamic/DynamicSql.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/SimpleDynamic/SimpleDynamicSql.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/ProcedureSql.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/StaticSql.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Statements/PreparedStatementFactory.cs
    ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/SqlMap.xsd

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Apache.Ibatis.DataMapper.SqlClient.Test.2005.csproj
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Apache.Ibatis.DataMapper.SqlClient.Test.2005.csproj?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Apache.Ibatis.DataMapper.SqlClient.Test.2005.csproj (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Apache.Ibatis.DataMapper.SqlClient.Test.2005.csproj Sat May 31 06:52:05 2008
@@ -198,6 +198,7 @@
     <Content Include="Scripts\petstore-drop.sql" />
     <Content Include="Scripts\petstore-init.sql" />
     <Content Include="Scripts\petstore-schema.sql" />
+    <Content Include="Scripts\ps_InsertAccountWithDefault.sql" />
     <Content Include="Scripts\ps_SelectAccount.sql" />
     <Content Include="Scripts\ps_SelectAccountWithOutPutParam.sql" />
     <Content Include="Scripts\ps_SelectAllAccount.sql" />

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/Account.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/Account.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/Account.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Domain/Account.cs Sat May 31 06:52:05 2008
@@ -18,6 +18,7 @@
 		private bool _bannerOption = false;
 		private bool _cartOption = false;
 	    private Document _document = null;
+        private bool? nullBannerOption = false;
 
         protected IList<Document> documents = new List<Document>();
 
@@ -79,7 +80,13 @@
 		{
 			get { return _bannerOption; }
 			set { _bannerOption = value; }
-		}
+        }//nullBannerOption
+
+        public bool? NullBannerOption
+        {
+            get { return nullBannerOption; }
+            set { nullBannerOption = value; }
+        }
 
 		public bool CartOption
 		{

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ProcedureTest.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ProcedureTest.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ProcedureTest.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Fixtures/Mapping/MSSQL/ProcedureTest.cs Sat May 31 06:52:05 2008
@@ -5,8 +5,7 @@
 using Apache.Ibatis.DataMapper.SqlClient.Test.Fixtures;
 using NUnit.Framework;
 using NUnit.Framework.SyntaxHelpers;
-using Apache.Ibatis.DataMapper.Session;
-using Apache.Ibatis.DataMapper.Session.Transaction;
+using System.Collections.Generic;
 
 namespace Apache.Ibatis.DataMapper.SqlClient.Test.Fixtures.Mapping.MSSQL
 {
@@ -35,6 +34,7 @@
             InitScript( sessionFactory.DataSource, ScriptDirectory + "ps_SelectAllAccount.sql", false);			    
             InitScript( sessionFactory.DataSource, ScriptDirectory + "swap-procedure.sql" );
             InitScript(sessionFactory.DataSource, ScriptDirectory + "ps_SelectAccountWithOutPutParam.sql");
+            InitScript(sessionFactory.DataSource, ScriptDirectory + "ps_InsertAccountWithDefault.sql");
         }
 
         /// <summary>
@@ -48,6 +48,99 @@
 
         #region Specific statement store procedure tests for sql server
 
+        [Test]
+        public void Procedure_with_inline_parameter_should_work()
+        {
+            // parameter syntax
+            //@{propertyName,column=string,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string}
+
+            Account account = dataMapper.QueryForObject<Account>("SPWithInlineParameter", 1);
+            Assert.AreEqual(1, account.Id);
+        }
+
+        [Test]
+        public void Procedure_with_inline_output_parameter_should_work()
+        {
+            Hashtable map = new Hashtable();
+            map.Add("Account_ID", 1);
+            map.Add("OutPut", 0);
+            Account account = dataMapper.QueryForObject<Account>("SPWithInlineParameterAndOutPutParam", map);
+
+            Assert.That(map["OutPut"], Is.EqualTo(987));
+
+            AssertAccount1(account);
+        }
+
+        [Test]
+        public void Procedure_with_complex_inline_parameter_should_work()
+        {
+            Account account = new Account();
+
+            account.Id = 99;
+            account.FirstName = "Achille";
+            account.LastName = "Talon";
+            account.EmailAddress = "no_email@provided.com";
+            account.CartOption = false;
+
+            dataMapper.Insert("InsertAccountViaStoreProcedure", account);
+
+            Account testAccount = dataMapper.QueryForObject<Account>("GetAccountViaColumnName", 99);
+
+            Assert.IsNotNull(testAccount);
+            Assert.That(testAccount.Id, Is.EqualTo(99));
+            Assert.That(testAccount.EmailAddress, Is.EqualTo("no_email@provided.com"));
+            Assert.That(testAccount.CartOption, Is.False);
+        }
+
+        [Test]
+        public void Procedure_with_default_parameter_should_work()
+        {
+            Account account = new Account();
+
+            account.Id = 99;
+            account.FirstName = "Achille";
+            account.LastName = "Talon";
+
+            dataMapper.Insert("InsertAccountViaSPWithDefaultParameter", account);
+
+            Account testAccount = dataMapper.QueryForObject<Account>("GetAccountViaColumnName", 99);
+
+            Assert.IsNotNull(testAccount);
+            Assert.That(testAccount.Id, Is.EqualTo(99));
+            Assert.That(testAccount.EmailAddress, Is.EqualTo("no_email@provided.com"));
+            Assert.That(testAccount.BannerOption, Is.False);
+            Assert.That(testAccount.CartOption, Is.False);
+        }
+
+        [Test]
+        public void Procedure_with_dynamic_parameter_should_work()
+        {
+            Account account = new Account();
+
+            account.Id = 99;
+            account.FirstName = "Achille";
+            account.LastName = "Talon";
+            account.NullBannerOption = false;
+
+            dataMapper.Insert("InsertAccountViaSPWithDynamicParameter", account);
+
+            Account testAccount = dataMapper.QueryForObject<Account>("GetAccountViaColumnName", 99);
+
+            Assert.IsNotNull(testAccount);
+            Assert.That(testAccount.Id, Is.EqualTo(99));
+            Assert.That(testAccount.EmailAddress, Is.EqualTo("no_email@provided.com"));
+            Assert.That(testAccount.BannerOption, Is.False);
+            Assert.That(testAccount.CartOption, Is.False);
+
+            account.Id = 100;
+            account.FirstName = "Achille";
+            account.LastName = "Talon";
+            account.NullBannerOption = null;
+
+            dataMapper.Insert("InsertAccountViaSPWithDynamicParameter", account);
+
+        }
+
         /// <summary>
         /// Test XML parameter.
         /// </summary>

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Maps/Account.xml Sat May 31 06:52:05 2008
@@ -786,9 +786,10 @@
 		</procedure>
 
     <procedure id="SelectAllAccountViaSP" resultClass="Account">
-      ps_SelectAllAccount
+      ps_SelectAllAccount 
     </procedure>
 
+    
     <procedure id="SelectAccountViaXML" parameterMap="XML-params" resultClass="Account">
       ps_SelectByIdList
     </procedure>
@@ -797,6 +798,44 @@
       ps_SelectAccountWithOutPutParam
     </procedure>
     
+    <procedure id="SPWithInlineParameter" parameterClass="int" resultClass="Account">
+      ps_SelectAccount @{Account_ID,column=Account_ID}
+    </procedure>
+
+    <procedure id="SPWithInlineParameterAndOutPutParam" parameterClass="map" resultClass="Account">
+      ps_SelectAccountWithOutPutParam @{Account_ID,column=Account_ID}, @{OutPut,column=OutPut}
+    </procedure>
+
+    <procedure id="InsertAccountViaSPAndInlineParameter" parameterClass="map" >
+      ps_InsertAccount
+      @{Id,column=Account_ID},
+      @{FirstName,column=Account_FirstName},
+      @{LastName,column=Account_LastName},
+      @{EmailAddress,column=Account_Email,nullValue=no_email@provided.com},
+      @{BannerOption,column=Account_Banner_Option,dbType=Varchar,type=bool},
+      @{CartOption,column=Account_Cart_Option,handler=HundredsBool}
+    </procedure>
+
+    <procedure id="InsertAccountViaSPWithDefaultParameter" parameterClass="map" >
+      ps_InsertAccountWithDefault
+      @{Id,column=Account_ID},
+      @{FirstName,column=Account_FirstName},
+      @{LastName,column=Account_LastName},
+      @{EmailAddress,column=Account_Email,nullValue=no_email@provided.com}
+    </procedure>
+
+    <procedure id="InsertAccountViaSPWithDynamicParameter" parameterClass="map" >
+      ps_InsertAccountWithDefault
+      @{Id,column=Account_ID}
+      ,@{FirstName,column=Account_FirstName}
+      ,@{LastName,column=Account_LastName}
+      ,@{EmailAddress,column=Account_Email,nullValue=no_email@provided.com}
+      <isNotNull property="NullBannerOption">
+      ,@{NullBannerOption,column=Account_Banner_Option,dbType=Varchar,type=bool}
+      </isNotNull>
+      @{CartOption,column=Account_Cart_Option,handler=HundredsBool}
+    </procedure>
+    
 	</statements>
 
 	<parameterMaps>

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/account-init.sql
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/account-init.sql?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/account-init.sql (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/account-init.sql Sat May 31 06:52:05 2008
@@ -55,3 +55,6 @@
 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAccountWithOutPutParam]') and 
 OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[ps_SelectAccountWithOutPutParam]
+
+if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertAccountWithDefault]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
+drop procedure [dbo].[ps_InsertAccountWithDefault]
\ No newline at end of file

Added: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/ps_InsertAccountWithDefault.sql
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/ps_InsertAccountWithDefault.sql?rev=662026&view=auto
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/ps_InsertAccountWithDefault.sql (added)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper.SqlClient.Test.2005/Scripts/ps_InsertAccountWithDefault.sql Sat May 31 06:52:05 2008
@@ -0,0 +1,12 @@
+CREATE PROCEDURE dbo.[ps_InsertAccountWithDefault]
+@Account_ID  [int], 
+@Account_FirstName [nvarchar](40),
+@Account_LastName [varchar](32),
+@Account_Email [varchar](128),
+@Account_Banner_Option [varchar](255)='Non',
+@Account_Cart_Option [int] =200
+AS
+insert into Accounts  
+(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
+values 
+(@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email, @Account_Banner_Option, @Account_Cart_Option)
\ No newline at end of file

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildStatements.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildStatements.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildStatements.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/ModelBuilder/BuildStatements.cs Sat May 31 06:52:05 2008
@@ -50,6 +50,8 @@
     public partial class DefaultModelBuilder
     {
         private readonly InlineParameterMapParser paramParser = new InlineParameterMapParser();
+        private const string MARK_TOKEN = "?";
+        private const string COMMA_TOKEN = ",";
 
         /// <summary>
         /// Builds the mapped statements.
@@ -383,7 +385,7 @@
                     sql = new ProcedureSql(
                         modelStore.DataExchangeFactory,
                         modelStore.DBHelperParameterCache,
-                        newSql, 
+                        newSql.Replace(MARK_TOKEN, string.Empty).Replace(COMMA_TOKEN, string.Empty).Trim(), 
                         statement);
                     // Could not call BuildPreparedStatement for procedure because when NUnit Test
                     // the database is not here (but in theory procedure must be prepared like statement)

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs Sat May 31 06:52:05 2008
@@ -50,14 +50,21 @@
         {
             BaseDeserialize(modelStore, config);
 
-            if (parameterMap == null)
+            if (parameterClass!=null)
             {
-                parameterMap = modelStore.GetParameterMap(ConfigConstants.EMPTY_PARAMETER_MAP);
             }
+            else
+            {
+                if (parameterMap == null)
+                {
+                    parameterMap = modelStore.GetParameterMap(ConfigConstants.EMPTY_PARAMETER_MAP);
+                }                
+            }
+
 
             return new Procedure(
                 id,
-                null,
+                parameterClass,
                 parameterMap,
                 resultClass,
                 resultsMap,

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ParameterMapping/InlineParameterMapParser.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ParameterMapping/InlineParameterMapParser.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ParameterMapping/InlineParameterMapParser.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/ParameterMapping/InlineParameterMapParser.cs Sat May 31 06:52:05 2008
@@ -72,6 +72,9 @@
 
             if (sqlStatement.Contains(NEW_BEGIN_TOKEN))
             {
+                // V3 parameter syntax
+                //@{propertyName,column=string,type=string,dbype=string,direction=[Input/Output/InputOutput],nullValue=string,handler=string}
+
                 if (newSql != null)
                 {
                     string toAnalyse = newSql;
@@ -84,9 +87,9 @@
                         string prepend = toAnalyse.Substring(0, start);
                         string append = toAnalyse.Substring(end + NEW_END_TOKEN.Length);
                        
-                        //EmailAddress,type=string,dbType=Varchar,nullValue=no_email@provided.com
+                        //EmailAddress,column=string,type=string,dbType=Varchar,nullValue=no_email@provided.com
                         string parameter = toAnalyse.Substring(start + NEW_BEGIN_TOKEN.Length, end - start - NEW_BEGIN_TOKEN.Length);
-                        ParameterProperty mapping = NewParseMapping(parameter, parameterClassType, dataExchangeFactory);
+                        ParameterProperty mapping = NewParseMapping(parameter, parameterClassType, dataExchangeFactory, statement);
                         mappingList.Add(mapping);
                         newSqlBuffer.Append(prepend);
                         newSqlBuffer.Append(MARK_TOKEN);
@@ -130,7 +133,7 @@
 						    } 
 						    else 
 						    {
-                                mapping = NewParseMapping(token, parameterClassType, dataExchangeFactory);
+                                mapping = NewParseMapping(token, parameterClassType, dataExchangeFactory, statement);
 						    }															 
 
 						    mappingList.Add(mapping);
@@ -177,11 +180,12 @@
         /// <param name="token">The token.</param>
         /// <param name="parameterClassType">Type of the parameter class.</param>
         /// <param name="dataExchangeFactory">The data exchange factory.</param>
+        /// <param name="statement">The statement.</param>
         /// <returns></returns>
         /// <example>
         /// #propertyName,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string#
         /// </example>
-        private ParameterProperty NewParseMapping(string token, Type parameterClassType, DataExchangeFactory dataExchangeFactory) 
+        private ParameterProperty NewParseMapping(string token, Type parameterClassType, DataExchangeFactory dataExchangeFactory,IStatement statement) 
 		{
             string propertyName = string.Empty;
             string type = string.Empty;
@@ -189,6 +193,7 @@
             string direction = string.Empty;
             string callBack = string.Empty;
             string nullValue = null;
+            string columnName = string.Empty;
 
 			StringTokenizer paramParser = new StringTokenizer(token, "=,", false);
 			IEnumerator enumeratorParam = paramParser.GetEnumerator();
@@ -221,10 +226,14 @@
 					else if ("handler".Equals(field)) 
 					{
                         callBack = value;
-					} 
+					}
+                    else if ("column".Equals(field))
+                    {
+                        columnName = value;
+                    } 
 					else 
 					{
-						throw new DataMapperException("Unrecognized parameter mapping field: '" + field + "' in " + token);
+						throw new DataMapperException("When parsing inline parameter for statement '"+statement.Id+"', can't recognize parameter mapping field: '" + field + "' in " + token+", check your inline parameter syntax.");
 					}
 				} 
 				else 
@@ -235,7 +244,7 @@
 
             return new ParameterProperty(
                 propertyName,
-                string.Empty,
+                columnName,
                 callBack,
                 type,
                 dbType,

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Dynamic/DynamicSql.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Dynamic/DynamicSql.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Dynamic/DynamicSql.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Dynamic/DynamicSql.cs Sat May 31 06:52:05 2008
@@ -54,6 +54,8 @@
 	/// </example>
 	public sealed class DynamicSql : ISql, IDynamicParent  
 	{
+        private const string MARK_TOKEN = "?";
+        private const string COMMA_TOKEN = ",";
 
 		#region Fields
 
@@ -165,7 +167,12 @@
 
 			string dynSql = ctx.BodyText;
 
-			// Processes $substitutions$ after DynamicSql
+            if (statement is Procedure)
+            {
+                dynSql = dynSql.Replace(MARK_TOKEN, string.Empty).Replace(COMMA_TOKEN, string.Empty).Trim();
+            }
+
+		    // Processes $substitutions$ after DynamicSql
 			if ( SimpleDynamicSql.IsSimpleDynamicSql(dynSql) ) 
 			{
                 dynSql = new SimpleDynamicSql(
@@ -325,7 +332,7 @@
 		private PreparedStatement BuildPreparedStatement(ISession session, RequestScope request, string sqlStatement)
 		{
             PreparedStatementFactory factory = new PreparedStatementFactory(session, dbHelperParameterCache, request, statement, sqlStatement);
-			return factory.Prepare();
+			return factory.Prepare(true);
 		}
 		#endregion
 

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/SimpleDynamic/SimpleDynamicSql.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/SimpleDynamic/SimpleDynamicSql.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/SimpleDynamic/SimpleDynamicSql.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/SimpleDynamic/SimpleDynamicSql.cs Sat May 31 06:52:05 2008
@@ -213,7 +213,7 @@
         private PreparedStatement BuildPreparedStatement(ISession session, RequestScope request, string sqlStatement)
 		{
 			PreparedStatementFactory factory = new PreparedStatementFactory( session, dbHelperParameterCache, request, statement, sqlStatement);
-			return factory.Prepare();
+			return factory.Prepare(false);
 		}
 		#endregion
 

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/ProcedureSql.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/ProcedureSql.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/ProcedureSql.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/ProcedureSql.cs Sat May 31 06:52:05 2008
@@ -111,7 +111,7 @@
 					if (preparedStatement==null)
 					{
                         PreparedStatementFactory factory = new PreparedStatementFactory(session, dbHelperParameterCache, request, statement, commandText);
-						preparedStatement = factory.Prepare();
+						preparedStatement = factory.Prepare(false);
 					}
 				}
 			}

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/StaticSql.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/StaticSql.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/StaticSql.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Sql/Static/StaticSql.cs Sat May 31 06:52:05 2008
@@ -103,7 +103,7 @@
 			RequestScope request = new RequestScope( dataExchangeFactory, session, statement);
 
             PreparedStatementFactory factory = new PreparedStatementFactory(session, dbHelperParameterCache, request, statement, sqlStatement);
-			preparedStatement = factory.Prepare();
+			preparedStatement = factory.Prepare(false);
 		}
 
 		#endregion

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Statements/PreparedStatementFactory.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Statements/PreparedStatementFactory.cs?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Statements/PreparedStatementFactory.cs (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/Model/Statements/PreparedStatementFactory.cs Sat May 31 06:52:05 2008
@@ -105,10 +105,12 @@
 		}
 
 
-		/// <summary>
-		/// Create a list of IDataParameter for the statement and build the sql string.
-		/// </summary>
-		public PreparedStatement Prepare()
+        /// <summary>
+        /// Create a list of IDataParameter for the statement and build the sql string.
+        /// </summary>
+        /// <param name="isDynamic">if set to <c>true</c> this statement is dynamic.</param>
+        /// <returns></returns>
+		public PreparedStatement Prepare(bool isDynamic)
 		{
 			preparedStatement = new PreparedStatement();
 
@@ -132,7 +134,14 @@
 				{
                     if (dbProvider.UseDeriveParameters)
 					{
-                        DiscoverParameter();
+                        if (isDynamic)
+                        {
+                            DiscoverParameter(request.ParameterMap);                         
+                        }
+                        else
+                        {
+                            DiscoverParameter(statement.ParameterMap); 
+                        }
 					}
 					else
 					{
@@ -186,7 +195,7 @@
         /// <summary>
         /// For store procedure, auto discover IDataParameters for stored procedures at run-time.
         /// </summary>
-        private void DiscoverParameter()
+        private void DiscoverParameter(ParameterMap parameterMap)
 		{
 			// pull the parameters for this stored procedure from the parameter cache 
 			// (or discover them & populate the cache)
@@ -206,15 +215,15 @@
 						dataParameter.ParameterName = dataParameter.ParameterName.Substring(start);
 					}
 				}
-				preparedStatement.DbParametersName.Add( dataParameter.ParameterName );
 				preparedStatement.DbParameters[i] = dataParameter;
 			}
 		    
             // Re-sort DbParameters to match order used in the parameterMap
-            IDbDataParameter[] sortedDbParameters = new IDbDataParameter[commandParameters.Length];
-            for (int i = 0; i < statement.ParameterMap.Properties.Count; i++)
+            IDbDataParameter[] sortedDbParameters = new IDbDataParameter[parameterMap.Properties.Count];
+            for (int i = 0; i < parameterMap.Properties.Count; i++)
             {
-                sortedDbParameters[i] = Search(preparedStatement.DbParameters, statement.ParameterMap.Properties[i], i);
+                sortedDbParameters[i] = Search(preparedStatement.DbParameters, parameterMap.Properties[i], i);
+                preparedStatement.DbParametersName.Add(sortedDbParameters[i].ParameterName);
             }
             preparedStatement.DbParameters = sortedDbParameters;
 		}
@@ -230,7 +239,7 @@
                     {
                         if (parameterName.StartsWith(dbProvider.ParameterPrefix))
                         {
-                            int prefixLength = dbProvider.ParameterPrefix.Length;
+                           int prefixLength = dbProvider.ParameterPrefix.Length;
                            parameterName = parameterName.Substring(prefixLength);
                         }
                     }

Modified: ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/SqlMap.xsd
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/SqlMap.xsd?rev=662026&r1=662025&r2=662026&view=diff
==============================================================================
--- ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/SqlMap.xsd (original)
+++ ibatis/trunk/cs/V3/src/Apache.Ibatis.DataMapper/SqlMap.xsd Sat May 31 06:52:05 2008
@@ -75,8 +75,30 @@
 	</xs:element>
 	<xs:element name="procedure">
 		<xs:complexType mixed="true">
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="include"/>
+				<xs:element ref="selectKey"/>
+				<xs:element ref="generate"/>
+				<xs:element ref="dynamic"/>
+				<xs:element ref="isEmpty"/>
+				<xs:element ref="isEqual"/>
+				<xs:element ref="isGreaterEqual"/>
+				<xs:element ref="isGreaterThan"/>
+				<xs:element ref="isLessThan"/>
+				<xs:element ref="isLessEqual"/>
+				<xs:element ref="isNotEmpty"/>
+				<xs:element ref="isNotEqual"/>
+				<xs:element ref="isNotNull"/>
+				<xs:element ref="isNotParameterPresent"/>
+				<xs:element ref="isNotPropertyAvailable"/>
+				<xs:element ref="isNull"/>
+				<xs:element ref="isParameterPresent"/>
+				<xs:element ref="isPropertyAvailable"/>
+				<xs:element ref="iterate"/>
+			</xs:choice>
 			<xs:attribute name="id" type="xs:string" use="required"/>
 			<xs:attribute name="parameterMap" type="xs:string" />
+			<xs:attribute name="parameterClass" type="xs:string" />
 			<xs:attribute name="resultMap" type="xs:string"/>
 			<xs:attribute name="resultClass" type="xs:string"/>
 			<xs:attribute name="cacheModel" type="xs:string"/>