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

BSTSCLAS.m

Go to the documentation of this file.
  1. BSTSCLAS ;GDIT/HS/BEE-Post Install ; 5 Nov 2012 12:51 PM
  1. ;;2.0;IHS STANDARD TERMINOLOGY;;Dec 01, 2016;Build 62
  1. ;
  1. EN Q
  1. ;
  1. ; Main entry point - interactive
  1. EXPORT ;
  1. N CNT,ERR,EXEC,I,MASK,STREAM,XML,NAME,B64
  1. K CLASSES
  1. W !,"Enter class(es) to distribute, one at a time. Wildcards OK."
  1. W !,"E.g, PACKAGE.CLASS.G*.CLS. Hit <ENTER> when finished"
  1. S MASK="" F D Q:$G(MASK)=""
  1. . NEW DIR,X,Y
  1. . S DIR(0)="F"
  1. . S DIR("A")="Class: "
  1. . D ^DIR
  1. . S MASK=$S(X="^":"",1:X)
  1. . Q:MASK=""
  1. . S:MASK'?1.E1".CLS"&(MASK'?1.E1".cls") MASK=MASK_".CLS"
  1. . S CLASSES(MASK)=""
  1. ;
  1. Q:'$D(CLASSES)
  1. ; Create a new global-based character stream
  1. EXPGO ;
  1. ; Create new record in 9002318.5 with IEN of REC
  1. ; Populate Name (not sure what it should be), Date/Time, and set status to I
  1. K DO,DA S DIC=9002318.5,DLAYGO=9002318.5,DIC(0)="L",X=$S($G(NAME)'="":NAME,1:"New Record for "_$H)
  1. S DIC("DR")=".01////"_X_";1.02////I"
  1. ; Do we need date on the Export?
  1. ;Set DIC("DR")=DIC("DR")_";1.03////"_$G(DT)
  1. D ^DIC
  1. I Y=-1 S ERR=1,ERR(1)="Failed to create a record" D ERROR Q
  1. S REC=+Y
  1. ; populate the new record
  1. S ERR=0,U="^"
  1. S EXEC="SET STREAM=##class(%Stream.GlobalCharacter).%New()"
  1. X EXEC
  1. ; Export a list of classes/routines/etc to the stream as XML
  1. S EXEC="DO $system.OBJ.ExportToStream(.CLASSES,.STREAM,.qlist,.ERR)"
  1. X EXEC
  1. ; ADD ERROR LOG
  1. I ERR D ERROR Q
  1. F S EXEC="S STR=STREAM.Read(1000000)" X EXEC Q:STR="" D Q:ERR
  1. . S EXEC="S COMP=$system.Util.Compress(STR)" X EXEC
  1. . S EXEC="S B64=$system.Encryption.Base64Encode(COMP)" X EXEC
  1. . I $L(B64)="" S ERR=1,ERR(1)="Failed to create encrypted stream" D ERROR Q
  1. . S B64=$TR(B64,$C(10))
  1. . F I=1:1 SET XML=$P(B64,$C(13),I) Q:XML="" D POPULATE^BSTSCLAS(REC,XML) Q:ERR
  1. . I ERR D ERROR
  1. . D POPULATE^BSTSCLAS(REC,"------------------------- SEGMENT END ------------------------")
  1. S DIE="^BSTSCLS("
  1. K DA S DA=REC
  1. ; Set Status to READY
  1. S DR="1.02////R"
  1. D ^DIE
  1. W !,"Record ",REC," created"
  1. Q
  1. ;
  1. IMPORT(REC,ERR) ;
  1. ; Returns ERR if there are any errors.
  1. NEW EXEC,I,STREAM,STRING,B64,COMP,LOADED
  1. NEW %,DIE,DA,CLASS,DIWF,DIWL,DIWR,DLAYGO,DR,ERRTEXT,ERRTXT
  1. NEW J,MASK,NAME,STR,X,Y
  1. S ERR=0
  1. I $G(REC)="" Q
  1. I '$D(^BSTSCLS(REC)) Q
  1. I $G(DT)'?7N.E S DT=$$DT^XLFDT
  1. ; Change the value of field RPMS STATUS in 9002318.5 to "I"
  1. K DA S DA=REC,DIE="^BSTSCLS(",DR="1.02////I" D ^DIE
  1. ; Erase old errors
  1. ;S IEN=0 F S IEN=$O(^BJMDS(90607,1,2,IEN)) Q:'IEN K DA S DA=IEN,DA(1)=1,DIK="^BJMDS(90607,1,2," D ^DIK
  1. ;
  1. ; Create a new global-based character stream
  1. SET EXEC="S STREAM=##class(%Stream.GlobalCharacter).%New()"
  1. X EXEC
  1. ;
  1. ; Copy the XML from the distribution global to a stream
  1. S I=0
  1. F D Q:B64=""
  1. . S B64=""
  1. . F S I=$O(^BSTSCLS(REC,10,I)) Q:'I S STR=^BSTSCLS(REC,10,I,0) Q:STR["SEGMENT END" S B64=B64_STR_$C(13,10)
  1. . I B64="" Q
  1. . S EXEC="S COMP=$system.Encryption.Base64Decode(B64)" X EXEC
  1. . S EXEC="S STRING=$system.Util.Decompress(COMP)" X EXEC
  1. . S EXEC="D STREAM.Write(STRING)" X EXEC
  1. ;
  1. ; First check that the received classes are OK. Pass "1" in the 5th parameter
  1. ; so that the import won't actualy happen. Then analyze the value of "ERR"
  1. S EXEC="D $system.OBJ.LoadStream(STREAM,""ck/lock=0"",.ERR,.LOADED,1)"
  1. X EXEC
  1. ; Error processing after the dry run
  1. I ERR D BGERROR G EXIT
  1. ;
  1. ; Actually load and compile the classes.
  1. ; "c" means "compile" and "k" means "keep source code"
  1. S EXEC="D $system.OBJ.LoadStream(STREAM,""ck/lock=0"",.ERR,.LOADED)"
  1. X EXEC
  1. ; Error processing after the actual load
  1. I ERR D BGERROR G EXIT
  1. ;
  1. S CLASS="" F S CLASS=$O(LOADED(CLASS)) Q:CLASS="" D
  1. . S DIC="^BSTSCLS("_REC_",11,",DIC(0)="L",DLAYGO=9002318.511
  1. . S DA(1)=REC
  1. . S X=CLASS
  1. . D ^DIC
  1. ; Change the value of the field RPMS STATUS in 9002318.5 to "R"
  1. ; and populate RPMS DATE/TIME INSTALLED
  1. S DIE="^BSTSCLS("
  1. K DA S DA=REC
  1. ; Set Status to READY
  1. W !,"Updating 9002318.5 Record"
  1. D NOW^%DTC
  1. S DR="1.02////C;1.03////"_%
  1. D ^DIE
  1. EXIT ;
  1. Q
  1. ;
  1. POPULATE(REC,XML) ;
  1. S DA(1)=REC
  1. K DIC S DIC="^BSTSCLS("_DA(1)_",10," ;XML Subfile
  1. S DIC(0)="L",DLAYGO=9002318.51 ;LAYGO to the subfile
  1. S X=XML
  1. ; S X=$$ENCODE(XML)
  1. ; Add XML Data as the .01 field
  1. D FILE^DICN
  1. I Y=-1 S ERR="Failed to create XML subfield entry" Q
  1. Q
  1. ERROR ;
  1. S ERRTEXT=""
  1. I $D(ERR)=1,ERR'=0 S ERRTXT=ERR
  1. I $D(ERR)>10 S I="",ERRTXT="" F S I=$O(ERR(I)) Q:'I S ERRTXT=ERRTXT_$G(ERR(I))_" "
  1. W !,!,ERRTXT
  1. Q
  1. BGERROR ;
  1. ;W !,"Class import process errored out with error ",$G(ERR)
  1. ;W !,"Please contact IHS National."
  1. ; Change the value of the field RPMS STATUS in 9002318.5 to "E"
  1. ; S ERRTEXT=""
  1. I $D(ERR)=1 S I=ERR K ERR S ERR=1,ERR(1)=I
  1. I $D(ERR)>10 S I="" D
  1. . F S I=$O(ERR(I)) Q:'I S ERR(I)=$TR(ERR(I),$C(10,13)," ")
  1. S DIE="^BSTSCLS("
  1. I '$G(REC) Q
  1. I '$D(^BSTSCLS(REC)) Q
  1. K DA S DA=REC
  1. ; Set Status to ERROR
  1. S DR="1.02////E"
  1. D ^DIE
  1. K ^UTILITY($J,"W")
  1. S DIWF="C80",DIWL=1,DIWR=80,I=""
  1. F S I=$O(ERR(I)) Q:'I S X=ERR(I) D ^DIWP
  1. S I="" K ERR1 S ERR1=0
  1. F S I=$O(^UTILITY($J,"W",I)) Q:'I S J="" F S J=$O(^UTILITY($J,"W",I,J)) Q:'J S ERR1=ERR1+1,ERR1(ERR1)=$G(^UTILITY($J,"W",I,J,0))
  1. ;D WP^DIE(90607,"1,",2,"","ERR1")
  1. Q