| 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 |  ;
 | 
|---|