示例#1
0
        internal static string Parameterize(this System.DateTime value, BuildContext buildContext, DataType dataType, Parameterization p = Parameterization.Value)
        {
            if (!ParameterizationCriteria(buildContext, p))
            {
                return(null);
            }

            var argument = new ParameterArgument(new Value(value, p, dataType));

            return(Parameterize(argument, buildContext, p));
        }
示例#2
0
        internal static string Parameterize(this System.Byte[] value, BuildContext buildContext, Parameterization p = Parameterization.Value)
        {
            if (!ParameterizationCriteria(buildContext, p))
            {
                return(null);
            }

            var argument = new ParameterArgument(value);

            return(Parameterize(argument, buildContext, p));
        }
示例#3
0
        internal Expression(string arg)
            : base(null)
        {
            Build = (buildContext, buildArgs) =>
            {
                QueryTalkException exception;
                var variable = buildContext.TryGetVariable(arg, out exception);

                if (variable.IsInliner())
                {
                    if (variable.DT != DT.InExpression)
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          variable.Name, _inliners));
                        return(null);
                    }

                    string arg2 = variable.Name;
                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument argument = buildArgs.Executable.GetInlinerArgument(arg2);
                        if (argument.Value != null)
                        {
                            arg2 = argument.Build(buildContext, buildArgs);
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }

                    return(arg2.ToString());
                }
                else if (variable.IsConcatenator())
                {
                    buildContext.TryTakeException(InvalidConcatenationException(variable.Name));
                    return(null);
                }
                // non-existing variable or expression string
                else
                {
                    // note: non-existing variable will pass the test => the server will throw an error
                    CheckExpressionString(arg);

                    return(arg);
                }
            };
        }
示例#4
0
        // create the parameter from the inline value argument
        private static string Parameterize(ParameterArgument argument, BuildContext buildContext, Parameterization p = Parameterization.Value)
        {
            QueryTalkException exception;
            var root = buildContext.ConcatRoot;

            // infer param from argument
            var param = Variable.InferParam(root, argument, out exception);

            TryThrow(exception);
            root.TryAddParamOrThrow(param, true);
            argument.BuildArgument(root, param.Name);
            TryThrow(argument.Exception);

            if (p == Parameterization.Value)
            {
                param.SetParameterizedValue(argument);
            }

            return(param.Name);
        }
示例#5
0
        /// <summary>
        /// Represents a column in the select statement.
        /// </summary>
        /// <param name="arg">Is a column identifier.</param>
        public Column(System.String arg)
            : base(arg)
        {
            SetArgType(arg);

            _isVariable = Variable.Detect(arg);

            Build = (buildContext, buildArgs) =>
            {
                if (buildContext == null)
                {
                    return(Filter.Delimit(arg));
                }
                ;

                string sql;

                Variable variable = TryGetVariable(buildContext);

                if (variable.IsInliner())
                {
                    if (!_inliners.Contains(variable.DT))
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          variable.Name, _inliners));
                        return(null);
                    }

                    string arg2 = variable.Name;

                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument inlinerArgument = buildArgs.Executable.GetInlinerArgument(variable.Name);

                        if (inlinerArgument.Value != null)
                        {
                            if (inlinerArgument.Value is System.String)
                            {
                                _columnName = (System.String)inlinerArgument.Value;
                                return(Filter.DelimitColumnMultiPart((string)inlinerArgument.Value, out chainException));
                            }
                            else if (inlinerArgument.Value is Column)
                            {
                                _columnName = ((Column)inlinerArgument.Value).ColumnName;
                                return(((Column)inlinerArgument.Value).Build(buildContext, buildArgs));
                            }
                            // Column[]
                            else
                            {
                                var columns = (Column[])inlinerArgument.Value;
                                return(Column.Concatenate(columns, buildContext, buildArgs, null, null, false));
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this, QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }

                    return(arg2);
                }
                else
                {
                    if (ProcessVariable(buildContext, buildArgs, out sql, variable))
                    {
                        return(sql);
                    }
                }

                if (buildContext.IsCurrentStringAsValue)
                {
                    return(buildContext.BuildString(arg));
                }

                sql = Filter.DelimitMultiPartOrParam(arg, IdentifierType.ColumnOrParam, out chainException, out _columnName);
                buildContext.TryTakeException(chainException);

                return(sql);
            };
        }
示例#6
0
        /// <summary>
        /// Initializes a new instance of the TableArgument class.
        /// </summary>
        /// <param name="arg">An argument to convert.</param>
        public TableArgument(System.String arg)
            : base(arg)
        {
            SetArgType(arg);

            if (CheckNull(Arg(() => arg, arg)))
            {
                Sql = Filter.DelimitTableMultiPart(arg, out chainException);
            }

            Build = (buildContext, buildArgs) =>
            {
                buildContext.TryTakeException(chainException);
                TryThrow();

                string sql;

                Variable variable = TryGetVariable(buildContext);

                if (variable.IsInliner())
                {
                    string arg2 = variable.Name;

                    // check inliner type
                    if (variable.DT != DT.InTable)
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          arg2, _inliners));
                        return(null);
                    }

                    if (buildArgs.Executable != null)
                    {
                        ParameterArgument argument = buildArgs.Executable.GetInlinerArgument(arg2);
                        if (argument.Value != null)
                        {
                            if (argument.Value is System.String)
                            {
                                arg2 = Filter.DelimitMultiPartOrParam((string)argument.Value, IdentifierType.Table, out chainException);
                            }
                            // Identifier
                            else
                            {
                                arg2 = ((Identifier)argument.Value).Build(buildContext, buildArgs);
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }
                    return(arg2);
                }

                if (ProcessVariable(buildContext, buildArgs, out sql))
                {
                    Sql = sql;
                }
                else
                {
                    Sql = Filter.DelimitMultiPartOrParam(arg, IdentifierType.Table, out chainException);
                    buildContext.TryTakeException(chainException);
                }

                return(Sql);
            };
        }
示例#7
0
        internal Table(System.String arg)
            : base(arg)
        {
            SetArgType(arg);

            Build = (buildContext, buildArgs) =>
            {
                string   sql;
                Variable variable = TryGetVariable(buildContext);

                if (variable.IsInliner())
                {
                    string arg2 = variable.Name;
                    if (variable.DT != DT.InTable)
                    {
                        buildContext.TryTakeException(variable.DT.InvalidInlinerException(GetType().Name,
                                                                                          arg2, _inliners));
                        return(null);
                    }

                    if (buildArgs.Executable != null)
                    {
                        // get param argument
                        ParameterArgument argument = buildArgs.Executable.GetInlinerArgument(arg2);
                        if (argument.Value != null)
                        {
                            if (argument.Value is System.String)
                            {
                                arg2 = Filter.DelimitTableMultiPart((string)argument.Value, out chainException);
                            }
                            else if (argument.Value is View)
                            {
                                arg2 = Filter.Enclose(arg2);
                            }
                            else
                            {
                                arg2 = argument.Build(buildContext, buildArgs);
                            }
                        }
                        else
                        {
                            buildContext.TryTakeException(new QueryTalkException(this,
                                                                                 QueryTalkExceptionType.InlinerArgumentNull,
                                                                                 String.Format("{0} = null", arg2)));
                            return(null);
                        }
                    }
                    return(arg2);
                }

                else
                {
                    if (ProcessVariable(buildContext, buildArgs, out sql, variable))
                    {
                        return(sql);
                    }

                    // specific (existing) variable checks
                    if (variable != null && variable.VariableType.IsParamOrSqlVariable())
                    {
                        // variable should be a table
                        if (!variable.DT.IsTable())
                        {
                            buildContext.TryTakeException(CreateException(QueryTalkExceptionType.TableVariableMissing, arg));
                            return(null);
                        }

                        // check concatenation with non-udt table variable (NOT ALLOWED)
                        if (buildContext.Current.Query.Master.IsConcatenated)
                        {
                            if (variable.NameType == null)
                            {
                                buildContext.TryTakeException(CreateException(QueryTalkExceptionType.TableVariableDisallowed, arg));
                                return(null);
                            }
                        }
                    }
                }

                // default
                sql = Filter.DelimitMultiPartOrParam(arg, IdentifierType.Table, out chainException);
                buildContext.TryTakeException(chainException);
                return(sql);
            };
        }
示例#8
0
 /// <summary>
 /// Specifies that the parameter is optional.
 /// </summary>
 /// <param name="prev">A predecessor object.</param>
 /// <param name="defaultValue">Is a default value assigned to the parameter in case that a parameter argument is not passed. All optional parameters have to be declared at the end of the parameter declaration.</param>
 public static ParamOptionalChainer Optional(this IParamOptional prev, ParameterArgument defaultValue)
 {
     return(new ParamOptionalChainer((Chainer)prev, defaultValue));
 }
示例#9
0
        // for functions only
        internal static string Parameterize(this View view, BuildContext buildContext)
        {
            var argument = new ParameterArgument(view);

            return(Parameterize(argument, buildContext, Parameterization.Value));
        }