Beispiel #1
0
        public virtual IEnumerable <CommandPart> CreatePersistParts(SqlPersistTask task, string parameterNamePrefix)
        {
            ArgumentValidator.EnsureArgumentNotNull(task, "task");
            ArgumentValidator.EnsureArgumentNotNullOrEmpty(parameterNamePrefix, "parameterNamePrefix");

            var result         = new List <CommandPart>();
            int parameterIndex = 0;

            foreach (var request in task.RequestSequence)
            {
                var tuple             = task.Tuple;
                var compilationResult = request.GetCompiledStatement();
                var configuration     = new SqlPostCompilerConfiguration();
                var part = new CommandPart();

                foreach (var binding in request.ParameterBindings)
                {
                    var parameterValue = GetParameterValue(task, binding);
                    if (binding.BindingType == PersistParameterBindingType.VersionFilter && IsHandledLikeNull(parameterValue))
                    {
                        configuration.AlternativeBranches.Add(binding);
                    }
                    else
                    {
                        var parameterName = GetParameterName(parameterNamePrefix, ref parameterIndex);
                        configuration.PlaceholderValues.Add(binding, Driver.BuildParameterReference(parameterName));
                        AddParameter(part, binding, parameterName, parameterValue);
                    }
                }

                part.Statement = compilationResult.GetCommandText(configuration);
                result.Add(part);
            }
            return(result);
        }
Beispiel #2
0
 private void ValidateCommandParameters(CommandPart commandPart)
 {
     if (GetCommandExecutionBehavior(new[] { commandPart }, 0) == ExecutionBehavior.TooLargeForAnyCommand)
     {
         throw new ParametersLimitExceededException(commandPart.Parameters.Count, MaxQueryParameterCount);
     }
 }
Beispiel #3
0
        private void AddCharacterLobParameter(CommandPart commandPart, string name, string value)
        {
            var lob = Connection.CreateCharacterLargeObject();

            commandPart.Resources.Add(lob);
            if (value != null)
            {
                if (value.Length > 0)
                {
                    int offset        = 0;
                    int remainingSize = value.Length;
                    while (remainingSize >= LobBlockSize)
                    {
                        lob.Write(value.ToCharArray(offset, LobBlockSize), 0, LobBlockSize);
                        offset        += LobBlockSize;
                        remainingSize -= LobBlockSize;
                    }
                    if (remainingSize > 0)
                    {
                        lob.Write(value.ToCharArray(offset, remainingSize), 0, remainingSize);
                    }
                }
                else
                {
                    lob.Erase();
                }
            }
            var parameter = Connection.CreateParameter();

            parameter.ParameterName = name;
            lob.BindTo(parameter);
            commandPart.Parameters.Add(parameter);
        }
Beispiel #4
0
        public void AddPart(CommandPart part)
        {
            if (prepared)
            {
                throw new InvalidOperationException("Unable to change command: it is already prepared");
            }

            statements.Add(part.Statement);

            foreach (var parameter in part.Parameters)
            {
                underlyingCommand.Parameters.Add(parameter);
            }

            if (part.Resources.Count == 0)
            {
                return;
            }

            if (resources == null)
            {
                resources = new DisposableSet();
            }
            foreach (var resource in part.Resources)
            {
                resources.Add(resource);
            }
        }
Beispiel #5
0
        public void AddPart(CommandPart part)
        {
            if (prepared)
            {
                throw new InvalidOperationException(Strings.ExUnableToChangeCommandItIsAlreadyPrepared);
            }

            statements.Add(part.Statement);

            foreach (var parameter in part.Parameters)
            {
                _ = underlyingCommand.Parameters.Add(parameter);
            }

            if (part.Resources.Count == 0)
            {
                return;
            }

            resources ??= new DisposableSet();

            foreach (var resource in part.Resources)
            {
                _ = resources.Add(resource);
            }
        }
Beispiel #6
0
        private void AddRegularParameter(CommandPart commandPart, TypeMapping mapping, string name, object value)
        {
            var parameter = Connection.CreateParameter();

            parameter.ParameterName = name;
            mapping.BindValue(parameter, value);
            commandPart.Parameters.Add(parameter);
        }
Beispiel #7
0
        private void AddParameter(
            CommandPart commandPart, ParameterBinding binding, string parameterName, object parameterValue)
        {
            switch (binding.TransmissionType)
            {
            case ParameterTransmissionType.Regular:
                AddRegularParameter(commandPart, binding.TypeMapping, parameterName, parameterValue);
                break;

            case ParameterTransmissionType.CharacterLob:
                AddCharacterLobParameter(commandPart, parameterName, (string)parameterValue);
                break;

            case ParameterTransmissionType.BinaryLob:
                AddBinaryLobParameter(commandPart, parameterName, (byte[])parameterValue);
                break;

            default:
                throw new ArgumentOutOfRangeException("binding.BindingType");
            }
        }
Beispiel #8
0
        private void AddBinaryLobParameter(CommandPart commandPart, string name, byte[] value)
        {
            var lob = Connection.CreateBinaryLargeObject();

            commandPart.Resources.Add(lob);
            if (value != null)
            {
                if (value.Length > 0)
                {
                    lob.Write(value, 0, value.Length);
                }
                else
                {
                    lob.Erase();
                }
            }
            var parameter = Connection.CreateParameter();

            parameter.ParameterName = name;
            lob.BindTo(parameter);
            commandPart.Parameters.Add(parameter);
        }
Beispiel #9
0
        public virtual CommandPart CreateQueryPart(IQueryRequest request, string parameterNamePrefix, ParameterContext parameterContext)
        {
            ArgumentValidator.EnsureArgumentNotNull(request, "request");
            ArgumentValidator.EnsureArgumentNotNullOrEmpty(parameterNamePrefix, "parameterNamePrefix");

            int parameterIndex    = 0;
            var compilationResult = request.GetCompiledStatement();
            var configuration     = new SqlPostCompilerConfiguration();
            var result            = new CommandPart();

            using (parameterContext.ActivateSafely()) {
                foreach (var binding in request.ParameterBindings)
                {
                    object parameterValue = GetParameterValue(binding);
                    switch (binding.BindingType)
                    {
                    case QueryParameterBindingType.Regular:
                        break;

                    case QueryParameterBindingType.SmartNull:
                        // replacing "x = @p" with "x is null" when @p = null (or empty string in case of Oracle)
                        if (IsHandledLikeNull(parameterValue))
                        {
                            configuration.AlternativeBranches.Add(binding);
                            continue;
                        }
                        break;

                    case QueryParameterBindingType.BooleanConstant:
                        // expanding true/false parameters to constants to help query optimizer with branching
                        if ((bool)parameterValue)
                        {
                            configuration.AlternativeBranches.Add(binding);
                        }
                        continue;

                    case QueryParameterBindingType.LimitOffset:
                        // not parameter, just inlined constant
                        configuration.PlaceholderValues.Add(binding, parameterValue.ToString());
                        continue;

                    case QueryParameterBindingType.NonZeroLimitOffset:
                        // Like "LimitOffset" but we handle zero value specially
                        // We replace value with 1 and activate special branch that evaluates "where" part to "false"
                        var stringValue = parameterValue.ToString();
                        if (stringValue == "0")
                        {
                            configuration.PlaceholderValues.Add(binding, "1");
                            configuration.AlternativeBranches.Add(binding);
                        }
                        else
                        {
                            configuration.PlaceholderValues.Add(binding, stringValue);
                        }
                        continue;

                    case QueryParameterBindingType.RowFilter:
                        var filterData     = (List <Tuple>)parameterValue;
                        var rowTypeMapping = ((QueryRowFilterParameterBinding)binding).RowTypeMapping;
                        if (filterData == null)
                        {
                            configuration.AlternativeBranches.Add(binding);
                            continue;
                        }
                        var commonPrefix = GetParameterName(parameterNamePrefix, ref parameterIndex);
                        var filterValues = new List <string[]>();
                        for (int tupleIndex = 0; tupleIndex < filterData.Count; tupleIndex++)
                        {
                            var tuple = filterData[tupleIndex];
                            var parameterReferences = new string[tuple.Count];
                            for (int fieldIndex = 0; fieldIndex < tuple.Count; fieldIndex++)
                            {
                                var name  = string.Format(RowFilterParameterNameFormat, commonPrefix, tupleIndex, fieldIndex);
                                var value = tuple.GetValueOrDefault(fieldIndex);
                                parameterReferences[fieldIndex] = Driver.BuildParameterReference(name);
                                AddRegularParameter(result, rowTypeMapping[fieldIndex], name, value);
                            }
                            filterValues.Add(parameterReferences);
                        }
                        configuration.DynamicFilterValues.Add(binding, filterValues);
                        continue;

                    default:
                        throw new ArgumentOutOfRangeException("binding.BindingType");
                    }
                    // regular case -> just adding the parameter
                    string parameterName = GetParameterName(parameterNamePrefix, ref parameterIndex);
                    configuration.PlaceholderValues.Add(binding, Driver.BuildParameterReference(parameterName));
                    AddParameter(result, binding, parameterName, parameterValue);
                }
            }
            result.Statement = compilationResult.GetCommandText(configuration);
            return(result);
        }
Beispiel #10
0
 private bool PendCommandPart(Command currentCommand, CommandPart partToAdd) =>
 PendCommandParts(currentCommand, new[] { partToAdd });