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