| 1 | HLCSQUE1 ;ALB/MFK HL7 UTILITY FUNCTIONS - 10/4/94 11AM ;05/08/2000  11:22
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**14,59,100**;Oct 13, 1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;Utilities used by HLCSQUE
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | DELMSG(IEN,HLDIR,MSG) ;DELETE A SINGLE MESSAGE FROM A QUEUE
 | 
|---|
| 7 |  ;INPUT: IEN - Internal Entry Number for queue
 | 
|---|
| 8 |  ;       HLDIR - Direction of queue
 | 
|---|
| 9 |  ;       MSG - Message number to remove
 | 
|---|
| 10 |  ;OUTPUT:  0 - Success
 | 
|---|
| 11 |  ;        -1 - Error
 | 
|---|
| 12 |  N DIK,DA
 | 
|---|
| 13 |  ;  Check for required variables
 | 
|---|
| 14 |  S IEN=$G(IEN)
 | 
|---|
| 15 |  Q:(IEN="") "-1^Internal Entry Number missing"
 | 
|---|
| 16 |  I +IEN<1 S IEN=$O(^HLCS(870,"B",IEN,""))
 | 
|---|
| 17 |  Q:(IEN="") "-1^Invalid IEN"
 | 
|---|
| 18 |  S HLDIR=$G(HLDIR)
 | 
|---|
| 19 |  S HLDIR=$S(HLDIR="IN":1,HLDIR="OUT":2,HLDIR=2:2,HLDIR=1:1,1:"")
 | 
|---|
| 20 |  Q:(HLDIR="") "-1^Invalid direction"
 | 
|---|
| 21 |  S MSG=$G(MSG)
 | 
|---|
| 22 |  Q:(MSG="") "-1^No message number"
 | 
|---|
| 23 |  L +^HLCS(870,IEN,HLDIR,MSG):1
 | 
|---|
| 24 |  ;If lock fails, another process is doing the work.
 | 
|---|
| 25 |  I '$T Q 1
 | 
|---|
| 26 |  S DIK="^HLCS(870,"_IEN_","_HLDIR_",",DA(1)=IEN,DA=MSG
 | 
|---|
| 27 |  D ^DIK
 | 
|---|
| 28 |  L -^HLCS(870,IEN,HLDIR,MSG)
 | 
|---|
| 29 |  K IEN,HLDIR,MSG
 | 
|---|
| 30 |  Q 0
 | 
|---|
| 31 | DELETE(IEN,HLDIR,FRONT) ;  Delete messages outside the 'queue size' window
 | 
|---|
| 32 |  N MSG,TMP,QSIZE,STOP,HLX
 | 
|---|
| 33 |  ;  Make sure required variables exist
 | 
|---|
| 34 |  S IEN=$G(IEN) Q:(IEN="")
 | 
|---|
| 35 |  S HLDIR=$G(HLDIR) Q:(HLDIR="")
 | 
|---|
| 36 |  S FRONT=$G(FRONT) Q:(FRONT="")
 | 
|---|
| 37 |  S TMP=^HLCS(870,IEN,0)
 | 
|---|
| 38 |  S QSIZE=$P(TMP,"^",21)
 | 
|---|
| 39 |  I FRONT'>0 Q
 | 
|---|
| 40 |  I QSIZE'>0 S QSIZE=10
 | 
|---|
| 41 |  S MSG=0,STOP=0
 | 
|---|
| 42 |  ;  For each message from the beginning of the queue to the front
 | 
|---|
| 43 |  ;  of the queue-queue size, delete that message if it's done
 | 
|---|
| 44 |  F  S MSG=$O(^HLCS(870,IEN,HLDIR,MSG)) Q:(MSG>(FRONT-QSIZE))!(STOP'=0)!(MSG'>0)  D
 | 
|---|
| 45 |  .I $P($G(^HLCS(870,IEN,HLDIR,MSG,0)),"^",2)'="D" D  QUIT:STOP  ;->
 | 
|---|
| 46 |  ..I $D(^HLCS(870,IEN,HLDIR,MSG)) D  QUIT:STOP  ;->
 | 
|---|
| 47 |  ...S HLX=$O(^HLCS(870,IEN,HLDIR,MSG)) QUIT:HLX>0  ;->
 | 
|---|
| 48 |  ...S STOP=1
 | 
|---|
| 49 |  ..S HLX=+$G(HLX)
 | 
|---|
| 50 |  ..I '$D(^HLCS(870,IEN,HLDIR,+HLX,0)) S STOP=1 QUIT  ;->
 | 
|---|
| 51 |  ..Q:$P($G(^HLCS(870,IEN,HLDIR,+HLX,0)),U,2)="D"  ;-> All OK...
 | 
|---|
| 52 |  ..S STOP=1
 | 
|---|
| 53 |  .S STOP=$$DELMSG(IEN,HLDIR,MSG)
 | 
|---|
| 54 |  K IEN,HLDIR,FRONT
 | 
|---|
| 55 |  Q
 | 
|---|