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