internal static void AddResultItem(DicomDataSet DataSet, DicomDataSet request, int group, int element, object v) { // Only send items which have been requested if (request[group, element].Exists) { if (v == null) { v = ""; } DataSet.Add(group, element, v); } }
internal static void AddResultItem(DicomDataSet ResultDataSet, DicomDataSet request, Keyword keyword, object v) { // trace-level logging if (null != keyword.ToString() && keyword.ToString().Length > 2) { Log.Trace("Adding a result item of type: " + keyword.ToString()); } // Only return fields (keywords) which have been requested if (request[keyword].Exists) { if (v == null) { v = ""; } ResultDataSet.Add(keyword, v); } }
private void MWL_Server_QueryReceived(object sender, QueryReceivedArgs e) { #region "Tracing all calls to Server" Log.Trace("MWL_Server_QueryReceived with QueryRoot: " + e.Root.ToString()); #endregion #region "Abort if not an MWL query" if (e.Root != QueryRoot.ModalityWorklist) { e.Errors.Add(Keyword.ErrorComment, "Invalid Query Root : None"); e.Status = StatusCodes.InvalidQueryRoot; return; } #endregion DicomDataSetCollection NullSequence = new DicomDataSetCollection(); DicomDataSet requestFromAssociation; DicomDataSet requestedProcedureStep = null; IEnumerable <ExamsScheduledTable> results = new List <ExamsScheduledTable>(); int status = 0; System.Data.SqlClient.SqlConnection db = null; try { #region "Open PowerPath db" try { db = new System.Data.SqlClient.SqlConnection(powerpathloginconfig.ConnectionString); db.Open(); } catch (SqlException se) { Log.Error("Sql Error opening Database -- " + se.Message); status = StatusCodes.GeneralError; // Error, unable to process! return; } #endregion using (var DBContext = new System.Data.Linq.DataContext(db)) { // Get the Imcoming Query Request requestFromAssociation = e.RequestAssociation.Request; #region "Build SQL query based on SCU request" // the "where 1=1" makes the syntax of adding further conditions simpler, as all are then " AND x=y" //TODO: refactor hard-coded table into Powerpath configuration item string tableWithExamsScheduled = @"vwsu_scheduled_speciman_xrays"; if (this.dicomserverconfig.ExamScheduledTable.Length > 4) { tableWithExamsScheduled = dicomserverconfig.ExamScheduledTable; } string sql = "SELECT * from " + tableWithExamsScheduled + " Where 1=1"; SqlQueryUtils.AddCondition(ref sql, requestFromAssociation[Keyword.PatientID], "PatientID"); SqlQueryUtils.AddNameCondition(ref sql, requestFromAssociation[Keyword.PatientName], "surname", "Forename"); if (requestFromAssociation[Keyword.ScheduledProcedureStepSequence].ExistsWithValue) { DicomDataSetCollection requestedProcedureSteps; //TODO: in what circumstances would there be more than one requested step? requestedProcedureSteps = (DicomDataSetCollection)requestFromAssociation[Keyword.ScheduledProcedureStepSequence].Value; requestedProcedureStep = requestedProcedureSteps[0]; // Required Matching keys SqlQueryUtils.AddCondition(ref sql, requestedProcedureStep[Keyword.ScheduledStationAETitle], "ScheduledAET"); // always blank from PowerPath //SqlQueryUtils.AddCondition(ref sql, rq1[Keyword.PerformingPhysicianName], "PerformingPhysician"); SqlQueryUtils.AddCondition(ref sql, requestedProcedureStep[Keyword.Modality], "Modality"); // AddDateCondition looks for a leading or trailing -hyphen- // if only date is specified, then using standard matching //but if both are specified, then MWL defines a combined match //note: for PowerPath, there is no Scheduled Time that makes any sense if (requestedProcedureStep[Keyword.ScheduledProcedureStepStartDate].ExistsWithValue && requestedProcedureStep[Keyword.ScheduledProcedureStepStartTime].ExistsWithValue) // if both Date and Time are specified { SqlQueryUtils.AddDateTimeCondition(ref sql, requestedProcedureStep[Keyword.ScheduledProcedureStepStartDate], requestedProcedureStep[Keyword.ScheduledProcedureStepStartTime], "ExamDateAndTime"); } else if (requestedProcedureStep[Keyword.ScheduledProcedureStepStartDate].ExistsWithValue) // if Date is specified { SqlQueryUtils.AddDateCondition(ref sql, requestedProcedureStep[Keyword.ScheduledProcedureStepStartDate], "ExamDateAndTime"); } // Optional (but commonly used) matching keys. SqlQueryUtils.AddCondition(ref sql, requestedProcedureStep[Keyword.ScheduledProcedureStepLocation], "ExamRoom"); SqlQueryUtils.AddCondition(ref sql, requestedProcedureStep[Keyword.ScheduledProcedureStepDescription], "ExamDescription"); } sql = sql + " Order by Surname, Forename"; Log.Debug("SQL query statement:" + Environment.NewLine + sql); #endregion #region "Execute Sql Query" try { results = DBContext.ExecuteQuery <ExamsScheduledTable>(sql); } catch (Exception ex) { Log.Error("Error executing SQL: '" + sql + "'. " + ex.Message); status = StatusCodes.GeneralError; return; } #endregion #region "Parse results" DicomDataSet rr1; DicomDataSet rr; DicomDataSetCollection rrs; foreach (ExamsScheduledTable result in results) { rr1 = new DicomDataSet(); rr = new DicomDataSet(); rrs = new DicomDataSetCollection { rr1 }; if (requestedProcedureStep != null) { rr.Add(Keyword.ScheduledProcedureStepSequence, rrs); } // add results to "main" dataset AddResultItem(rr, requestFromAssociation, Keyword.AccessionNumber, result.AccessionNumber); // T2 AddResultItem(rr, requestFromAssociation, Keyword.InstitutionName, result.HospitalName); AddResultItem(rr, requestFromAssociation, Keyword.ReferringPhysicianName, result.ReferringPhysician); // T2 AddResultItem(rr, requestFromAssociation, Keyword.PatientName, result.Surname + "^" + result.Forename + "^^" + result.Title); //T1 AddResultItem(rr, requestFromAssociation, Keyword.PatientID, result.PatientID); // T1 AddResultItem(rr, requestFromAssociation, Keyword.PatientBirthDate, result.DateOfBirth); // T2 AddResultItem(rr, requestFromAssociation, Keyword.PatientSex, result.Sex); //T2 AddResultItem(rr, requestFromAssociation, Keyword.StudyInstanceUID, result.StudyUID); // T1 AddResultItem(rr, requestFromAssociation, Keyword.RequestingPhysician, result.ReferringPhysician); //T2 AddResultItem(rr, requestFromAssociation, Keyword.RequestedProcedureDescription, result.ExamDescription); //T1C AddResultItem(rr, requestFromAssociation, Keyword.RequestedProcedureID, result.ProcedureID); // T1 // Scheduled Procedure Step sequence T1 // add results to procedure step dataset // Return if requested if (requestedProcedureStep != null) { AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledStationAETitle, result.ScheduledAET); // T1 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledProcedureStepStartDate, result.ExamDateAndTime); //T1 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledProcedureStepStartTime, result.ExamDateAndTime); //T1 AddResultItem(rr1, requestedProcedureStep, Keyword.Modality, result.Modality); // T1 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledPerformingPhysicianName, result.PerformingPhysician); //T2 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledProcedureStepDescription, result.ExamDescription); // T1C AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledProcedureStepID, result.ProcedureStepID); // T1 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledStationName, result.ExamRoom); //T2 AddResultItem(rr1, requestedProcedureStep, Keyword.ScheduledProcedureStepLocation, result.ExamRoom); //T2 } // Put blanks in for unsupported fields which are type 2 (i.e. must have a value even if NULL) // In a real server, you may wish to support some or all of these, but they are not commonly supported AddResultItem(rr, requestFromAssociation, Keyword.ReferencedStudySequence, NullSequence); AddResultItem(rr, requestFromAssociation, Keyword.Priority, ""); AddResultItem(rr, requestFromAssociation, Keyword.PatientTransportArrangements, ""); AddResultItem(rr, requestFromAssociation, Keyword.AdmissionID, ""); AddResultItem(rr, requestFromAssociation, Keyword.CurrentPatientLocation, ""); AddResultItem(rr, requestFromAssociation, Keyword.ReferencedPatientSequence, NullSequence); AddResultItem(rr, requestFromAssociation, Keyword.PatientWeight, ""); AddResultItem(rr, requestFromAssociation, Keyword.ConfidentialityConstraintOnPatientDataDescription, ""); Log.Debug("Sending response .."); // Send Reponse Back e.SendResponse(rr, StatusCodes.Pending); Log.Info("PowerPath Database Disconnected Normally"); } #endregion } } catch (Exception ex) { Log.Error("Error processing MWL request -- " + ex.Message); status = StatusCodes.GeneralError; // Error, unable to process! } finally { if (null != db) { try { db.Close(); } catch { /* ignore an SqlException here */ } db.Dispose(); } e.Status = status; } }