%ZTM1 ;SEA/RDS-TaskMan: Manager, Part 3 (Validate Task) ;07/27/2005 18:13
;;8.0;KERNEL;**118,127,275,355**;JUL 10, 1995;Build 9
MAIN ;
;SCHQ^%ZTM--examine task, determine device and destination, ^%ZTSK(ZTSK) lock at call.
D LOOKUP D D STORE
.D ZIS I %ZTREJCT Q
.D VOLUME I %ZTREJCT Q
.D UCI I %ZTREJCT Q
.Q
Q ;Un-lock back in %ZTM
LOOKUP ;
;MAIN--Unload Task Variables For Validation
S %ZTREJCT=0
D TSKSTAT(2,"Inspected")
S ZTREC=^%ZTSK(ZTSK,0)
S ZTREC02="",ZTREC1=$G(^%ZTSK(ZTSK,.1)),ZTREC2=$G(^%ZTSK(ZTSK,.2))
S ZTREC21="",ZTREC25=$G(^%ZTSK(ZTSK,.25)) ;,$P(ZTREC,U,6)=ZTDTH
S ^%ZTSK(ZTSK,.02)="" ;Clear
Q
;
ZIS ;MAIN--Determine Output Device
S ZTIO=$S($P(ZTREC2,U)]"":$P(ZTREC2,U),1:ZTST)
I ZTIO="" S (IO,ZTREC2,ZTREC21,ZTREC25)="" G ZISX
S $P(ZTREC2,U)=ZTIO,%ZIS="NQRST0",IOP=ZTIO,ZTIO(1)=$P(ZTREC2,U,5)
I ZTIO(1)="DIRECT" S %ZIS=%ZIS_"D"
D ^%ZIS K IO(1)
I $S($G(IOT)="VTRM":1,IO="":1,1:POP) D REJCT("INVALID OUTPUT DEVICE") G ZISX
I IOT="HG" S IO=""
;Check for IO queue at end
S $P(ZTREC2,U,1,4)=ZTIO_U_IO_U_IOT_U_IOST
S:'$D(IOCPU) IOCPU=$P($G(^%ZIS(1,+$G(IOS),0)),U,9) ;need IOCPU
S ZTREC21=$G(IOS)
ZISX Q
;
VOLUME ;determine destination volume set
S ZTDVOL(1)="",A=$P($G(IOCPU),":",2) ;device node
S ZTNODE=$S($L(A):A,1:$P($P(ZTREC,U,14),":",2))
S A=$S(ZTIO="":"",1:$P($G(IOCPU),":")) ;device cpu
S ZTDVOL=$S($L(A):A,1:$P($P(ZTREC,U,14),":")) ;Destination
S ZTCVOL=$P(ZTREC,U,12),ZTCVT=$$VSTYP(ZTCVOL) ;Creation
I ZTDVOL="" D
. I ZTCVT="C" S ZTDVOL=$S(%ZTYPE="P":%ZTVOL,ZTCVOL]"":ZTCVOL,1:%ZTVOL),ZTDVOL(1)=1 Q
. S ZTDVOL=$S(ZTCVOL]"":ZTCVOL,1:%ZTVOL) Q
S ZTREC02=U_ZTDVOL_U_ZTNODE_U_ZTDVOL(1)
;
V1 ;reject tasks with destination volume sets not in Volume Set file
S ZT1=$O(^%ZIS(14.5,"B",ZTDVOL,""))
I ZT1="" D REJCT("Task's volume set not listed in index.") Q
S ZTS=$G(^%ZIS(14.5,ZT1,0))
I ZTS="" D REJCT("Task's volume set not listed in file.") Q
;
V2 ;lookup type of volume set, and reject tasks to F or O types
S ZTYPE=$P(ZTS,U,10)
I ZTYPE="F"!(ZTYPE="O") D REJCT("Task's volume set can't accept tasks.") Q
;
V3 ;accept tasks with the current volume set as the destination
I ZTDVOL=%ZTVOL Q
;
V4 ;reject tasks whose destination volume sets lack link access
I $P(ZTS,U,3)="N" D REJCT("Task's volume set has no link access.") Q
Q
VSTYP(VS) ;Get a VS's type
Q:VS="" VS N %
S %=$O(^%ZIS(14.5,"B",VS,0)),%=$G(^%ZIS(14.5,+%,0))
Q $P(%,U,10)
;
UCI ;MAIN--determine destination UCI
S ZTUCI=$P($P(ZTREC,U,4),",")
S ZTUCI=$S(ZTUCI]"":ZTUCI,1:$P(ZTREC,U,11))
;
;reject tasks that lack a destination UCI
U1 ;
;reject tasks with no UCI of origin or requested destination
I ZTUCI="" D REJCT("Task has no destination UCI listed.") Q
U2 ;
;handle tasks whose destination volume set is the current one
;if UCI is here, accept the task; if not, reject it
I ZTDVOL=%ZTVOL D Q
. S X=ZTUCI_","_ZTDVOL X ^%ZOSF("UCICHECK")
. I 0[Y D REJCT("Task's UCI does not exist here.") Q
. S ZTUCI=$P(Y,",")
. S $P(ZTREC02,U)=ZTUCI
. I $E($P(ZTREC,U,2))'="%" Q
. S X=$P(ZTREC,U,2) X ^%ZOSF("TEST")
. I $T Q
. D REJCT("Task's entry routine does not exist here.")
.Q
U3 ;
;accept tasks whose dest. UCIs are listed under their dest. volume sets
I $O(^%ZIS(14.6,"AV",ZTDVOL,ZTUCI,"")) S $P(ZTREC02,U)=ZTUCI Q
U4 ;
;otherwise, the destination UCI must be a valid one here...
S X=ZTUCI X ^%ZOSF("UCICHECK")
I 0[Y D REJCT("Task's destination UCI failed check.") Q
U5 ;
;...and it must be changed to the associated UCI over there
S ZT1=$O(^%ZIS(14.6,"AT",ZTUCI,%ZTVOL,ZTDVOL,""))
I ZT1]"" S ZTUCI=ZT1
S $P(ZTREC02,U)=ZTUCI
Q
;
STORE ;Store Validated Data In Task Log, Quit If Needn't Do WAIT
I %ZTREJCT S $P(ZTREC1,U,1,2)="B^"_$H ;Rejected
I $D(^%ZTSK(ZTSK,0))[0 D TSKSTAT("I") S %ZTREJCT=1 Q
S ^%ZTSK(ZTSK,0)=ZTREC
S ^%ZTSK(ZTSK,.02)=ZTREC02
S ^%ZTSK(ZTSK,.1)=$P(ZTREC1,U,1,9)_U_$P(^(.1),U,10,11)
S ^%ZTSK(ZTSK,.2)=ZTREC2,^(.21)=ZTREC21,^(.25)=ZTREC25
K %ZTF,IOCPU
I ZTIO="" Q
I %ZTREJCT Q
I ZTDVOL'=%ZTVOL Q
I IOT'="TRM",IOT'="RES" Q
I $D(^%ZTSCH("IO",IO))>9 D IOWAIT
K X,Y
Q
;
IOWAIT ;If Device has a queue, Put Task On IO Queue.
S %ZTREJCT=1 D TSKSTAT("A","Put On The IO List")
S %ZTIO=IO,ZTIOS=ZTREC21,ZTIOT=IOT
D NQ^%ZTM4
Q
;
REJCT(MSG) ;Save reject msg, set flag
S %ZTREJCT=1,$P(ZTREC1,U,3)=MSG
I $G(DUZ)>.9 D
. N XQA,XQAMSG,XQADATA,XQAROU,ZTUCI
. S XQA(DUZ)="",XQAMSG="Your task #"_ZTSK_" rejected because: "_MSG,XQADATA=ZTSK,XQAROU="XQA^XUTMUTL"
. S ZTUCI=$P($P(ZTREC,U,4),","),ZTUCI=$S(ZTUCI]"":ZTUCI,1:$P(ZTREC,U,11))
. N ZTSK,ZTIO,ZTDTH,ZTCPU,ZTREC
. S ZTRTN="ALERT^%ZTMS4",ZTDTH=$H,ZTIO="",ZTSAVE("XQA*")=""
. D ^%ZTLOAD Q
Q
;
TSKSTAT(CODE,MSG) ; Update task's status
S $P(^%ZTSK(ZTSK,.1),"^",1,3)=$G(CODE)_U_$H_U_$G(MSG)
Q
;
H3(%) ;Convert $H to seconds.
Q 86400*%+$P(%,",",2)
%ZTM1 ;SEA/RDS-TaskMan: Manager, Part 3 (Validate Task) ;07/27/2005 18:13
+1 ;;8.0;KERNEL;**118,127,275,355**;JUL 10, 1995;Build 9
MAIN ;
+1 ;SCHQ^%ZTM--examine task, determine device and destination, ^%ZTSK(ZTSK) lock at call.
+2 DO LOOKUP
Begin DoDot:1
+3 DO ZIS
IF %ZTREJCT
QUIT
+4 DO VOLUME
IF %ZTREJCT
QUIT
+5 DO UCI
IF %ZTREJCT
QUIT
+6 QUIT
End DoDot:1
DO STORE
+7 ;Un-lock back in %ZTM
QUIT
LOOKUP ;
+1 ;MAIN--Unload Task Variables For Validation
+2 SET %ZTREJCT=0
+3 DO TSKSTAT(2,"Inspected")
+4 SET ZTREC=^%ZTSK(ZTSK,0)
+5 SET ZTREC02=""
SET ZTREC1=$GET(^%ZTSK(ZTSK,.1))
SET ZTREC2=$GET(^%ZTSK(ZTSK,.2))
+6 ;,$P(ZTREC,U,6)=ZTDTH
SET ZTREC21=""
SET ZTREC25=$GET(^%ZTSK(ZTSK,.25))
+7 ;Clear
SET ^%ZTSK(ZTSK,.02)=""
+8 QUIT
+9 ;
ZIS ;MAIN--Determine Output Device
+1 SET ZTIO=$SELECT($PIECE(ZTREC2,U)]"":$PIECE(ZTREC2,U),1:ZTST)
+2 IF ZTIO=""
SET (IO,ZTREC2,ZTREC21,ZTREC25)=""
GOTO ZISX
+3 SET $PIECE(ZTREC2,U)=ZTIO
SET %ZIS="NQRST0"
SET IOP=ZTIO
SET ZTIO(1)=$PIECE(ZTREC2,U,5)
+4 IF ZTIO(1)="DIRECT"
SET %ZIS=%ZIS_"D"
+5 DO ^%ZIS
KILL IO(1)
+6 IF $SELECT($GET(IOT)="VTRM":1,IO="":1,1:POP)
DO REJCT("INVALID OUTPUT DEVICE")
GOTO ZISX
+7 IF IOT="HG"
SET IO=""
+8 ;Check for IO queue at end
+9 SET $PIECE(ZTREC2,U,1,4)=ZTIO_U_IO_U_IOT_U_IOST
+10 ;need IOCPU
IF '$DATA(IOCPU)
SET IOCPU=$PIECE($GET(^%ZIS(1,+$GET(IOS),0)),U,9)
+11 SET ZTREC21=$GET(IOS)
ZISX QUIT
+1 ;
VOLUME ;determine destination volume set
+1 ;device node
SET ZTDVOL(1)=""
SET A=$PIECE($GET(IOCPU),":",2)
+2 SET ZTNODE=$SELECT($LENGTH(A):A,1:$PIECE($PIECE(ZTREC,U,14),":",2))
+3 ;device cpu
SET A=$SELECT(ZTIO="":"",1:$PIECE($GET(IOCPU),":"))
+4 ;Destination
SET ZTDVOL=$SELECT($LENGTH(A):A,1:$PIECE($PIECE(ZTREC,U,14),":"))
+5 ;Creation
SET ZTCVOL=$PIECE(ZTREC,U,12)
SET ZTCVT=$$VSTYP(ZTCVOL)
+6 IF ZTDVOL=""
Begin DoDot:1
+7 IF ZTCVT="C"
SET ZTDVOL=$SELECT(%ZTYPE="P":%ZTVOL,ZTCVOL]"":ZTCVOL,1:%ZTVOL)
SET ZTDVOL(1)=1
QUIT
+8 SET ZTDVOL=$SELECT(ZTCVOL]"":ZTCVOL,1:%ZTVOL)
QUIT
End DoDot:1
+9 SET ZTREC02=U_ZTDVOL_U_ZTNODE_U_ZTDVOL(1)
+10 ;
V1 ;reject tasks with destination volume sets not in Volume Set file
+1 SET ZT1=$ORDER(^%ZIS(14.5,"B",ZTDVOL,""))
+2 IF ZT1=""
DO REJCT("Task's volume set not listed in index.")
QUIT
+3 SET ZTS=$GET(^%ZIS(14.5,ZT1,0))
+4 IF ZTS=""
DO REJCT("Task's volume set not listed in file.")
QUIT
+5 ;
V2 ;lookup type of volume set, and reject tasks to F or O types
+1 SET ZTYPE=$PIECE(ZTS,U,10)
+2 IF ZTYPE="F"!(ZTYPE="O")
DO REJCT("Task's volume set can't accept tasks.")
QUIT
+3 ;
V3 ;accept tasks with the current volume set as the destination
+1 IF ZTDVOL=%ZTVOL
QUIT
+2 ;
V4 ;reject tasks whose destination volume sets lack link access
+1 IF $PIECE(ZTS,U,3)="N"
DO REJCT("Task's volume set has no link access.")
QUIT
+2 QUIT
VSTYP(VS) ;Get a VS's type
+1 IF VS=""
QUIT VS
NEW %
+2 SET %=$ORDER(^%ZIS(14.5,"B",VS,0))
SET %=$GET(^%ZIS(14.5,+%,0))
+3 QUIT $PIECE(%,U,10)
+4 ;
UCI ;MAIN--determine destination UCI
+1 SET ZTUCI=$PIECE($PIECE(ZTREC,U,4),",")
+2 SET ZTUCI=$SELECT(ZTUCI]"":ZTUCI,1:$PIECE(ZTREC,U,11))
+3 ;
+4 ;reject tasks that lack a destination UCI
U1 ;
+1 ;reject tasks with no UCI of origin or requested destination
+2 IF ZTUCI=""
DO REJCT("Task has no destination UCI listed.")
QUIT
U2 ;
+1 ;handle tasks whose destination volume set is the current one
+2 ;if UCI is here, accept the task; if not, reject it
+3 IF ZTDVOL=%ZTVOL
Begin DoDot:1
+4 SET X=ZTUCI_","_ZTDVOL
XECUTE ^%ZOSF("UCICHECK")
+5 IF 0[Y
DO REJCT("Task's UCI does not exist here.")
QUIT
+6 SET ZTUCI=$PIECE(Y,",")
+7 SET $PIECE(ZTREC02,U)=ZTUCI
+8 IF $EXTRACT($PIECE(ZTREC,U,2))'="%"
QUIT
+9 SET X=$PIECE(ZTREC,U,2)
XECUTE ^%ZOSF("TEST")
+10 IF $TEST
QUIT
+11 DO REJCT("Task's entry routine does not exist here.")
+12 QUIT
End DoDot:1
QUIT
U3 ;
+1 ;accept tasks whose dest. UCIs are listed under their dest. volume sets
+2 IF $ORDER(^%ZIS(14.6,"AV",ZTDVOL,ZTUCI,""))
SET $PIECE(ZTREC02,U)=ZTUCI
QUIT
U4 ;
+1 ;otherwise, the destination UCI must be a valid one here...
+2 SET X=ZTUCI
XECUTE ^%ZOSF("UCICHECK")
+3 IF 0[Y
DO REJCT("Task's destination UCI failed check.")
QUIT
U5 ;
+1 ;...and it must be changed to the associated UCI over there
+2 SET ZT1=$ORDER(^%ZIS(14.6,"AT",ZTUCI,%ZTVOL,ZTDVOL,""))
+3 IF ZT1]""
SET ZTUCI=ZT1
+4 SET $PIECE(ZTREC02,U)=ZTUCI
+5 QUIT
+6 ;
STORE ;Store Validated Data In Task Log, Quit If Needn't Do WAIT
+1 ;Rejected
IF %ZTREJCT
SET $PIECE(ZTREC1,U,1,2)="B^"_$HOROLOG
+2 IF $DATA(^%ZTSK(ZTSK,0))[0
DO TSKSTAT("I")
SET %ZTREJCT=1
QUIT
+3 SET ^%ZTSK(ZTSK,0)=ZTREC
+4 SET ^%ZTSK(ZTSK,.02)=ZTREC02
+5 SET ^%ZTSK(ZTSK,.1)=$PIECE(ZTREC1,U,1,9)_U_$PIECE(^(.1),U,10,11)
+6 SET ^%ZTSK(ZTSK,.2)=ZTREC2
SET ^(.21)=ZTREC21
SET ^(.25)=ZTREC25
+7 KILL %ZTF,IOCPU
+8 IF ZTIO=""
QUIT
+9 IF %ZTREJCT
QUIT
+10 IF ZTDVOL'=%ZTVOL
QUIT
+11 IF IOT'="TRM"
IF IOT'="RES"
QUIT
+12 IF $DATA(^%ZTSCH("IO",IO))>9
DO IOWAIT
+13 KILL X,Y
+14 QUIT
+15 ;
IOWAIT ;If Device has a queue, Put Task On IO Queue.
+1 SET %ZTREJCT=1
DO TSKSTAT("A","Put On The IO List")
+2 SET %ZTIO=IO
SET ZTIOS=ZTREC21
SET ZTIOT=IOT
+3 DO NQ^%ZTM4
+4 QUIT
+5 ;
REJCT(MSG) ;Save reject msg, set flag
+1 SET %ZTREJCT=1
SET $PIECE(ZTREC1,U,3)=MSG
+2 IF $GET(DUZ)>.9
Begin DoDot:1
+3 NEW XQA,XQAMSG,XQADATA,XQAROU,ZTUCI
+4 SET XQA(DUZ)=""
SET XQAMSG="Your task #"_ZTSK_" rejected because: "_MSG
SET XQADATA=ZTSK
SET XQAROU="XQA^XUTMUTL"
+5 SET ZTUCI=$PIECE($PIECE(ZTREC,U,4),",")
SET ZTUCI=$SELECT(ZTUCI]"":ZTUCI,1:$PIECE(ZTREC,U,11))
+6 NEW ZTSK,ZTIO,ZTDTH,ZTCPU,ZTREC
+7 SET ZTRTN="ALERT^%ZTMS4"
SET ZTDTH=$HOROLOG
SET ZTIO=""
SET ZTSAVE("XQA*")=""
+8 DO ^%ZTLOAD
QUIT
End DoDot:1
+9 QUIT
+10 ;
TSKSTAT(CODE,MSG) ; Update task's status
+1 SET $PIECE(^%ZTSK(ZTSK,.1),"^",1,3)=$GET(CODE)_U_$HOROLOG_U_$GET(MSG)
+2 QUIT
+3 ;
H3(%) ;Convert $H to seconds.
+1 QUIT 86400*%+$PIECE(%,",",2)