Previous Topic: Assembler User Exit TemplateNext Topic: Macros


Sample Assembler User Exit

Functions

This is a sample CA IDMS VSAM Transparency user exit written in Assembler. It is functionally equivalent to the sample COBOL exit in Sample COBOL User Exit. The source code for this program is provided on the installation media with CA IDMS VSAM Transparency (member name ESVSXITA).

This exit allows you to convert the VSAM structure into CA IDMS/DB structure.

VSAM Structure (Variable Length KSDS Record)

CA IDMS Structure

The user exit must navigate the database and build the record that the VSAM application program is expecting.

Functions as Before Exit

This exit is invoked both before and after any DML processing. As a before exit, it performs the following functions:

Functions as After Exit

As an after exit, it performs the following functions:

Sample Assembler Exit

***                                                                 *
***      THIS EXIT IS INVOKED USING STANDARD z/OS LINKAGE;          *
***         BALR 14,15         (FROM CALLING PROGRAM)               *
***         STM  14,12,12(13)  (FIRST THING IN CALLED PROGRAM)      *
***         BR   14            (TO RETURN)                          *
***                                                                 *
***      REGISTER USAGE CONVENTIONS ARE:                            *
***                                                                 *
***         R1     -─►  SET UP TO SSC FOR EXITIDMS                  *
***         R2     -─►  SUBSCHEMA CONTROL DSECT                     *
***         R3     -─►  EXIT DSECT                                  *
***         R4     -─►  COVERAGE RECORD DSECT/WORK REGISTER         *
***         R5     -─►  WORK AREA FOR MOVE OF RECORD                *
***         R6     -─►  WORK REGISTER                               *
***         R7     -─►  WORK AREA FOR CONVERSION                    *
***         R8     -─►  POLICY RECORD DSECT                         *
***         R9     -─►  TCE                                         *
***         R10    -─►  CSA                                         *
***         R11    -─►  SAVE AREA                                   *
***         R12    -─►  BASE REGISTER                               *
***         R13    -─►  SAVE AREA                                   *
***         R14    -─►  USED BY CALL CONVENTION                     *
***         R15    -─►  USED BY CALL CONVENTIONS                    *
***                                                                 *
***      INPUT:                                                     *
***                                                                 *
***         R1     -─►  PARAMETER LIST                              *
***         R1+0   -─►    ADDRESS OF EXB                            *
***         R1+4   -─►    ADDRESS OF SSC                            *
***         R1+8   -─►    ADDRESS OF RECORD BUFFER                  *
*********************************************************************
         EJECT
ESVSXITA CSECT
         #MOPT ENV=USER
         @MODE MODE=BATCH,QUOTES=YES,DEBUG=YES
*                                   SPECIFY OPERATING ENVIRONMENT,
*                                   NOTATION CONVENTION, DEBUG OPTION
BEGIN    STM   R14,R12,12(R13)      SAVE CALLER'S REGISTERS
         BALR  R12,0                ESTABLISH R12 AS BASE
         USING *,R12
         SPACE
         B     START                BRANCH AROUND LITERAL
*
         DC    CL8'ESVSXITA'        EYECATCHER
*
         USING SSC,R2               SUBSCHEMA CONTROL ADDRESSIBILITY
         USING EXBDS,R3             EXIT DSECT ADDRESSABILITY
         USING COVERAGE,R4          COVERAGE RECORD ADDRESSIBILITY
         USING RECORD,R8            POLICY RECORD ADDRESSIBILITY
         USING CSA,R10              COMMON SYSTEM AREA ADDRESSIBILITY
         SPACE
START    EQU   *
         LR    R7,R13               SAVE R13
         L     R3,0(R1)             R3  ─► EXB
         L     R2,4(R1)             R2  ─► SSC
         L     R8,8(R1)             R8  ─► RECORD BUFFER
         LA    R13,EXBSAVE          R13 ─► USER SAVE AREA
         SPACE
***
***  ACQUIRE STORAGE FOR EXIT TO USE
***
GETSTG   #GETSTG TYPE=(USER,SHORT),PLIST=*,LEN=50,INIT=0,              X
               ADDR=(R4),ERROR=STGERROR
         SPACE
*
         EJECT
*     CHECK TO SEE IF THIS IS A BEFORE EXIT WITH A PUT REQUEST
CHKBEFOR CLI   EXBXEXIT,C'B'        CALLING BEFORE EXIT??
         BNE   CHKAFTER             NO, CHECK FOR AFTER EXIT
         CLC   EXBRTYPE,=CL6'PUT'   IS THIS A PUT REQUEST??
         BNE   CHKERASE             NO, DON'T DO ANYTHING ELSE
         SPACE
*     BEFORE EXIT - PUT REQUEST
*     MOVE ZERO TO CONTROL FIELD
BEFORPUT MVC   CNTLFLD,=H'00'       MOVE ZERO TO OCCURS FIELD
         B     RTN                  RETURN
         EJECT
*     CHECK TO SEE IF THIS IS AN BEFORE EXIT WITH A ERASE REQUEST
CHKERASE CLI   EXBXEXIT,C'B'        YES, CALLING BEFORE EXIT??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         CLC   EXBRTYPE,=CL6'ERASE' IS THIS AN ERASE REQUEST??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         SPACE
*     BEFORE EXIT - ERASE REQUEST
*     GET POLICY RECORD AND ERASE ALL COVERAGE RECORDS WITHIN
*     POLICY-COVG SET.
         SPACE
BEFORERA EQU   *
         CLC   POLTYP,=CL4'1040'    IS RECORD TYPE 1040??
         BNE   REC1041              NO, CHECK FOR TYPE 1041
         LA    R6,4                 R6 ─► 4 COVERAGE RECORDS TO GET
         B     BINDPOL              GO BIND POLICY RECORD
REC1041  CLC   POLTYP,=CL4'1041'    IS RECORD TYPE 1041??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         LA    R6,3                 R6 ─► 3 COVERAGE RECORDS TO GET
         SPACE
***  BIND POLICY RECORD
BINDPOL  EQU   0
         @BIND REC=POLREC,IOAREA=(R4)   BIND COVERAGE RECORD TO R4
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO
         BNE   RTNERR               NO, RETURN ERROR
         SPACE
***  OBTAIN POLICY RECORD
OBTPOLCY @FIND   CALC,REC=POLREC    OBTAIN CALC POLICY RECORD
*
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO??
         BNE   RTNERR               NO, RETURN ERROR
***  BIND COVERAGE RECORD
         @BIND REC=COVGREC,IOAREA=(R4)   BIND COVERAGE RECORD TO R4
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO
         BNE   RTNERR               NO, RETURN ERROR
         SPACE
***  OBTAIN COVERAGE RECORDS
OBTCOVG  @OBTAIN NEXT,SET=SETNAME,REC=COVGREC
*                                   OBTAIN ALL COVERAGE RECORDS FOR
*                                      THIS POLICY
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO??
         BNE   RTNERR               NO, RETURN ERROR
         SPACE
***  ERASE COVERAGE RECORD
         @ERASE ALL,REC=COVGREC     ERASE COVERAGE RECORD FOR
*                                      THIS POLICY
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO??
         BNE   RTNERR               NO, RETURN ERROR
         BCT   R6,OBTCOVG           WALK THE SET, OBTAIN THE NEXT
         SPACE
         B     RTN                  RETURN
         EJECT
*     CHECK TO SEE IF THIS IS AN AFTER EXIT WITH A GET REQUEST
CHKAFTER CLI   EXBXEXIT,C'A'        YES, CALLING AFTER EXIT??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         CLC   EXBRTYPE,=CL6'GET'   IS THIS A GET REQUEST??
         BNE   CHKPUT               NO, CHECK FOR PUT REQUEST
         CLC   SSCSTAT,=CL4'0000'   STATUS OF LAST CALL = ZERO??
         BNE   RTN                  NO, RETURN
         SPACE
*     AFTER EXIT - GET REQUEST
*     GET MEMBERS IN IDMS SET AND BUILD VSAM RECORD IN BUFFER
*     WE HAVE THE OWNER RECORD.  OBTAIN ALL MEMBERS WITHIN
*     POLICY-COVG SET, AND BUILD VSAM TYPE RECORD FOR PROGRAM.
AFTERGET EQU   *
         CLC   POLTYP,=CL4'1040'    IS RECORD TYPE 1040??
         BNE   TYP1041              NO, CHECK FOR TYPE 1041
         LA    R6,4                 R6 ─► 4 COVERAGE RECORDS TO GET
         B     SETUP                GO OBTAIN THE RECORDS
TYP1041  CLC   POLTYP,=CL4'1041'    IS RECORD TYPE 1041??
         BNE   NOTREC               NO, DON'T DO ANYTHING ELSE
         LA    R6,3                 R6 ─► 3 COVERAGE RECORDS TO GET
         SPACE
SETUP    MVC   OCCURS,=CL40' '      CLEAR OUT AREA TO STORE COVERAGE
         LA    R5,27(0,R8)          R5 ─► START OF COVERAGE RECORDS
*                                         IN POLICY RECORD
***  BIND COVERAGE RECORD
         @BIND REC=COVGREC,IOAREA=(R4)   BIND COVERAGE RECORD TO R4
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO
         BNE   RTNERR               NO, RETURN ERROR
         SPACE
***  OBTAIN COVERAGE RECORD
GETREC   @OBTAIN NEXT,SET=SETNAME   OBTAIN NEXT COVERAGE RECORD
*                                      WITHIN POLICY-COVG SET
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO??
         BNE   RTNERR               NO, RETURN ERROR
         MVC   0(10,R5),COVERAGE    MOVE COVERAGE REC INTO POLICY REC
         LA    R5,10(0,R5)          R5 ─► LOC OF NEXT COVERAGE RECORD
         BCT   R6,GETREC            WALK THE SET, OBTAIN THE NEXT
*     MOVE ZERO TO CONTROL FIELD
PACK     MVC   CNTLFLD,=PL2'00'     MOVE ZERO TO OCCURS FIELD
         MVI   EXBSETLN,C'X'        HAVE PRPL SET NEW RECORD LENGTH
         B     RTN                  RETURN
         EJECT
*     CHECK TO SEE IF THIS A PUT REQUEST AND CALLING AFTER  EXIT
CHKPUT   CLI   EXBXEXIT,C'A'        CALLING AFTER EXIT??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         CLC   EXBRTYPE,=CL6'PUT'   IS THIS A PUT REQUEST??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         CLC   SSCSTAT,=CL4'0000'   STATUS OF LAST CALL = ZERO??
         BNE   RTN                  NO
         SPACE
*     AFTER EXIT - PUT REQUEST
*     STORE COVERAGE (MEMBER) RECORDS WITHIN POLICY-COVG SET
*   WE HAVE THE OWNER RECORD.  STORE ALL MEMBERS WITHIN POLICY-COVG
*   SET.
AFTERPUT EQU   *
         CLC   POLTYP,=CL4'1040'    IS RECORD TYPE 1040??
         BNE   TYPE1041             NO, RECORD CHECK FOR TYPE 1041
         LA    R6,4                 R6 ─► 4 COVERAGE RECORDS TO STORE
         B     SETUPS               GO STORE THE RECORDS
TYPE1041 CLC   POLTYP,=CL4'1041'    IS RECORD TYPE 1041??
         BNE   RTN                  NO, DON'T DO ANYTHING ELSE
         LA    R6,3                 R6 ─► 3 COVERAGE RECORDS TO STORE
         SPACE
SETUPS   LA    R5,27(0,R8)          R5 ─► START OF COVERAGE RECORDS
*                                         IN POLICY RECORD
***  BIND COVERAGE RECORD
         @BIND REC=COVGREC,IOAREA=(R4)   BIND COVERAGE RECORD TO R4
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO
         BNE   RTNERR               NO, RETURN ERROR
         SPACE
***  STORE COVERAGE RECORD
PUTREC   MVC   DATA,0(R5)           MOVE POLICY/COVG INFO TO COVG REC
         @STORE REC=COVGREC         STORE COVERAGE RECORD
         SPACE
         CLC   SSCSTAT,=CL4'0000'   STATUS ZERO
         BNE   RTNERR               NO, RETURN ERROR
         LA    R5,10(0,R5)          R5 ─► LOC OF NEXT COVERAGE RECORD
         BCT   R6,PUTREC            STORE THE NEXT RECORD
         B     RTN                  RETURN
         EJECT
NOTREC   MVC   OCCURS,=CL40' '      CLEAR OUT AREA TO STORE COVERAGE
         SPACE
RTNERR   EQU   *
         MVI   EXBSETFB,C'X'        TELL ESVS EXIT SET FEEDBACK CODE
         MVC   EXBFDBK,SSCSTAT      MOVE SSCSTAT TO EXBFDBK
RTN      EQU   *
         #FREESTG ADDR=(R4)         FREE ACQIURED STORAGE
         LR    R13,R7               RESTORE R13
         LM    R14,R12,12(R13)      RESTORE CALLER'S REGISTERS
         SR    R15,R15              ZERO RETURN CODE
         BR    R14                  RETURN TO CALLER
         SPACE
STGERROR EQU   *
         DC    H'0'                 ABEND WITH 0C1
         BR    R14                  RETURN TO CALLER
         SPACE
         EJECT
STARS    DC    CL8'********'        END OF EXECUTABLE CODE

DMLSEQ   DC    F'0'                 NEEDED AT DML EXPANSION TIME
SETNAME  DC    CL16'POLICY-COVG'    SET-NAME
COVGREC  DC    CL16'COVERAGE'       RECORD-NAME
POLREC   DC    CL16'POLICY'         RECORD-NAME
         LTORG
RECORD   DSECT                      POLICY RECORD LAYOUT
         DS    0F
POLICY   DS    0CL27
POLKEY   DS    0CL15
POLKEYDA DS    CL11
POLTYP   DS    CL4
POLDAT   DS    CL10
CNTLFLD  DS    CL2
OCCURS   DS    0CL40
COVG1    DS    CL10
COVG2    DS    CL10
COVG3    DS    CL10
COVG4    DS    CL10
         SPACE
COVERAGE DSECT                      COVERAGE RECORD LAYOUT
DATA     DS    CL10
         EJECT
         COPY  #EVEXBDS
         EJECT
         COPY  #SSCDS
         EJECT
         PRINT OFF
         PRINT NOGEN
         COPY  #CSADS
         PRINT GEN
         END   ESVSXITA