public ExternalProcedureInfo(ObjectName procedureName, RoutineParameter[] parameters, ExternalRef externalRef) : base(procedureName, parameters) { if (externalRef == null) throw new ArgumentNullException("externalRef"); ExternalRef = externalRef; }
public ExternalFunctionInfo(ObjectName functionName, RoutineParameter[] parameters, SqlType returnType, ExternalRef externalRef) : base(functionName, parameters, returnType, FunctionType.Static) { if (externalRef == null) throw new ArgumentNullException("externalRef"); ExternalRef = externalRef; }
public ExternalProcedureInfo(ObjectName procedureName, RoutineParameter[] parameters, ExternalRef externalRef) : base(procedureName, parameters) { if (externalRef == null) { throw new ArgumentNullException("externalRef"); } ExternalRef = externalRef; }
public ExternalFunctionInfo(ObjectName functionName, RoutineParameter[] parameters, SqlType returnType, ExternalRef externalRef) : base(functionName, parameters, returnType, FunctionType.Static) { if (externalRef == null) { throw new ArgumentNullException("externalRef"); } ExternalRef = externalRef; }
public IRoutine GetRoutine(ObjectName routineName) { IRoutine result; if (!routinesCache.TryGet(routineName, out result)) { var t = FindEntry(routineName); if (t == null || t.RowCount == 0) { return(null); } var id = t.GetValue(0, 0); var schemaName = t.GetValue(0, 1).Value.ToString(); var name = t.GetValue(0, 2).Value.ToString(); var fullName = new ObjectName(ObjectName.Parse(schemaName), name); var t2 = GetParameters(id); var parameters = CreateParameters(t2); var routineType = t.GetValue(0, 3).Value.ToString(); var returnTypeString = t.GetValue(0, 6).Value.ToString(); var owner = t.GetValue(0, 7).Value.ToString(); RoutineInfo info; SqlType returnType = null; if (routineType == FunctionType || routineType == ExtrernalFunctionType) { returnType = transaction.Context.ResolveType(returnTypeString); } SqlStatement body = null; ExternalRef externalRef = null; if (routineType == FunctionType || routineType == ProcedureType) { var bodyBin = (SqlBinary)t.GetValue(0, 5).Value; body = bodyBin.ToObject <PlSqlBlockStatement>(); } else if (routineType == ExtrernalFunctionType || routineType == ExternalProcedureType) { var location = t.GetValue(0, 4).Value.ToString(); if (!ExternalRef.TryParse(location, out externalRef)) { throw new InvalidOperationException(String.Format("The location stored for function '{0}' is invalid: {1}.", routineName, location)); } } if (routineType == FunctionType) { info = new PlSqlFunctionInfo(fullName, parameters, returnType, body); } else if (routineType == ProcedureType) { info = new PlSqlProcedureInfo(fullName, parameters, body); } else if (routineType == ExtrernalFunctionType) { info = new ExternalFunctionInfo(fullName, parameters, returnType, externalRef); } else if (routineType == ExternalProcedureType) { info = new ExternalProcedureInfo(fullName, parameters, externalRef); } else { throw new InvalidOperationException(String.Format("Invalid routine type '{0}' found in database", routineType)); } info.Owner = owner; if (info is PlSqlFunctionInfo) { result = new PlSqlFunction((PlSqlFunctionInfo)info); } else if (info is PlSqlProcedureInfo) { result = new PlSqlProcedure((PlSqlProcedureInfo)info); } else if (info is ExternalFunctionInfo) { result = new ExternalFunction((ExternalFunctionInfo)info); } else { result = new ExternalProcedure((ExternalProcedureInfo)info); } routinesCache.Set(fullName, result); } return(result); }
private static bool TryParse(string s, out ExternalRef externalRef, out Exception error) { externalRef = null; if (String.IsNullOrEmpty(s)) { error = new ArgumentNullException("s"); return false; } var typeName = s; string assemblyName = null; if (s[0] == '[') { var delim2 = s.IndexOf(']'); if (delim2 == -1) { error = new FormatException("The external ref is invalid."); return false; } assemblyName = s.Substring(1, delim2-1); typeName = s.Substring(delim2 + 1); } var delim = typeName.LastIndexOf('.'); if (delim == -1) { error = new FormatException("The input type is invalid."); return false; } var methodName = typeName.Substring(delim + 1); typeName = typeName.Substring(0, delim); var parenDelim1 = methodName.IndexOf('('); if (parenDelim1 == -1) { error = new FormatException("Method open parenthesis not found."); return false; } var parenDelim2 = methodName.IndexOf(')'); if (parenDelim2 == -1) { error = new FormatException("Method close parenthesis not found."); return false; } var argString = methodName.Substring(parenDelim1 + 1, (parenDelim2 - parenDelim1) - 1); methodName = methodName.Substring(0, parenDelim1); var args = new List<string>(); if (!String.IsNullOrEmpty(argString)) { var sp = argString.Split(','); for (int i = 0; i < sp.Length; i++) { var arg = sp[i].Trim(); if (String.IsNullOrEmpty(arg)) { error = new FormatException("One of the arguments is invalid."); return false; } args.Add(arg); } } externalRef = new ExternalRef(assemblyName, typeName, methodName, args.ToArray()); error = null; return true; }
public static bool TryParse(string s, out ExternalRef externalRef) { Exception error; return TryParse(s, out externalRef, out error); }
public static bool TryParse(string s, out ExternalRef externalRef) { Exception error; return(TryParse(s, out externalRef, out error)); }
private static bool TryParse(string s, out ExternalRef externalRef, out Exception error) { externalRef = null; if (String.IsNullOrEmpty(s)) { error = new ArgumentNullException("s"); return(false); } var typeName = s; string assemblyName = null; if (s[0] == '[') { var delim2 = s.IndexOf(']'); if (delim2 == -1) { error = new FormatException("The external ref is invalid."); return(false); } assemblyName = s.Substring(1, delim2 - 1); typeName = s.Substring(delim2 + 1); } var delim = typeName.LastIndexOf('.'); if (delim == -1) { error = new FormatException("The input type is invalid."); return(false); } var methodName = typeName.Substring(delim + 1); typeName = typeName.Substring(0, delim); var parenDelim1 = methodName.IndexOf('('); if (parenDelim1 == -1) { error = new FormatException("Method open parenthesis not found."); return(false); } var parenDelim2 = methodName.IndexOf(')'); if (parenDelim2 == -1) { error = new FormatException("Method close parenthesis not found."); return(false); } var argString = methodName.Substring(parenDelim1 + 1, (parenDelim2 - parenDelim1) - 1); methodName = methodName.Substring(0, parenDelim1); var args = new List <string>(); if (!String.IsNullOrEmpty(argString)) { var sp = argString.Split(','); for (int i = 0; i < sp.Length; i++) { var arg = sp[i].Trim(); if (String.IsNullOrEmpty(arg)) { error = new FormatException("One of the arguments is invalid."); return(false); } args.Add(arg); } } externalRef = new ExternalRef(assemblyName, typeName, methodName, args.ToArray()); error = null; return(true); }