/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="ctx"></param> /// <param name="parameterObject"></param> /// <param name="localChildren"></param> /// <param name="buffer"></param> private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator localChildren, StringBuilder buffer) { while (localChildren.MoveNext()) { ISqlChild child = (ISqlChild)localChildren.Current; if (child is SqlText) { SqlText sqlText = (SqlText)child; string sqlStatement = sqlText.Text; if (sqlText.IsWhiteSpace) { buffer.Append(sqlStatement); } else { // if (SimpleDynamicSql.IsSimpleDynamicSql(sqlStatement)) // { // sqlStatement = new SimpleDynamicSql(sqlStatement, _statement).GetSql(parameterObject); // SqlText newSqlText = _paramParser.ParseInlineParameterMap( null, sqlStatement ); // sqlStatement = newSqlText.Text; // ParameterProperty[] mappings = newSqlText.Parameters; // if (mappings != null) // { // for (int i = 0; i < mappings.Length; i++) // { // ctx.AddParameterMapping(mappings[i]); // } // } // } // BODY OUT buffer.Append(" "); buffer.Append(sqlStatement); ParameterProperty[] parameters = sqlText.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(parameters[i]); } } } } else if (child is SqlTag) { SqlTag tag = (SqlTag)child; ISqlTagHandler handler = tag.Handler; int response = BaseTagHandler.INCLUDE_BODY; do { StringBuilder body = new StringBuilder(); response = handler.DoStartFragment(ctx, tag, parameterObject); if (response != BaseTagHandler.SKIP_BODY) { if (ctx.IsOverridePrepend && ctx.FirstNonDynamicTagWithPrepend == null && tag.IsPrependAvailable && !(tag.Handler is DynamicTagHandler)) { ctx.FirstNonDynamicTagWithPrepend = tag; } ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); response = handler.DoEndFragment(ctx, tag, parameterObject, body); handler.DoPrepend(ctx, tag, parameterObject, body); if (response != BaseTagHandler.SKIP_BODY) { if (body.Length > 0) { // BODY OUT if (handler.IsPostParseRequired) { SqlText sqlText = _paramParser.ParseInlineParameterMap(request, null, body.ToString()); buffer.Append(sqlText.Text); ParameterProperty[] mappings = sqlText.Parameters; if (mappings != null) { int length = mappings.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(mappings[i]); } } } else { buffer.Append(" "); buffer.Append(body.ToString()); } if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) { ctx.IsOverridePrepend = false; } } } } }while (response == BaseTagHandler.REPEAT_BODY); } } }
/// <summary> /// Parse dynamic tags /// </summary> /// <param name="commandTextNode"></param> /// <param name="dynamic"></param> /// <param name="sqlBuffer"></param> /// <param name="isDynamic"></param> /// <param name="postParseRequired"></param> /// <param name="statement"></param> /// <returns></returns> private bool ParseDynamicTags( XmlNode commandTextNode, IDynamicParent dynamic, StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) { XmlNodeList children = commandTextNode.ChildNodes; int count = children.Count; for (int i = 0; i < count; i++) { XmlNode child = children[i]; if ( (child.NodeType == XmlNodeType.CDATA) || (child.NodeType == XmlNodeType.Text) ) { string data = child.InnerText.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' '); //?? data = NodeUtils.ParsePropertyTokens(data, _configScope.Properties); SqlText sqlText; if (postParseRequired) { sqlText = new SqlText(); sqlText.Text = data.ToString(); } else { sqlText = _paramParser.ParseInlineParameterMap(_configScope, null, data ); } dynamic.AddChild(sqlText); sqlBuffer.Append(data); } else if (child.Name == "include") { NameValueCollection prop = NodeUtils.ParseAttributes(child, _configScope.Properties); string refid = NodeUtils.GetStringAttribute(prop, "refid"); XmlNode includeNode = (XmlNode)_configScope.SqlIncludes[refid]; if (includeNode == null) { String nsrefid = _configScope.ApplyNamespace(refid); includeNode = (XmlNode)_configScope.SqlIncludes[nsrefid]; if (includeNode == null) { throw new ConfigurationException("Could not find SQL tag to include with refid '" + refid + "'"); } } isDynamic = ParseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false, statement); } else { string nodeName = child.Name; IDeSerializer serializer = _deSerializerFactory.GetDeSerializer(nodeName); if (serializer != null) { isDynamic = true; SqlTag tag; tag = serializer.Deserialize(child); dynamic.AddChild(tag); if (child.HasChildNodes) { isDynamic = ParseDynamicTags( child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement ); } } } } return isDynamic; }
/// <summary> /// Parse Inline ParameterMap /// </summary> /// <param name="statement"></param> /// <param name="sqlStatement"></param> /// <returns>A new sql command text.</returns> /// <param name="scope"></param> public SqlText ParseInlineParameterMap(IScope scope, IStatement statement, string sqlStatement) { string newSql = sqlStatement; ArrayList mappingList = new ArrayList(); Type parameterClassType = null; if (statement != null) { parameterClassType = statement.ParameterClass; } StringTokenizer parser = new StringTokenizer(sqlStatement, PARAMETER_TOKEN, true); StringBuilder newSqlBuffer = new StringBuilder(); string token = null; string lastToken = null; IEnumerator enumerator = parser.GetEnumerator(); while (enumerator.MoveNext()) { token = (string)enumerator.Current; if (PARAMETER_TOKEN.Equals(lastToken)) { if (PARAMETER_TOKEN.Equals(token)) { newSqlBuffer.Append(PARAMETER_TOKEN); token = null; } else { ParameterProperty mapping = null; if (token.IndexOf(PARAM_DELIM) > -1) { mapping = OldParseMapping(token, parameterClassType, scope); } else { mapping = NewParseMapping(token, parameterClassType, scope); } mappingList.Add(mapping); newSqlBuffer.Append("? "); enumerator.MoveNext(); token = (string)enumerator.Current; if (!PARAMETER_TOKEN.Equals(token)) { throw new DataMapperException("Unterminated inline parameter in mapped statement (" + statement.Id + ")."); } token = null; } } else { if (!PARAMETER_TOKEN.Equals(token)) { newSqlBuffer.Append(token); } } lastToken = token; } newSql = newSqlBuffer.ToString(); ParameterProperty[] mappingArray = (ParameterProperty[]) mappingList.ToArray(typeof(ParameterProperty)); SqlText sqlText = new SqlText(); sqlText.Text = newSql; sqlText.Parameters = mappingArray; return sqlText; }
private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator localChildren, StringBuilder buffer) { while (localChildren.MoveNext()) { ISqlChild current = (ISqlChild)localChildren.Current; if (current is SqlText) { SqlText text = (SqlText)current; string str = text.Text; if (text.IsWhiteSpace) { buffer.Append(str); } else { buffer.Append(" "); buffer.Append(str); ParameterProperty[] parameters = text.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(parameters[i]); } } } } else if (current is SqlTag) { SqlTag tag = (SqlTag)current; ISqlTagHandler handler = tag.Handler; int num3 = 1; do { StringBuilder builder = new StringBuilder(); num3 = handler.DoStartFragment(ctx, tag, parameterObject); if (num3 != 0) { if ((ctx.IsOverridePrepend && (ctx.FirstNonDynamicTagWithPrepend == null)) && (tag.IsPrependAvailable && !(tag.Handler is DynamicTagHandler))) { ctx.FirstNonDynamicTagWithPrepend = tag; } this.ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), builder); num3 = handler.DoEndFragment(ctx, tag, parameterObject, builder); handler.DoPrepend(ctx, tag, parameterObject, builder); if ((num3 != 0) && (builder.Length > 0)) { if (handler.IsPostParseRequired) { SqlText text2 = this._paramParser.ParseInlineParameterMap(request, null, builder.ToString()); buffer.Append(text2.Text); ParameterProperty[] propertyArray2 = text2.Parameters; if (propertyArray2 != null) { int num4 = propertyArray2.Length; for (int j = 0; j < num4; j++) { ctx.AddParameterMapping(propertyArray2[j]); } } } else { buffer.Append(" "); buffer.Append(builder.ToString()); } if (tag.IsPrependAvailable && (tag == ctx.FirstNonDynamicTagWithPrepend)) { ctx.IsOverridePrepend = false; } } } }while (num3 == 2); } } }