zOs/REXX/ELARDDL0

$#:
*        WS2/3 Script fuer Jobs fuer ElarDDL
*
*
lib   = XB.ELAR.INFRA.FAM.NDBS.FINAL
gen   = DSN.ELAR.GENDDL
creDb = 0                     $** create databases if missing
                              $** nur mit WS3 |||||||||
checkSql = DSN.DBX.XB.SQL(#ELARDDL)
dbSys = DEVG
jn = XBDDLJOB
rxLib = ORG.U0009.B0106.KIDI63.EXEC
*  @splitCheckDDL
dbEx = 1
$#@
if $creDb then $@[
    call sqlConnect $dbSys
    call sqlQueryPrep 7, "select name from sysibm.sysDatabase" ,
                              "where name = ?"
    $]
$;
$>.fEdit($-gen'(DDLJOB) ::f')
lmmId = lmmBegin($lib)
$do mx=1 to 9999 $@[
    mbr = lmmNext(lmmId)
    if mbr = '' then
        leave
    call readDsn "'"$lib"("mbr")'", i.
    db = ''
    cnt = 0
    do ix=1 to i.0
       li = translate(i.ix)
       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 = '' then
        call err 'no db found in' mbr
    if mx // 20 = 0 then
        say mx mbr 'db' db  'cnt' cnt
    $=mbr=- mbr
    $=db =- db
    if $creDb 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
$/jc/
    $@=/jcl/
//******** $mx db=$db mbr=$mbr *************************
$*(
//       IF RC=0 THEN
//S${mx}CHB 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 DISP=SHR,DSN=$gen.BEF($db)
//SYSUDUMP   DD SYSOUT=*
//SYSTERM    DD DUMMY
//SYSIN      DD *
-- elar checkDDl before $mx db=$db mbr=$mbr -------------
//           DD DISP=SHR,DSN=$gen(CHKSQL1)
//           DD *
   INSERT INTO SESSION.FAMLISTE ( FAMILY, DBNAME )
                         VALUES ( '?', '$db')
   ;
//           DD DISP=SHR,DSN=$gen(CHKSQL2)
//       ENDIF  $*)
//       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
$*(
//       IF RC=0 THEN
//S${mx}CHA 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 DISP=SHR,DSN=$gen.AFT($db)
//SYSUDUMP   DD SYSOUT=*
//SYSTERM    DD DUMMY
//SYSIN      DD *
-- elar checkDDl after $mx db=$db mbr=$mbr -------------
//           DD DISP=SHR,DSN=$gen(CHKSQL1)
//           DD *
   INSERT INTO SESSION.FAMLISTE ( FAMILY, DBNAME )
                         VALUES ( '?', '$db')
   ;
//           DD DISP=SHR,DSN=$gen(CHKSQL2)
//       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 *
  ws2 @ call sleep 30
//       ENDIF
$] if mx > 30 then leave $/sleep/
$/jcl/
    $]
call lmmEnd lmmId
$@proc @/splitCheckDDL/
    call readDsn $checkSql, c.
    do cx=1 to c.0 until abbrev(c.cx,
           , 'INSERT INTO SESSION.FAMLISTE ( FAMILY, DBNAME )')
        end
    if cx >= c.0 then
        call err 'INSERT INTO SESSION... not in' $checkSql
    call writeDsn $gen'(chkSql1) ::f', c., cx-1, 1
    do cx=cx+1 to c.0 until pos(';', c.cx) > 0
        end
    ox = 0
    do cx=cx+1 to c.0
        ox = ox+1
        o.ox = c.cx
        end
    call writeDsn $gen'(chkSql2) ::f', o., ox, 1
    call writeDsn $gen.bef'(#) ::f133', o., 0, 1
    call writeDsn $gen.aft'(#) ::f133', o., 0, 1
$/splitCheckDDL/
$#out                                              20131129 11:08:28
$#out                                              20131129 11:05:40
$#out                                              20131129 11:03:09
$#out                                              20131129 10:59:13