| 1 | LA7CHKF ;DALOI/JMC - Check Lab Messaging File Integrity ; 2/26/97 11:00
 | 
|---|
| 2 |  ;;5.2;AUTOMATED LAB INSTRUMENTS;**27,46**;Sep 27, 1994
 | 
|---|
| 3 |  ;This routine checks file integrity for Lab Messaging.
 | 
|---|
| 4 | EN ; Run an integrity check
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 | 
|---|
| 7 |  N LA7FIX,LA7ION,LA7LOG,LA7QUIT
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  S LA7LOG=1
 | 
|---|
| 10 |  S DIR(0)="SO^1:Check File Integrity;2:Fix File Entries"
 | 
|---|
| 11 |  S DIR("A")="Select Option",DIR("B")=1
 | 
|---|
| 12 |  D ^DIR
 | 
|---|
| 13 |  I $D(DIRUT) Q
 | 
|---|
| 14 |  I Y=1 S LA7FIX=0
 | 
|---|
| 15 |  I Y=2 S LA7FIX=1
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  K DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 | 
|---|
| 18 |  S DIR(0)="YO",DIR("A")="Print Report",DIR("B")="YES",DIR("?")="Enter 'YES' to print the integrity report."
 | 
|---|
| 19 |  D ^DIR
 | 
|---|
| 20 |  I $D(DIRUT) Q
 | 
|---|
| 21 |  I Y=1 D
 | 
|---|
| 22 |  . N %ZIS
 | 
|---|
| 23 |  . S %ZIS="NQ0",%ZIS("A")="Select Device: ",%ZIS("B")=""
 | 
|---|
| 24 |  . D ^%ZIS
 | 
|---|
| 25 |  . I POP S LA7QUIT=1
 | 
|---|
| 26 |  . S LA7ION=ION
 | 
|---|
| 27 |  I $G(LA7QUIT) D HOME^%ZIS Q
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  S ZTRTN="DQ^LA7CHKF",ZTDESC="Lab Messaging File Integrity Checker"
 | 
|---|
| 30 |  S ZTSAVE("LA7*")="",ZTIO=""
 | 
|---|
| 31 |  D ^%ZTLOAD,HOME^%ZIS
 | 
|---|
| 32 |  W !,"Request ",$S($G(ZTSK):"",1:"NOT "),"Queued"
 | 
|---|
| 33 |  Q
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 | DQ ; Entry point from taskman
 | 
|---|
| 36 |  D IC
 | 
|---|
| 37 |  Q
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 | IC ; File 62.49 Integrity checker and fix-er-upper.
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; Check that all the cross-references have entries
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  N LA7CFG,LA7DA,LA7DAT,LA7ECNT,LA7IC,LA7INAME,LA7Q,LA7ROOT,X,Y
 | 
|---|
| 44 |  S LA7FIX=$G(LA7FIX,0) ; Set flag to fix problems 1=yes, 0=just check (default)
 | 
|---|
| 45 |  S LA7LOG=$G(LA7LOG,0) ; Set flag to report problems, 1=yes, 0=no (default)
 | 
|---|
| 46 |  I LA7LOG D
 | 
|---|
| 47 |  . F  S LA7IC="LA7IC^"_$$NOW^XLFDT L +^XTMP(LA7IC):9999 Q:'$D(^XTMP(LA7IC))  L -^XTMP(LA7IC) H 1
 | 
|---|
| 48 |  . S DT=$$DT^XLFDT
 | 
|---|
| 49 |  . S ^XTMP(LA7IC,0)=$$FMADD^XLFDT(DT,7)_"^"_DT_"^Lab Messaging Integrity Checker"_"^"_$$NOW^XLFDT
 | 
|---|
| 50 |  S LA7ECNT=0 ; Count of number of errors
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 |  ; Check the "AD" cross-reference
 | 
|---|
| 53 |  S LA7ROOT="^LAHM(62.49,""AD"")"
 | 
|---|
| 54 |  F  S LA7ROOT=$Q(LA7ROOT) Q:LA7ROOT=""  Q:$QS(LA7ROOT,1)'=62.49!($QS(LA7ROOT,2)'="AD")  D
 | 
|---|
| 55 |  . S LA7DAT=$QS(LA7ROOT,3),LA7DA=$QS(LA7ROOT,4)
 | 
|---|
| 56 |  . I '$$LOCK(LA7DA) Q
 | 
|---|
| 57 |  . I LA7DAT'=$P($P($G(^LAHM(62.49,LA7DA,0)),"^",5),".") D
 | 
|---|
| 58 |  . . I LA7FIX K @LA7ROOT
 | 
|---|
| 59 |  . . I LA7LOG D LOG("Bad ""AD"" cross-reference of "_LA7ROOT_" for entry "_LA7DA)
 | 
|---|
| 60 |  . D UNLOCK(LA7DA)
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ; Check the "B" cross-reference
 | 
|---|
| 63 |  S LA7ROOT="^LAHM(62.49,""B"")"
 | 
|---|
| 64 |  F  S LA7ROOT=$Q(@LA7ROOT) Q:LA7ROOT=""  Q:$QS(LA7ROOT,1)'=62.49!($QS(LA7ROOT,2)'="B")  D
 | 
|---|
| 65 |  . S LA7DA=$QS(LA7ROOT,4)
 | 
|---|
| 66 |  . I '$$LOCK(LA7DA) Q
 | 
|---|
| 67 |  . I LA7DA'=$QS(LA7ROOT,3) D
 | 
|---|
| 68 |  . . I LA7FIX K @LA7ROOT
 | 
|---|
| 69 |  . . I LA7LOG D LOG("""B"" cross-reference "_LA7ROOT_" points to incorrect entry "_$QS(LA7ROOT,4))
 | 
|---|
| 70 |  . I '$D(^LAHM(62.49,LA7DA,0)) D
 | 
|---|
| 71 |  . . I LA7FIX K @LA7ROOT
 | 
|---|
| 72 |  . . I LA7LOG D LOG("""B"" cross-reference "_LA7ROOT_" points to missing entry "_LA7DA)
 | 
|---|
| 73 |  . D UNLOCK(LA7DA)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; Check the "C" cross-reference
 | 
|---|
| 76 |  S LA7ROOT="^LAHM(62.49,""C"")"
 | 
|---|
| 77 |  F  S LA7ROOT=$Q(@LA7ROOT) Q:LA7ROOT=""  Q:$QS(LA7ROOT,1)'=62.49!($QS(LA7ROOT,2)'="C")  D
 | 
|---|
| 78 |  . S LA7INAME=$QS(LA7ROOT,3),LA7DA=$QS(LA7ROOT,4)
 | 
|---|
| 79 |  . I '$$LOCK(LA7DA) Q
 | 
|---|
| 80 |  . I LA7INAME'=$E($P($G(^LAHM(62.49,LA7DA,0)),"^",6),1,30) D
 | 
|---|
| 81 |  . . I LA7FIX K @LA7ROOT
 | 
|---|
| 82 |  . . I LA7LOG D LOG("Bad ""C"" cross-reference of "_LA7ROOT_" on entry "_LA7DA)
 | 
|---|
| 83 |  . D UNLOCK(LA7DA)
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  ; Check the "Q" cross-reference
 | 
|---|
| 86 |  S LA7ROOT="^LAHM(62.49,""Q"")"
 | 
|---|
| 87 |  F  S LA7ROOT=$Q(@LA7ROOT) Q:LA7ROOT=""  Q:$QS(LA7ROOT,1)'=62.49!($QS(LA7ROOT,2)'="Q")  D
 | 
|---|
| 88 |  . S LA7CFG=$QS(LA7ROOT,3)
 | 
|---|
| 89 |  . S LA7Q=$QS(LA7ROOT,4)
 | 
|---|
| 90 |  . S LA7DA=$QS(LA7ROOT,5)
 | 
|---|
| 91 |  . I '$$LOCK(LA7DA) Q
 | 
|---|
| 92 |  . S X(0)=$G(^LAHM(62.49,LA7DA,0))
 | 
|---|
| 93 |  . S X(.5)=$G(^LAHM(62.49,LA7DA,.5))
 | 
|---|
| 94 |  . I LA7CFG'=$P(X(.5),"^")!(LA7Q'=($P(X(0),"^",2)_$P(X(0),"^",3))) D
 | 
|---|
| 95 |  . . I LA7LOG D LOG("Bad ""Q"" cross-reference of "_LA7ROOT_" for entry: "_LA7DA)
 | 
|---|
| 96 |  . . I LA7FIX K @LA7ROOT
 | 
|---|
| 97 |  . D UNLOCK(LA7DA)
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 |  ; Check that all entries have "AD" cross-reference set.
 | 
|---|
| 100 |  ;                              "B" cross-reference set
 | 
|---|
| 101 |  ;                              "C" cross-reference set
 | 
|---|
| 102 |  ;                              "Q" cross-reference set
 | 
|---|
| 103 |  S (LA7DA,LA7TCNT)=0
 | 
|---|
| 104 |  F  S LA7DA=$O(^LAHM(62.49,LA7DA)) Q:'LA7DA  D
 | 
|---|
| 105 |  . I '$$LOCK(LA7DA) Q
 | 
|---|
| 106 |  . S LA7TCNT=LA7TCNT+1 ; Count of entries in file.
 | 
|---|
| 107 |  . S X(0)=$G(^LAHM(62.49,LA7DA,0))
 | 
|---|
| 108 |  . S X(.5)=$G(^LAHM(62.49,LA7DA,.5))
 | 
|---|
| 109 |  . S Y=$P(X(0),"^") ; Message number (.01 field)
 | 
|---|
| 110 |  . I 'Y D
 | 
|---|
| 111 |  . . I LA7FIX K ^LAHM(62.49,LA7DA)
 | 
|---|
| 112 |  . . I LA7LOG D LOG("Entry "_LA7DA_" missing .01 field")
 | 
|---|
| 113 |  . S Y=$P(X(0),"^",5) ; date/time entered
 | 
|---|
| 114 |  . I Y,'$D(^LAHM(62.49,"AD",$P(Y,"."),LA7DA)) D
 | 
|---|
| 115 |  . . I LA7FIX S ^LAHM(62.49,"AD",$P(Y,"."),LA7DA)=""
 | 
|---|
| 116 |  . . I LA7LOG D LOG("Entry "_LA7DA_" missing ""AD"" cross-reference "_$P(Y,"."))
 | 
|---|
| 117 |  . S Y=$P(X(0),"^")
 | 
|---|
| 118 |  . I Y,'$D(^LAHM(62.49,"B",Y,LA7DA)) D
 | 
|---|
| 119 |  . . I LA7FIX S ^LAHM(62.49,"B",Y,LA7DA)=""
 | 
|---|
| 120 |  . . I LA7LOG D LOG("Entry "_LA7DA_" missing ""B"" cross-reference")
 | 
|---|
| 121 |  . S Y=$P(X(0),"^",6) ; instrument name
 | 
|---|
| 122 |  . I $L(Y),'$D(^LAHM(62.49,"C",$E(Y,1,30),LA7DA)) D
 | 
|---|
| 123 |  . . I LA7FIX S ^LAHM(62.49,"C",$E(Y,1,30),LA7DA)=""
 | 
|---|
| 124 |  . . I LA7LOG D LOG("Entry "_LA7DA_" missing ""C"" cross-reference "_Y)
 | 
|---|
| 125 |  . S Y=$P(X(0),"^",2)_$P(X(0),"^",3) ; concatentate configuration_status
 | 
|---|
| 126 |  . I +X(.5),$L(Y),'$D(^LAHM(62.49,"Q",+X(.5),Y,LA7DA)) D
 | 
|---|
| 127 |  . . I LA7FIX S ^LAHM(62.49,"Q",+X(.5),Y,LA7DA)=""
 | 
|---|
| 128 |  . . I LA7LOG D LOG("Entry "_LA7DA_" missing ^LAHM(62.49,""Q"","_+X(.5)_","""_Y_""","_LA7DA_") cross-reference")
 | 
|---|
| 129 |  . D UNLOCK(LA7DA)
 | 
|---|
| 130 |  I LA7LOG D
 | 
|---|
| 131 |  . S $P(^XTMP(LA7IC,0),"^",5)=$$NOW^XLFDT ; End date/time
 | 
|---|
| 132 |  . S $P(^XTMP(LA7IC,0),"^",6,7)=LA7TCNT_"^"_LA7ECNT ; Total^Error count
 | 
|---|
| 133 |  . L -^XTMP(LA7IC) ; Release lock
 | 
|---|
| 134 |  I LA7ECNT D
 | 
|---|
| 135 |  . N XQA,XQAID,XQADATA,XQAMSG,XQAOPT,XQAROU
 | 
|---|
| 136 |  . S XQAMSG="Lab Messaging -Warning- "_LA7ECNT_" errors found in File #62.49, LA7 MESSAGE QUEUE."
 | 
|---|
| 137 |  . I LA7LOG S XQADATA=LA7IC,XQAROU="DISIC^LA7UXQA"
 | 
|---|
| 138 |  . S XQAID="LA7ERR-"_$TR(LA7IC,"^",":")
 | 
|---|
| 139 |  . I $G(DUZ)>.9 S XQA(DUZ)=""
 | 
|---|
| 140 |  . S XQA("G.LAB MESSAGING")=""
 | 
|---|
| 141 |  . D SETUP^XQALERT
 | 
|---|
| 142 |  I $L($G(LA7ION)) D  ; Task print of integrity report
 | 
|---|
| 143 |  . N ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSK
 | 
|---|
| 144 |  . S ZTRTN="DQ^LA7CHKFP",ZTDTH=$H,ZTSAVE("LA7IC")="",ZTIO=LA7ION
 | 
|---|
| 145 |  . S ZTDESC="Print LA7 File Integrity Report"
 | 
|---|
| 146 |  . D ^%ZTLOAD
 | 
|---|
| 147 |  K LA7FIX,LA7ION,LA7LOG
 | 
|---|
| 148 |  Q
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 | LOG(X) ; Log error in XTMP global.
 | 
|---|
| 151 |  ; Call with X = error message to store.
 | 
|---|
| 152 |  S LA7ECNT=$G(LA7ECNT)+1
 | 
|---|
| 153 |  S ^XTMP(LA7IC,LA7ECNT)=X
 | 
|---|
| 154 |  Q
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 | LOCK(LA7DA) ; Lock entry in #62.49
 | 
|---|
| 157 |  ; Call with LA7DA = entry to lock
 | 
|---|
| 158 |  ; Returns       0 = failure to obtain lock
 | 
|---|
| 159 |  ;               1 = lock obtained
 | 
|---|
| 160 |  N LA7Y
 | 
|---|
| 161 |  S LA7Y=0,LA7DA=+$G(LA7DA)
 | 
|---|
| 162 |  L +^LAHM(62.49,LA7DA):10
 | 
|---|
| 163 |  I $T S LA7Y=1
 | 
|---|
| 164 |  I 'LA7Y,$G(LA7LOG) D LOG("Unable to obtain lock on entry "_LA7DA_" in file #62.49")
 | 
|---|
| 165 |  Q LA7Y
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 | UNLOCK(LA7DA) ; Unlock entry in #62.49
 | 
|---|
| 168 |  ; Call with LA7DA = entry to lock
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  S LA7DA=+$G(LA7DA)
 | 
|---|
| 171 |  L -^LAHM(62.49,LA7DA)
 | 
|---|
| 172 |  Q
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 | LACHK() ; Check ^LA("ADL","Q") for build up of entries.
 | 
|---|
| 175 |  ; Send alert to mail group LAB MESSAGING warning about large # of entries.
 | 
|---|
| 176 |  N LA7CNT,LA7DA,X,Y
 | 
|---|
| 177 |  S LA7DA="",LA7CNT=0
 | 
|---|
| 178 |  F  S LA7DA=$O(^LA("ADL","Q",LA7DA)) Q:LA7DA=""  S LA7CNT=LA7CNT+1
 | 
|---|
| 179 |  I LA7CNT>500 D
 | 
|---|
| 180 |  . N XQA,XQAID,XQADATA,XQAMSG,XQAOPT,XQAROU
 | 
|---|
| 181 |  . S XQAMSG="Lab Messaging -Warning- "_LA7CNT_" entries in LA(""ADL"",""Q"") global - please check."
 | 
|---|
| 182 |  . S XQAID="LA7ADL-"_$H
 | 
|---|
| 183 |  . I $G(DUZ)>.9 S XQA(DUZ)=""
 | 
|---|
| 184 |  . S XQA("G.LAB MESSAGING")=""
 | 
|---|
| 185 |  . D SETUP^XQALERT
 | 
|---|
| 186 |  Q LA7CNT
 | 
|---|