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(); }
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)); }