/// <summary> /// Removes all WorkQueueUids from the database and delete the corresponding DICOM files from the filesystem. /// </summary> private void ProcessWorkQueueUids() { if (Study == null) { Platform.Log(LogLevel.Info, "Begin StudyProcess Cleanup (Study has not been created): Attempt #{0}. {1} unprocessed files will be removed", WorkQueueItem.FailureCount + 1, WorkQueueUidList.Count); } else { Platform.Log(LogLevel.Info, "Begin StudyProcess Cleanup for study {0}, Patient {1} (PatientId:{2} A#:{3}) on Partition {4}. Attempt #{5}. {6} unprocessed files will be removed", Study.StudyInstanceUid, Study.PatientsName, Study.PatientId, Study.AccessionNumber, ServerPartition.Description, WorkQueueItem.FailureCount + 1, WorkQueueUidList.Count ); } foreach (WorkQueueUid sop in WorkQueueUidList) { string path = GetFileStoredPath(sop); Platform.Log(LogLevel.Info, "Cleaning up {0}", path); using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting {0}", sop.SopInstanceUid))) { // delete the file FileDeleteCommand deleteFile = new FileDeleteCommand(path, true); processor.AddCommand(deleteFile); // delete the WorkQueueUID from the database DeleteWorkQueueUidCommand deleteUid = new DeleteWorkQueueUidCommand(sop); processor.AddCommand(deleteUid); try { // delete the directory (if empty) var fileInfo = new FileInfo(path); MatrixPACS.ImageServer.Core.Command.DeleteDirectoryCommand deleteDir = new MatrixPACS.ImageServer.Core.Command.DeleteDirectoryCommand(fileInfo.Directory.FullName, false, true); processor.AddCommand(deleteDir); } catch (DirectoryNotFoundException) { // ignore } if (!processor.Execute()) { throw new Exception(String.Format("Unable to delete SOP {0}", sop.SopInstanceUid), processor.FailureException); } } // Delete the base directory if it's empty var baseDir = GetBaseDirectory(sop); if (Directory.Exists(baseDir)) { using (ServerCommandProcessor processor = new ServerCommandProcessor(String.Format("Deleting {0}", sop.SopInstanceUid))) { MatrixPACS.ImageServer.Core.Command.DeleteDirectoryCommand deleteDir = new MatrixPACS.ImageServer.Core.Command.DeleteDirectoryCommand(baseDir, false, true); processor.AddCommand(deleteDir); if (!processor.Execute()) { throw new Exception(String.Format("Unable to delete {0}", baseDir), processor.FailureException); } } } } }
private void ProcessSeriesLevelDelete(Model.WorkQueue item) { // ensure the Study is loaded. Study study = StorageLocation.Study; Platform.CheckForNullReference(study, "Study record doesn't exist"); Platform.Log(LogLevel.Info, "Processing Series Level Deletion for Study {0}, A#: {1}", study.StudyInstanceUid, study.AccessionNumber); _seriesToDelete = new List <Series>(); bool completed = false; try { // Load the list of Series to be deleted from the WorkQueueUid LoadUids(item); // Go through the list of series and add commands // to delete each of them. It's all or nothing. using (var processor = new ServerCommandProcessor(String.Format("Deleting Series from study {0}, A#:{1}, Patient: {2}, ID:{3}", study.StudyInstanceUid, study.AccessionNumber, study.PatientsName, study.PatientId))) { StudyXml studyXml = StorageLocation.LoadStudyXml(); IDictionary <string, Series> existingSeries = StorageLocation.Study.Series; // Add commands to delete the folders and update the xml foreach (WorkQueueUid uid in WorkQueueUidList) { // Delete from study XML if (studyXml.Contains(uid.SeriesInstanceUid)) { //Note: DeleteDirectoryCommand doesn't throw exception if the folder doesn't exist var xmlUpdate = new RemoveSeriesFromStudyXml(studyXml, uid.SeriesInstanceUid); processor.AddCommand(xmlUpdate); } // Delete from filesystem string path = StorageLocation.GetSeriesPath(uid.SeriesInstanceUid); if (Directory.Exists(path)) { var delDir = new DeleteDirectoryCommand(path, true); processor.AddCommand(delDir); } } // flush the updated xml to disk processor.AddCommand(new SaveXmlCommand(studyXml, StorageLocation)); // Update the db.. NOTE: these commands are executed at the end. foreach (WorkQueueUid uid in WorkQueueUidList) { // Delete from DB WorkQueueUid queueUid = uid; Series theSeries = existingSeries[queueUid.SeriesInstanceUid]; if (theSeries != null) { _seriesToDelete.Add(theSeries); var delSeries = new DeleteSeriesFromDBCommand(StorageLocation, theSeries); processor.AddCommand(delSeries); delSeries.Executing += DeleteSeriesFromDbExecuting; } else { // Series doesn't exist Platform.Log(LogLevel.Info, "Series {0} is invalid or no longer exists", uid.SeriesInstanceUid); } // The WorkQueueUid must be cleared before the entry can be removed from the queue var deleteUid = new DeleteWorkQueueUidCommand(uid); processor.AddCommand(deleteUid); // Force a re-archival if necessary processor.AddCommand(new InsertArchiveQueueCommand(item.ServerPartitionKey, item.StudyStorageKey)); } if (!processor.Execute()) { throw new ApplicationException( String.Format("Error occurred when series from Study {0}, A#: {1}", study.StudyInstanceUid, study.AccessionNumber), processor.FailureException); } else { foreach (Series series in _seriesToDelete) { OnSeriesDeleted(series); } } } completed = true; } finally { if (completed) { OnCompleted(); PostProcessing(item, WorkQueueProcessorStatus.Complete, WorkQueueProcessorDatabaseUpdate.ResetQueueState); } else { PostProcessing(item, WorkQueueProcessorStatus.Pending, WorkQueueProcessorDatabaseUpdate.None); } } }