× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



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 thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 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.