| 1 | HLCSQUE ;ALB/MFK HL7 UTILITY FUNCTIONS - 10/4/94 11AM ;05/08/2000 11:07
|
---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**14,61,59**;Oct 13, 1995
|
---|
| 3 | ENQUEUE(IEN,HLDIR) ;Assign a message for queue entry
|
---|
| 4 | ; INPUT: IEN - Internal Entry Number for file 870 - HL7 QUEUE
|
---|
| 5 | ; HLDIR - Direction of queue (IN/OUT)
|
---|
| 6 | ; OUTPUT: BEG - Location in the queue to stuff the message
|
---|
| 7 | ; -1 - Error
|
---|
| 8 | ; NOTE: All the locks have been commented out.
|
---|
| 9 | N FRONT,BACK,DIC,DA,X,BP,FP,REC,DINUM,ENTRY,Y,RETURN,BPOINTER
|
---|
| 10 | N FPOINTER,HLCNT
|
---|
| 11 | ; Make sure required variables were given
|
---|
| 12 | S IEN=$G(IEN)
|
---|
| 13 | Q:(IEN="") "-1^Queue not given"
|
---|
| 14 | I +IEN<1 S IEN=$O(^HLCS(870,"B",IEN,""))
|
---|
| 15 | Q:(IEN="") "-1^Invalid queue"
|
---|
| 16 | S HLDIR=$G(HLDIR)
|
---|
| 17 | S HLDIR=$S(HLDIR="1":"IN",HLDIR=2:"OUT",1:HLDIR)
|
---|
| 18 | I HLDIR'="IN",(HLDIR'="OUT") Q "-1^Invalid Direction"
|
---|
| 19 | I HLDIR="IN" S HLDIR=1,BPOINTER="IN QUEUE BACK POINTER",FPOINTER="IN QUEUE FRONT POINTER"
|
---|
| 20 | I HLDIR="OUT" S HLDIR=2,BPOINTER="OUT QUEUE BACK POINTER",FPOINTER="OUT QUEUE FRONT POINTER"
|
---|
| 21 | F L +^HLCS(870,IEN,FPOINTER):1 Q:$T H 1
|
---|
| 22 | S FRONT=$G(^HLCS(870,IEN,FPOINTER))
|
---|
| 23 | L -^HLCS(870,IEN,FPOINTER)
|
---|
| 24 | D DELETE^HLCSQUE1(IEN,HLDIR,FRONT)
|
---|
| 25 | F L +^HLCS(870,IEN,BPOINTER):1 Q:$T H 1
|
---|
| 26 | S BACK=$G(^HLCS(870,IEN,BPOINTER))
|
---|
| 27 | ; Set up DICN call
|
---|
| 28 | S DIC="^HLCS(870,"_IEN_","_HLDIR_","
|
---|
| 29 | S ENTRY=HLDIR+18
|
---|
| 30 | S DIC(0)="LNX",DA(1)=IEN,DIC("P")=$P(^DD(870,ENTRY,0),"^",2)
|
---|
| 31 | S (DINUM,X)=BACK+1
|
---|
| 32 | ; Create Record
|
---|
| 33 | K DD,DO
|
---|
| 34 | F L +^HLCS(870,IEN,HLDIR):1 Q:$T H 1
|
---|
| 35 | F HLCNT=0:1 D Q:Y>0 H HLCNT
|
---|
| 36 | . D FILE^DICN
|
---|
| 37 | S REC=$P(Y,"^",1)
|
---|
| 38 | ; Set the 'status' to 'S' for stub
|
---|
| 39 | S $P(^HLCS(870,IEN,HLDIR,REC,0),"^",2)="S"
|
---|
| 40 | S ^HLCS(870,IEN,BPOINTER)=BACK+1
|
---|
| 41 | ; Put queue pointers back
|
---|
| 42 | S RETURN=IEN_"^"_REC
|
---|
| 43 | EXIT1 ; Unlock and return results
|
---|
| 44 | L -^HLCS(870,IEN,HLDIR)
|
---|
| 45 | L -^HLCS(870,IEN,BPOINTER)
|
---|
| 46 | K IEN,HLDIR
|
---|
| 47 | Q RETURN
|
---|
| 48 | DEQUEUE(IEN,HLDIR) ;Release the next message from the queue
|
---|
| 49 | N MSG,RETURN,FRONT,FP,BACK,POINTER
|
---|
| 50 | S IEN=$G(IEN)
|
---|
| 51 | Q:(IEN="") "-1^Queue not given"
|
---|
| 52 | I +IEN<1 S IEN=$O(^HLCS(870,"B",IEN,""))
|
---|
| 53 | Q:(IEN="") "-1^Invalid queue"
|
---|
| 54 | S HLDIR=$G(HLDIR)
|
---|
| 55 | S HLDIR=$S(HLDIR="1":"IN",HLDIR=2:"OUT",1:HLDIR)
|
---|
| 56 | I HLDIR'="IN",(HLDIR'="OUT") Q "-1^Invalid Direction"
|
---|
| 57 | I HLDIR="IN" S HLDIR=1,POINTER="IN QUEUE FRONT POINTER"
|
---|
| 58 | I HLDIR="OUT" S HLDIR=2,POINTER="OUT QUEUE FRONT POINTER"
|
---|
| 59 | F L +^HLCS(870,IEN,POINTER):1 Q:$T H 1
|
---|
| 60 | S FRONT=$G(^HLCS(870,IEN,POINTER))
|
---|
| 61 | L -^HLCS(870,IEN,POINTER)
|
---|
| 62 | D DELETE^HLCSQUE1(IEN,HLDIR,FRONT)
|
---|
| 63 | ;If queue empty or "Stub" record don't dequeue
|
---|
| 64 | F L +^HLCS(870,IEN,HLDIR,FRONT+1,0):1 Q:$T H 1
|
---|
| 65 | I '$D(^HLCS(870,IEN,HLDIR,FRONT+1,0)) S RETURN="-1^NO NEXT RECORD" G EXIT2
|
---|
| 66 | I ($P($G(^HLCS(870,IEN,HLDIR,FRONT+1,0)),"^",2)'="P") S RETURN="-1^STUB" G EXIT2
|
---|
| 67 | ; for status "P"
|
---|
| 68 | S ^HLCS(870,IEN,POINTER)=FRONT+1
|
---|
| 69 | S RETURN=IEN_"^"_(FRONT+1)
|
---|
| 70 | ; Return success
|
---|
| 71 | EXIT2 ;
|
---|
| 72 | L -^HLCS(870,IEN,HLDIR,FRONT+1,0)
|
---|
| 73 | L -^HLCS(870,IEN,POINTER)
|
---|
| 74 | Q RETURN
|
---|
| 75 | CLEARQUE(IEN,HLDIR) ;Empty an entire queue
|
---|
| 76 | ; IEN - Entry number for queue - can be name from "B" X-ref
|
---|
| 77 | ; HLDIR - Can be "IN", "OUT", 1 or 2.
|
---|
| 78 | ; output: 0 for success
|
---|
| 79 | ; -1^error for error
|
---|
| 80 | N MSG,X,ERR,FP,BP
|
---|
| 81 | ;NOTE: this is not needed to initialize a queue
|
---|
| 82 | ; enqueue will set up (?) a new queue
|
---|
| 83 | ; Make sure that required variables exist
|
---|
| 84 | S IEN=$G(IEN)
|
---|
| 85 | Q:(IEN="") "-1^Internal Entry Number missing"
|
---|
| 86 | I +IEN<1 S IEN=$O(^HLCS(870,"B",IEN,""))
|
---|
| 87 | Q:(IEN="") "-1^Invalid IEN"
|
---|
| 88 | ; Convert direction to a number
|
---|
| 89 | S HLDIR=$G(HLDIR)
|
---|
| 90 | Q:(HLDIR'="IN")&(HLDIR'="OUT")&(HLDIR'=1)&(HLDIR'=2) "-1^Invalid direction"
|
---|
| 91 | S HLDIR=$S(HLDIR="IN":1,HLDIR="OUT":2,HLDIR=2:2,1:1)
|
---|
| 92 | ; If in queue, set front pointer to 6, out pointer gets set to 8
|
---|
| 93 | I HLDIR=1 S FP="IN QUEUE FRONT POINTER",BP="IN QUEUE BACK POINTER"
|
---|
| 94 | I HLDIR=2 S FP="OUT QUEUE FRONT POINTER",BP="OUT QUEUE BACK POINTER"
|
---|
| 95 | S MSG=0
|
---|
| 96 | W !
|
---|
| 97 | ; Loop through and delete messages
|
---|
| 98 | F S MSG=$O(^HLCS(870,IEN,HLDIR,MSG)) Q:(MSG'>0) D
|
---|
| 99 | .S ERR=$$DELMSG^HLCSQUE1(IEN,HLDIR,MSG) W "."
|
---|
| 100 | .I ERR W ERR,!
|
---|
| 101 | ; Clear front and back pointers
|
---|
| 102 | S ^HLCS(870,IEN,FP)=0
|
---|
| 103 | S ^HLCS(870,IEN,BP)=0
|
---|
| 104 | ;K IEN,HLDIR
|
---|
| 105 | Q 0
|
---|
| 106 | ;
|
---|
| 107 | PUSH(HLDOUT0,HLDOUT1) ;-- Place message back on queue
|
---|
| 108 | ; INPUT - HLDOUT0 IEN of file 870
|
---|
| 109 | ; HLDOUT1 IEN of Out Multiple
|
---|
| 110 | ; OUTPUT- NONE
|
---|
| 111 | ;
|
---|
| 112 | ;-- exit if not vaild variables
|
---|
| 113 | I 'HLDOUT0!'HLDOUT1 G PUSHQ
|
---|
| 114 | ;-- exit if global does not already exist
|
---|
| 115 | I '$D(^HLCS(870,HLDOUT0,"OUT QUEUE FRONT POINTER")) G PUSHQ
|
---|
| 116 | S ^HLCS(870,HLDOUT0,"OUT QUEUE FRONT POINTER")=(HLDOUT1-1)
|
---|
| 117 | PUSHQ Q
|
---|
| 118 | ;
|
---|