Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: A1VSRFL1

A1VSRFL1.m

Go to the documentation of this file.
  1. A1VSRFL1 ;Albany FO/GTS - VistA Package Sizing Manager; 21-OCT-2016
  1. ;;1.0;VistA Package Sizing;;Oct 10, 2016;Build 25
  1. ;
  1. ;;Variable glosary (local, for each package)
  1. ;; PKGIEN = Package IEN
  1. ;; PKGNAME = Package NAME (.01 - $P(^(0),"^",1))
  1. ;; PKGPFX = Package PREFIX / NAMESPACE (1 - $P(^(0),"^",2))
  1. ;;
  1. ;; RTOT = total ROUTINEs
  1. ;; TLCNT = total SIZE of all ROUTINES
  1. ;; FTOT = total FILEs
  1. ;; FLDTOT = total FIELDs of all FILES (Future: TBD)
  1. ;; OTOT = total OPTIONs (^DIC(19,)
  1. ;; PRCTOT = total PROTOCOLs (^ORD(101,)
  1. ;; RPTOT = total REMOTE PROCEDUREs (^XWB(8994,)
  1. ;; TPLTTOT = total Fileman Templates
  1. ;
  1. ONERPT(PKGNAME,VALMCNT) ; Report a single package
  1. ;;INPUT:
  1. ; VALMCNT - Current Node # on ListMan ^TMP("A1VS PKG MGR RPT",$JOB) global
  1. ; PKGNAME - Package name to report
  1. ;
  1. N Q,PCENUM,ADP,RDP,FTOT,RTOT,OTOT,PRCTOT,RPTOT,TPLTTOT,PKGIEN,PKGPFX,RNDT,TLCNT
  1. N PARMDAT,PARMDAT3,PARMDAT4,PARMDAT7,PARMDAT8
  1. D FULL^VALM1
  1. IF '$D(^DIC(9.4,"B",PKGNAME)) W !!,"Selected package is not defined on this VistA Instance. Unable to continue."
  1. SET PKGIEN=$O(^DIC(9.4,"B",PKGNAME,""))
  1. S PKGPFX=$G(^TMP("A1VS-PARAM-CAP",$J,PKGNAME,2,"Primary Prefix"))
  1. I PKGPFX="" W !!,"PREFIX not found for package selected. Unable to continue." Q
  1. ;
  1. SET PARMDAT=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,5,"Additional Prefixes")
  1. S (ADP,Q,PCENUM)=0
  1. FOR SET PCENUM=PCENUM+1 SET Q=$P(PARMDAT,"|",PCENUM) Q:Q="" SET ADP=ADP+1 SET ADP(ADP)=Q
  1. ;
  1. SET PARMDAT=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,6,"Excepted Prefixes")
  1. S (RDP,Q,PCENUM)=0
  1. FOR SET PCENUM=PCENUM+1 SET Q=$P(PARMDAT,"|",PCENUM) Q:Q="" SET RDP=RDP+1 SET RDP(RDP)=Q
  1. ;
  1. W !,"...counting...",!," ...files..."
  1. SET PARMDAT3=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,3,"*Lowest File#")
  1. SET PARMDAT4=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,4,"*Highest File#")
  1. SET PARMDAT7=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,7,"File Numbers")
  1. SET PARMDAT8=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,8,"File Ranges")
  1. SET FTOT=$$COUNTFLS(PKGPFX,PARMDAT3,PARMDAT4,PARMDAT7,PARMDAT8) ; Count Files
  1. ;
  1. W !," ...routines..."
  1. S TLCNT=0,RTOT=$$ROUTINE(PKGPFX,.TLCNT)
  1. I ADP F Q=1:1:ADP I ADP(Q)'="" S RTOT=RTOT+$$ROUTINE(ADP(Q),.TLCNT) ; Count Routines
  1. ;
  1. W !," ...options..."
  1. S OTOT=$$OPTION(PKGPFX)
  1. I ADP F Q=1:1:ADP I ADP(Q)'="" S OTOT=OTOT+$$OPTION(ADP(Q)) ;Count Options
  1. ;
  1. S PRCTOT=$$PROTOCOL(PKGPFX,PKGIEN)
  1. I ADP F Q=1:1:ADP I ADP(Q)'="" S PRCTOT=PRCTOT+$$PROTOCOL(ADP(Q),PKGIEN) ;Count Protocols
  1. ;
  1. W !," ...remote procedures..."
  1. S RPTOT=0
  1. D CNTR("^XWB(8994,",.RPTOT,PKGPFX,PKGNAME,.RDP,.ADP) ;Count Remote Procedure Calls
  1. ;
  1. W !," ...edit, print, & sort templates..."
  1. S TPLTTOT=0
  1. D CNTR("^DIPT(",.TPLTTOT,PKGPFX,PKGNAME,.RDP,.ADP) ;Count Print Templates
  1. D CNTR("^DIBT(",.TPLTTOT,PKGPFX,PKGNAME,.RDP,.ADP) ;Count Sort Templates
  1. D CNTR("^DIE(",.TPLTTOT,PKGPFX,PKGNAME,.RDP,.ADP) ;Count Input Templates
  1. ;
  1. DO ADD^A1VSLAPI(.VALMCNT," ")
  1. DO ADD^A1VSLAPI(.VALMCNT," VistA Application Sizing Information",1,3,36)
  1. DO NOW^%DTC S Y=X D DD^%DT
  1. SET RNDT=Y
  1. DO ADD^A1VSLAPI(.VALMCNT,"Run Date: "_RNDT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"VistA Application: "_PKGNAME)
  1. DO ADD^A1VSLAPI(.VALMCNT,"==================")
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Routines: "_RTOT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Size of Routines: "_TLCNT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Files: "_FTOT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Fields: TBD")
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Options: "_OTOT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Protocols: "_PRCTOT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of RPCs: "_RPTOT)
  1. DO ADD^A1VSLAPI(.VALMCNT,"Number of Templates: "_TPLTTOT)
  1. QUIT
  1. ;
  1. COUNTFLS(PKGPFX,LINE3,LINE4,LINE7,LINE8) ;Count total # of files for a package
  1. ; LINE3=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,3,"*Lowest File#")
  1. ; LINE4=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,4,"*Highest File#")
  1. ; LINE7=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,7,"File Numbers")
  1. ; LINE8=^TMP("A1VS-PARAM-CAP",$J,PKGNAME,8,"File Ranges")
  1. ;
  1. NEW FNDFLDAT,FILELIST,PCENUM,FLERNG,STRTFNUM,ENDFNUM,FTOT,FNUM
  1. SET (FTOT,FNDFLDAT)=0
  1. ;
  1. ; 1st look for delimited list of file ranges, if exists count it only
  1. SET FILELIST=LINE8
  1. IF FILELIST'="" DO
  1. . SET FNDFLDAT=1
  1. . SET PCENUM=0
  1. . FOR SET PCENUM=PCENUM+1 SET FLERNG=$P(FILELIST,"|",PCENUM) QUIT:FLERNG']"" DO
  1. .. SET STRTFNUM=+$P(FLERNG,"-")
  1. .. SET ENDFNUM=+$P(FLERNG,"-",2)
  1. .. IF +STRTFNUM>0,+ENDFNUM>0 SET FTOT=FTOT+$$FLECNT(STRTFNUM,ENDFNUM)
  1. ;
  1. ; 2nd if no list of file ranges, look files between Lowest and Highest file number range
  1. IF 'FNDFLDAT,PKGPFX'="XU" DO
  1. . NEW STRTFNUM,ENDFNUM,FNUM,FILENAME
  1. . SET STRTFNUM=LINE3
  1. . SET ENDFNUM=LINE4
  1. . IF +STRTFNUM>0,+ENDFNUM>0 SET FNDFLDAT=1 SET FTOT=FTOT+$$FLECNT(STRTFNUM,ENDFNUM)
  1. ;
  1. ; 3rd if no list of file ranges & no High/Low file range, count files in File list data element
  1. SET FILELIST=LINE7
  1. IF 'FNDFLDAT,FILELIST'="" DO
  1. . SET FNDFLDAT=1
  1. . SET PCENUM=0
  1. . FOR SET PCENUM=PCENUM+1 SET FNUM=$P(FILELIST,"|",PCENUM) QUIT:FNUM']"" SET FTOT=FTOT+1
  1. QUIT FTOT
  1. ;
  1. ROUTINE(PKGPFX,TLCNT,RDP,ADP) ; Returns total of all characters in all routines
  1. ; ...Including line feeds on each line of each routine in characters counted
  1. ; Input - PKGPFX : Prefix for routine in package
  1. ; - TLCNT : Sum of routine sizes in package
  1. ; - RDP : Removed (Excepted) Prefixes
  1. ; - ADP : Additional Prefixes
  1. ;
  1. ; Output - TLCNT : Sum of routine sizes incremented by routines in PKGPFX
  1. ;
  1. NEW CNT,LPPFX,PFXLN,X,ADPFXLN,ADPFX
  1. SET PFXLN=$L(PKGPFX)
  1. SET CNT=0
  1. SET LPPFX=""
  1. DO RTNLST(PKGPFX,"^TMP(""A1VS"",""RTNLST"""_","_$J_")") ;Create global of Routines with Primary Prefix
  1. FOR SET LPPFX=$ORDER(^TMP("A1VS","RTNLST",$J,LPPFX)) QUIT:LPPFX="" QUIT:($E(LPPFX,1,PFXLN)'=PKGPFX) DO
  1. .IF $$RDPCK(LPPFX,.RDP) DO
  1. .. SET X=LPPFX
  1. .. X ^%ZOSF("TEST") IF $T SET TLCNT=TLCNT+$$RSIZE(LPPFX) SET CNT=CNT+1
  1. KILL ^TMP("A1VS","RTNLST",$J)
  1. ;
  1. SET ADPFX=""
  1. FOR SET ADPFX=$O(ADP(ADPFX)) Q:ADPFX="" DO
  1. . SET ADPFXLN=$L(ADPFX)
  1. . DO RTNLST(ADPFX,"^TMP(""A1VS"",""RTNLST"""_","_$J_")") ;Create global of Routines with Additional Prefix
  1. . FOR SET LPPFX=$ORDER(^TMP("A1VS","RTNLST",$J,LPPFX)) QUIT:LPPFX="" QUIT:($E(LPPFX,1,ADPFXLN)'=ADPFX) DO
  1. .. IF ($E(LPPFX,1,PFXLN)'=PKGPFX),($$RDPCK(LPPFX,.RDP)) DO
  1. ... SET X=LPPFX
  1. ... X ^%ZOSF("TEST") IF $T SET TLCNT=TLCNT+$$RSIZE(LPPFX) SET CNT=CNT+1
  1. . KILL ^TMP("A1VS","RTNLST",$J)
  1. QUIT CNT
  1. ;
  1. RTNLST(PREFIX,RTNLIST) ; Create RTNLIST of routines in PREFIX namespace
  1. NEW RTNS,RTNNAME
  1. SET RTNS=##class(%ResultSet).%New("%Routine:RoutineList") ;Create Routine Query Class instance
  1. DO RTNS.Execute(PREFIX_"*.INT") ;Query Routines
  1. FOR Q:'RTNS.Next() SET RTNNAME=$P(RTNS.GetData(1),".") SET @RTNLIST@(RTNNAME)=""
  1. QUIT
  1. ;
  1. RDPCK(LPPFX,RDP) ;Check for excepted PREFIX [Result=0 when Excepted]
  1. N RESULT,RPFX,RPFXLN
  1. S RESULT=1
  1. S RPFX=""
  1. FOR SET RPFX=$O(RDP(RPFX)) Q:RPFX="" Q:'RESULT DO
  1. . SET RPFXLN=$L(RPFX)
  1. . IF $E(LPPFX,1,RPFXLN)=RPFX SET RESULT=0
  1. Q RESULT
  1. ;
  1. FLECNT(STRTFNUM,ENDFNUM) ; Count Files
  1. NEW FCNT,FNUM
  1. SET FCNT=0
  1. SET FNUM=$O(^DIC(STRTFNUM),-1)
  1. FOR SET FNUM=$O(^DIC(FNUM)) Q:'FNUM Q:'FNUM Q:FNUM>ENDFNUM DO
  1. . KILL VPSFAT
  1. . SET FILENAME=$P($G(^DIC(FNUM,0)),"^")
  1. . IF FILENAME]"" S FCNT=FCNT+1
  1. KILL VPSFAT
  1. Q FCNT
  1. ;
  1. PROTOCOL(PKGPFX,PKGIEN,RDP,ADP) ; Count Protocols
  1. NEW LPPFX,PFXLN,ADPFXLN,ADPFX,CNT,ORDIEN
  1. SET PFXLN=$L(PKGPFX)
  1. SET CNT=0
  1. SET LPPFX=""
  1. IF '$D(PGKIEN) SET PKGIEN=0
  1. IF $D(PKGIEN),(PKGIEN="") SET PKGIEN=0
  1. FOR SET LPPFX=$O(^ORD(101,"B",LPPFX)) QUIT:LPPFX="" SET ORDIEN=$O(^ORD(101,"B",LPPFX,"")) QUIT:ORDIEN="" DO
  1. . IF $P($G(^ORD(101,ORDIEN,0)),"^",12)=PKGIEN SET CNT=CNT+1
  1. . IF $E(LPPFX,1,PFXLN)=PKGPFX,$$RDPCK(LPPFX,.RDP) DO
  1. .. IF ($P($G(^ORD(101,ORDIEN,0)),"^",12)'=PKGIEN) S CNT=CNT+1
  1. .;
  1. . IF ($E(LPPFX,1,PFXLN)'=PKGPFX),($P($G(^ORD(101,ORDIEN,0)),"^",12)'=PKGIEN) DO
  1. .. SET ADPFX=""
  1. .. FOR SET ADPFX=$O(ADP(ADPFX)) QUIT:ADPFX="" DO
  1. ... SET ADPFXLN=$L(ADPFX)
  1. ... IF $E(LPPFX,1,ADPFXLN)=ADPFX,$$RDPCK(LPPFX,.RDP) SET CNT=CNT+1
  1. ;
  1. Q CNT
  1. ;
  1. CNTR(TMPGLB,CNT,PKGPFX,PKGNAME,RDP,ADP) ;Count Templates & RPCs
  1. NEW LPPFX,PFXLN,TMPLTPFX,PFXEXT,PFXANLYS,PFXAVAIL
  1. SET PFXLN=$L(PKGPFX)
  1. SET LPPFX=$O(@(TMPGLB_"""B"","""_PKGPFX_""")"),-1)
  1. FOR SET LPPFX=$O(@(TMPGLB_"""B"","""_LPPFX_""")")) Q:$E(LPPFX,1,PFXLN)'=PKGPFX DO
  1. .SET TMPLTPFX=LPPFX
  1. .SET:TMPLTPFX[" " TMPLTPFX=$P(TMPLTPFX," ")
  1. .IF $L(TMPLTPFX)=PFXLN SET CNT=CNT+1
  1. .IF $L(TMPLTPFX)>PFXLN,('$D(^TMP("A1VS-PREFIX-IDX",$J,PKGNAME,TMPLTPFX))),('$D(^TMP("A1VS-FORUM-PFXS",$J,TMPLTPFX))) DO
  1. ..; Prefix starts with PKGPFX, is not part of another package's main prefix, and is not the current package
  1. .. SET PFXAVAIL=1
  1. .. SET PFXANLYS=PKGPFX
  1. .. FOR PFXEXT=PFXLN+1:1 Q:($E(TMPLTPFX,PFXEXT)'?1AN) Q:'PFXAVAIL SET PFXANLYS=PFXANLYS_$E(TMPLTPFX,PFXEXT) DO
  1. ... IF ($D(^TMP("A1VS-FORUM-PFXS",$J,PFXANLYS))),'$$RDPCK(PFXANLYS,.RDP) SET PFXAVAIL=0 ;Parsed prefix belongs to other package or excluded from current pkg
  1. .. IF PFXAVAIL SET CNT=CNT+1
  1. QUIT
  1. ;
  1. OPTION(PKGPFX,PKGNME,RDP) ;Count Options
  1. ;
  1. NEW CNT,LPPFX,PFXLN,OPTPFX,PFXEXT,PFXANLYS,PFXAVAIL
  1. SET PFXLN=$L(PKGPFX)
  1. SET CNT=0
  1. SET LPPFX=$O(^DIC(19,"B",PKGPFX),-1)
  1. FOR SET LPPFX=$O(^DIC(19,"B",LPPFX)) Q:$E(LPPFX,1,PFXLN)'=PKGPFX DO
  1. .SET OPTPFX=LPPFX
  1. .SET:OPTPFX[" " OPTPFX=$P(OPTPFX," ")
  1. .IF $L(OPTPFX)=PFXLN SET CNT=CNT+1
  1. .IF $L(OPTPFX)>PFXLN,('$D(^TMP("A1VS-PREFIX-IDX",$J,PKGNAME,OPTPFX))),('$D(^TMP("A1VS-FORUM-PFXS",$J,OPTPFX))) DO
  1. ..; Prefix starts with PKGPFX, is not part of another package, or the current package
  1. .. SET PFXAVAIL=1
  1. .. SET PFXANLYS=PKGPFX
  1. .. FOR PFXEXT=PFXLN+1:1 Q:($E(OPTPFX,PFXEXT)'?1AN) Q:'PFXAVAIL SET PFXANLYS=PFXANLYS_$E(OPTPFX,PFXEXT) DO
  1. ... IF ($D(^TMP("A1VS-FORUM-PFXS",$J,PFXANLYS))),'$$RDPCK(PFXANLYS,.RDP) SET PFXAVAIL=0 ;Parsed prefix belongs to other package or excluded from current pkg
  1. .. IF PFXAVAIL SET CNT=CNT+1
  1. Q CNT
  1. ;
  1. ; - NOTE: Check for Primary Prefix (=1) will count DVBC for COMP & PEN package but NOT AMIE.
  1. MULTX(APFX,PKGNAME) ; Return indication of Multiple packages using same prefix
  1. ;Prevent Primary prefix from double counting as added prefix
  1. NEW RESULT,LPPKG
  1. SET RESULT=1
  1. SET LPPKG=""
  1. ;
  1. ; Return RESULT=0 if PKGNAME is not LPPKG and LPPKG is primary package
  1. FOR SET LPPKG=$O(^TMP("A1VS-IDX-PKG",$J,APFX,LPPKG)) Q:LPPKG="" Q:'RESULT DO
  1. . IF LPPKG'=PKGNAME,^TMP("A1VS-IDX-PKG",$J,APFX,LPPKG)=1 SET RESULT=0
  1. QUIT RESULT
  1. ;
  1. ;
  1. KIDSIDX() ;Create Prefix-Package Indicies from KIDS
  1. NEW KIDSIEN,KIDSPKG,KIDSPRFX,KIDSZERO,PKGIEN,PATCHNME
  1. SET KIDSIEN=0
  1. FOR SET KIDSIEN=$O(^XPD(9.6,KIDSIEN)) Q:+KIDSIEN=0 DO
  1. . SET KIDSZERO=$G(^XPD(9.6,KIDSIEN,0))
  1. . IF KIDSZERO]"" DO
  1. .. SET PKGIEN=$P(KIDSZERO,"^",2)
  1. .. SET:+PKGIEN>0 KIDSPKG=$P($G(^DIC(9.4,PKGIEN,0)),"^",1)
  1. .. SET PATCHNME=$P(KIDSZERO,"^",1)
  1. .. SET KIDSPRFX=$P(PATCHNME,"*",1)
  1. .. IF KIDSPRFX]"" SET ^TMP("A1VS-KIDSPFX-IDX",$J,KIDSPRFX)=KIDSPKG
  1. QUIT
  1. ;
  1. RSIZE(RTN) ; Compute routine size (# characters plus line feeds) [^%ZOSF("SIZE") algorithm]
  1. NEW LINE,CT,RSIZEVAL
  1. SET (CT,RSIZEVAL)=0
  1. SET LINE=""
  1. X "ZL @RTN F S CT=CT+1,LINE=$T(+CT) Q:$L(LINE)=0 SET RSIZEVAL=RSIZEVAL+$L(LINE)+2"
  1. QUIT RSIZEVAL