Esempio n. 1
0
        public ExternalProcedureInfo(ObjectName procedureName, RoutineParameter[] parameters, ExternalRef externalRef)
            : base(procedureName, parameters)
        {
            if (externalRef == null)
                throw new ArgumentNullException("externalRef");

            ExternalRef = externalRef;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 6
0
        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;
        }
Esempio n. 7
0
 public static bool TryParse(string s, out ExternalRef externalRef)
 {
     Exception error;
     return TryParse(s, out externalRef, out error);
 }
Esempio n. 8
0
        public static bool TryParse(string s, out ExternalRef externalRef)
        {
            Exception error;

            return(TryParse(s, out externalRef, out error));
        }
Esempio n. 9
0
        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);
        }