**********************************************************************************************
* DBG102R4: Execute database generation script
* Copyright (C) 2000 Martin Rowe <martin@dbg400.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**********************************************************************************************
H DATEDIT(*YMD) DEBUG(*YES) OPTION(*NODEBUGIO : *SRCSTMT)
**********************************************************************************************
* INDICATOR USAGE:
**********************************************************************************************
* File access inds
* 80 81 82 83
* Error ind (for calls)
* 90
**********************************************************************************************
* FILES:
**********************************************************************************************
* Database Generation links
FDBGDGL00 IF E K DISK
* Database Generation scripts
FDBGSQLD1 IF E K DISK
**********************************************************************************************
* ARRAYS:
**********************************************************************************************
D P#OutStrings S 132 DIM(50)
**********************************************************************************************
* DATA STRUCTURES:
**********************************************************************************************
* PROGRAM NAME
D SDS
D SDS#PGM 10
*
D DS
D CPYF 120 INZ('CPYF FROMFILE( ) -
D TOFILE( ) -
D MBROPT(*REPLACE) -
D FROMRCD(1) -
D FMTOPT(*MAP *DROP) -
D ERRLVL(*NOMAX)')
D FromFile 10 OVERLAY(CPYF:15)
D ToFile 21 OVERLAY(CPYF:34)
*
D DS
D CLRPFM 40 INZ('CLRPFM FILE( -
D )')
D ToFile2 21 OVERLAY(CLRPFM:13)
**********************************************************************************************
* WORK FIELDS:
**********************************************************************************************
D CallPgm S 10
D K#DglSeq S LIKE(DGLSEQ)
D NextPgm S 10
D P#CallParm S 10
D P#CharNbr S 16
D P#CmdLength S 15 5
D P#CmdString S 256
D P#DecNbr S 15 5
D P#ErrorID S 7
D P#Errors S 1
D P#File S 10
D P#InString S 132
D P#Library S 10
D P#MbrOpt S 8
D P#MsgData S 512
D P#MsgDtaLn S 5 0
D P#MsgFile S 10
D P#MsgfLib S 10
D P#MsgID S 7
D P#MsgType S 10
D P#NbrRcds S 10 0
D P#ObjName S 10
D P#ObjType S 10
D P#PgmMode S 4
D P#PgmNbr S 2 0
D P#PgmQueue S 10
D P#PgmStack S 5 0
D P#Request S LIKE(DGLSQL)
D P#RqsType S 7
D P#RtnCode1 S 1
D P#Script S LIKE(DFDOCD)
D P#Source S LIKE(DGLSRC)
D P#SubPgmMode S 4
D P#SubScript S LIKE(DFDOCD)
D P#Target S LIKE(DGLTGT)
D P#ToLibNme S 10
D P#ToObjNme S 10
D P#WordNbr S 3 0
D Pos1 S 3 0
D Sequence S 2
D Textline S LIKE(DFTEXT)
**********************************************************************************************
* CONSTANTS:
**********************************************************************************************
D Lower C CONST('abcdefghijklmnopqrstuvwxyz')
D Upper C CONST('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
**********************************************************************************************
* ENTRY PARAMETERS:
**********************************************************************************************
C *ENTRY PLIST
C PARM P#Script
C PARM P#Library
C PARM P#PgmMode
C PARM P#Errors
C PARM P#PgmNbr
**********************************************************************************************
* KEY LISTS:
**********************************************************************************************
C LinkKey KLIST
C KFLD P#Target
C KFLD P#Source
C KFLD K#DglSeq
**********************************************************************************************
* MAINLINE:
**********************************************************************************************
* Validate the script entries
C EXSR VALIDATE
* Now repeat (if no errors) to load the required data
B001 C IF P#Errors = *off
C AND P#PgmMode = '*RUN'
C EXSR EXECUTE
E001 C ENDIF
* Time to go...
C ENDPGM TAG
* ====== ===
C EVAL *INLR = *on
C RETURN
**********************************************************************************************
* VALIDATE: Validate the script
**********************************************************************************************
C VALIDATE BEGSR
* First validate the script
C P#Script CHAIN DBGSQLD1 80
* Error if the script not found (doh)
B001 C IF *IN80
C EVAL P#MsgID = 'MIT0072'
C EVAL P#MsgData = P#Script
C EVAL P#MsgDtaLn = 10
C EVAL P#PgmStack = 3 + P#PgmNbr
C EVAL P#Errors = *on
C EVAL P#MsgType = '*COMP'
C EXSR SNDMSG
E001 C ENDIF
*
B001 C DOW NOT *IN80
* Ignore comments (start with a semi-colon) and empty lines
B002 C IF %SUBST(DFTEXT:1:1) <> ';'
C AND DFTEXT <> *blanks
C Lower:Upper XLATE DFTEXT Textline
C EVAL DFTEXT = Textline
* Parse the line to get the Source (or sub-script), Target & Sequence values
C CALL 'DBG041R4' 90
C PARM DFTEXT P#InString Text entry
C PARM 0 P#WordNbr Returned entries
C PARM *blanks P#OutStrings Returned data
* Determine the type of entry, and process accordingly
B003 C SELECT
* No validation done on special entries at present
S003 C WHEN P#OutStrings(1) = '*CPYF'
S003 C WHEN P#OutStrings(1) = '*CALL'
S003 C WHEN P#OutStrings(1) = '*CMD'
S003 C WHEN P#OutStrings(1) = '*CPYRCDS'
S003 C WHEN P#OutStrings(1) = '*SQLSEL'
S003 C WHEN P#OutStrings(1) = '*SQLUPD'
S003 C WHEN P#OutStrings(1) = '*SQLDLT'
S003 C OTHER
C EXSR CHECKLINK
E003 C ENDSL
E002 C ENDIF
C P#Script READE DBGSQLD1 80
E001 C ENDDO
*
C ENDSR
**********************************************************************************************
* CHECKLINK: Check link/script
**********************************************************************************************
C CHECKLINK BEGSR
*
C EVAL P#Target = P#OutStrings(1)
C EVAL P#Source = P#OutStrings(2)
C EVAL Sequence = P#OutStrings(3)
C EVAL P#SubScript = P#OutStrings(1)
* If this is a script entry
B001 C IF P#Source = '*SCRIPT'
* Determine name of the next program to be called
C EVAL P#PgmNbr = P#PgmNbr + 1
C MOVEL SDS#PGM NextPgm
C MOVE P#PgmNbr NextPgm
* Copy this program to QTEMP, with the next sequence number
C CALL 'DBG046CL' 90
C PARM SDS#PGM P#ObjName
C PARM '*PGM' P#ObjType
C PARM NextPgm P#ToObjNme
C PARM 'QTEMP' P#ToLibNme
C PARM '0' P#RtnCode1
* Call the copy of this program to expand the subscript
C CALL NextPgm
C PARM P#SubScript
C PARM P#Library
C PARM P#Errors
C PARM P#PgmNbr
C PARM '*CHK' P#SubPgmMode
* Reduce program count
C EVAL P#PgmNbr = P#PgmNbr - 1
* Otherwise it's a standard DB link record
X001 C ELSE
* Get sequence number in numeric form for key
C MOVE Sequence K#DglSeq
C LinkKey CHAIN DBGDGL00 81
* Error if the link statement for these files not found
B002 C IF *IN81
C EVAL P#MsgID = 'MIT0071'
C EVAL P#MsgData = P#Target + P#Source + Sequence
C EVAL P#MsgDtaLn = 23
C EVAL P#PgmStack = 3 + P#PgmNbr
C EVAL P#Errors = *on
C EVAL P#MsgType = '*COMP'
C EXSR SNDMSG
E002 C ENDIF
E001 C ENDIF
*
C ENDSR
**********************************************************************************************
* EXECUTE: Execute the script
**********************************************************************************************
C EXECUTE BEGSR
*
C P#Script CHAIN DBGSQLD1 80
B001 C DOW NOT *IN80
* Ignore comments (start with a semi-colon) and empty lines
B002 C IF %SUBST(DFTEXT:1:1) <> ';'
C AND DFTEXT <> *blanks
C Lower:Upper XLATE DFTEXT Textline
C EVAL DFTEXT = Textline
C CALL 'DBG041R4' 90
C PARM DFTEXT P#InString Text entry
C PARM 0 P#WordNbr Returned entries
C PARM *blanks P#OutStrings Returned data
* Determine the type of entry, and process accordingly
B003 C SELECT
* CPYF request
S003 C WHEN P#OutStrings(1) = '*CPYF'
C EVAL FromFile = P#OutStrings(2)
C EVAL ToFile = %TRIM(P#Library) + '/' + FromFile
C CALL 'QCMDEXC' 90
C PARM CPYF P#CmdString
C PARM 120 P#CmdLength
* If an error occurs, clear out the target file (in case this was a refresh of the data)
B004 C IF *IN90
C EVAL ToFile2 = ToFile
C CALL 'QCMDEXC' 90
C PARM CLRPFM P#CmdString
C PARM 40 P#CmdLength
E004 C ENDIF
* CALL request
S003 C WHEN P#OutStrings(1) = '*CALL'
C EVAL CallPgm = P#OutStrings(2)
C CALL CallPgm 90
C PARM P#Library P#CallParm
* CMD request
S003 C WHEN P#OutStrings(1) = '*CMD'
C EVAL P#CmdString = %SUBST(DFTEXT:6:74)
C CALL 'QCMDEXC' 90
C PARM P#CmdString
C PARM 74 P#CmdLength
* CPYRCDS request
S003 C WHEN P#OutStrings(1) = '*CPYRCDS'
* Convert number of rcds required (third 'word' on line) to decimal value for parm use
C EVAL P#CharNbr = %TRIM(P#OutStrings(3))
C CALL 'DBG043R3'
C PARM P#CharNbr
C PARM 0 P#DecNbr
C EVAL P#File = P#OutStrings(2)
* Copy required number of records
C CALL 'DBG103CL'
C PARM P#File
C PARM P#Library
C PARM P#DecNbr P#NbrRcds
* SQL SELECT request
S003 C WHEN P#OutStrings(1) = '*SQLSEL'
* If the optional replace member data switch is specified, set the RUNSQL MEMBER parm
B004 C IF P#OutStrings(3) = '/R'
C EVAL P#MbrOpt = '*REPLACE'
X004 C ELSE
C EVAL P#MbrOpt = '*ADD'
E004 C ENDIF
C EVAL P#Target = P#OutStrings(2)
C EVAL Pos1 = %SCAN( ' WHERE ' : DFTEXT )
C EVAL P#Request = 'SELECT * FROM ' + P#Target +
C %SUBST( DFTEXT : Pos1 : 79 - Pos1 )
C CALL 'DBG102CL' 90
C PARM P#Library
C PARM P#Target
C PARM ' ' P#Source
C PARM P#Request
C PARM P#MbrOpt
C PARM '*SQLSEL' P#RqsType
* SQL UPDATE request
S003 C WHEN P#OutStrings(1) = '*SQLUPD'
C EVAL P#Target = P#OutStrings(2)
C EVAL Pos1 = %SCAN( ' SET ' : DFTEXT )
C EVAL P#Request = 'UPDATE ' + P#Target +
C %SUBST( DFTEXT : Pos1 : 79 - Pos1 )
C CALL 'DBG102CL' 90
C PARM P#Library
C PARM P#Target
C PARM ' ' P#Source
C PARM P#Request
C PARM '*REPLACE' P#MbrOpt
C PARM '*SQLUPD' P#RqsType
* SQL DELETE request
S003 C WHEN P#OutStrings(1) = '*SQLDLT'
C EVAL P#Target = P#OutStrings(2)
C EVAL Pos1 = %SCAN( ' WHERE ' : DFTEXT )
C EVAL P#Request = 'DELETE FROM ' + P#Target +
C %SUBST( DFTEXT : Pos1 : 79 - Pos1 )
C CALL 'DBG102CL' 90
C PARM P#Library
C PARM P#Target
C PARM ' ' P#Source
C PARM P#Request
C PARM '*REPLACE' P#MbrOpt
C PARM '*SQLDLT' P#RqsType
* Link or script request
S003 C OTHER
C EXSR PROCLINK
E003 C ENDSL
E002 C ENDIF
C P#Script READE DBGSQLD1 80
E001 C ENDDO
*
C ENDSR
**********************************************************************************************
* PROCLINK: Process link/script
**********************************************************************************************
C PROCLINK BEGSR
*
C EVAL P#Target = P#OutStrings(1)
C EVAL P#Source = P#OutStrings(2)
C EVAL Sequence = P#OutStrings(3)
C EVAL P#SubScript = P#OutStrings(1)
* If this is a subscript entry
B001 C IF P#Source = '*SCRIPT'
* Need to run this program again for the sub script
C EVAL P#PgmNbr = P#PgmNbr + 1
C MOVEL SDS#PGM NextPgm
C MOVE P#PgmNbr NextPgm
* Call the copy of this program to expand the subscript (should exist from check above)
C CALL NextPgm
C PARM P#SubScript
C PARM P#Library
C PARM *on P#Errors
C PARM P#PgmNbr
C PARM '*RUN' P#PgmMode
* Reduce program count
C EVAL P#PgmNbr = P#PgmNbr - 1
* Otherwise process the link as normal
X001 C ELSE
C MOVE Sequence K#DglSeq
C LinkKey CHAIN DBGDGL00 81
B002 C IF NOT *IN81
* If the optional replace member data switch is specified, set the RUNSQL MEMBER parm
B003 C IF P#OutStrings(4) = '/R'
C EVAL P#MbrOpt = '*REPLACE'
X003 C ELSE
C EVAL P#MbrOpt = '*ADD'
E003 C ENDIF
C CALL 'DBG102CL' 90
C PARM P#Library
C PARM P#Target
C PARM P#Source
C PARM DGLSQL P#Request
C PARM P#MbrOpt
C PARM '*LINK ' P#RqsType
E002 C ENDIF
E001 C ENDIF
*
C ENDSR
**********************************************************************************************
* SNDMSG: SEND PROGRAM MESSAGE
**********************************************************************************************
C SNDMSG BEGSR
* Use in-house utility (via system API 'QMHSNDPM')
C CALL 'DBG044R3'
C PARM P#MsgID
C PARM 'DBGMSGF ' P#MsgFile
C PARM '*LIBL ' P#MsgfLib
C PARM P#MsgData
C PARM P#MsgDtaLn
C PARM P#MsgType
C PARM SDS#PGM P#PgmQueue
C PARM P#PgmStack
C PARM ' ' P#ErrorID
*
C ENDSR
**********************************************************************************************