| 1 | HLUTIL ;SFISC/RJH- Utilities for HL7 TCP    ;08/24/2000  16:55 | 
|---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**36,19,57,64,66,109**;Oct 13, 1995 | 
|---|
| 3 | Q | 
|---|
| 4 | ;For TCP only | 
|---|
| 5 | MSGSTAT(X) ;message status | 
|---|
| 6 | ;input value:   X = message id | 
|---|
| 7 | ;return value: status^status updated^error msg.^error type pointer^ | 
|---|
| 8 | ;queue position or # of retries^# open failed^ack timeout | 
|---|
| 9 | ;      status: | 
|---|
| 10 | ;               0 = message doesn't exist | 
|---|
| 11 | ;               1 = waiting in queue | 
|---|
| 12 | ;             1.5 = opening connection | 
|---|
| 13 | ;             1.7 = awaiting response, # of retries | 
|---|
| 14 | ;               2 = awaiting application ack | 
|---|
| 15 | ;               3 = successfully completed | 
|---|
| 16 | ;               4 = error | 
|---|
| 17 | ;               8 = being generated | 
|---|
| 18 | ;               9 = awaiting processing | 
|---|
| 19 | Q:$G(X)']"" 0 | 
|---|
| 20 | N C,I,L,Y,Z | 
|---|
| 21 | S Y=$O(^HLMA("C",X,0)) Q:'Y 0 | 
|---|
| 22 | ;lock node to flush disk buffers | 
|---|
| 23 | L +^HLMA(Y,"P"):3 S Z=$G(^HLMA(Y,"P")) | 
|---|
| 24 | S:'Z Z=0 | 
|---|
| 25 | ;if pending, get queue position | 
|---|
| 26 | I +Z=1 D | 
|---|
| 27 | . ;get Logical Link, if msg. not in x-ref, then it is being sent | 
|---|
| 28 | . S L=+$P(^HLMA(Y,0),U,7) Q:'$D(^HLMA("AC","O",L,Y)) | 
|---|
| 29 | . ;find position in queue, if greater than 2 - use 2 | 
|---|
| 30 | . S I=Y F C=1:1:2 S I=$O(^HLMA("AC","O",L,I),-1) Q:'I | 
|---|
| 31 | . S $P(Z,U,5)=C | 
|---|
| 32 | L -^HLMA(Y,"P") | 
|---|
| 33 | Q Z | 
|---|
| 34 | ; | 
|---|
| 35 | MSGACT(X,HLIENACT) ;outgoing message action | 
|---|
| 36 | ;input value:   X = message id | 
|---|
| 37 | ;               HLIENACT = 1-cancel; 2-requeue | 
|---|
| 38 | ;return value:  1 = action sucessful | 
|---|
| 39 | ;               0 = action failed | 
|---|
| 40 | Q:$G(X)']"" 0 | 
|---|
| 41 | N HLIEN,HLIEN0,HLSTAT,HLTCP,Y,LINK | 
|---|
| 42 | S HLIEN=+$O(^HLMA("C",X,0)) Q:'HLIEN 0 | 
|---|
| 43 | S HLIEN0=$G(^HLMA(HLIEN,0)) Q:'HLIEN0 0 | 
|---|
| 44 | ;must be outgoing | 
|---|
| 45 | Q:$P(HLIEN0,U,3)'="O" 0 | 
|---|
| 46 | F Y=1:1:3 L +^HLMA(HLIEN,"P"):1 Q:$T  H 1 | 
|---|
| 47 | E  Q 0 | 
|---|
| 48 | ; | 
|---|
| 49 | ;**109** | 
|---|
| 50 | S LINK=$P($G(^HLMA(HLIEN,0)),"^",7) | 
|---|
| 51 | ; | 
|---|
| 52 | S HLSTAT=1 | 
|---|
| 53 | ;cancel | 
|---|
| 54 | I HLIENACT=1 D | 
|---|
| 55 | . ;HLTCP is set so that file 773 is updated | 
|---|
| 56 | . S HLTCP="" | 
|---|
| 57 | . D STATUS^HLTF0(HLIEN,3,,"Cancelled by application",1) | 
|---|
| 58 | .; | 
|---|
| 59 | .;**109** | 
|---|
| 60 | . D DEQUE^HLCSREP(LINK,"O",HLIEN) | 
|---|
| 61 | .; | 
|---|
| 62 | ;requeue | 
|---|
| 63 | I HLIENACT=2 D | 
|---|
| 64 | . N DA,DIK,HLJ | 
|---|
| 65 | . ;check for type=outgoing and logical link, need for "AC" x-ref | 
|---|
| 66 | . I $P(HLIEN0,U,3)'="O"!('$P(HLIEN0,U,7)) S HLSTAT=0 Q | 
|---|
| 67 | . ;set status=pend transmission | 
|---|
| 68 | . S Y=$NA(HLJ(773,HLIEN_",")),@Y@(20)=1 | 
|---|
| 69 | . ;delete status update, error msg, error type, date processed | 
|---|
| 70 | . S (@Y@(21),@Y@(22),@Y@(23),@Y@(100))="@" | 
|---|
| 71 | . D FILE^HLDIE("","HLJ","","MSGACT","HLUTIL") ; HL*1.6*109 | 
|---|
| 72 | . ;**109** | 
|---|
| 73 | . ;need to set "AC" x-ref | 
|---|
| 74 | .; S DA=HLIEN,DIK="^HLMA(",DIK(1)="7^AC" | 
|---|
| 75 | .; D EN1^DIK | 
|---|
| 76 | .; | 
|---|
| 77 | .;**109** | 
|---|
| 78 | . D ENQUE^HLCSREP(LINK,"O",HLIEN) | 
|---|
| 79 | ; | 
|---|
| 80 | L -^HLMA(HLIEN,"P") | 
|---|
| 81 | Q HLSTAT | 
|---|
| 82 | ; | 
|---|
| 83 | CHKLL(X) ;check setup of Logical Link | 
|---|
| 84 | ;input value:   X = institution number or name | 
|---|
| 85 | ;return value:  1 = setup OK | 
|---|
| 86 | ;               0 = LL setup incorrect | 
|---|
| 87 | N HLF,HLRESLT | 
|---|
| 88 | S HLF=$S(X:"I",1:"") | 
|---|
| 89 | D LINK^HLUTIL3(X,.HLRESLT,HLF) | 
|---|
| 90 | S X=+$O(HLRESLT(0)) Q:'X 0 | 
|---|
| 91 | Q $$LLOK^HLCSLM(X) | 
|---|
| 92 | ; | 
|---|
| 93 | DONTPURG() ; set the DONT PURGE field to 1 in order to prevent the message | 
|---|
| 94 | ; from purging. | 
|---|
| 95 | ; return value :  1 for successfully set the field | 
|---|
| 96 | ;                -1 for failure | 
|---|
| 97 | Q $$SETPURG(1) | 
|---|
| 98 | ; | 
|---|
| 99 | TOPURG() ; clear the DONT PURGE field to allow the message to be purged. | 
|---|
| 100 | ; return value :  0 for successfully clear the field | 
|---|
| 101 | ;                -1 for failure | 
|---|
| 102 | Q $$SETPURG(0) | 
|---|
| 103 | ; | 
|---|
| 104 | SETPURG(STATUS) ; to set or to clear the DONT PURGE field | 
|---|
| 105 | ; HLMTIENS = ien in file 773 for this message | 
|---|
| 106 | ; input: 1 to set the DONT PURGE field | 
|---|
| 107 | ;        0 to clear the DONT PURGE field. | 
|---|
| 108 | ; return value: 1 means successfully set the DONT PURGE field | 
|---|
| 109 | ;               0 means successfully clear the DONT PURGE field | 
|---|
| 110 | ;              -1 means fail to set or to clear the field | 
|---|
| 111 | I (STATUS'=1),(STATUS'=0) Q -1 | 
|---|
| 112 | I '$D(^HLMA(+$G(HLMTIENS),0)) Q -1 | 
|---|
| 113 | ; | 
|---|
| 114 | L +^HLMA(HLMTIENS):30 | 
|---|
| 115 | E  Q -1 | 
|---|
| 116 | S $P(^HLMA(HLMTIENS,2),U)=STATUS | 
|---|
| 117 | L -^HLMA(HLMTIENS) | 
|---|
| 118 | Q STATUS | 
|---|
| 119 | ; | 
|---|
| 120 | REPROC(IEN,RTN) ; reprocessing message | 
|---|
| 121 | ; IEN- the message IEN in file 773 | 
|---|
| 122 | ; RTN- the routine, to be Xecuted for processing the message | 
|---|
| 123 | ; return value:  0 for success, -1 for failure | 
|---|
| 124 | N HLMTIEN,HLMTIENS,HLNEXT,HLNODE,HLQUIT,HLERR,HLRESLT,HLTCP | 
|---|
| 125 | N HL,HDR,FS,ECH,HLMSA,X,X1,X2 | 
|---|
| 126 | S HLQUIT=0,HLNODE="",HLNEXT="D HLNEXT^HLCSUTL" | 
|---|
| 127 | I '$D(^HLMA(+$G(IEN),0)) Q -1 | 
|---|
| 128 | I $G(RTN)'["" Q -1 | 
|---|
| 129 | S (HLMTIENS,HLTCP)=+IEN,HLMTIEN=+^HLMA(HLMTIENS,0),HLMSA=$$MSA^HLTP3(HLMTIEN) | 
|---|
| 130 | M HDR=^HLMA(HLMTIENS,"MSH") | 
|---|
| 131 | D CHK^HLTPCK2(.HDR,.HL,.HLMSA) | 
|---|
| 132 | Q:HL'="" -1 | 
|---|
| 133 | ; | 
|---|
| 134 | I RTN["D " X RTN | 
|---|
| 135 | I RTN'["D " D | 
|---|
| 136 | . I RTN["^" X "D "_RTN | 
|---|
| 137 | . I RTN'["^" X "D ^"_RTN | 
|---|
| 138 | S HLRESLT=0 S:($D(HLERR)) HLRESLT="9^"_$G(^HL(771.7,9,0)) | 
|---|
| 139 | ; update the status | 
|---|
| 140 | D STATUS^HLTF0(HLMTIENS,$S(HLRESLT:4,1:3),$S(HLRESLT:+HLRESLT,1:""),$S($D(HLERR):HLERR,HLRESLT:$P(HLRESLT,"^",2),1:""),1) | 
|---|
| 141 | Q 0 | 
|---|