Ejemplo n.º 1
0
        static public Study Insert(IUpdateContext update, Study entity)
        {
            var broker        = update.GetBroker <IStudyEntityBroker>();
            var updateColumns = new StudyUpdateColumns();

            updateColumns.StudyInstanceUid              = entity.StudyInstanceUid;
            updateColumns.ServerPartitionKey            = entity.ServerPartitionKey;
            updateColumns.PatientKey                    = entity.PatientKey;
            updateColumns.NumberOfStudyRelatedSeries    = entity.NumberOfStudyRelatedSeries;
            updateColumns.NumberOfStudyRelatedInstances = entity.NumberOfStudyRelatedInstances;
            updateColumns.StudySizeInKB                 = entity.StudySizeInKB;
            updateColumns.ResponsiblePerson             = entity.ResponsiblePerson;
            updateColumns.ResponsibleOrganization       = entity.ResponsibleOrganization;
            updateColumns.QueryXml             = entity.QueryXml;
            updateColumns.SpecificCharacterSet = entity.SpecificCharacterSet;
            updateColumns.StudyStorageKey      = entity.StudyStorageKey;
            updateColumns.PatientsName         = entity.PatientsName;
            updateColumns.PatientId            = entity.PatientId;
            updateColumns.IssuerOfPatientId    = entity.IssuerOfPatientId;
            updateColumns.PatientsBirthDate    = entity.PatientsBirthDate;
            updateColumns.PatientsAge          = entity.PatientsAge;
            updateColumns.PatientsSex          = entity.PatientsSex;
            updateColumns.StudyDate            = entity.StudyDate;
            updateColumns.StudyTime            = entity.StudyTime;
            updateColumns.AccessionNumber      = entity.AccessionNumber;
            updateColumns.StudyId                 = entity.StudyId;
            updateColumns.StudyDescription        = entity.StudyDescription;
            updateColumns.ReferringPhysiciansName = entity.ReferringPhysiciansName;
            Study newEntity = broker.Insert(updateColumns);

            return(newEntity);
        }
 private void SetStudyEncoding(Study study, StudyUpdateColumns update)
 {
     // set the SpecificCharacterSet of the patient and study record. This will update the database
     // and force Patient/Study/Series level query response to be encoded in UTF8. Image level responses
     // will be encoded using the character set in the image (see QueryScpExtension)
     //
     // Only update the db if necessary
     if (IsUTF8(study.SpecificCharacterSet))
     {
         update.SpecificCharacterSet = UTF8;
     }
 }
Ejemplo n.º 3
0
        protected override void OnExecute(ServerCommandProcessor theProcessor, IUpdateContext updateContext)
        {
            Study study = _location.Study ?? Study.Find(updateContext, _location.Key);

            if (study.StudySizeInKB != _studySizeInKB)
            {
                IStudyEntityBroker broker     = updateContext.GetBroker <IStudyEntityBroker>();
                StudyUpdateColumns parameters = new StudyUpdateColumns()
                {
                    StudySizeInKB = _studySizeInKB
                };
                if (!broker.Update(study.Key, parameters))
                {
                    throw new ApplicationException("Unable to update study size in the database");
                }
            }
        }
Ejemplo n.º 4
0
        protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext)
        {
            if (_rebuildCommand != null)
            {
                _studySizeInKB = _rebuildCommand.StudyXml.GetStudySize() / KB;
            }

            Study study = _location.Study ?? Study.Find(updateContext, _location.Key);

            if (study != null && study.StudySizeInKB != _studySizeInKB)
            {
                var broker     = updateContext.GetBroker <IStudyEntityBroker>();
                var parameters = new StudyUpdateColumns
                {
                    StudySizeInKB = _studySizeInKB
                };
                if (!broker.Update(study.Key, parameters))
                {
                    throw new ApplicationException("Unable to update study size in the database");
                }
            }
        }
Ejemplo n.º 5
0
        public bool DeleteOrderItem(ServerEntityKey partitionKey, ServerEntityKey orderKey)
        {
            using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush))
            {
                // Disconnect studies from order
                var studyBroker = updateContext.GetBroker <IStudyEntityBroker>();

                var criteria = new StudySelectCriteria();
                criteria.OrderKey.EqualTo(orderKey);
                criteria.ServerPartitionKey.EqualTo(partitionKey);

                var updateColumns = new StudyUpdateColumns
                {
                    OrderKey = null
                };
                studyBroker.Update(criteria, updateColumns);

                bool retValue = _adaptor.Delete(updateContext, orderKey);

                updateContext.Commit();

                return(retValue);
            }
        }
        private void UpdateDatabase()
        {
            var patientUpdate = new PatientUpdateColumns();
            var seriesUpdate  = new SeriesUpdateColumns();
            var studyUpdate   = new StudyUpdateColumns();

            // Update Patient level info. Different cases can occur here:
            //      A) Patient demographic info is not changed ==> update the current patient
            //      B) New patient demographics matches (another) existing patient in the datbase
            //              ==> Transfer the study to that patient. This means the study count on both patients must be updated.
            //                  The current patient should also be deleted if there's no more study attached to it after the transfer.
            //      C) New patient demographics doesn't match any patient in the database
            //              ==> A new patient should be created for this study. The study count on the current patient should be updated
            //                  and the patient should also be deleted if this is the only study attached to it.
            if (_patientInfoIsNotChanged)
            {
                _newPatient = _curPatient;
            }
            else if (_newPatient == null)
            {
                // No matching patient in the database. We should create a new patient for this study
                _newPatient = CreateNewPatient(_newPatientInfo);
            }
            else
            {
                // There's already patient in the database with the new patient demographics
                // The study should be attached to that patient.
                TransferStudy(_study.Key, _oldPatientInfo, _newPatient);
            }

            // Copy the existing valus over into the study & series objects
            // Note, this sets up an update statement that will update the key columns for
            // Study Instance UID, Series Instance UID, however, note that the columns will not
            // actually change value.  Its alittle ugly, but it will make it so if we add new
            // columns in the future, it just "works".
            _file.DataSet.LoadDicomFields(patientUpdate);
            _file.DataSet.LoadDicomFields(studyUpdate);
            _file.DataSet.LoadDicomFields(seriesUpdate);

            // Get any extensions that exist and process them
            var ep         = new ProcessorInsertExtensionPoint();
            var extensions = ep.CreateExtensions();

            foreach (IInsertExtension e in extensions)
            {
                e.UpdateExtension(patientUpdate, studyUpdate, seriesUpdate, _file);
            }

            UpdatePatientEncoding(_newPatient, patientUpdate);
            SetStudyEncoding(_study, studyUpdate);

            // Update the Study table
            var patientUpdateBroker = UpdateContext.GetBroker <IPatientEntityBroker>();

            patientUpdateBroker.Update(_newPatient.Key, patientUpdate);

            // Update the Study table
            var studyUpdateBroker = UpdateContext.GetBroker <IStudyEntityBroker>();

            studyUpdateBroker.Update(_study.Key, studyUpdate);

            // Update the Series table
            var seriesUpdateBroker = UpdateContext.GetBroker <ISeriesEntityBroker>();

            seriesUpdateBroker.Update(_curSeries.Key, seriesUpdate);

            // If the Request Attributes Sequence is in the dataset, do an insert.
            // Small hole in this that if the value of this sequence has changed, both the old and
            // the new values will stay in the database, not much to do about it, except
            // reprocess the whole series, which doesn't seem worth it.
            if (_file.DataSet.Contains(DicomTags.RequestAttributesSequence))
            {
                var attribute = _file.DataSet[DicomTags.RequestAttributesSequence] as DicomAttributeSQ;
                if (attribute != null && !attribute.IsEmpty)
                {
                    foreach (DicomSequenceItem sequenceItem in (DicomSequenceItem[])attribute.Values)
                    {
                        var requestParms = new RequestAttributesInsertParameters();
                        sequenceItem.LoadDicomFields(requestParms);
                        requestParms.SeriesKey = _curSeries.Key;

                        var insertRequest = UpdateContext.GetBroker <IInsertRequestAttributes>();
                        insertRequest.Execute(requestParms);
                    }
                }
            }
        }
        private void EnsureConsistentObjectCount(StudyXml studyXml, IDictionary <string, List <string> > processedSeriesMap)
        {
            Platform.CheckForNullReference(studyXml, "studyXml");

            // We have to ensure that the counts in studyXml and what we have processed are consistent.
            // Files or folder may be reprocessed but then become missing when then entry is resumed.
            // We have to removed them from the studyXml before committing the it.

            Platform.Log(LogLevel.Info, "Verifying study xml against the filesystems");
            int filesProcessed = 0;

            foreach (string seriesUid in processedSeriesMap.Keys)
            {
                filesProcessed += processedSeriesMap[seriesUid].Count;
            }

            // Used to keep track of the series to be removed.
            // We can't remove the item from the study xml while we are
            // interating through it
            var seriesToRemove = new List <string>();

            foreach (SeriesXml seriesXml in studyXml)
            {
                if (!processedSeriesMap.ContainsKey(seriesXml.SeriesInstanceUid))
                {
                    seriesToRemove.Add(seriesXml.SeriesInstanceUid);
                }
                else
                {
                    //check all instance in the series
                    List <string> foundInstances   = processedSeriesMap[seriesXml.SeriesInstanceUid];
                    var           instanceToRemove = new List <string>();
                    foreach (InstanceXml instanceXml in seriesXml)
                    {
                        if (!foundInstances.Contains(instanceXml.SopInstanceUid))
                        {
                            // the sop no long exists in the filesystem
                            instanceToRemove.Add(instanceXml.SopInstanceUid);
                        }
                    }

                    foreach (string instanceUid in instanceToRemove)
                    {
                        seriesXml[instanceUid] = null;
                        Platform.Log(LogLevel.Info, "Removed SOP {0} in the study xml: it no longer exists.", instanceUid);
                    }
                }
            }

            foreach (string seriesUid in seriesToRemove)
            {
                studyXml[seriesUid] = null;
                Platform.Log(LogLevel.Info, "Removed Series {0} in the study xml: it no longer exists.", seriesUid);
            }

            Platform.CheckTrue(studyXml.NumberOfStudyRelatedSeries == processedSeriesMap.Count,
                               String.Format("Number of series in the xml do not match number of series reprocessed: {0} vs {1}",
                                             studyXml.NumberOfStudyRelatedInstances, processedSeriesMap.Count));

            Platform.CheckTrue(studyXml.NumberOfStudyRelatedInstances == filesProcessed,
                               String.Format("Number of instances in the xml do not match number of reprocessed: {0} vs {1}",
                                             studyXml.NumberOfStudyRelatedInstances, filesProcessed));

            Platform.Log(LogLevel.Info, "Study xml has been verified.");

            if (StorageLocation.Study != null)
            {
                // update the instance count in the db
                using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush))
                {
                    var broker  = updateContext.GetBroker <IStudyEntityBroker>();
                    var columns = new StudyUpdateColumns
                    {
                        NumberOfStudyRelatedInstances = studyXml.NumberOfStudyRelatedInstances,
                        NumberOfStudyRelatedSeries    = studyXml.NumberOfStudyRelatedSeries
                    };
                    broker.Update(StorageLocation.Study.GetKey(), columns);
                    updateContext.Commit();
                }
            }
            else
            {
                // alert orphaned StudyStorage entry
                RaiseAlert(WorkQueueItem, AlertLevel.Critical,
                           String.Format("Study {0} has been reprocessed but Study record was NOT created. Images reprocessed: {1}. Path={2}",
                                         StorageLocation.StudyInstanceUid, filesProcessed,
                                         StorageLocation.GetStudyPath()));
            }
        }
Ejemplo n.º 8
0
 public bool UpdateStudy(Study study, StudyUpdateColumns columns)
 {
     return(_adaptor.Update(study.Key, columns));
 }