public static ArrayList parseGrantSql(string p_sql, string p_filename) { SQLPlusScanner scanner = new SQLPlusScanner(new StringReader(p_sql), "parseGrantSql"); string currGrantType = ""; string currObjectClause = ""; string currGrantor = ""; string currTableName = ""; string currAdminOption = "NO"; string currGrantable = "NO"; string currHierarchy = "NO"; bool complete = false; StringBuilder grantPrivileges = new StringBuilder(); StringBuilder grantees = new StringBuilder(); try { string currentToken = scanner.getSkipComments(); if (currentToken != "GRANT") throw new ArgumentException("Sql does not contain grant statement"); while (true) { currentToken = scanner.getSkipComments(); if (currentToken == "ON" || currentToken == "TO") break; if (currentToken != "," && grantPrivileges.Length > 0) grantPrivileges.Append(" "); grantPrivileges.Append(currentToken); } if (grantPrivileges.ToString().Trim() == "") Log.Warning("GrantObject", "Incorrect grant, was expecting grant privileges: {0}", p_sql); if (currentToken == "ON") currGrantType = "OBJECT"; else currGrantType = "SYSTEM"; // read objectName if (currGrantType == "OBJECT") { currentToken = scanner.getSkipComments(); if (currentToken == "DIRECTORY") { currObjectClause = currentToken; currentToken = scanner.getSkipComments(); } else if (currentToken == "JAVA") { currObjectClause = currentToken; currentToken = scanner.getSkipComments(); if (currentToken != "SOURCE" || currentToken != "RESOURCE") SQLMake.Util.Log.Warning("GrantObject", "Incorrect grant, was expecting keyword SOURCE|RESOURCE: {0}", p_sql); currObjectClause += " " + currentToken; currentToken = scanner.getSkipComments(); } if (currentToken.IndexOf('.') > -1) { currGrantor = currentToken.Split('.')[0]; currTableName = currentToken.Split('.')[1]; } else { currTableName = currentToken; } currentToken = scanner.getSkipComments(); } if (currentToken != "TO") Log.Warning("GrantObject", "Incorrect grant, was expecting keyword TO: {0}", p_sql); // read grantees part while (true) { currentToken = scanner.getSkipComments(); grantees.Append(currentToken); complete = true; currentToken = scanner.getSkipComments(); if (currentToken != ",") break; else grantees.Append(currentToken); } // read with admin clause if (currGrantType == "SYSTEM") { currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments(); if (currentToken == "WITH ADMIN OPTION") currAdminOption = "YES"; else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH ADMIN OPTION: {0}", p_sql); } else { currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments(); if (currentToken == "WITH GRANT OPTION") currGrantable = "YES"; else if (currentToken == "WITH HIERARCHY OPTION") currHierarchy = "YES"; else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH GRANT OPTION|WITH HIERARCHY OPTION: {0}", p_sql); currentToken = scanner.getSkipComments(); currentToken += " " + scanner.getSkipComments() + " " + scanner.getSkipComments(); if (currentToken == "WITH GRANT OPTION") currGrantable = "YES"; else if (currentToken == "WITH HIERARCHY OPTION") currHierarchy = "YES"; else Log.Warning("GrantObject", "Incorrect grant, was expecting keyword WITH GRANT OPTION|WITH HIERARCHY OPTION: {0}", p_sql); } currentToken = scanner.getSkipComments(); Log.Warning("GrantObject", "Incorrect grant, keywords found after expected end of grant clause: {0}", p_sql); } catch (EOFException) { if (!complete) Log.Warning("GrantObject", "Incorrect grant, premature termination of sql statement: {0}", p_sql); } catch (EOBException) { if (!complete) Log.Warning("GrantObject", "Incorrect grant, premature termination of sql statement: {0}", p_sql); } ArrayList resultSet = new ArrayList(); if (complete) { foreach (string grantPrivilege in grantPrivileges.ToString().Split(',')) { foreach (string grantee in grantees.ToString().Split(',')) { GrantObject grantObject = new GrantObject(p_filename, currGrantType, currObjectClause, replaceWithSandbox(grantee.Trim()), currTableName, replaceWithSandbox(currGrantor.Trim()), grantPrivilege, currAdminOption, currGrantable, currHierarchy); // Console.WriteLine(grantObject.ToString()); resultSet.Add(grantObject); } } } return resultSet; }
public static SynonymObject parseSynonymSql(string p_sql, string p_filename) { SQLPlusScanner scanner = new SQLPlusScanner(new StringReader(p_sql), "parseSynonymSql"); string synonymSchema = ""; string synonymName = ""; string synonymTarget = ""; bool isPublic = false; bool complete = false; try { string currentToken = scanner.getSkipComments(); if (currentToken == "CREATE") currentToken = scanner.getSkipComments(); if (currentToken == "OR") { currentToken = scanner.getSkipComments(); if (currentToken != "REPLACE") throw new ArgumentException("REPLACE expected after CREATE OR tokens"); currentToken = scanner.getSkipComments(); } isPublic = false; if (currentToken == "PUBLIC") { isPublic = true; currentToken = scanner.getSkipComments(); } if (currentToken != "SYNONYM") throw new ArgumentException("Sql does not contain SYNONYM statement"); currentToken = scanner.getSkipComments(); // expecting schema.synonymName if (currentToken.IndexOf('.') > -1) { synonymSchema = currentToken.Split('.')[0]; synonymName = currentToken.Split('.')[1]; } else { synonymSchema = ""; synonymName = currentToken; } currentToken = scanner.getSkipComments(); // expecting FOR if (currentToken != "FOR") throw new ArgumentException("FOR statement expected in synonym statement"); // target schema: schema.object@db_link // we have to convert schema to sandbox name currentToken = scanner.getSkipComments(); if (currentToken.IndexOf('.') > -1) { synonymTarget = replaceWithSandbox(currentToken.Split('.')[0].Trim()) + "." + currentToken.Split('.')[1]; } else { synonymTarget = currentToken; } complete = true; // this should throw exception as we should be at the end currentToken = scanner.getSkipComments(); } catch (EOFException) { if (!complete) Log.Warning("SynonymObject", "Incorrect synonym, premature termination of sql statement: {0}", p_sql); } catch (EOBException) { if (!complete) Log.Warning("GrantObject", "Incorrect synonym, premature termination of sql statement: {0}", p_sql); } return new SynonymObject(p_filename, synonymSchema, synonymName, synonymTarget, isPublic); }
public static string getObjectNameFromFile(string fileName, ref string plsqlObjectType) { StreamReader r = new StreamReader(fileName, Encoding.GetEncoding(Settings.getEncoding(false))); SQLPlusScanner scanner = new SQLPlusScanner(r, fileName); String token = null; CommandTypes mode = CommandTypes.Unknown; do { try { token = scanner.get(); mode = scanner.currCommand.cmdType; } // this is needed to filter out any SQLPlus commands like PROMPT // or line&block comments catch (EOBException) { mode = scanner.currCommand.cmdType; scanner.resetBlockType(); } } while (mode == CommandTypes.SqlPlus); // This is cheap but perhaps not exactly correct // way to skip "create or replace" while (token.ToUpper() != "FUNCTION" && token.ToUpper() != "LIBRARY" && token.ToUpper() != "PACKAGE" && token.ToUpper() != "PROCEDURE" && token.ToUpper() != "TRIGGER" && token.ToUpper() != "TYPE" && token.ToUpper() != "VIEW") { token = scanner.get(); } plsqlObjectType = token.ToUpper(); token = scanner.getSkipComments(); if ((plsqlObjectType == "PACKAGE" || plsqlObjectType == "TYPE") && token.ToUpper() == "BODY") { plsqlObjectType += " BODY"; token = scanner.getSkipComments(); } // now the token contains plsql object name string plsqlObjectName = token; r.Close(); r.Dispose(); return plsqlObjectName; }