private void ProcessSqlNodeList(XmlNodeList rootList, TSqlObfuscatingFormattingState state)
 {
     foreach (XmlElement contentElement in rootList)
     {
         ProcessSqlNode(contentElement, state);
     }
 }
 private void ProcessSqlNodeList(IEnumerable <Node> rootList, TSqlObfuscatingFormattingState state)
 {
     foreach (Node contentElement in rootList)
     {
         ProcessSqlNode(contentElement, state);
     }
 }
        public string FormatSQLTree(XmlDocument sqlTreeDoc)
        {
            //thread-safe - each call to FormatSQLTree() gets its own independent state object
            TSqlObfuscatingFormattingState state = new TSqlObfuscatingFormattingState(RandomizeColor, RandomizeLineLength);

            if (sqlTreeDoc.SelectSingleNode(string.Format("/{0}/@{1}[.=1]", SqlXmlConstants.ENAME_SQL_ROOT, SqlXmlConstants.ANAME_ERRORFOUND)) != null)
                state.AddOutputContent(ErrorOutputPrefix);

            XmlNodeList rootList = sqlTreeDoc.SelectNodes(string.Format("/{0}/*", SqlXmlConstants.ENAME_SQL_ROOT));
            return FormatSQLNodes(rootList, state);
        }
        public string FormatSQLTree(XmlDocument sqlTreeDoc)
        {
            //thread-safe - each call to FormatSQLTree() gets its own independent state object
            TSqlObfuscatingFormattingState state = new TSqlObfuscatingFormattingState(RandomizeColor, RandomizeLineLength);

            if (sqlTreeDoc.SelectSingleNode(string.Format("/{0}/@{1}[.=1]", SqlXmlConstants.ENAME_SQL_ROOT, SqlXmlConstants.ANAME_ERRORFOUND)) != null)
            {
                state.AddOutputContent(ErrorOutputPrefix);
            }

            XmlNodeList rootList = sqlTreeDoc.SelectNodes(string.Format("/{0}/*", SqlXmlConstants.ENAME_SQL_ROOT));

            return(FormatSQLNodes(rootList, state));
        }
        public string FormatSQLTree(Node sqlTreeDoc)
        {
            //thread-safe - each call to FormatSQLTree() gets its own independent state object
            TSqlObfuscatingFormattingState state = new TSqlObfuscatingFormattingState(RandomizeColor, RandomizeLineLength);

            if (sqlTreeDoc.Name == SqlStructureConstants.ENAME_SQL_ROOT && sqlTreeDoc.GetAttributeValue(SqlStructureConstants.ANAME_ERRORFOUND) == "1")
            {
                state.AddOutputContent(ErrorOutputPrefix);
            }

            //pass "doc" itself into process: useful/necessary when formatting MINIFY sub-regions from standard formatter
            ProcessSqlNodeList(new[] { sqlTreeDoc }, state);
            state.BreakIfExpected();
            return(state.DumpOutput());
        }
        private void ProcessSqlNode(XmlElement contentElement, TSqlObfuscatingFormattingState state)
        {
            switch (contentElement.Name)
            {
            case SqlXmlConstants.ENAME_SQL_ROOT:
            case SqlXmlConstants.ENAME_SQL_STATEMENT:
            case SqlXmlConstants.ENAME_SQL_CLAUSE:
            case SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE:
            case SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK:
            case SqlXmlConstants.ENAME_DDL_OTHER_BLOCK:
            case SqlXmlConstants.ENAME_DDL_DECLARE_BLOCK:
            case SqlXmlConstants.ENAME_CURSOR_DECLARATION:
            case SqlXmlConstants.ENAME_BEGIN_TRANSACTION:
            case SqlXmlConstants.ENAME_SAVE_TRANSACTION:
            case SqlXmlConstants.ENAME_COMMIT_TRANSACTION:
            case SqlXmlConstants.ENAME_ROLLBACK_TRANSACTION:
            case SqlXmlConstants.ENAME_CONTAINER_OPEN:
            case SqlXmlConstants.ENAME_CONTAINER_CLOSE:
            case SqlXmlConstants.ENAME_WHILE_LOOP:
            case SqlXmlConstants.ENAME_IF_STATEMENT:
            case SqlXmlConstants.ENAME_SELECTIONTARGET:
            case SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT:
            case SqlXmlConstants.ENAME_CTE_WITH_CLAUSE:
            case SqlXmlConstants.ENAME_PERMISSIONS_BLOCK:
            case SqlXmlConstants.ENAME_PERMISSIONS_DETAIL:
            case SqlXmlConstants.ENAME_MERGE_CLAUSE:
            case SqlXmlConstants.ENAME_MERGE_TARGET:
            case SqlXmlConstants.ENAME_CASE_INPUT:
            case SqlXmlConstants.ENAME_BOOLEAN_EXPRESSION:
            case SqlXmlConstants.ENAME_BETWEEN_LOWERBOUND:
            case SqlXmlConstants.ENAME_BETWEEN_UPPERBOUND:
            case SqlXmlConstants.ENAME_CONTAINER_SINGLESTATEMENT:
            case SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT:
            case SqlXmlConstants.ENAME_MERGE_ACTION:
            case SqlXmlConstants.ENAME_PERMISSIONS_TARGET:
            case SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT:
            case SqlXmlConstants.ENAME_DDL_WITH_CLAUSE:
            case SqlXmlConstants.ENAME_MERGE_CONDITION:
            case SqlXmlConstants.ENAME_MERGE_THEN:
            case SqlXmlConstants.ENAME_JOIN_ON_SECTION:
            case SqlXmlConstants.ENAME_CTE_ALIAS:
            case SqlXmlConstants.ENAME_ELSE_CLAUSE:
            case SqlXmlConstants.ENAME_DDL_AS_BLOCK:
            case SqlXmlConstants.ENAME_CURSOR_FOR_BLOCK:
            case SqlXmlConstants.ENAME_TRIGGER_CONDITION:
            case SqlXmlConstants.ENAME_CURSOR_FOR_OPTIONS:
            case SqlXmlConstants.ENAME_CTE_AS_BLOCK:
            case SqlXmlConstants.ENAME_DDL_RETURNS:
            case SqlXmlConstants.ENAME_MERGE_USING:
            case SqlXmlConstants.ENAME_MERGE_WHEN:
            case SqlXmlConstants.ENAME_BETWEEN_CONDITION:
            case SqlXmlConstants.ENAME_BEGIN_END_BLOCK:
            case SqlXmlConstants.ENAME_TRY_BLOCK:
            case SqlXmlConstants.ENAME_CATCH_BLOCK:
            case SqlXmlConstants.ENAME_CASE_STATEMENT:
            case SqlXmlConstants.ENAME_CASE_WHEN:
            case SqlXmlConstants.ENAME_CASE_THEN:
            case SqlXmlConstants.ENAME_CASE_ELSE:
            case SqlXmlConstants.ENAME_AND_OPERATOR:
            case SqlXmlConstants.ENAME_OR_OPERATOR:
                //these are all containers, and therefore have no impact on obfuscated output.
                ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                break;

            case SqlXmlConstants.ENAME_DDLDETAIL_PARENS:
            case SqlXmlConstants.ENAME_FUNCTION_PARENS:
            case SqlXmlConstants.ENAME_IN_PARENS:
            case SqlXmlConstants.ENAME_DDL_PARENS:
            case SqlXmlConstants.ENAME_EXPRESSION_PARENS:
            case SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS:
                state.SpaceExpected = false;
                state.AddOutputContent("(");
                ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                state.SpaceExpected = false;
                state.SpaceExpectedForAnsiString = false;
                state.AddOutputContent(")");
                break;

            case SqlXmlConstants.ENAME_WHITESPACE:
                //do nothing
                break;

            case SqlXmlConstants.ENAME_COMMENT_MULTILINE:
                if (PreserveComments)
                {
                    state.SpaceExpected = false;
                    state.AddOutputContent("/*" + contentElement.InnerText + "*/");
                }
                break;

            case SqlXmlConstants.ENAME_COMMENT_SINGLELINE:
                if (PreserveComments)
                {
                    state.SpaceExpected = false;
                    state.AddOutputContent("--" + contentElement.InnerText.Replace("\r", "").Replace("\n", ""));
                    state.BreakExpected = true;
                }
                break;

            case SqlXmlConstants.ENAME_COMMENT_SINGLELINE_CSTYLE:
                if (PreserveComments)
                {
                    state.SpaceExpected = false;
                    state.AddOutputContent("//" + contentElement.InnerText.Replace("\r", "").Replace("\n", ""));
                    state.BreakExpected = true;
                }
                break;

            case SqlXmlConstants.ENAME_BATCH_SEPARATOR:
                //newline regardless of whether previous element recommended a break or not.
                state.BreakExpected = true;
                ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                state.BreakExpected = true;
                break;

            case SqlXmlConstants.ENAME_STRING:
                state.SpaceIfExpectedForAnsiString();
                state.SpaceExpected = false;
                state.AddOutputContent("'" + contentElement.InnerText.Replace("'", "''") + "'");
                state.SpaceExpectedForAnsiString = true;
                break;

            case SqlXmlConstants.ENAME_NSTRING:
                state.AddOutputContent("N'" + contentElement.InnerText.Replace("'", "''") + "'");
                state.SpaceExpectedForAnsiString = true;
                break;

            case SqlXmlConstants.ENAME_BRACKET_QUOTED_NAME:
                state.SpaceExpected = false;
                state.AddOutputContent("[" + contentElement.InnerText.Replace("]", "]]") + "]");
                break;

            case SqlXmlConstants.ENAME_QUOTED_STRING:
                state.SpaceExpected = false;
                state.AddOutputContent("\"" + contentElement.InnerText.Replace("\"", "\"\"") + "\"");
                break;

            case SqlXmlConstants.ENAME_COMMA:
            case SqlXmlConstants.ENAME_PERIOD:
            case SqlXmlConstants.ENAME_SEMICOLON:
            case SqlXmlConstants.ENAME_SCOPERESOLUTIONOPERATOR:
            case SqlXmlConstants.ENAME_ASTERISK:
            case SqlXmlConstants.ENAME_EQUALSSIGN:
            case SqlXmlConstants.ENAME_OTHEROPERATOR:
                state.SpaceExpected = false;
                state.AddOutputContent(contentElement.InnerText);
                break;

            case SqlXmlConstants.ENAME_COMPOUNDKEYWORD:
                state.AddOutputContent(FormatKeyword(contentElement.Attributes[SqlXmlConstants.ANAME_SIMPLETEXT].Value));
                state.SpaceExpected = true;
                break;


            case SqlXmlConstants.ENAME_LABEL:
                state.AddOutputContent(contentElement.InnerText);
                state.BreakExpected = true;
                break;

            case SqlXmlConstants.ENAME_OTHERKEYWORD:
            case SqlXmlConstants.ENAME_ALPHAOPERATOR:
            case SqlXmlConstants.ENAME_DATATYPE_KEYWORD:
            case SqlXmlConstants.ENAME_PSEUDONAME:
            case SqlXmlConstants.ENAME_BINARY_VALUE:
                state.AddOutputContent(FormatKeyword(contentElement.InnerText));
                state.SpaceExpected = true;
                break;

            case SqlXmlConstants.ENAME_NUMBER_VALUE:
                state.AddOutputContent(FormatKeyword(contentElement.InnerText));
                if (!contentElement.InnerText.ToLowerInvariant().Contains("e"))
                {
                    state.SpaceExpectedForE = true;
                    if (contentElement.InnerText.Equals("0"))
                    {
                        state.SpaceExpectedForX = true;
                    }
                }
                break;

            case SqlXmlConstants.ENAME_MONETARY_VALUE:
                if (!contentElement.InnerText.Substring(0, 1).Equals("$"))
                {
                    state.SpaceExpected = false;
                }

                state.AddOutputContent(contentElement.InnerText);

                if (contentElement.InnerText.Length == 1)
                {
                    state.SpaceExpectedForPlusMinus = true;
                }
                break;

            case SqlXmlConstants.ENAME_OTHERNODE:
            case SqlXmlConstants.ENAME_FUNCTION_KEYWORD:
                state.AddOutputContent(contentElement.InnerText);
                state.SpaceExpected = true;
                break;

            default:
                throw new Exception("Unrecognized element in SQL Xml!");
            }
        }
 private string FormatSQLNodes(XmlNodeList nodes, TSqlObfuscatingFormattingState state)
 {
     ProcessSqlNodeList(nodes, state);
     state.BreakIfExpected();
     return(state.DumpOutput());
 }
        public string FormatSQLTree(XmlNode fragmentNode)
        {
            TSqlObfuscatingFormattingState state = new TSqlObfuscatingFormattingState(false, false);

            return(FormatSQLNodes(fragmentNode.SelectNodes("."), state));
        }
 private void ProcessSqlNodeList(XmlNodeList rootList, TSqlObfuscatingFormattingState state)
 {
     foreach (XmlElement contentElement in rootList)
         ProcessSqlNode(contentElement, state);
 }
        private void ProcessSqlNode(XmlElement contentElement, TSqlObfuscatingFormattingState state)
        {
            switch (contentElement.Name)
            {
                case SqlXmlConstants.ENAME_SQL_ROOT:
                case SqlXmlConstants.ENAME_SQL_STATEMENT:
                case SqlXmlConstants.ENAME_SQL_CLAUSE:
                case SqlXmlConstants.ENAME_SET_OPERATOR_CLAUSE:
                case SqlXmlConstants.ENAME_DDL_PROCEDURAL_BLOCK:
                case SqlXmlConstants.ENAME_DDL_OTHER_BLOCK:
                case SqlXmlConstants.ENAME_CURSOR_DECLARATION:
                case SqlXmlConstants.ENAME_BEGIN_TRANSACTION:
                case SqlXmlConstants.ENAME_SAVE_TRANSACTION:
                case SqlXmlConstants.ENAME_COMMIT_TRANSACTION:
                case SqlXmlConstants.ENAME_ROLLBACK_TRANSACTION:
                case SqlXmlConstants.ENAME_CONTAINER_OPEN:
                case SqlXmlConstants.ENAME_CONTAINER_CLOSE:
                case SqlXmlConstants.ENAME_WHILE_LOOP:
                case SqlXmlConstants.ENAME_IF_STATEMENT:
                case SqlXmlConstants.ENAME_SELECTIONTARGET:
                case SqlXmlConstants.ENAME_CONTAINER_GENERALCONTENT:
                case SqlXmlConstants.ENAME_CTE_WITH_CLAUSE:
                case SqlXmlConstants.ENAME_PERMISSIONS_BLOCK:
                case SqlXmlConstants.ENAME_PERMISSIONS_DETAIL:
                case SqlXmlConstants.ENAME_MERGE_CLAUSE:
                case SqlXmlConstants.ENAME_MERGE_TARGET:
                case SqlXmlConstants.ENAME_CASE_INPUT:
                case SqlXmlConstants.ENAME_BOOLEAN_EXPRESSION:
                case SqlXmlConstants.ENAME_BETWEEN_LOWERBOUND:
                case SqlXmlConstants.ENAME_BETWEEN_UPPERBOUND:
                case SqlXmlConstants.ENAME_CONTAINER_SINGLESTATEMENT:
                case SqlXmlConstants.ENAME_CONTAINER_MULTISTATEMENT:
                case SqlXmlConstants.ENAME_MERGE_ACTION:
                case SqlXmlConstants.ENAME_PERMISSIONS_TARGET:
                case SqlXmlConstants.ENAME_PERMISSIONS_RECIPIENT:
                case SqlXmlConstants.ENAME_DDL_WITH_CLAUSE:
                case SqlXmlConstants.ENAME_MERGE_CONDITION:
                case SqlXmlConstants.ENAME_MERGE_THEN:
                case SqlXmlConstants.ENAME_JOIN_ON_SECTION:
                case SqlXmlConstants.ENAME_CTE_ALIAS:
                case SqlXmlConstants.ENAME_ELSE_CLAUSE:
                case SqlXmlConstants.ENAME_DDL_AS_BLOCK:
                case SqlXmlConstants.ENAME_CURSOR_FOR_BLOCK:
                case SqlXmlConstants.ENAME_TRIGGER_CONDITION:
                case SqlXmlConstants.ENAME_CURSOR_FOR_OPTIONS:
                case SqlXmlConstants.ENAME_CTE_AS_BLOCK:
                case SqlXmlConstants.ENAME_DDL_RETURNS:
                case SqlXmlConstants.ENAME_MERGE_USING:
                case SqlXmlConstants.ENAME_MERGE_WHEN:
                case SqlXmlConstants.ENAME_BETWEEN_CONDITION:
                case SqlXmlConstants.ENAME_BEGIN_END_BLOCK:
                case SqlXmlConstants.ENAME_TRY_BLOCK:
                case SqlXmlConstants.ENAME_CATCH_BLOCK:
                case SqlXmlConstants.ENAME_CASE_STATEMENT:
                case SqlXmlConstants.ENAME_CASE_WHEN:
                case SqlXmlConstants.ENAME_CASE_THEN:
                case SqlXmlConstants.ENAME_CASE_ELSE:
                case SqlXmlConstants.ENAME_AND_OPERATOR:
                case SqlXmlConstants.ENAME_OR_OPERATOR:
                    //these are all containers, and therefore have no impact on obfuscated output.
                    ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                    break;

                case SqlXmlConstants.ENAME_DDLDETAIL_PARENS:
                case SqlXmlConstants.ENAME_FUNCTION_PARENS:
                case SqlXmlConstants.ENAME_DDL_PARENS:
                case SqlXmlConstants.ENAME_EXPRESSION_PARENS:
                case SqlXmlConstants.ENAME_SELECTIONTARGET_PARENS:
                    state.SpaceExpected = false;
                    state.AddOutputContent("(");
                    ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                    state.SpaceExpected = false;
                    state.SpaceExpectedForAnsiString = false;
                    state.AddOutputContent(")");
                    break;

                case SqlXmlConstants.ENAME_WHITESPACE:
                    //do nothing
                    break;

                case SqlXmlConstants.ENAME_COMMENT_MULTILINE:
                    if (PreserveComments)
                    {
                        state.SpaceExpected = false;
                        state.AddOutputContent("/*" + contentElement.InnerText + "*/");
                    }
                    break;
                case SqlXmlConstants.ENAME_COMMENT_SINGLELINE:
                    if (PreserveComments)
                    {
                        state.SpaceExpected = false;
                        state.AddOutputContent("--" + contentElement.InnerText.Replace("\r", "").Replace("\n", ""));
                        state.BreakExpected = true;
                    }
                    break;

                case SqlXmlConstants.ENAME_BATCH_SEPARATOR:
                    //newline regardless of whether previous element recommended a break or not.
                    state.BreakExpected = true;
                    ProcessSqlNodeList(contentElement.SelectNodes("*"), state);
                    state.BreakExpected = true;
                    break;

                case SqlXmlConstants.ENAME_STRING:
                    state.SpaceIfExpectedForAnsiString();
                    state.SpaceExpected = false;
                    state.AddOutputContent("'" + contentElement.InnerText.Replace("'", "''") + "'");
                    state.SpaceExpectedForAnsiString = true;
                    break;

                case SqlXmlConstants.ENAME_NSTRING:
                    state.AddOutputContent("N'" + contentElement.InnerText.Replace("'", "''") + "'");
                    state.SpaceExpectedForAnsiString = true;
                    break;

                case SqlXmlConstants.ENAME_BRACKET_QUOTED_NAME:
                    state.SpaceExpected = false;
                    state.AddOutputContent("[" + contentElement.InnerText.Replace("]", "]]") + "]");
                    break;

                case SqlXmlConstants.ENAME_QUOTED_STRING:
                    state.SpaceExpected = false;
                    state.AddOutputContent("\"" + contentElement.InnerText.Replace("\"", "\"\"") + "\"");
                    break;

                case SqlXmlConstants.ENAME_COMMA:
                case SqlXmlConstants.ENAME_PERIOD:
                case SqlXmlConstants.ENAME_SEMICOLON:
                case SqlXmlConstants.ENAME_SCOPERESOLUTIONOPERATOR:
                case SqlXmlConstants.ENAME_ASTERISK:
                case SqlXmlConstants.ENAME_OTHEROPERATOR:
                    state.SpaceExpected = false;
                    state.AddOutputContent(contentElement.InnerText);
                    break;

                case SqlXmlConstants.ENAME_COMPOUNDKEYWORD:
                    state.AddOutputContent(FormatKeyword(contentElement.Attributes[SqlXmlConstants.ANAME_SIMPLETEXT].Value));
                    state.SpaceExpected = true;
                    break;

                case SqlXmlConstants.ENAME_LABEL:
                    state.AddOutputContent(contentElement.InnerText);
                    state.BreakExpected = true;
                    break;

                case SqlXmlConstants.ENAME_OTHERKEYWORD:
                case SqlXmlConstants.ENAME_ALPHAOPERATOR:
                case SqlXmlConstants.ENAME_DATATYPE_KEYWORD:
                case SqlXmlConstants.ENAME_PSEUDONAME:
                case SqlXmlConstants.ENAME_BINARY_VALUE:
                    state.AddOutputContent(FormatKeyword(contentElement.InnerText));
                    state.SpaceExpected = true;
                    break;

                case SqlXmlConstants.ENAME_NUMBER_VALUE:
                    state.AddOutputContent(FormatKeyword(contentElement.InnerText));
                    if (!contentElement.InnerText.ToLowerInvariant().Contains("e"))
                    {
                        state.SpaceExpectedForE = true;
                        if (contentElement.InnerText.Equals("0"))
                            state.SpaceExpectedForX = true;
                    }
                    break;

                case SqlXmlConstants.ENAME_MONETARY_VALUE:
                    if (!contentElement.InnerText.Substring(0, 1).Equals("$"))
                        state.SpaceExpected = false;

                    state.AddOutputContent(contentElement.InnerText);

                    if (contentElement.InnerText.Length == 1)
                        state.SpaceExpectedForPlusMinus = true;
                    break;

                case SqlXmlConstants.ENAME_OTHERNODE:
                case SqlXmlConstants.ENAME_FUNCTION_KEYWORD:
                    state.AddOutputContent(contentElement.InnerText);
                    state.SpaceExpected = true;
                    break;

                default:
                    throw new Exception("Unrecognized element in SQL Xml!");
            }
        }
 private string FormatSQLNodes(XmlNodeList nodes, TSqlObfuscatingFormattingState state)
 {
     ProcessSqlNodeList(nodes, state);
     state.BreakIfExpected();
     return state.DumpOutput();
 }
 public string FormatSQLTree(XmlNode fragmentNode)
 {
     TSqlObfuscatingFormattingState state = new TSqlObfuscatingFormattingState(false, false);
     return FormatSQLNodes(fragmentNode.SelectNodes("."), state);
 }