1 | HLOF778A ;ALB/CJM-HL7 - Saving messages to file 778 (continued) ;07/10/2007
|
---|
2 | ;;1.6;HEALTH LEVEL SEVEN;**126,134,137**;Oct 13, 1995;Build 21
|
---|
3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ;
|
---|
6 | NEW(HLMSTATE) ;
|
---|
7 | ;This function creates a new entry in file 778.
|
---|
8 | ;Input:
|
---|
9 | ; HLMSTATE (required, pass by reference) These subscripts are expected:
|
---|
10 | ;
|
---|
11 | ;Output - the function returns the ien of the newly created record
|
---|
12 | ;
|
---|
13 | N IEN,NODE,ID,STAT
|
---|
14 | S STAT="HLMSTATE(""STATUS"")"
|
---|
15 | S IEN=$$NEWIEN(HLMSTATE("DIRECTION"),$$TCP)
|
---|
16 | Q:'IEN 0
|
---|
17 | S HLMSTATE("IEN")=IEN
|
---|
18 | ;
|
---|
19 | D ;build the message header
|
---|
20 | .N HDR
|
---|
21 | .;for incoming messages the header segment should already exist
|
---|
22 | .;for outgoing messages must build the header segment
|
---|
23 | .I HLMSTATE("DIRECTION")="OUT" D Q
|
---|
24 | ..I HLMSTATE("BATCH"),$G(HLMSTATE("ACK TO"))]"" S HLMSTATE("HDR","REFERENCE BATCH CONTROL ID")=HLMSTATE("ACK TO")
|
---|
25 | ..D BUILDHDR^HLOPBLD1(.HLMSTATE,$S(HLMSTATE("BATCH"):"BHS",1:"MSH"),.HDR)
|
---|
26 | ..S HLMSTATE("HDR",1)=HDR(1),HLMSTATE("HDR",2)=HDR(2)
|
---|
27 | ;
|
---|
28 | K ^HLB(IEN)
|
---|
29 | S ID=$S(HLMSTATE("BATCH"):HLMSTATE("HDR","BATCH CONTROL ID"),1:HLMSTATE("HDR","MESSAGE CONTROL ID"))
|
---|
30 | S NODE=ID_"^"_HLMSTATE("BODY")_"^"_$G(HLMSTATE("ACK TO"))_"^"_$S(HLMSTATE("DIRECTION")="IN":"I",1:"O")_"^"
|
---|
31 | S $P(NODE,"^",5)=$G(@STAT@("LINK NAME"))
|
---|
32 | S $P(NODE,"^",6)=$G(@STAT@("QUEUE"))
|
---|
33 | S $P(NODE,"^",8)=$G(@STAT@("PORT"))
|
---|
34 | S $P(NODE,"^",20)=$G(@STAT)
|
---|
35 | S $P(NODE,"^",21)=$G(@STAT@("ERROR TEXT"))
|
---|
36 | S $P(NODE,"^",16)=HLMSTATE("DT/TM")
|
---|
37 | ;
|
---|
38 | I HLMSTATE("DIRECTION")="OUT" D
|
---|
39 | .S $P(NODE,"^",10)=$P($G(@STAT@("APP ACK RESPONSE")),"^")
|
---|
40 | .S $P(NODE,"^",11)=$P($G(@STAT@("APP ACK RESPONSE")),"^",2)
|
---|
41 | .S $P(NODE,"^",12)=$P($G(@STAT@("ACCEPT ACK RESPONSE")),"^")
|
---|
42 | .S $P(NODE,"^",13)=$P($G(@STAT@("ACCEPT ACK RESPONSE")),"^",2)
|
---|
43 | .S $P(NODE,"^",14)=$P($G(@STAT@("FAILURE RESPONSE")),"^")
|
---|
44 | .S $P(NODE,"^",15)=$P($G(@STAT@("FAILURE RESPONSE")),"^",2)
|
---|
45 | .;
|
---|
46 | .;for outgoing set these x-refs now, for incoming msgs set them later
|
---|
47 | .S ^HLB("B",ID,IEN)=""
|
---|
48 | .S ^HLB("C",HLMSTATE("BODY"),IEN)=""
|
---|
49 | .I ($G(@STAT)="ER") D
|
---|
50 | ..S ^HLB("ERRORS",$S($L($G(HLMSTATE("HDR","RECEIVING APPLICATION"))):HLMSTATE("HDR","RECEIVING APPLICATION"),1:"UNKNOWN"),HLMSTATE("DT/TM CREATED"),IEN)=""
|
---|
51 | ..D COUNT^HLOESTAT("OUT",$G(HLMSTATE("HDR","RECEIVING APPLICATION")),$G(HLMSTATE("HDR","SENDING APPLICATION")),$S(HLMSTATE("BATCH"):"BATCH",1:$G(HLMSTATE("HDR","MESSAGE TYPE"))),$G(HLMSTATE("HDR","EVENT")))
|
---|
52 | .;
|
---|
53 | .;save some space for the ack
|
---|
54 | .S:($G(HLMSTATE("HDR","ACCEPT ACK TYPE"))="AL") ^HLB(IEN,4)="^^^ "
|
---|
55 | I $G(HLMSTATE("STATUS","PURGE")) S $P(NODE,"^",9)=HLMSTATE("STATUS","PURGE"),^HLB("AD","OUT",HLMSTATE("STATUS","PURGE"),HLMSTATE("IEN"))=""
|
---|
56 | S ^HLB(IEN,0)=NODE
|
---|
57 | ;
|
---|
58 | ;store the message header
|
---|
59 | S ^HLB(IEN,1)=HLMSTATE("HDR",1)
|
---|
60 | S ^HLB(IEN,2)=HLMSTATE("HDR",2)
|
---|
61 | ;
|
---|
62 | ;if the msg is an app ack, update the original msg
|
---|
63 | I $G(HLMSTATE("ACK TO","IEN"))]"" D
|
---|
64 | .N ACKTO
|
---|
65 | .M ACKTO=HLMSTATE("ACK TO")
|
---|
66 | .S ACKTO("ACK BY")=$S(HLMSTATE("BATCH"):HLMSTATE("HDR","BATCH CONTROL ID"),1:HLMSTATE("HDR","MESSAGE CONTROL ID"))
|
---|
67 | .D ACKTO^HLOF778(.HLMSTATE,.ACKTO)
|
---|
68 | .S HLMSTATE("ACK TO","DONE")=1 ;because the update was already done, otherwise it might be done again
|
---|
69 | ;
|
---|
70 | ;The "SEARCH" x-ref will be created asynchronously
|
---|
71 | S ^HLTMP("PENDING SEARCH X-REF",$J,HLMSTATE("DT/TM CREATED"),IEN)=""
|
---|
72 | ;
|
---|
73 | ;sequence q?
|
---|
74 | I HLMSTATE("DIRECTION")="OUT",$G(@STAT@("SEQUENCE QUEUE"))'="" S ^HLB(IEN,5)=@STAT@("SEQUENCE QUEUE")
|
---|
75 | ;
|
---|
76 | Q IEN
|
---|
77 | ;
|
---|
78 | NEWIEN(DIR,TCP) ;
|
---|
79 | ;This function uses a counter to get the next available ien for file 778. There are 4 different counters, each assigned as range of numbers, selected via the input parameters. It does not create a record.
|
---|
80 | ;Inputs:
|
---|
81 | ; DIR = "IN" or "OUT" (required)
|
---|
82 | ; TCP = 1,0 (optional)
|
---|
83 | ;Output - the function returns the next available ien. Several counters are used:
|
---|
84 | ;
|
---|
85 | ; <"OUT","TCP">
|
---|
86 | ; <"OUT","NOT TCP">
|
---|
87 | ; <"IN","TCP">
|
---|
88 | ; <"IN","NOT TCP">
|
---|
89 | ;
|
---|
90 | N IEN,COUNTER,INC
|
---|
91 | I DIR="OUT" S INC=$S(+$G(TCP):0,1:100000000000)
|
---|
92 | I DIR="IN" S INC=$S(+$G(TCP):200000000000,1:300000000000)
|
---|
93 | S COUNTER=$NA(^HLC("FILE778",DIR,$S(+$G(TCP):"TCP",1:"NOT TCP")))
|
---|
94 | AGAIN ;
|
---|
95 | S IEN=$$INC^HLOSITE(COUNTER,1)
|
---|
96 | I IEN>100000000000 D
|
---|
97 | .L +@COUNTER:200
|
---|
98 | .I $T,@COUNTER>100000000000 S @COUNTER=1,IEN=1
|
---|
99 | .L -@COUNTER
|
---|
100 | I IEN>100000000000 G AGAIN
|
---|
101 | Q (IEN+INC)
|
---|
102 | ;
|
---|
103 | TCP() ;checks the link to see if its TCP, return 1 if yes, 0 if no or not defined
|
---|
104 | N IEN,TCP
|
---|
105 | S TCP=1
|
---|
106 | S IEN=$G(HLMSTATE("STATUS","LINK IEN"))
|
---|
107 | I IEN,$P($G(^HLCS(869.1,+$P($G(^HLCS(870,IEN,0)),"^",3),0)),"^")'="TCP" S TCP=0
|
---|
108 | Q TCP
|
---|
109 | ;
|
---|
110 | GETWORK(WORK) ; Used by the Process Manager.
|
---|
111 | ;Are there any messages that need the "SEARCH" x-ref set?
|
---|
112 | ;Inputs:
|
---|
113 | ; WORK (required, pass-by-reference)
|
---|
114 | ; ("DOLLARJ")
|
---|
115 | ; ("NOW") (required by the process manager, pass-by-reference)
|
---|
116 | ;
|
---|
117 | L +^HLTMP("PENDING SEARCH X-REF"):0
|
---|
118 | Q:'$T 0
|
---|
119 | N OLD,DOLLARJ,SUCCESS,NOW
|
---|
120 | S SUCCESS=0
|
---|
121 | S NOW=$$SEC^XLFDT($H)
|
---|
122 | S (OLD,DOLLARJ)=$G(WORK("DOLLARJ"))
|
---|
123 | F S DOLLARJ=$O(^HLTMP("PENDING SEARCH X-REF",DOLLARJ)) Q:DOLLARJ="" D Q:SUCCESS
|
---|
124 | .N TIME S TIME=$O(^HLTMP("PENDING SEARCH X-REF",DOLLARJ,""))
|
---|
125 | .S:(NOW-$$SEC^XLFDT(TIME)>100) SUCCESS=1
|
---|
126 | ;
|
---|
127 | I OLD'="",'SUCCESS F S DOLLARJ=$O(^HLTMP("PENDING SEARCH X-REF",DOLLARJ)) Q:DOLLARJ="" Q:DOLLARJ>OLD D Q:SUCCESS
|
---|
128 | .N TIME S TIME=$O(^HLTMP("PENDING SEARCH X-REF",DOLLARJ,""))
|
---|
129 | .S:(NOW-$$SEC^XLFDT(TIME)>100) SUCCESS=1
|
---|
130 | S WORK("DOLLARJ")=DOLLARJ,WORK("NOW")=NOW
|
---|
131 | Q:WORK("DOLLARJ")]"" 1
|
---|
132 | L -^HLTMP("PENDING SEARCH X-REF")
|
---|
133 | Q 0
|
---|
134 | ;
|
---|
135 | DOWORK(WORK) ;Used by the Process Manager
|
---|
136 | ;Sets the "SEARCH" x-ref, running 100 seconds behind when the message record was created.
|
---|
137 | ;
|
---|
138 | N MSGIEN,TIME
|
---|
139 | S TIME=0
|
---|
140 | F S TIME=$O(^HLTMP("PENDING SEARCH X-REF",WORK("DOLLARJ"),TIME)) Q:'TIME Q:((WORK("NOW")-$$SEC^XLFDT(TIME))<100) D
|
---|
141 | .S MSGIEN=0
|
---|
142 | .F S MSGIEN=$O(^HLTMP("PENDING SEARCH X-REF",WORK("DOLLARJ"),TIME,MSGIEN)) Q:'MSGIEN D
|
---|
143 | ..N MSG
|
---|
144 | ..I $$GETMSG^HLOMSG(MSGIEN,.MSG) D
|
---|
145 | ...Q:'MSG("DT/TM CREATED")
|
---|
146 | ...I MSG("BATCH") D
|
---|
147 | ....N HDR
|
---|
148 | ....F Q:'$$NEXTMSG^HLOMSG(.MSG,.HDR) S MSG("HDR",1)=HDR(1),MSG("HDR",2)=HDR(2) D SET(.MSG)
|
---|
149 | ...E D
|
---|
150 | ....D SET(.MSG)
|
---|
151 | ..K ^HLTMP("PENDING SEARCH X-REF",WORK("DOLLARJ"),TIME,MSGIEN)
|
---|
152 | L -^HLTMP("PENDING SEARCH X-REF")
|
---|
153 | Q
|
---|
154 | ;
|
---|
155 | SET(MSG) ;
|
---|
156 | ;sets the ^HLB("SEARCH") x-ref
|
---|
157 | ;
|
---|
158 | N APP,FS,CS,IEN
|
---|
159 | I MSG("DIRECTION")'="IN",MSG("DIRECTION")'="OUT" Q
|
---|
160 | S FS=$E(MSG("HDR",1),4)
|
---|
161 | Q:FS=""
|
---|
162 | S CS=$E(MSG("HDR",1),5)
|
---|
163 | S APP=$S(MSG("DIRECTION")="IN":$P($P(MSG("HDR",1),FS,5),CS),1:$P($P(MSG("HDR",1),FS,3),CS))
|
---|
164 | I APP="" S APP="UNKNOWN"
|
---|
165 | I MSG("BATCH") D
|
---|
166 | .N VALUE
|
---|
167 | .S VALUE=$P(MSG("HDR",2),FS,4)
|
---|
168 | .S MSG("MESSAGE TYPE")=$P(VALUE,CS)
|
---|
169 | .S MSG("EVENT")=$P(VALUE,CS,2)
|
---|
170 | S:MSG("MESSAGE TYPE")="" MSG("MESSAGE TYPE")="<none>"
|
---|
171 | S:MSG("EVENT")="" MSG("EVENT")="<none>"
|
---|
172 | S IEN=MSG("IEN")
|
---|
173 | I MSG("BATCH") S IEN=IEN_"^"_MSG("BATCH","CURRENT MESSAGE")
|
---|
174 | S ^HLB("SEARCH",MSG("DIRECTION"),MSG("DT/TM CREATED"),APP,MSG("MESSAGE TYPE"),MSG("EVENT"),IEN)=""
|
---|
175 | Q
|
---|