private void PurgeObjects(IModelPurgingRule purgingRule, CancellationToken token) { try{ Tracing.Tracer.LogVerboseText($"Purging {purgingRule}"); var objectsCount = 0; if (Application != null) { using (var objectSpace = Application.CreateObjectSpace()){ StoreExecutionTime(purgingRule, objectSpace); var criteriaOperator = objectSpace.ParseCriteria(purgingRule.Criteria); var objects = objectSpace.GetObjects(purgingRule.TypeInfo.Type, criteriaOperator); objectSpace.SetTopReturnedObjectsCount(objects, purgingRule.ChunkSize); while (objects.Count > 0) { token.ThrowIfCancellationRequested(); objectsCount += objects.Count; objectSpace.Delete(objects); objectSpace.CommitChanges(); objectSpace.ReloadCollection(objects); } } } Tracing.Tracer.LogVerboseText($"Purged {purgingRule}-{objectsCount}"); } catch (TaskCanceledException) { } catch (Exception e) { Tracing.Tracer.LogError(e); } }
private static void StoreExecutionTime(IModelPurgingRule purgingRule, IObjectSpace objectSpace) { var ruleId = purgingRule.GetParent <IModelClass>().Id() + ((ModelNode)purgingRule).Id; var ruleScheduleStorage = objectSpace.GetObjectsQuery <RuleInfoObject>().FirstOrDefault(storage => storage.RuleScheduleType == RuleScheduleType.Purging && storage.RuleId == ruleId) ?? objectSpace.CreateObject <RuleInfoObject>(); ruleScheduleStorage.RuleScheduleType = RuleScheduleType.Purging; ruleScheduleStorage.RuleId = ((ModelNode)purgingRule).Id; ruleScheduleStorage.Executed = DateTime.Now; objectSpace.CommitChanges(); }