예제 #1
0
        /// <summary>
        /// Parse dynamic tags
        /// </summary>
        /// <param name="statementConfig">The statement config.</param>
        /// <param name="dynamic">The dynamic.</param>
        /// <param name="sqlBuffer">The SQL buffer.</param>
        /// <param name="isDynamic">if set to <c>true</c> [is dynamic].</param>
        /// <param name="postParseRequired">if set to <c>true</c> [post parse required].</param>
        /// <param name="statement">The statement.</param>
        /// <returns></returns>
        private bool ParseDynamicTags(
            IConfiguration statementConfig,
            IDynamicParent dynamic,
            StringBuilder sqlBuffer,
            bool isDynamic,
            bool postParseRequired,
            IStatement statement)
        {
            ConfigurationCollection children = statementConfig.Children;
            int count = children.Count;

            for (int i = 0; i < count; i++)
            {
                IConfiguration child = children[i];
                if (child.Type == ConfigConstants.ELEMENT_TEXT || child.Type == ConfigConstants.ELEMENT_CDATA)
                {
                    string childValueString = child.Value;
                    if (statement.PreserveWhitespace)
                    {
                        childValueString = childValueString
                                           .Replace('\n', ' ')
                                           .Replace('\r', ' ')
                                           .Replace('\t', ' ')
                                           .Trim();
                    }

                    SqlText sqlText = null;
                    if (postParseRequired)
                    {
                        sqlText      = new SqlText();
                        sqlText.Text = childValueString;
                    }
                    else
                    {
                        sqlText = InlineParameterMapParser.ParseInlineParameterMap(modelStore.DataExchangeFactory, statementConfig.Id, null, childValueString);
                    }

                    dynamic.AddChild(sqlText);
                    sqlBuffer.Append(" " + childValueString);
                }
                else if (child.Type == ConfigConstants.ELEMENT_SELECTKEY || child.Type == ConfigConstants.ELEMENT_INCLUDE)
                {
                }
                else
                {
                    IDeSerializer serializer = deSerializerFactory.GetDeSerializer(child.Type);

                    if (serializer != null)
                    {
                        isDynamic = true;
                        SqlTag tag;

                        tag = serializer.Deserialize(child);

                        dynamic.AddChild(tag);

                        if (child.Children.Count > 0)
                        {
                            isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement);
                        }
                    }
                }
            }

            return(isDynamic);
        }
예제 #2
0
        /// <summary>
        /// Parse dynamic tags
        /// </summary>
        /// <param name="statementConfig">The statement config.</param>
        /// <param name="dynamic">The dynamic.</param>
        /// <param name="sqlBuffer">The SQL buffer.</param>
        /// <param name="isDynamic">if set to <c>true</c> [is dynamic].</param>
        /// <param name="postParseRequired">if set to <c>true</c> [post parse required].</param>
        /// <param name="statement">The statement.</param>
        /// <returns></returns>
        private bool ParseDynamicTags(
            IConfiguration statementConfig,
            IDynamicParent dynamic,
            StringBuilder sqlBuffer,
            bool isDynamic,
            bool postParseRequired,
            IStatement statement)
        {
            //具体文本的集合 可能是需要拼接成完整的SQL语句
            ConfigurationCollection children = statementConfig.Children;
            int count = children.Count;

            for (int i = 0; i < count; i++)
            {
                IConfiguration child = children[i];
                if (child.Type == ConfigConstants.ELEMENT_TEXT || child.Type == ConfigConstants.ELEMENT_CDATA)
                {
                    //第一步处理    获取当前文本的一个值 并处理"\r\n"
                    string childValueString = child.Value;
                    if (statement.PreserveWhitespace)
                    {
                        childValueString = childValueString.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' ').Trim();
                    }

                    //第二部处理   将处理的当前一个部分SQL语句放入到SqlText类中
                    SqlText sqlText = null;
                    if (postParseRequired)
                    {
                        sqlText      = new SqlText();
                        sqlText.Text = childValueString;
                    }
                    else
                    {
                        //分析SQL语句中的参数 例如# # ,@{}等内部参数 最后的结果是一个语句保存 和 参数列表在SqlText类中
                        sqlText = InlineParameterMapParser.ParseInlineParameterMap(modelStore.DataExchangeFactory, statementConfig.Id, null, childValueString);
                    }
                    //将此次分析的SQL语句结果保存到dynamic类对象中 可能需要添加多次
                    dynamic.AddChild(sqlText);//按顺序放置 最后拼接即可

                    //sqlBuffer字符串拼接每一部分的sql语句 最后是当前节点的完整语句
                    sqlBuffer.Append(" " + childValueString);
                }
                else if (child.Type == ConfigConstants.ELEMENT_SELECTKEY || child.Type == ConfigConstants.ELEMENT_INCLUDE)
                {
                    //此处没有处理代码
                }
                else
                {
                    //从deSerializerFactory工厂类的字典serializerMap中获取对应的处理IDeSerializer类
                    IDeSerializer serializer = deSerializerFactory.GetDeSerializer(child.Type);//child.Type就是节点的名

                    if (serializer != null)
                    {
                        isDynamic = true;
                        SqlTag tag;

                        //当前child是一个element 进行解析
                        tag = serializer.Deserialize(child);

                        //添加到IList<ISqlChild> children中
                        dynamic.AddChild(tag);

                        if (child.Children.Count > 0)
                        {
                            //递归处理子节点 注意是子节点Tag了 递归下去 但sqlBuffer字符串一直是同一个
                            isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement);
                        }
                    }
                }
            }

            return(isDynamic);
        }