int CreateStoredProcedureCommandText(StringBuilder sb, string sql, Matcher match, IDataParameterCollection userParams, int userParamsStartPosition) #endif { int curUserPos = userParamsStartPosition; #if USE_DOTNET_REGEX Group procNameGroup = null; for (Match procNameMatch = match; procNameMatch.Success; procNameMatch = procNameMatch.NextMatch()){ procNameGroup = match.Groups["PROCNAME"]; if (!procNameGroup.Success) { continue; } } if (procNameGroup == null || !procNameGroup.Success) throw new ArgumentException("Not a stored procedure call: '{0}'", sql); ArrayList derivedParameters = DeriveParameters(procNameGroup.Value, false); #else ArrayList derivedParameters = DeriveParameters(match.group(2).Trim(), false); #endif int curDerivedPos = 0; AbstractDbParameter retValderivedParameter = curDerivedPos < derivedParameters.Count ? (AbstractDbParameter)derivedParameters[curDerivedPos] : null; if (retValderivedParameter != null && retValderivedParameter.Direction == ParameterDirection.ReturnValue) curDerivedPos++; int queryCurrentPosition = 0; #if USE_DOTNET_REGEX for (Match retValMatch = match; retValMatch.Success; retValMatch = retValMatch.NextMatch()){ Group retval = retValMatch.Groups["RETVAL"]; if (!retval.Success) { continue; } int retvalIndex = retval.Index; string retvalValue = retval.Value; int retvalLength = retval.Length; #else int retvalIndex = match.start(1); for (;retvalIndex >= 0;) { string retvalValue = match.group(1); int retvalLength = retvalValue.Length; #endif sb.Append(sql, queryCurrentPosition, retvalIndex); AbstractDbParameter userParameter = GetUserParameter(retvalValue, userParams, curUserPos); if (userParameter != null) { sb.Append('?'); InternalParameters.Add(userParameter); if (retValderivedParameter != null && !userParameter.IsDbTypeSet) { userParameter.JdbcType = retValderivedParameter.JdbcType; } curUserPos++; } else { sb.Append(retvalValue); } queryCurrentPosition = (retvalIndex + retvalLength); break; } #if USE_DOTNET_REGEX sb.Append(sql, queryCurrentPosition, procNameGroup.Index + procNameGroup.Length - queryCurrentPosition); queryCurrentPosition = procNameGroup.Index + procNameGroup.Length; #else sb.Append(sql, queryCurrentPosition, match.end(2) - queryCurrentPosition); queryCurrentPosition = match.end(2); #endif bool hasUserParams = false; #if USE_DOTNET_REGEX must rewrite the regex to not parse params to have single code with java regex #else int paramsStart = match.start(3); if (paramsStart >= 0) { #endif hasUserParams = true; sb.Append(sql,queryCurrentPosition,paramsStart - queryCurrentPosition); queryCurrentPosition = paramsStart; for (SimpleMatch m = SqlStatementsHelper.ProcedureParameterSplitterReqExp.Match(match.group(3)); m.Success;m = m.NextMatch()) { SimpleCapture parameterCapture = m; sb.Append(sql,queryCurrentPosition,paramsStart + parameterCapture.Index - queryCurrentPosition); // advance in query queryCurrentPosition = paramsStart + parameterCapture.Index + parameterCapture.Length; AbstractDbParameter derivedParameter = curDerivedPos < derivedParameters.Count ? (AbstractDbParameter)derivedParameters[curDerivedPos++] : null; //check for special params while (derivedParameter != null && derivedParameter.IsSpecial) { // derived parameter is special - never appears in user parameters or user values InternalParameters.Add((AbstractDbParameter)derivedParameter.Clone()); sb.Append('?'); sb.Append(','); derivedParameter = curDerivedPos < derivedParameters.Count ? (AbstractDbParameter)derivedParameters[curDerivedPos++] : null; } AbstractDbParameter userParameter = GetUserParameter(parameterCapture.Value.Trim(), userParams, curUserPos); if (userParameter != null) { sb.Append('?'); InternalParameters.Add(userParameter); if (derivedParameter != null && !userParameter.IsDbTypeSet) { userParameter.JdbcType = derivedParameter.JdbcType; } // advance in user parameters curUserPos++; } else { sb.Append(parameterCapture.Value); } } } bool addedSpecialParams = false; for (int i = curDerivedPos; i < derivedParameters.Count;) { AbstractDbParameter derivedParameter = (AbstractDbParameter)derivedParameters[i++]; if (derivedParameter.IsSpecial) { // derived parameter is special - never appears in user parameters or user values if (!hasUserParams && !addedSpecialParams) { addedSpecialParams = true; curDerivedPos++; sb.Append('('); } for (;curDerivedPos < i;curDerivedPos++) sb.Append(','); InternalParameters.Add((AbstractDbParameter)derivedParameter.Clone()); sb.Append('?'); } } if (!hasUserParams && addedSpecialParams) sb.Append(')'); sb.Append(sql,queryCurrentPosition,sql.Length - queryCurrentPosition); return curUserPos - userParamsStartPosition; }
string CreateStoredProcedureCommandTextSimple(string procedureName, IDataParameterCollection userParams, IList derivedParams) { StringBuilder sb = new StringBuilder(); int curUserPos = 0; int curDerivedPos = 0; bool addParas = true; string trimedProcedureName = (procedureName != null) ? procedureName.TrimEnd() : String.Empty; if (trimedProcedureName.Length > 0 && trimedProcedureName[trimedProcedureName.Length-1] == ')') addParas = false; AbstractDbParameter derivedParam = (derivedParams.Count > 0) ? (AbstractDbParameter)derivedParams[curDerivedPos] : null; if (derivedParam != null) { if (derivedParam.Direction == ParameterDirection.ReturnValue) curDerivedPos++; else derivedParam = null; //play as if there is no retval parameter } AbstractDbParameter returnValueParameter = GetReturnParameter (userParams); if (returnValueParameter != null) { curUserPos++; InternalParameters.Add(returnValueParameter); sb.Append("{? = call "); if (derivedParam != null && !returnValueParameter.IsDbTypeSet) { returnValueParameter.JdbcType = derivedParam.JdbcType; } } else { sb.Append("{call "); } sb.Append(procedureName); if (addParas) sb.Append('('); bool needComma = false; for (int i = curDerivedPos; i < derivedParams.Count; i++) { AbstractDbParameter derivedParameter = (AbstractDbParameter)derivedParams[curDerivedPos++]; bool addParam = false; if (derivedParameter.IsSpecial) { // derived parameter is special - never appears in user parameters or user values InternalParameters.Add((AbstractDbParameter)derivedParameter.Clone()); addParam = true; } else { AbstractDbParameter userParameter = GetUserParameter(derivedParameter.Placeholder, userParams, curUserPos); if (userParameter != null) { curUserPos++; InternalParameters.Add(userParameter); addParam = true; if (derivedParameter != null && !userParameter.IsDbTypeSet) { userParameter.JdbcType = derivedParameter.JdbcType; } } } if (addParam) { if (needComma) sb.Append(','); else needComma = true; sb.Append('?'); } } for (int i = curUserPos; i < userParams.Count; i++) { if (needComma) sb.Append(','); else needComma = true; AbstractDbParameter userParameter = (AbstractDbParameter)userParams[curUserPos++]; InternalParameters.Add(userParameter); sb.Append('?'); } if (addParas) sb.Append(')'); sb.Append('}'); return sb.ToString(); }