Exemple #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);
        }
 private void OnResourcesChanged(EAddRemove addRemove, EResource resource, int amount)
 {
     if (ResourcesChanged != null)
         ResourcesChanged(addRemove, resource, amount);
 }
Exemple #3
0
                public void Perform(
                    HttpListenerContext _Context,
                    EAddRemove _Operation,
                    List <Metadata> _MetadataList,
                    MetadataLocator _MetadataLocator,
                    string _UserID)
                {
                    Action <HttpListenerContext, string, string, BPrimitiveType, string, BPrimitiveType[]> Function;

                    if (_Operation == EAddRemove.Add)
                    {
                        Function = Controller_DeliveryEnsurer.Get().DB_AddElementsToArrayItem_FireAndForget;
                    }
                    else
                    {
                        Function = Controller_DeliveryEnsurer.Get().DB_RemoveElementsFromArrayItem_FireAndForget;
                    }

                    int ParallelOperationsNumber = _MetadataList.Count * AttributeTables.Length;

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

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

                    var WaitFor = new ManualResetEvent(false);

                    foreach (var Data in _MetadataList)
                    {
                        var CombinedValues = ""; var c = 0;
                        Data.MetadataValues.Sort();
                        foreach (var DataValue in Data.MetadataValues)
                        {
                            CombinedValues += DataValue;
                            if (++c < Data.MetadataValues.Count)
                            {
                                CombinedValues += METADATA_V_DELIMITER;
                            }
                        }

                        for (var j = 0; j < AttributeTables.Length; j++)
                        {
                            var Table        = AttributeTables[j];
                            var Key          = AttributeTableKeys[j];
                            var AttributeKey = AttributeKeyGeneration[j](new AttributeKeyGeneration_Input()
                            {
                                MetadataKey            = Data.MetadataKey,
                                MetadataCombinedValues = CombinedValues,
                                UserID = _UserID
                            });
                            BTaskWrapper.Run(() =>
                            {
                                //Only the metadata key as index
                                Function(
                                    _Context,
                                    Table,
                                    Key,
                                    new BPrimitiveType(AttributeKey),
                                    AttributeKeyDBEntryBase.METADATA_LOCATOR_PROPERTY,
                                    new BPrimitiveType[]
                                {
                                    new BPrimitiveType(_MetadataLocator.ToString())
                                });

                                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) { }
                }