Beispiel #1
0
        public async Task <ExecuteDynamicResultModel> ExecuteDatabase(
            DatabaseExecutionChains databaseExecutionChains,
            IEnumerable <ExecuteParamModel> parameters,
            IEnumerable <LoopDataParamModel> LoopDatas = null)
        {
            var allRequiredDb = await _databaseRepository.GetAllByIdsAsync(databaseExecutionChains?.Steps.Select(a => a.DatabaseConnectionId));

            return(await _databaseService
                   .ExecuteDynamic(
                       allRequiredDb?.ToList(),
                       databaseExecutionChains,
                       parameters,
                       LoopDatas));
        }
        public async Task <ExecuteDynamicResultModel> ExecuteDynamic(
            List <DatabaseConnection> databaseConnections,
            DatabaseExecutionChains executionChains,
            IEnumerable <ExecuteParamModel> parameters,
            IEnumerable <LoopDataParamModel> LoopDatas)
        {
            var context = new ExecutionDynamicContext
            {
                Data = JObject.Parse("{}")
            };

            var result = new ExecuteDynamicResultModel {
                IsSuccess = true
            };
            var parametersList = parameters.ToList();

            for (var i = 1; i <= executionChains?.Steps.Count; i++)
            {
                var step = executionChains.Steps[i - 1];
                var executingDatabaseConnection = databaseConnections.First(a => a.Id == step.DatabaseConnectionId);
                var connectionType =
                    executingDatabaseConnection.GetConnectionType();
                var executionDatabase = _executionDatabases.First(a => a.ConnectionType == connectionType);
                if (executionDatabase != null)
                {
                    step.ExecuteCommand = ReplaceValueWithContext(step.ExecuteCommand, context, ref parametersList, connectionType != Core.Persistences.ConnectionType.MongoDB);
                    StepExecutionResult stepResult;
                    // Single step
                    if (string.IsNullOrEmpty(step.DataLoopKey))
                    {
                        stepResult = await executionDatabase
                                     .ExecuteStep(
                            executingDatabaseConnection, step.ExecuteCommand, parametersList, context);
                    }
                    else
                    {
                        if (LoopDatas != null)
                        {
                            var loopData             = LoopDatas.First(a => a.Name == step.DataLoopKey);
                            var stepExecutionResults = new List <StepExecutionResult>();
                            foreach (var subParameters in loopData.Parameters)
                            {
                                var subStepResult = await executionDatabase
                                                    .ExecuteStep(
                                    executingDatabaseConnection, step.ExecuteCommand, subParameters, context);

                                stepExecutionResults.Add(subStepResult);
                            }

                            stepResult = new StepExecutionResult
                            {
                                IsSuccess     = true,
                                Result        = stepExecutionResults.Select(a => a.Result).ToArray(),
                                ExecutionType = StepExecutionType.Multiple
                            };
                        }
                        else
                        {
                            throw new DatabaseException(DatabaseErrorCodes.LoopDataIsNotNull);
                        }
                    }

                    if (stepResult.IsSuccess)
                    {
                        switch (stepResult.ExecutionType)
                        {
                        case StepExecutionType.Query:
                            WriteDataToContext($"step{i.ToString()}", ConvertUtil.SerializeObject(stepResult.Result, true), context);
                            break;

                        case StepExecutionType.Insert:
                            // Due to JSON .NET Serialize problem for dynamic properties isn't working with Camel cast
                            // We need to exchange a anonymous class (or object) before serializing
                            WriteDataToContext(
                                $"step{i.ToString()}",
                                connectionType == Core.Persistences.ConnectionType.MongoDB
                                        ? ConvertUtil.SerializeObject(new { stepResult.Result.Id }, true)
                                            : ConvertUtil.SerializeObject(stepResult.Result, true), context);
                            break;

                        case StepExecutionType.Update:
                            if (connectionType != Core.Persistences.ConnectionType.MongoDB && stepResult.Result != null)
                            {
                                WriteDataToContext(
                                    $"step{i.ToString()}",
                                    ConvertUtil.SerializeObject(stepResult.Result, true), context);
                            }
                            break;

                        case StepExecutionType.Delete:
                            if (connectionType != Core.Persistences.ConnectionType.MongoDB && stepResult.Result != null)
                            {
                                WriteDataToContext(
                                    $"step{i.ToString()}",
                                    ConvertUtil.SerializeObject(stepResult.Result, true), context);
                            }
                            break;

                        case StepExecutionType.Multiple:
                            if (stepResult.Result != null)
                            {
                                WriteDataToContext(
                                    $"step{i.ToString()}",
                                    ConvertUtil.SerializeObject(stepResult.Result, true), context);
                            }
                            break;
                        }
                    }
                    else
                    {
                        return(ExecuteDynamicResultModel.IsFailed(stepResult.Error));
                    }
                }
                else
                {
                    throw new DatabaseException(DatabaseErrorCodes.NotSupportedConnectionType);
                }
            }
            result.Result = context.Data.ToObject <dynamic>();
            return(result);
        }