|
From: Brad Stone <brad@bvstools.com> > And V5R1. > > But yet PDM displays the last change date just fine. Is > there a system file somewhere that you could get this from? > That's why this is so curious. It's there somewhere, but > WHERE? > Records for physical files are stored in members. A physical file can have one or more members. An MI-system object, called the cursor, identifies each member. A cursor can point directly to a data space (for arrival sequence files) or to a data space through a dataspace index (for keyed sequence files). The object type/subtype for a member cursor is x'0D50'. The cursor name consists firstly of the 10-character filename, then the 10-character member name and is finally padded out with blanks for a total of 30 characters. Given that representation, we can then resolve a system pointer to the cursor using code similar to the following: CPYBLA RESOLVE-TYPE, X'0D50'; CPYBLAP RESOLVE-NAME( 1:30), PARM-FILE, " "; CPYBLA RESOLVE-NAME(11:10), PARM-MEMBER; RSLVSP .CURSOR, RESOLVE, .CONTEXT, *; We build a space pointer to the associated space from the resolved system pointer with the "Set Space Pointer From Pointer"-instruction: SETSPPFP .CURSOR-SPACE, .CURSOR; The Member Header Investigating the associated space for the cursor we see that at offset x'04' there is a 4-byte binary value (x'00000490') that when added to the address of the associated space (x'.0007F0') points to an area (x'.000c80') where the member descriptive text, type and source change dates are stored. This area is known as the member header: DCL SPCPTR .CURSOR-SPACE; DCL SPC CURSOR-SPACE BAS(.CURSOR-SPACE); DCL DD CSR-MBR-HEADER BIN(4) DEF(CURSOR-SPACE) POS(5); Further analysis (which I'll spare you) reveals that the format of the member header is as follows: DCL SPCPTR .MBR-HEADER; DCL SPC MBR-HEADER BAS(.MBR-HEADER); DCL SYSPTR .MHDR-PREV-MCB DIR; DCL SYSPTR .MHDR-NEXT-MCB DIR; DCL SYSPTR .MHDR-FILE-CB DIR; DCL SYSPTR .MHDR-SHARE-DIR DIR; DCL SYSPTR .MHDR-DATA-DICT DIR; DCL DD MHDR-STATUS CHAR(2) DIR; DCL DD * CHAR(2) DIR; DCL DD MHDR-TEXT CHAR(50) DIR; DCL DD MHDR-TYPE CHAR(10) DIR; DCL DD * CHAR(10) DIR; DCL DD MHDR-CHANGE-DATE CHAR(13) DIR; DCL DD MHDR-CREATE-DATE CHAR(13) DIR; DCL DD MHDR-PREFRD-UNIT CHAR(1) DIR; DCL DD MHDR-ALLOC-TYPE CHAR(2) DIR; DCL DD MHDR-INIT-RECS BIN(4) DIR; DCL DD MHDR-RECS-EXTEND BIN(2) DIR; DCL DD MHDR-NBR-EXTENDS BIN(2) DIR; DCL DD MHDR-RECOVER-OPT CHAR(1) DIR; DCL DD MHDR-SAVE-DATE CHAR(13) DIR; DCL DD MHDR-RSTR-DATE CHAR(13) DIR; DCL DD MHDR-%-DLT-ALLOW CHAR(1) DIR; DCL DD MHDR.USER-AREA BIN(4) DIR; DCL DD MHDR-OLD-S-DATE CHAR(13) DIR; DCL DD MHDR-OLD-R-DATE CHAR(13) DIR; DCL DD MHDR........... CHAR(1) DIR; We can get a pointer to the member header by using the "Add to Space Pointer"-instruction (ADDSPP) that adds the binary value at offset x'04' (which we'll use as the 3rd operand) to the space pointer to the associated space (which we'll use as the 2nd operand) yielding the required space pointer to the member header, returned to us by ADDSPP in the 1st operand: ADDSPP .MBR-HEADER, .CURSOR-SPACE, CSR-MBR-HEADER; Unfortunately, we cannot add a negative offset to get at the functional space of the object (where the system pointer is pointing to). If you try to, you get a run-time exception that the address is outside of the bounds of the associated space. What we really would like to do is to manufacture a space pointer directly from the system pointer. That problem we just solved in chapter 7 and we'll apply the solution here: CPYBWP .POINTER, .CURSOR; CPYBREP PTR-OFFSET, X'00'; CALLX .MIMAKPTR, MIMAKPTR, *; And now we can access the modify-timestamp: DCL SPC MBR-CURSOR BAS(.POINTER); DCL DD MBR-CHANGE-TIMESTAMP CHAR(8) DEF(MBR-CURSOR) POS(129);
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.