Exemple #1
0
        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;
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
        }