Ejemplo n.º 1
0
        protected SqlMethod(SqlMethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException(nameof(methodInfo));
            }

            MethodInfo = methodInfo;
        }
Ejemplo n.º 2
0
        public static void MakeProcedureInfo()
        {
            var name = ObjectName.Parse("a.proc");
            var info = new SqlMethodInfo(name);

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));

            Assert.Equal(name, info.MethodName);
            Assert.NotEmpty(info.Parameters);
        }
Ejemplo n.º 3
0
        public static void MatchInvoke()
        {
            var name = ObjectName.Parse("a.proc");
            var info = new SqlMethodInfo(name);

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            var procedure = new SqlProcedureDelegate(info, methodContext => Task.CompletedTask);

            var invoke = new Invoke(name, new[] { new InvokeArgument(SqlObject.BigInt(11)) });

            Assert.True(procedure.Matches(null, invoke));
        }
Ejemplo n.º 4
0
        private static Dictionary <string, SqlExpression> BuildArguments(SqlMethodInfo methodInfo, Invoke invoke)
        {
            var result = new Dictionary <string, SqlExpression>();

            if (invoke.IsNamed)
            {
                var invokeArgs   = invoke.Arguments.ToDictionary(x => x.Name, y => y.Value);
                var methodParams = methodInfo.Parameters.ToDictionary(x => x.Name, y => y);

                foreach (var invokeArg in invokeArgs)
                {
                    SqlParameterInfo paramInfo;
                    if (!methodParams.TryGetValue(invokeArg.Key, out paramInfo))
                    {
                        throw new InvalidOperationException(
                                  $"Invoke argument {invokeArg.Key} does not correspond to any parameter of the method");
                    }

                    result[invokeArg.Key] = invokeArg.Value;
                }

                foreach (var methodParam in methodParams)
                {
                    if (!result.ContainsKey(methodParam.Key))
                    {
                        var paramInfo = methodParam.Value;
                        if (paramInfo.IsRequired)
                        {
                            throw new InvalidOperationException(
                                      $"The invoke to {methodInfo.MethodName} has no value for required parameter {paramInfo.Name} and no default value was set");
                        }

                        result[methodParam.Key] = paramInfo.DefaultValue;
                    }
                }
            }
            else
            {
                if (methodInfo.Parameters.Count != invoke.Arguments.Count)
                {
                    throw new NotSupportedException($"Invoke arguments mismatch the number of parameters of {methodInfo.MethodName}");
                }

                for (int i = 0; i < methodInfo.Parameters.Count; i++)
                {
                    var parmInfo = methodInfo.Parameters[i];
                    result[parmInfo.Name] = invoke.Arguments[i].Value;
                }
            }

            return(result);
        }
Ejemplo n.º 5
0
        public static void GetString()
        {
            var name = ObjectName.Parse("a.proc");
            var info = new SqlMethodInfo(name);

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            var function = new SqlProcedureDelegate(info, ctx => {
                var a = ctx.Value("a");
                var b = a.Multiply(SqlObject.BigInt(2));

                Console.Out.WriteLine("a * 2 = {0}", b);
            });

            var sql = $"PROCEDURE a.proc(a INTEGER)";

            Assert.Equal(sql, function.ToString());
        }
Ejemplo n.º 6
0
        public async Task ExecuteWithNamedArgs()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlMethodInfo(name);

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            var procedure = new SqlProcedureDelegate(info, ctx => {
                var a = ctx.Value("a");
                var b = a.Multiply(SqlObject.BigInt(2));
                Console.Out.WriteLine("a * 2 = {0}", b);
            });

            Assert.Equal(name, info.MethodName);

            var result = await procedure.ExecuteAsync(context, new InvokeArgument("a", SqlObject.Integer(22)));

            Assert.NotNull(result);
            Assert.False(result.HasReturnedValue);
        }
Ejemplo n.º 7
0
        public void Register <TMethod>(SqlMethodInfo methodInfo, params ObjectName[] aliases)
            where TMethod : SqlMethod
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException(nameof(methodInfo));
            }

            var methodName = methodInfo.MethodName.ToUpper();

            container.Register <SqlMethod, TMethod>(methodName);

            foreach (var alias in aliases)
            {
                container.Register <SqlMethod, TMethod>(alias.ToUpper());
            }

            initialized = false;
        }
Ejemplo n.º 8
0
        public async void ExecuteWithOutputArgs()
        {
            var name = ObjectName.Parse("a.proc");
            var info = new SqlMethodInfo(name);

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            info.Parameters.Add(new SqlParameterInfo("b", PrimitiveTypes.Integer(), SqlParameterDirection.Out));

            var procedure = new SqlProcedureDelegate(info, ctx => {
                var a = ctx.Value("a");
                var b = a.Multiply(SqlObject.Integer(2));

                ctx.SetOutput("b", SqlExpression.Constant(b));
            });

            Assert.Equal(name, info.MethodName);

            var result = await procedure.ExecuteAsync(context, new InvokeArgument("a", SqlObject.Integer(22)));

            Assert.NotNull(result);
            Assert.False(result.HasReturnedValue);
            Assert.NotEmpty(result.Output);
        }
Ejemplo n.º 9
0
 public ParameterCollection(SqlMethodInfo methodInfo)
 {
     this.methodInfo = methodInfo;
 }
Ejemplo n.º 10
0
 internal InvokeInfo(SqlMethodInfo methodInfo, Dictionary <string, SqlType> arguments)
 {
     MethodInfo     = methodInfo;
     this.arguments = arguments;
 }
Ejemplo n.º 11
0
 protected SqlProcedureBase(SqlMethodInfo methodInfo)
     : base(methodInfo)
 {
 }
Ejemplo n.º 12
0
 public SqlProcedureDelegate(SqlMethodInfo methodInfo, Action <MethodContext> body)
     : this(methodInfo, context => {
     body(context);
     return(Task.CompletedTask);
 }) {
 }
Ejemplo n.º 13
0
 public SqlProcedureDelegate(SqlMethodInfo methodInfo, Func <MethodContext, Task> body)
     : base(methodInfo)
 {
     this.body = body;
 }