Exemplo n.º 1
0
        protected virtual IActiveOperation <TInternal> PrepareNonQueryOperationWithParameter <TContext, TMySqlOperation, TOperation, TResult, TInternal>(TMySqlOperation operation, IReadOnlyCollection <IColumnValuePair <byte[]> > dataEntryList, Func <TOperation, IAsyncResult, TInternal> createResultHandler, Func <MySqlCommand, TInternal, string> finalizer)
            where TContext : IModifyContext, IDataContext
            where TMySqlOperation : IMySqlModifyOperation <TContext, TInternal>, TOperation
            where TOperation : IModifyOperation, IOperation <TContext, TResult>
            where TResult : IModifyResult, IDataResult
            where TInternal : IModifyResultInternal, IDataResultInternal, TResult
        {
            TInternal OperationResult;
            MySqlActiveOperation <TInternal> ActiveOperation;

            try
            {
                string CommandText = operation.GetCommandText();

                MySqlCommand Command = new MySqlCommand(CommandText, Connection);

                int i = 0;
                foreach (IColumnValuePair <byte[]> DataEntry in dataEntryList)
                {
                    MySqlParameter DataParameter = Command.CreateParameter();
                    DataParameter.ParameterName = $"data{i}";
                    DataParameter.Value         = DataEntry.Value;
                    Command.Parameters.Add(DataParameter);

                    i++;
                }

                TraceCommand(Command);
                IAsyncResult Result = Command.BeginExecuteNonQuery();

                OperationResult = createResultHandler(operation, Result);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult, finalizer);
                ActiveOperationTable.Add(ActiveOperation, Command);
            }
#if TRACE
            catch (ApplicationException)
            {
                throw;
            }
#endif
            catch (MySqlException e)
            {
                TraceMySqlException(e);
                OperationResult = createResultHandler(operation, null);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult);
            }
            catch (Exception e)
            {
                TraceException(e);
                OperationResult = createResultHandler(operation, null);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult);
            }

            return(ActiveOperation);
        }
Exemplo n.º 2
0
        private void ExecuteOperation()
        {
            WaitHandle[] ThreadHandles = new WaitHandle[] { NewOperationEvent, ShutdownEvent };
            bool         Exit          = false;

            while (!Exit)
            {
                int ThreadWaitResult = WaitHandle.WaitAny(ThreadHandles, Timeout.InfiniteTimeSpan);

                if (ThreadWaitResult == 0)
                {
                    IActiveOperation[] ActiveOperations = new IActiveOperation[ActiveOperationTable.Count];
                    WaitHandle[]       OperationHandles = new WaitHandle[ActiveOperationTable.Count + 1];

                    OperationHandles[0] = ShutdownEvent;

                    int n = 0;
                    foreach (IActiveOperation ActiveOperation in ActiveOperationTable)
                    {
                        ActiveOperations[n]     = ActiveOperation;
                        OperationHandles[n + 1] = ActiveOperation.ResultBase.AsyncResult.AsyncWaitHandle;
                        n++;
                    }

                    int OperationWaitResult = WaitHandle.WaitAny(OperationHandles, TimeSpan.FromSeconds(1.0));

                    if (OperationWaitResult == WaitHandle.WaitTimeout)
                    {
                        NewOperationEvent.Set();
                    }

                    else if (OperationWaitResult > 0 && OperationWaitResult <= OperationHandles.Length)
                    {
                        IActiveOperation ActiveOperation = ActiveOperations[OperationWaitResult - 1];
                        ActiveOperationTable.Remove(ActiveOperation);

                        Connector.NotifyOperationCompleted(ActiveOperation, out Exception CompletionException);
                        if (LastCompletionException == null && CompletionException != null)
                        {
                            LastCompletionException = CompletionException;
                        }
                    }
                    else
                    {
                        Exit = true;
                    }
                }

                else
                {
                    Exit = true;
                }
            }
        }
Exemplo n.º 3
0
        protected virtual IActiveOperation <TInternal> PrepareNonQueryOperation <TContext, TMySqlOperation, TOperation, TResult, TInternal>(TMySqlOperation operation, Func <TOperation, IAsyncResult, TInternal> createResultHandler, Func <MySqlCommand, TInternal, string> finalizer)
            where TContext : IModifyContext
            where TMySqlOperation : IMySqlModifyOperation <TContext, TInternal>, TOperation
            where TOperation : IModifyOperation, IOperation <TContext, TResult>
            where TResult : IModifyResult
            where TInternal : IModifyResultInternal, TResult
        {
            TInternal OperationResult;
            MySqlActiveOperation <TInternal> ActiveOperation;

            try
            {
                string CommandText = operation.GetCommandText();

                MySqlCommand Command = new MySqlCommand(CommandText, Connection);

                TraceCommand(Command);
                IAsyncResult Result = Command.BeginExecuteNonQuery();

                OperationResult = createResultHandler(operation, Result);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult, finalizer);
                ActiveOperationTable.Add(ActiveOperation, Command);
            }
#if TRACE
            catch (ApplicationException)
            {
                throw;
            }
#endif
            catch (MySqlException e)
            {
                TraceMySqlException(e);
                OperationResult = createResultHandler(operation, null);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult);
            }
            catch (Exception e)
            {
                TraceException(e);
                OperationResult = createResultHandler(operation, null);
                ActiveOperation = new MySqlActiveOperation <TInternal>(OperationResult);
            }

            return(ActiveOperation);
        }
Exemplo n.º 4
0
        private void FinalizeOrQueue(IActiveOperation activeOperation)
        {
            IResultInternal Result = activeOperation.ResultBase;

            if (Result.IsStarted)
            {
                Result.CheckIfCompletedSynchronously(out bool IsCompletedSynchronously);

                if (IsCompletedSynchronously)
                {
                    Connector.NotifyOperationCompleted(activeOperation, out Exception CompletionException);
                    if (CompletionException != null)
                    {
                        throw CompletionException;
                    }
                }
                else
                {
                    ActiveOperationTable.Add(activeOperation);
                    NewOperationEvent.Set();
                    Result.WaitCompleted();
                }
            }
        }
Exemplo n.º 5
0
        private void NotifyOperationCompleted(IMySqlActiveOperation activeOperation, out Exception completionException)
        {
            completionException = null;

            try
            {
                using (MySqlCommand Command = ActiveOperationTable[activeOperation])
                {
                    ActiveOperationTable.Remove(activeOperation);
                    IResultInternal Result     = activeOperation.ResultBase;
                    string          Diagnostic = activeOperation.MySqlFinalizerBase(Command, Result);

                    if (Result.IsCompletedSynchronously)
                    {
                        Diagnostic += " [SYNCHRONOUS]";
                    }

                    TraceCommandEnd(Command, Diagnostic);
                }
            }
#if TRACE
            catch (ApplicationException)
            {
                throw;
            }
#endif
            catch (MySqlException e)
            {
                TraceMySqlException(e);
            }
            catch (Exception e)
            {
                completionException = e;
                TraceException(e);
            }
        }