Ejemplo n.º 1
0
        public bool AddRemoveMetadataSets_AttributesTables(
            WebServiceBaseTimeoutableDeliveryEnsurerUserProcessor _Request,
            string _UserID,
            MetadataLocator _MetadataLocator,
            List <Metadata> _MetadataList_Ref,
            EAddRemove _Operation,
            EKillProcedureIfGetClearanceFails _KillProcedureIfGetClearanceFails,
            out BWebServiceResponse _FailureResponse,
            Action <string> _ErrorMessageAction = null)
        {
            _FailureResponse = BWebResponse.InternalError("");
            if (_MetadataList_Ref == null || _MetadataList_Ref.Count == 0)
            {
                return(true);
            }

            //Full copy
            var MetadataList_Local = new List <Metadata>();

            for (int i = 0; i < _MetadataList_Ref.Count; i++)
            {
                var Current = _MetadataList_Ref[i];
                MetadataList_Local.Add(new Metadata()
                {
                    MetadataKey    = Current.MetadataKey,
                    MetadataValues = new List <string>(Current.MetadataValues)
                });
            }

            var OperationInstance = new AddRemoveMetadataSets_AttributesTables_Operation();

            if (!OperationInstance.ClearanceInstance.GetClearanceForAll(_Request, MetadataList_Local, _ErrorMessageAction))
            {
                if (_KillProcedureIfGetClearanceFails == EKillProcedureIfGetClearanceFails.Yes)
                {
                    OperationInstance.ClearanceInstance.SetClearanceForObtained(_ErrorMessageAction);
                    _FailureResponse = BWebResponse.InternalError("Atomic operation control has failed.");
                    return(false);
                }
            }
            //From now on, there should not be a case that it returns false.

            OperationInstance.ProcedureInstance.Perform(_Request.CachedContext, _Operation, MetadataList_Local, _MetadataLocator, _UserID);

            OperationInstance.ClearanceInstance.SetClearanceForObtained(_ErrorMessageAction);

            return(true);
        }
Ejemplo n.º 2
0
                public bool GetClearanceForAll(
                    WebServiceBaseTimeoutableDeliveryEnsurerUserProcessor _RequestOwnerProcessor,
                    List <Metadata> _MetadataList,
                    Action <string> _ErrorMessageAction = null)
                {
                    RequestOwnerProcessor = _RequestOwnerProcessor;

                    int ParallelOperationsNumber = _MetadataList.Count * AttributeTables.Length;

                    var ParallelOperationsStack = new Stack <bool>(ParallelOperationsNumber);

                    for (var i = 0; i < ParallelOperationsNumber; i++)
                    {
                        ParallelOperationsStack.Push(true);
                    }

                    int FailedClearanceOps = 0;

                    var WaitFor = new ManualResetEvent(false);

                    for (var i = 0; i < _MetadataList.Count; i++)
                    {
                        var Data = _MetadataList[i];
                        for (var j = 0; j < AttributeTables.Length; j++)
                        {
                            var Table = AttributeTables[j];
                            BTaskWrapper.Run(() =>
                            {
                                if (!RequestOwnerProcessor.OwnerProcessor.TryGetTarget(out WebServiceBaseTimeoutableProcessor Processor) ||
                                    !Controller_AtomicDBOperation.Get().GetClearanceForDBOperation(
                                        Processor,
                                        Table,
                                        Data.MetadataKey,
                                        _ErrorMessageAction))
                                {
                                    Interlocked.Increment(ref FailedClearanceOps);
                                    return;
                                }
                                lock (ClearanceObtainedFor)
                                {
                                    ClearanceObtainedFor.Add(Data.MetadataKey);
                                }
                                lock (ParallelOperationsStack)
                                {
                                    ParallelOperationsStack.TryPop(out bool _);
                                    if (ParallelOperationsStack.Count == 0)
                                    {
                                        try
                                        {
                                            WaitFor.Set();
                                        }
                                        catch (Exception) { }
                                    }
                                }
                            });
                        }
                    }

                    try
                    {
                        if (ParallelOperationsNumber > 0)
                        {
                            WaitFor.WaitOne();
                        }
                        WaitFor.Close();
                    }
                    catch (Exception) { }

                    return(FailedClearanceOps == 0);
                }