/// <summary>
        /// Reset any archival request that may have been left In Progress when the service last shut down.
        /// </summary>
        public void ResetFailedArchiveQueueItems()
        {
            using (IUpdateContext updateContext = PersistentStore.OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                IArchiveQueueEntityBroker broker = updateContext.GetBroker <IArchiveQueueEntityBroker>();

                ArchiveQueueSelectCriteria criteria = new ArchiveQueueSelectCriteria();
                criteria.ProcessorId.EqualTo(ServerPlatform.ProcessorId);
                criteria.ArchiveQueueStatusEnum.EqualTo(ArchiveQueueStatusEnum.InProgress);

                IList <ArchiveQueue> failedList = broker.Find(criteria);
                foreach (ArchiveQueue failedItem in failedList)
                {
                    UpdateArchiveQueue(updateContext, failedItem, ArchiveQueueStatusEnum.Pending, Platform.Time.AddMinutes(2));

                    Platform.Log(LogLevel.Warn,
                                 "Reseting ArchiveQueue entry {0} to Pending that was In Progress at startup for PartitionArchive {1}",
                                 failedItem.Key, _partitionArchive.Description);
                }

                if (failedList.Count > 0)
                {
                    updateContext.Commit();
                }
                else
                {
                    Platform.Log(LogLevel.Info, "No ArchiveQueue entries to reset on startup for archive {0}", _partitionArchive.Description);
                }
            }
        }
        public bool ResetArchiveQueueItem(IList <ArchiveQueue> items, DateTime time)
        {
            if (items == null || items.Count == 0)
            {
                return(false);
            }

            ArchiveQueueUpdateColumns columns = new ArchiveQueueUpdateColumns();

            columns.ArchiveQueueStatusEnum = ArchiveQueueStatusEnum.Pending;
            columns.ProcessorId            = "";
            columns.ScheduledTime          = time;

            bool             result = true;
            IPersistentStore store  = PersistentStoreRegistry.GetDefaultStore();

            using (IUpdateContext ctx = store.OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                IArchiveQueueEntityBroker archiveQueueBroker = ctx.GetBroker <IArchiveQueueEntityBroker>();

                foreach (ArchiveQueue item in items)
                {
                    // Only do an update if its a failed status currently
                    ArchiveQueueSelectCriteria criteria = new ArchiveQueueSelectCriteria();
                    criteria.ArchiveQueueStatusEnum.EqualTo(ArchiveQueueStatusEnum.Failed);
                    criteria.StudyStorageKey.EqualTo(item.StudyStorageKey);

                    if (!archiveQueueBroker.Update(criteria, columns))
                    {
                        result = false;
                        break;
                    }
                }

                if (result)
                {
                    ctx.Commit();
                }
            }

            return(result);
        }
        public void RunApplication(string[] args)
        {
            using (IUpdateContext updateContext = PersistentStore.OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                IPartitionArchiveEntityBroker  partitionBroker   = updateContext.GetBroker <IPartitionArchiveEntityBroker>();
                PartitionArchiveSelectCriteria partitionCriteria = new PartitionArchiveSelectCriteria();

                partitionCriteria.Enabled.EqualTo(true);
                partitionCriteria.ReadOnly.EqualTo(false);
                PartitionArchive activePartition = partitionBroker.FindOne(partitionCriteria);
                if (activePartition == null)
                {
                    Platform.Log(LogLevel.Error, "No active ArchivePartition were found.");
                    return;
                }

                partitionCriteria.ReadOnly.EqualTo(true);
                IList <ServerEntityKey> partitionKeys = new List <ServerEntityKey>();
                foreach (PartitionArchive partition in partitionBroker.Find(partitionCriteria))
                {
                    partitionKeys.Add(partition.Key);
                }

                IArchiveQueueEntityBroker  queueBroker   = updateContext.GetBroker <IArchiveQueueEntityBroker>();
                ArchiveQueueSelectCriteria queueCriteria = new ArchiveQueueSelectCriteria();
                queueCriteria.ArchiveQueueStatusEnum.In(new ArchiveQueueStatusEnum[] { ArchiveQueueStatusEnum.Failed, ArchiveQueueStatusEnum.Pending });
                queueCriteria.PartitionArchiveKey.In(partitionKeys);

                ArchiveQueueUpdateColumns queueColumns = new ArchiveQueueUpdateColumns()
                {
                    PartitionArchiveKey    = activePartition.Key,
                    ArchiveQueueStatusEnum = ArchiveQueueStatusEnum.Pending,
                    ProcessorId            = "",
                    ScheduledTime          = Platform.Time
                };

                if (queueBroker.Update(queueCriteria, queueColumns))
                {
                    updateContext.Commit();
                }
            }
        }