PAUDBLOD
Source: app-authorization-ims-db2-mq/cbl/PAUDBLOD.CBL
Type: Batch program
PAUDBLOD — Program Documentation
Purpose
PAUDBLOD is a batch data-load utility that reloads a Pending Authorization IMS database from two sequential extract files. It reads "root" segment records (pending authorization summary) and "child" segment records (pending authorization details) and re-inserts them into the IMS database via CBLTDLI calls, effectively rebuilding the hierarchical database from flat-file input. This is typically used in reload/restore or migration scenarios where a previously unloaded database is being restored.
How it works
Processing is driven by MAIN-PARA, which runs sequentially through four stages:
-
1000-INITIALIZE — Captures the current date/day (for display/logging only) and opens both input files,
INFILE1andINFILE2. If either file fails to open (status not spaces/'00'), it displays an error and calls9999-ABEND, which setsRETURN-CODEto 16 and terminates the program (GOBACK). -
2000-READ-ROOT-SEG-FILE (looped until end-of-file) — Reads one record from
INFILE1, moves it into thePENDING-AUTH-SUMMARYstructure, and calls2100-INSERT-ROOT-SEG, which issues an IMSISRT(insert) call viaCBLTDLIusingROOT-UNQUAL-SSAto insert the root segment (PAUTSUM0). Success, duplicate ('II'), or failure status is checked; any other non-space/non-'II'status triggers9999-ABEND. -
3000-READ-CHILD-SEG-FILE (looped until end-of-file) — Reads one record from
INFILE2(containing aROOT-SEG-KEYand a child detail record). IfROOT-SEG-KEYis numeric, it moves the key into the SSA qualifier and the detail record intoPENDING-AUTH-DETAILS, then calls3100-INSERT-CHILD-SEG. This paragraph first does an IMSGU(get-unique) call qualified onACCNTIDto locate/verify the matching root segment. On success it calls3200-INSERT-IMS-CALL, which performs the actualISRTof the child segment (PAUTDTL1) under that root. Any unexpected PCB status from either the GU or ISRT call causes9999-ABEND. -
4000-FILE-CLOSE — Closes both files, displaying errors (but not abending) if close status is bad.
After all four stages complete, MAIN-PARA issues GOBACK to end normally.
Inputs & outputs
| Name | Type | Description |
|---|---|---|
INFILE1 (DD INFILE1) |
Sequential input file | Flat-file extract of root segments (PENDING-AUTH-SUMMARY, layout CIPAUSMY), 100-byte records. Read record-by-record in 2000-READ-ROOT-SEG-FILE. |
INFILE2 (DD INFILE2) |
Sequential input file | Flat-file extract of child segments, each record carrying a ROOT-SEG-KEY (packed decimal, S9(11) COMP-3) plus a 200-byte detail record (PENDING-AUTH-DETAILS, layout CIPAUDTY). Read in 3000-READ-CHILD-SEG-FILE. |
IMS Database (via PAUTBPCB PCB, CBLTDLI calls) |
IMS DB output | Target hierarchical database with root segment PAUTSUM0 (Pending Authorization Summary) and child segment PAUTDTL1 (Pending Authorization Details). Data is inserted (ISRT) and looked up (GU) through this PCB. |
IO-PCB-MASK / PAUTBPCB |
Linkage section parameters | I/O PCB mask and the program's IMS PCB, passed in via ENTRY 'DLITCBL'/PROCEDURE DIVISION USING. No CICS commands or SQL tables are used — this is a pure batch/IMS DL/I program. |
No SQL tables or CICS commands are used by this program (confirmed by parser: empty sql_tables and cics_commands lists).
Things to know
- Hard-coded abend code:
9999-ABENDalways setsRETURN-CODEto16regardless of the actual error, so downstream JCL/step conditions can't distinguish which failure occurred from the return code alone — the actual cause is only visible in theDISPLAYmessages in the job log. - Inconsistent error handling severity: Open/insert/GU failures cause an abend, but close failures (
4000-FILE-CLOSE) only produce aDISPLAYmessage and processing continues — files may be left in an inconsistent state without a nonzero return code from this specific failure. - Silent skip on non-numeric key: In
3000-READ-CHILD-SEG-FILE, ifROOT-SEG-KEYis not numeric, the record is silently skipped (no insert, no error message) — this could mask malformed input. - Duplicate segments tolerated: Both root insert (
2100-INSERT-ROOT-SEG) and child insert (3200-INSERT-IMS-CALL) treat IMS status'II'(duplicate segment) as acceptable, not an error — meaning reloads can be run against a partially-loaded database without failing, but this could also mask unexpected duplicate data. - Dead/vestigial code: Several
WS-VARIABLESfields (e.g.,WS-EXPIRY-DAYS,WS-DAY-DIFF,WS-NO-CHKP, checkpoint ID fieldsWK-CHKPT-ID) and thePRM-INFOstructure are declared but never referenced in the procedure logic shown — likely leftover from a related program or an unused checkpoint/restart feature that was never implemented here. - Extensive commented-out code: Many
DISPLAYstatements and some logic (e.g., PSB name/PCB offset comments, date adjustment lines under3100-INSERT-CHILD-SEG) are commented out, suggesting this program was adapted/copied from another (possibly the "IMSUNLOD" program, perWS-PGMNAMEdefault value) and not fully cleaned up. - No checkpoint/restart logic, despite variable names suggesting it was planned (
WK-CHKPT-ID,P-CHKP-FREQ,P-CHKP-DIS-FREQinPRM-INFO) — if this program processes large volumes, a mid-run failure requires a full rerun from the beginning of both files. - CALL parameters
FAIL,THRU,TOappearing in the parser'scallslist are almost certainly false positives from COBOL keywords (e.g.,PERFORM ... THRU,MOVE ... TO) rather than actual program calls — the only real external call isCBLTDLI(the standard IMS DL/I call interface). - Copybooks used:
CIPAUSMY(root segment layout),CIPAUDTY(child segment layout),IMSFUNCS(IMS function code constants likeFUNC-ISRT,FUNC-GU), andPAUTBPCB(PCB mask layout) — the actual segment/field structures are defined in these copybooks and not visible in this source file.
Files
| Logical file | DD name |
|---|---|
| INFILE1 | INFILE1 |
| INFILE2 | INFILE2 |
Copybooks
CIPAUDTY, CIPAUSMY, IMSFUNCS, PAUTBPCB
Calls
CBLTDLI, FAIL, THRU, TO
Paragraph flow
flowchart TD
MAIN_PARA["MAIN-PARA"]
1000_INITIALIZE["1000-INITIALIZE"]
1000_EXIT["1000-EXIT"]
2000_READ_ROOT_SEG_FILE["2000-READ-ROOT-SEG-FILE"]
2000_EXIT["2000-EXIT"]
2100_INSERT_ROOT_SEG["2100-INSERT-ROOT-SEG"]
2100_EXIT["2100-EXIT"]
3000_READ_CHILD_SEG_FILE["3000-READ-CHILD-SEG-FILE"]
3000_EXIT["3000-EXIT"]
3100_INSERT_CHILD_SEG["3100-INSERT-CHILD-SEG"]
3100_EXIT["3100-EXIT"]
3200_INSERT_IMS_CALL["3200-INSERT-IMS-CALL"]
3200_EXIT["3200-EXIT"]
4000_FILE_CLOSE["4000-FILE-CLOSE"]
4000_EXIT["4000-EXIT"]
9999_ABEND["9999-ABEND"]
9999_EXIT["9999-EXIT"]
1000_INITIALIZE --> 9999_ABEND
2000_READ_ROOT_SEG_FILE --> 2100_INSERT_ROOT_SEG
2100_INSERT_ROOT_SEG --> 9999_ABEND
3000_READ_CHILD_SEG_FILE --> 3100_INSERT_CHILD_SEG
3100_INSERT_CHILD_SEG --> 3200_INSERT_IMS_CALL
3100_INSERT_CHILD_SEG --> 9999_ABEND
3200_INSERT_IMS_CALL --> 9999_ABEND
MAIN_PARA --> 1000_INITIALIZE
MAIN_PARA --> 2000_READ_ROOT_SEG_FILE
MAIN_PARA --> 3000_READ_CHILD_SEG_FILE
MAIN_PARA --> 4000_FILE_CLOSE
Paragraphs
| Paragraph | Line | Performs |
|---|---|---|
| MAIN-PARA | 169 | 1000-INITIALIZE, 2000-READ-ROOT-SEG-FILE, 3000-READ-CHILD-SEG-FILE, 4000-FILE-CLOSE |
| 1000-INITIALIZE | 190 | 9999-ABEND, 9999-ABEND |
| 1000-EXIT | 218 | |
| 2000-READ-ROOT-SEG-FILE | 222 | 2100-INSERT-ROOT-SEG |
| 2000-EXIT | 239 | |
| 2100-INSERT-ROOT-SEG | 242 | 9999-ABEND |
| 2100-EXIT | 264 | |
| 3000-READ-CHILD-SEG-FILE | 269 | 3100-INSERT-CHILD-SEG |
| 3000-EXIT | 290 | |
| 3100-INSERT-CHILD-SEG | 292 | 3200-INSERT-IMS-CALL, 9999-ABEND |
| 3100-EXIT | 315 | |
| 3200-INSERT-IMS-CALL | 318 | 9999-ABEND |
| 3200-EXIT | 338 | |
| 4000-FILE-CLOSE | 341 | |
| 4000-EXIT | 357 | |
| 9999-ABEND | 360 | |
| 9999-EXIT | 368 |