- HLOTRACE ;OIFO-OAK/PIJ/CJM - HLO CLIENT TRACE Tool ; 03/07/2011
- ;;1.6;HEALTH LEVEL SEVEN;**146,147,153,172** ;Oct 13, 1995;Build 11
- ;Per VA Directive 6402, this routine should not be modified.
- ;;
- ;; HLO CLIENT TRACE Tool
- ;; *** For troubleshooting HLO client issues ***
- ;; Client runs in the foreground and writes trace statements
- ;; to the screen.
- ;;
- START ;
- N CONF
- I '$G(DUZ) W !,"Your DUZ must be set!" Q
- D OWNSKEY^XUSRB(.CONF,"XUPROG",DUZ)
- I 'CONF(0) D Q
- . W !!," Sorry, you are not authorized to use this tool.",!!
- ;I $P($$VERSION^%ZOSV(1),"/",1)'="Cache for OpenVMS" D Q
- I '(($P($$VERSION^%ZOSV(1),"/",1)[("Cache"))!($$VERSION^%ZOSV(1)["IRIS")) D Q
- .W !!," Sorry, this tool can only be used under Cache or IRIS",!!
- N LINK,PORT,QUE,SUB,WORK,HLMSTATE,HLCSTATE,OLD,MAXTRACE,TRACECNT
- S LINK=$$ASKLINK^HLOUSR
- Q:LINK=""
- S PORT=$$ASKPORT(LINK)
- Q:'PORT
- S SUB=LINK_":"_PORT
- S QUE=$$ASKQUE(SUB)
- Q:QUE=""
- ZB /INTERRUPT:NORMAL ;disable CTRL-C breaks
- L +^HLB("QUEUE","OUT",SUB,QUE):20
- ;
- I '$T W !,"That queue is currently being processed. You need to either stop that link,",!,"stop that queue, or totally stop HLO so that this tool can be used." Q
- I '$O(^HLB("QUEUE","OUT",SUB,QUE,0)) W !,"There are no messages pending on that queue!" Q
- S TRACECNT=0
- S MAXTRACE=$$ASKCOUNT
- Q:(MAXTRACE<1)
- S WORK("QUEUE")=QUE,WORK("LINK")=SUB
- D SETBREAKS
- D DOWORK^HLOCLNT(.WORK)
- D:$G(HLCSTATE("CONNECTED")) CLOSE^HLOT(.HLCSTATE)
- ;
- U $PRINCIPAL
- L -^HLB("QUEUE","OUT",SUB,QUE)
- ZB /CLEAR
- W !,"DONE!"
- ;
- Q
- SETBREAKS ;
- ZB /CLEAR
- ;
- ;set break in $$STOPPED^HLOQUE to circumvent shutdown of the queue
- ZB ZB0^HLOQUE:"N":1:"S RET=0"
- ;set break in $$IFSHUT^HLOTLNK to circumvent shutdown of the link
- ZB ZB0^HLOTLNK:"N":1:"S RET=0"
- ;set break at ZB0 in client (start of DOWORK)
- ZB ZB0^HLOCLNT:"N":1:"D WRITE^HLOTRACE(""Launching the client process..."")"
- ;set break at ZB1 in client ($$CONNECT)
- ZB ZB1^HLOCLNT1:"N":1:"D WRITE^HLOTRACE(""Trying to connect..."")"
- ;set break at ZB2 in client (end of $$CONNECT)
- ZB ZB2^HLOCLNT1:"N":1:"D ZB2^HLOTRACE"
- ;set break at ZB3 in client (ERROR TRAP)
- ZB ZB3^HLOCLNT:"N":1:"D ZB3^HLOTRACE"
- ;set break at ZB4 in client (FOR loop on the outgoing queue)
- ZB ZB4^HLOCLNT:"N":1:"D ZB4^HLOTRACE"
- ;set break at ZB5 in client (end of DOWORK, with just cleanup left)
- ZB ZB5^HLOCLNT:"N":1:"D WRITE3^HLOTRACE(""Cleaning up...."")"
- ;set break at ZB6 in client (start of $$TRANSMIT^HLOCLNT1)
- ZB ZB6^HLOCLNT1:"N":1:"D WRITE^HLOTRACE(""Beginning to transmit message...."")"
- ;set break at ZB7 in client (end of $$TRANSMIT^HLOCLNT1)
- ZB ZB7^HLOCLNT1:"N":1:"D WRITE^HLOTRACE(""Message transmitted!"")"
- ;set break at ZB8 in client (start of $$READACK^HLOCLNT1)
- ;ZB ZB8^HLOCLNT1:"N":1:"D WRITE^HLOTRACE(""Beginning to read commit acknowledgment...."")"
- ZB ZB8^HLOCLNT1:"N":1:"D ZB8^HLOTRACE"
- ;set break at ZB9 in client (end of $$READACK^HLOCLNT1)
- ;ZB ZB9^HLOCLNT1:"N":1:"D WRITE^HLOTRACE(""Commit acknowledgment received!"")"
- ZB ZB9^HLOCLNT1:"N":1:"D ZB9^HLOTRACE"
- ;set break ZB10 in the client(start of $$READHDR^HLOT)
- ZB ZB10^HLOT:"N":1:"D ZB10^HLOTRACE"
- ;set break ZB11 in the client(end of $$READHDR^HLOT)
- ZB ZB11^HLOT:"N":1:"D ZB11^HLOTRACE"
- ;set break ZB12 in the client(start of $$READSEG^HLOT)
- ZB ZB12^HLOT:"N":1:"D ZB12^HLOTRACE"
- ;set break ZB13 in the client(end of $$READSEG^HLOT)
- ZB ZB13^HLOT:"N":1:"D ZB13^HLOTRACE"
- ;set break ZB14 in the client(start of $$WRITESEG^HLOT)
- ZB ZB14^HLOT:"N":1:"D ZB14^HLOTRACE"
- ;set break ZB15 in the client(end of $$WRITESEG^HLOT)
- ZB ZB15^HLOT:"N":1:"D ZB15^HLOTRACE"
- ;set break ZB16 in the client(start of $$WRITEHDR^HLOT)
- ZB ZB16^HLOT:"N":1:"D ZB16^HLOTRACE"
- ;set break ZB17 in the client(end of $$WRITEHDR^HLOT)
- ZB ZB17^HLOT:"N":1:"D ZB17^HLOTRACE"
- ;set break ZB18 in the client(start of $$ENDMSG^HLOT)
- ZB ZB18^HLOT:"N":1:"D ZB18^HLOTRACE"
- ;set break ZB19 in the client(end of $$ENDMSG^HLOT)
- ZB ZB19^HLOT:"N":1:"D ZB19^HLOTRACE"
- ZB ZB20^HLOCLNT:"N":1:"D ZB20^HLOTRACE"
- ZB ZB21^HLOCLNT:"N":1:"D ZB21^HLOTRACE"
- ZB ZB22^HLOCLNT:"N":1:"D ZB22^HLOTRACE"
- ZB ZB23^HLOCLNT:"N":1:"D ZB23^HLOTRACE"
- ZB ZB24^HLOCLNT1:"N":1:"D ZB24^HLOTRACE"
- ZB ZB25^HLOCLNT:"N":1:"D WRITE^HLOTRACE(""Calling DEQUE..."")"
- ZB ZB31^HLOTCP:"N":1:"D WRITE^HLOTRACE(""Beginning READ over TCP..."")"
- ZB ZB32^HLOTCP:"N":1:"D ZB32^HLOTRACE"
- Q
- WRITE(MSG) ;
- N OLD
- S OLD=$IO
- U $PRINCIPAL
- W !,?5,"Time: ",$$NOW^XLFDT," ",MSG
- U OLD
- Q
- WRITE2(MSG,VALUE) ;
- N OLD,I
- S OLD=$IO
- U $PRINCIPAL
- W !,?5,"Time: ",$$NOW^XLFDT," ",MSG
- S I=0
- W:$O(VALUE(0)) !
- F S I=$O(VALUE(I)) Q:'I W VALUE(I)
- U OLD
- Q
- WRITE3(MSG) ;
- N OLD
- S OLD=$IO
- U $PRINCIPAL
- W !,MSG
- U OLD
- Q
- ;
- ZB3 ;
- N CON,MSG
- S CON=($ZA\8192#2)
- S MSG="Error encountered, $ECODE="_$ECODE
- D WRITE^HLOTRACE(MSG)
- S MSG=$S(CON:" TCP connection still active",1:" TCP connection was dropped")
- D WRITE3^HLOTRACE(MSG)
- D ^%ZTER
- Q
- ZB4 ;
- N OLD
- S OLD=$IO
- U $PRINCIPAL
- W !!,"Looking for the next message to transmit..."
- I 'MSGIEN W !!,"No more messages pending on that queue!" S SUCCESS=0 Q
- S TRACECNT=$G(TRACECNT)+1
- I MAXTRACE>1 D
- .W !!,"Message IEN=",MSGIEN," next on queue"
- .I TRACECNT>MAXTRACE D
- ..I $$ASKYESNO^HLOUSR2("Do you want to trace another group of message transmissions","YES") S SUCCESS=1,TRACECNT=1
- ..E S SUCCESS=0
- .E S SUCCESS=1
- E D
- .I '$$ASKYESNO^HLOUSR2("Message IEN="_MSGIEN_" next on queue, do you want to trace its transmission","YES") S SUCCESS=0
- U OLD
- Q
- ;
- ZB2 ;
- W !,$S('HLCSTATE("CONNECTED"):"Connection Failed!",1:"Connected!")
- Q
- ZB8 ;
- D WRITE^HLOTRACE("Beginning to read commit acknowledgment....")
- Q
- ZB9 ;
- I $G(SUCCESS) D
- .D WRITE^HLOTRACE("Commit acknowledgment received!")
- E D
- .D WRITE^HLOTRACE("Read of commit acknowledgment FAILED!")
- Q
- ZB10 ;
- D WRITE^HLOTRACE("Getting message header...")
- Q
- ZB11 ;
- I $D(HDR) D WRITE2^HLOTRACE("",.HDR)
- D WRITE^HLOTRACE($S(SUCCESS:"Got message header!",1:"**** FAILED TO READ MESSAGE HEADER! *****"))
- Q
- ZB12 ;
- D WRITE^HLOTRACE("Getting next segment...")
- Q
- ZB13 I $D(SEG) D WRITE2^HLOTRACE("",.SEG)
- D WRITE^HLOTRACE($S(RETURN:"Got next segment!",$G(HLCSTATE("MESSAGE ENDED")):"No more segments!",1:"**** FAILED TO COMPLETE READING NEXT SEGMENT *****"))
- Q
- ZB14 ;
- D WRITE2^HLOTRACE("Writing next segment...",.SEG)
- Q
- ZB15 D WRITE^HLOTRACE($S(RETURN:"Completed!",1:"**** FAILED TO COMPLETE *****"))
- Q
- ZB16 ;
- D WRITE2^HLOTRACE("Writing header segment...",.HDR)
- Q
- ZB17 D WRITE^HLOTRACE($S(SUCCESS:"Completed!",1:"**** FAILED TO COMPLETE *****"))
- Q
- ZB18 ;
- D WRITE^HLOTRACE("Writing message terminators and flushing buffer...")
- Q
- ZB19 D WRITE^HLOTRACE($S(RETURN:"Completed!",1:"**** FAILED TO COMPLETE *****"))
- Q
- ZB20 ;
- D WRITE^HLOTRACE("Message on queue was already transmitted, will be deleted from queue...")
- Q
- ZB21 ;
- D WRITE^HLOTRACE("MSA segment shows this is not a commit ack to the message transmitted...")
- Q
- ZB22 ;
- D WRITE^HLOTRACE("Commit ack not CA, message status set to error...")
- Q
- ZB23 ;
- D WRITE^HLOTRACE("Setting timestamp of sequence queue...")
- Q
- ZB24 ;S HLOCSTATE("CONNECTED")=1
- S HLCSTATE("LINK","SHUTDOWN")=0
- Q
- ZB32 D:('$G(RETURN)) WRITE^HLOTRACE("**** FAILED ****")
- D:$G(RETURN) WRITE3^HLOTRACE("")
- D:$G(RETURN) WRITE3^HLOTRACE($G(BUF))
- D:$G(RETURN) WRITE3^HLOTRACE("")
- D:$G(RETURN) WRITE^HLOTRACE("READ over TCP completed! #Characters read: "_$L($G(BUF)))
- Q
- ;
- ASKQUE(SUB) ;
- N DIR,Q1,Q2
- S Q1=$O(^HLB("QUEUE","OUT",SUB,""))
- I Q1="" W !,"There are no outgoing messages queued to that link!",! Q ""
- S Q2=$O(^HLB("QUEUE","OUT",SUB,Q1))
- I Q2="" D
- .S DIR("B")=Q1
- E I $D(^HLB("QUEUE","OUT",SUB,"DEFAULT")) D
- .S DIR("B")="DEFAULT"
- E D
- .S DIR("B")=Q1
- S DIR(0)="F^1:20"
- S DIR("A")="What is the name of the queue"
- S DIR("?",1)="To use this tool, there must be messages already pending transmission."
- S DIR("?")="Enter the name of the queue, or '^' to exit."
- D ^DIR
- I $D(DIRUT)!(Y="") Q ""
- Q Y
- ;
- ASKCOUNT() ;
- N DIR
- S DIR(0)="N^1:100"
- S DIR("A")="Send how many at a time"
- S DIR("B")=1
- S DIR("?",1)="How many messages do you want to transmit at once"
- S DIR("?")="while tracing the client (100 maximum)?"
- D ^DIR
- Q:$D(DTOUT)!$D(DUOUT) -1
- Q X
- ASKPORT(LINK) ;
- Q:LINK="" ""
- N PORT,QUEUE
- S QUEUE=$O(^HLB("QUEUE","OUT",LINK_":"))
- Q:$P(QUEUE,":")'=LINK ""
- S PORT=$P(QUEUE,":",2)
- Q:'PORT ""
- S QUEUE=$O(^HLB("QUEUE","OUT",QUEUE))
- Q:$P(QUEUE,":")'=LINK PORT
- S PORT=$$ASKPORT^HLOUSRA(LINK)
- Q PORT