**********************************************************************************************
* DBG104R4: Create DBG script from library's files
* 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)
**********************************************************************************************
* FILES:
**********************************************************************************************
* DSPOBJD *OUTFILE for files in target library
FDBGLIST IF E DISK
* Database Generation links
FDBGDGL00 IF E K DISK
* Database Generation script headers
FDBGSQLH1 UF A E K DISK
* Database Generation script headers
FDBGSQLD1 UF A E K DISK
**********************************************************************************************
* ARRAYS:
**********************************************************************************************
D List S 10 DIM(999)
D Comp S 10 DIM(999)
D UnComp S 10 DIM(999)
**********************************************************************************************
* DATA STRUCTURES:
**********************************************************************************************
* PROGRAM NAME
D SDS
D SDS#PGM 10
D SDS#User 254 263
**********************************************************************************************
* WORK FIELDS:
**********************************************************************************************
D CSlot S 3 0
D CtlSize S 4
D Index S 3 0
D K#LSRC S LIKE(DGLSRC)
D K#LTGT S LIKE(DGLTGT)
D LinkFound S 1
D P#File S 10
D P#DtaSpcSiz S 15 0
D P#NbrCurRcd S 10 0
D P#Primary1 S 10
D P#Primary2 S 10
D P#Primary3 S 10
D P#Return S 7
D P#Script S LIKE(DFDOCD)
D P#ScriptType S 5
D Prevmbfile S LIKE(MBFILE)
D Primary S 10
D Repeat S 1
D Sequence S 2
D TgtData S 1
D USlot S 3 0
D WholeMegs S 4 0
**********************************************************************************************
* CONSTANTS:
**********************************************************************************************
**********************************************************************************************
* ENTRY PARAMETERS:
**********************************************************************************************
C *ENTRY PLIST
C PARM P#Script
C PARM P#ScriptType
C PARM P#Return
C PARM P#Primary1
C PARM P#Primary2
C PARM P#Primary3
**********************************************************************************************
* KEY LISTS:
**********************************************************************************************
C DBGDGL00Key KLIST
C KFLD K#LTGT
C KFLD K#LSRC
**********************************************************************************************
* MAINLINE:
**********************************************************************************************
C P#Script CHAIN DBGSQLH1
* If the script already exists (created by someone else), then quit the program
B001 C IF %FOUND(DBGSQLH1)
C AND DFCUSR <> SDS#User
C EVAL P#Return = '*EXISTS'
* Otherwise, write/update a script header
X001 C ELSE
C EVAL DFDOCD = P#Script
C EVAL DFCDTE = *DATE
C EVAL DFADTE = *DATE
C EVAL DFCUSR = SDS#User
C EVAL DFAUSR = SDS#User
C EVAL DFLOCK = 'F'
C EVAL DFHEAD = 'N'
C EVAL DFDOCH = 'Added via CRTDBGSCP command for ' +
C SDS#User
B002 C IF %FOUND(DBGSQLH1)
C UPDATE DB1DFTH
* If updating a script, clear out the old one first
B003 C DOU NOT %FOUND(DBGSQLD1)
C DFDOCD DELETE DB1DFT0
E003 C ENDDO
X002 C ELSE
C WRITE DB1DFTH
E002 C ENDIF
* Loop through all *OUTFILE, entries, storing the physical file names
C 1 SETLL DBGLIST
C READ DBGLIST
B002 C DOW NOT %EOF(DBGLIST)
B003 C IF MBFILE <> Prevmbfile
C EVAL Prevmbfile = MBFILE
C EVAL Index = Index + 1
C EVAL List(Index) = MBFILE
E003 C ENDIF
C READ DBGLIST
E002 C ENDDO
C EVAL List(Index + 1) = '*END'
* Now loop through each entry to create (if possible) a link for each
B002 C SELECT
* If building data by straight CPYF
S002 C WHEN P#ScriptType = '*CPYF'
C EVAL Prevmbfile = *blanks
C 1 SETLL DBGLIST
C READ DBGLIST
B003 C DOW NOT %EOF(DBGLIST)
B004 C IF MBFILE <> Prevmbfile
C EVAL Prevmbfile = MBFILE
* Indicate if the target file already has data
B005 C IF MBNRCD > 0
C EVAL TgtData = 'Y'
X005 C ELSE
C EVAL TgtData = ' '
E005 C ENDIF
* Get the size of the control file - report anything over 5Mb (might slow things down)
C CALL 'DBG104CL'
C PARM MBFILE P#File
C PARM 0 P#NbrCurRcd
C PARM 0 P#DtaSpcSiz
B005 C IF P#DtaSpcSiz > 5242880
C EVAL WholeMegs = P#DtaSpcSiz / (1024 * 1024)
C EVAL CtlSize = %EDITC(WholeMegs:'4')
X005 C ELSE
C EVAL CtlSize = ' < 5'
E005 C ENDIF
* Process according to script type requested
C EVAL DFTEXT = '*CPYF ' + MBFILE + ' ' +
C TgtData + ' ' + CtlSize + 'Mb ' + MBTXT
C EVAL DFLINE = DFLINE + 10
C WRITE DB1DFT0
E004 C ENDIF
*
C READ DBGLIST
E003 C ENDDO
* If building data using database links
S002 C WHEN P#ScriptType = '*LINK'
* Start with the primary file(s) [that are built by user cmd by modifying the script later]
C EVAL Comp(1) = P#Primary1
C EVAL Comp(2) = P#Primary2
C EVAL Comp(3) = P#Primary3
C EVAL UnComp = List
* Load any primary files into the script first
B003 C DO 3 USlot
B004 C SELECT
S004 C WHEN USlot = 1
C EVAL Primary = P#Primary1
S004 C WHEN USlot = 2
C EVAL Primary = P#Primary2
S004 C WHEN USlot = 3
C EVAL Primary = P#Primary3
E004 C ENDSL
*
B004 C IF Primary <> *blanks
C Primary LOOKUP UnComp(USlot) 70
B005 C IF %EQUAL
C EVAL UnComp(USlot) = ' '
E005 C ENDIF
* Get the number of records in the primary
C CALL 'DBG104CL'
C PARM Primary P#File
C PARM 0 P#NbrCurRcd
C PARM 0 P#DtaSpcSiz
C EVAL DFTEXT = '; Build of ' + %TRIM(Primary) +
C ' required here. Source file has ' +
C %trim(%EDITC(P#NbrCurRcd:'4')) + ' records.'
C EVAL DFLINE = DFLINE + 10
C WRITE DB1DFT0
E004 C ENDIF
E003 C ENDDO
*
C EVAL USlot = 1
C EVAL CSlot = 1
C EVAL Index = 2
B003 C DOU Repeat = *off
C EVAL Repeat = *on
* Bypass entries that have already been completed (hence empty)
B004 C DOW UnComp(USlot) = *blanks
C EVAL USlot = USlot + 1
E004 C ENDDO
* If all uncompleted links have been checked against the current control file, move on.
B004 C IF UnComp(USlot) = '*END'
C EVAL CSlot = CSlot + 1
C EVAL USlot = 1
E004 C ENDIF
* If no more control files available, then quit this section
B004 C IF Comp(CSlot) = *blanks
C EVAL Repeat = *off
C LEAVE
E004 C ENDIF
* Now look through the list of files and try to build links with the master as control
C EVAL K#LTGT = UnComp(USlot)
C EVAL K#LSRC = Comp(CSlot)
* If a match found, write to file, and move onto next uncompleted link
C DBGDGL00Key CHAIN DBGDGL00
B004 C IF %FOUND(DBGDGL00)
C MOVE DGLSEQ Sequence
C EVAL DFTEXT = %TRIM(DGLTGT) + ' ' +
C %TRIM(DGLSRC) + ' ' + %TRIM(Sequence) +
C ' ' + %TRIM(DGLTXT)
C EVAL DFLINE = DFLINE + 10
C WRITE DB1DFT0
C EVAL Comp(Index) = UnComp(USlot)
C EVAL UnComp(USlot) = *blanks
C EVAL Index = Index + 1
E004 C ENDIF
C EVAL USlot = USlot + 1
E003 C ENDDO
* Write *CPYF requests for the remaining uncompleted links
C 1 SETLL DBGLIST
C READ DBGLIST
B003 C DOW NOT %EOF(DBGLIST)
B004 C IF MBFILE <> Prevmbfile
C EVAL Prevmbfile = MBFILE
C MBFILE LOOKUP UnComp(USlot) 70
B005 C IF %FOUND
* Indicate if the target file already has data
B006 C IF MBNRCD > 0
C EVAL TgtData = 'Y'
X006 C ELSE
C EVAL TgtData = ' '
E006 C ENDIF
* Get the size of the control file - report anything over 5Mb (might slow things down)
C CALL 'DBG104CL'
C PARM MBFILE P#File
C PARM 0 P#NbrCurRcd
C PARM 0 P#DtaSpcSiz
B006 C IF P#DtaSpcSiz > 5242880
C EVAL WholeMegs = P#DtaSpcSiz / (1024 * 1024)
C EVAL CtlSize = %EDITC(WholeMegs:'4')
X006 C ELSE
C EVAL CtlSize = ' < 5'
E006 C ENDIF
C EVAL DFTEXT = '*CPYF ' + MBFILE + ' ' +
C TgtData + ' ' + CtlSize + 'Mb ' + MBTXT
C EVAL DFLINE = DFLINE + 10
C WRITE DB1DFT0
E005 C ENDIF
E004 C ENDIF
C READ DBGLIST
E003 C ENDDO
E002 C ENDSL
E001 C ENDIF
* Time to go...
C ENDPGM TAG
* ====== ===
C EVAL *INLR = *on
C RETURN
**********************************************************************************************