Exemple #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)
        {
            //具体文本的集合 可能是需要拼接成完整的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;
        }
        /// <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 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;
        }