private void VisitProcedureAndBodyParameters(IProcedureStatement statement, bool isProcedure, bool checkIfNotExists)
        {
            if (checkIfNotExists)
            {
                if (isProcedure)
                {
                    VisitStatement(Sql.DropProcedure(statement.Name, true));
                }
                else
                {
                    VisitStatement(Sql.DropFunction(statement.Name, true));
                }
                State.WriteStatementTerminator();
            }
            State.Write(MySqlSymbols.DELIMITER);
            State.Write(DelimiterSymbol);
            State.WriteCRLF();
            State.Write(Symbols.CREATE);

            if (isProcedure)
            {
                State.Write(Symbols.PROCEDURE);
            }
            else
            {
                State.Write(Symbols.FUNCTION);
            }
            VisitNameToken(statement.Name);
            State.WriteCRLF();


            if (!isProcedure)
            {
                VisitProcedureAndFunctionParameters(statement, false);
                VisitFunctionReturnParameters(statement);
            }
            else
            {
                VisitProcedureAndFunctionParameters(statement);
            }

            State.Write(Symbols.BEGIN);
            State.WriteCRLF();
            VisitStatement(statement.Body);
            State.WriteStatementTerminator();
            State.Write(Symbols.END);

            State.Write(String.Empty);
            State.Write(DelimiterSymbol);
            State.WriteStatementTerminator();
            State.Write(MySqlSymbols.DELIMITER);
            State.Write(String.Empty);
            State.WriteStatementTerminator();
        }
        private void VisitFunctionReturnParameters(IProcedureStatement s)
        {
            var retVal = s.Parameters.FirstOrDefault(p => p.Direction == ParameterDirection.ReturnValue);

            State.Write(Symbols.RETURNS);
            if (retVal == null)
            {
                State.Write(Symbols.VOID);
            }
            else
            {
                VisitType(retVal);
            }
            State.WriteCRLF();
        }
        private void VisitProcedureAndFunctionParameters(IProcedureStatement s, bool IsProcedure = true)
        {
            var separator = Symbols.OpenParenthesis;

            State.Write(separator);
            foreach (var p in s.Parameters
                     .Where(p => p.Direction != ParameterDirection.ReturnValue))
            {
                if (separator == Symbols.Comma)
                {
                    State.Write(separator);
                }
                State.WriteCRLF();
                separator = Symbols.Comma;

                if (IsProcedure)
                {
                    switch (p.Direction)
                    {
                    case ParameterDirection.Input:
                        State.Write(Symbols.IN);
                        break;

                    case ParameterDirection.InputOutput:
                        State.Write(Symbols.INOUT);
                        break;

                    case ParameterDirection.Output:
                        State.Write(Symbols.OUT);
                        break;

                    default:
                        State.Write(Symbols.IN);
                        break;
                    }
                }
                VisitNameToken(p.Name);
                VisitType(p);
            }
            if (separator == Symbols.Comma)
            {
                State.WriteCRLF();
            }
            State.Write(Symbols.CloseParenthesis);
            State.WriteCRLF();
        }
        private void VisitFunctionParametersAndBody(IProcedureStatement s)
        {
            State.Write(Symbols.FUNCTION);

            VisitNameToken(s.Name);
            State.WriteCRLF();

            var       separator   = Symbols.OpenParenthesis;
            Parameter returnParam = s.Parameters
                                    .Where(p => p.Direction == ParameterDirection.ReturnValue).FirstOrDefault();

            foreach (var p in s.Parameters
                     .Where(p => p.Direction != ParameterDirection.ReturnValue))
            {
                State.Write(separator);
                State.WriteCRLF();
                separator = Symbols.Comma;

                VisitNameToken(p.Name);
                VisitType(p);

                if (p.DefaultValue != null)
                {
                    State.Write(Symbols.AssignVal);
                    VisitValue(p.DefaultValue);
                }
                if ((p.Direction != 0) && (p.Direction != ParameterDirection.Input))
                {
                    State.Write(Symbols.OUTPUT);
                }
                if (p.ReadOnly)
                {
                    State.Write(Symbols.READONLY);
                }
            }
            if (separator == Symbols.Comma)
            {
                State.WriteCRLF();
                State.Write(Symbols.CloseParenthesis);
                State.WriteCRLF();
            }
            if (returnParam != null)
            {
                State.Write(Symbols.RETURNS);
                VisitNameToken(returnParam.Name);
                VisitType(returnParam);
                State.WriteCRLF();
            }

            if (s.Recompile)
            {
                State.Write(Symbols.WITH, Symbols.RECOMPILE);
                State.WriteCRLF();
            }

            State.Write(Symbols.AS);
            State.WriteCRLF();
            State.Write(Symbols.BEGIN);
            State.WriteStatementTerminator();
            VisitStatement(s.Body);
            State.Write(Symbols.END);
            State.WriteStatementTerminator();
        }
Example #5
0
        private void CreateOrReplaceFunction(IProcedureStatement statement)
        {
            State.Write(Symbols.CREATE);
            State.Write(Symbols.OR);
            State.Write(Symbols.REPLACE);
            State.Write(Symbols.FUNCTION);

            VisitNameToken(statement.Name);
            var    separator       = String.Empty;
            string returnValueName = this.TempName;

            var retVal = statement.Parameters.FirstOrDefault(p => p.Direction == ParameterDirection.ReturnValue);

            State.Write(Symbols.OpenParenthesis);
            foreach (var p in statement.Parameters
                     .Where(p => p.Direction != ParameterDirection.ReturnValue))
            {
                State.Write(separator);
                separator = Symbols.Comma;

                VisitNameToken(p.Name);
                VisitType(p);

                if (p.DefaultValue != null)
                {
                    State.Write(Symbols.AssignVal);
                    VisitValue(p.DefaultValue);
                }
                if ((p.Direction != 0) && (p.Direction != ParameterDirection.Input))
                {
                    State.Write(Symbols.OUTPUT);
                }
                if (p.ReadOnly)
                {
                    State.Write(Symbols.READONLY);
                }
            }

            State.Write(Symbols.CloseParenthesis);
            State.WriteCRLF();

            State.Write(Symbols.RETURNS);
            if (retVal == null)
            {
                State.Write(Symbols.VOID);
            }
            else
            {
                VisitType(retVal);
                returnValueName = retVal.Name;
            }
            State.Write(Symbols.AS);
            State.Write(returnValueName);
            State.WriteCRLF();

            if (statement.Declarations.Count != 0)
            {
                State.Write(Symbols.DECLARE);
                State.WriteCRLF();

                foreach (Parameter p in statement.Declarations)
                {
                    VisitNameToken(p.Name);
                    VisitType(p);
                    State.WriteStatementTerminator();
                }
            }

            State.Write(Symbols.BEGIN);
            State.WriteCRLF();
            VisitStatement(statement.Body);
            State.WriteStatementTerminator();
            State.Write(Symbols.END);
            State.WriteStatementTerminator();
            State.Write(String.Format(this.EndFunction, returnValueName));
        }