zOs/REXX/ELARGEN

$#:
*        WSH Script fuer ElarDDL generate ddl execution jobs
*
*
lib    = XB.ELAR.INFRA.FAM.NDBS.FINAL       $** ddl input
lib    = DSN.ELAR.GENPROD
gen    = DSN.ELAR.GENDDL                    $** generiert jobs
gen    = A540769.TST.ELAR                   $** generiert jobs
$** chkOut = DSN.ELAR.GENDDL.CHKOUT
creDb  = 0                     $** create databases if missing
dbSys  = DEVG
rxLib = DSN.DB2.EXEC

$<>
$>. fEdit($-gen'(XBDDLEXE) ::f')
$@ddlExe
$<>
$*(
$>. fEdit($-gen'(XBDDLCHK) ::f')
$@ddlChk
$*)

$proc $@/ddlExe/
$= dbEx = 1
$= jn   = XBDDLEXE
if $creDb then $@[
    call sqlConnect $dbSys
    call sqlQueryPrep 7, "select name from sysibm.sysDatabase" ,
                              "where name = ?"
    $]
$;
lmmId = lmmBegin($lib)
allDb = ''
$do mx=1 to 9999 $@[
    mbr = lmmNext(lmmId)
    if mbr = '' then
        leave
    call readDsn "'"$lib"("mbr")'", i.
    db = ''
    cnt = 0
    cCA = 0
    do ix=1 to i.0
       li = translate(i.ix)
       cCA = cCA + (wordPos('CREATE', li) > 0) ,
                 + (wordPos('ALTER', li) > 0)
       if wordPos('IN', li) > 0 then do
           nd = word(li, wordPos('IN', li) + 1)
           nd = word(translate(nd, ' ', '.'), 1)
           if nd = '' then
               call 'err' mbr ix 'bad in:' i.ix
           if db = '' then
               db = nd
           else if db \== nd then
               call err 'db was' db 'but now' nd 'in' mbr ix':'i.ix
           cnt = cnt + 1
           end
       if wordPos('DROP', li) > 0 then do
           if abbrev(li, '--') then nop
           else if subWord(li, wordPos('DROP', li)-2, 2) ,
                  == 'RESTRICT ON' then nop
           else
               call err 'drop in' mbr ix':'i.ix
           end
       end
    if db <> '' & wordPos(db, allDb) < 1 then
        allDB = allDb db
    if db = '' then
        if cCA <> 0 then
            call err 'no db found in' mbr
    if mx // 20 = 0 then
        say mx mbr 'db' db  'cnt' cnt 'cCA' cCA
    $=mbr=- mbr
    $=db =- db
    if $creDb & db <> '' then $@[
        call sqlQueryArgs 7, db
        $=dbEx =- sqlFetch(7, ee)
        call sqlClose 7
        $=mx =- right(mx, 4, 0)
        $]
    if mx // 50 = 1 then $@=/jc/
//$jn JOB (CP00,KE50),'DB2 ELARDDL',
//         MSGCLASS=T,TIME=1440,
//         NOTIFY=&SYSUID,REGION=0M,SCHENV=DB2
//*MAIN CLASS=LOG
//*   ddl execution generiert von dsn.elar.ddlGen(elarGen)
//*        im $-[sysvar(sysNode) 'um' f('%t s')$]
$/jc/
    $@=/jcl/
//******** $mx db=$db mbr=$mbr *************************
//       IF RC=0 THEN
//S${mx}DDL EXEC PGM=IKJEFT01,DYNAMNBR=200,TIME=99
//SYSTSIN    DD *
    DSN SYSTEM($dbSys)
    RUN PROGRAM(DSNTEP2) PARMS('ALIGN(LHS)') PLAN(DSNTEP2)
//SYSTSPRT   DD SYSOUT=*
//SYSPRINT   DD SYSOUT=*
//SYSUDUMP   DD SYSOUT=*
//SYSTERM    DD DUMMY
//SYSIN      DD *
-- elar createDDl $mx db=$db mbr=$mbr -------------
--#SET MAXERRORS 0
set current sqlid = 'S100447';
$@[ if \ $dbEx then $@=[
  create database $db
       BUFFERPOOL BP2 INDEXBP    BP1  CCSID EBCDIC
       STOGROUP GSMS4
  ;
$] $]
//           DD DISP=SHR,DSN=$lib($mbr)
//       ENDIF
$@/sleep/ if mx // 10 = 0 then $@=[
//       IF RC = 0 THEN
//SLE$mx  EXEC PGM=IKJEFT01
//SYSTSPRT   DD SYSOUT=*
//SYSPRINT   DD SYSOUT=*
//SYSPROC    DD DISP=SHR,DSN=$rxLib
//WSH        DD DUMMY
//SYSTSIN    DD *
  wsh @ call sleep 30
//       ENDIF
$] $/sleep/
$/jcl/
    $]
call lmmEnd lmmId
$=allDb =- allDb
$/ddlExe/

$proc $@=/ddlChk/
$=jn = XBDDLCHK
//$jn JOB (CP00,KE50),'DB2 ELARDDL',
//         MSGCLASS=T,TIME=1440,
//         NOTIFY=&SYSUID,REGION=0M,SCHENV=DB2
//*MAIN CLASS=LOG
//CLEANUP   EXEC PGM=IDCAMS
//SYSPRINT  DD SYSOUT=*
//SYSIN     DD *
 DEL ('DSN.DBX.*.ELARDDL.RQ1') PURGE NOSCRATCH
 SET MAXCC = 0
$@do dx=1 to words($allDb) $@=/oneDb/
    $= db =- word($allDb, dx)
//******************** $dx $db
//SQL$dx     EXEC PGM=IKJEFT01,REGION=0M
//SYSEXEC    DD DISP=SHR,DSN=DSN.GENERAL.EXEC
//RXPARM     DD DISP=SHR,DSN=DSN.DBX.ELARDDL.SETUP(ELARDDL)
//SYSUDUMP   DD SYSOUT=*
//SYSPRINT   DD SYSOUT=*
//SYSTSPRT   DD SYSOUT=*
//SYSTSIN    DD  *
  %EXECSQL CONNECTID="$dbSys"                               -
   [TAYLORING] TAYLORING=YES HLQ="DSN.DBX"                  -
   TAYLOR.0=4                                               -
   TAYLOR.1.NAME="&FAMILY"      TAYLOR.1.VALUE=NULL         -
   TAYLOR.2.NAME="&DBNAME"      TAYLOR.2.VALUE="'$db'"      -
   TAYLOR.3.NAME="&CREATE_FROM" TAYLOR.3.VALUE="'10.12.2014'" -
   TAYLOR.4.NAME="&CREATE_TO"   TAYLOR.4.VALUE="'13.12.9999'"
//*
//* copy to output lib
//*
//COP$dx   EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT2   DD DISP=SHR,DSN=$chkOut($db)
//SYSUT1   DD DISP=(MOD,DELETE,DELETE),
//            DSN=DSN.DBX.&SYSUID..ELARDDL.RQ1
//SYSIN    DD DUMMY
    $/oneDb/
$/ddlChk/
$#out                                              20150106 11:40:09
$#out                                              20150106 11:39:47
*** run error ***
adr ispExec rc 8 in LMINIT DATAID(lmmId) DATASET('XB.ELAR.INFRA.FAM.NDBS.FINAL')
$#out                                              20141218 10:54:46
*** run error ***
adr ispExec rc 8 in LMINIT DATAID(lmmId) DATASET('XB.ELAR.INFRA.FAM.NDBS.FINAL.N
$#out                                              20141218 10:43:28
$#out                                              20141218 10:41:04