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 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!"); } }