Previous Topic: OLQ DML User ExitNext Topic: Assembly and Link Edit (z/OS)


Sample Exit

OLQDMLX1 TITLE 'SAMPLE USER-WRITTEN DML EXIT FOR OLQ'
*OLQDMLX1 RENT EP=DMLXEP1 XA
***********************************************************************
***********************************************************************
**                                                                   **
**   THIS PROGRAM IS A TEMPLATE TO BE USED AS AN EXAMPLE FOR         **
**   PROVIDING ENTRY INTO AND EXIT FROM AN OLQ USER-WRITTEN          **
**   DBMS EDIT MODULE FOR RELEASE 14.0 AND LATER.                    **
**                                                                   **
***********************************************************************
***********************************************************************
**                                                                   **
**   THIS IS A SAMPLE ONLY AND NO GUARANTEE IS GIVEN AS TO           **
**   FUNCTIONALITY, ACCURACY, COMPLETENESS, OR PERFORMANCE.          **
**                                                                   **
***********************************************************************
***********************************************************************
         EJECT
*----------------------------------------------------------------------
*
*  USERDMLX1 - USER-WRITTEN EXIT FOR DML COMMANDS IN OLQ
*
*----------------------------------------------------------------------
*
*  OLQDMLX1 allows user-defined editing of DML commands before they
*  are issued by OLQ. The edit routine can be used for things such
*  as validating security, keeping statistics, looking for special
*  data values, etc.
*
*  If certain records, DML commands, or AREAs are to be selected
*  for editing, an IDMS database procedure should be used.
*
*  If many records or many subschemas are to be edited during OLQ
*  processing, this exit should be used.
*
*  OLQDMLX1 will be automatically called by OLQ before every
*  DML command if program OLQSDMLE is LINK/EDITed with this
*  module and with IDMSBALI and command 'DCMT VARY PROGRAM
*  OLQSDMLE NEW COPY' is issued.
*  //SYSLIB    DD DISP=SHR,DSN=IDMS.LOADLIB
*  //OBJLIB    DD DISP=SHR,DSN=USER.LOADLIB
*  //SYSLIN    DD *
*    INCLUDE SYSLIB(OLQSDMLE)
*    INCLUDE OBJLIB(OLQDMLX1)
*    INCLUDE SYSLIB(IDMSBALI)
*    MODE    AMODE(31),RMODE(ANY)
*    ENTRY   ENTRY
*    NAME    OLQSDMLE(R)
*
*   REGISTER USAGE -
*        R12 - BASE REGISTER
*        R13 -
*        R14 - RETURN ADDRESS FOR SUBROUTINES
*        R15 - A(DB/DC INTERFACE)
*        R0  -
*        R1  - A(PARAMETER LIST) AT ENTRY AND DURING CALLS
*        R2  - A(SECURITY REQUEST BLOCK)
*        R3  -
*        R4  -
*        R5  - WORK REGISTER
*        R6  -
*        R7  -
*        R8  - A(OLQ GLOBAL WORK AREA)
*        R9  -
*        R10 -
*        R11 -
*
*----------------------------------------------------------------------
         EJECT
DMLXSTG  DSECT
*----------------------------------------------------------------------
*        Any user-required storage is defined here
*----------------------------------------------------------------------
WORKAREA DC    CL80' '
DMLXSTGL EQU   *-DMLXSTG
SSCTRLDS DSECT
         @SSCTRL
      EJECT
*----------------------------------------------------------------------
*        Entry code is defined here
*----------------------------------------------------------------------
         #MOPT CSECT=OLQDMLX1,ENV=USER
         @MODE MODE=IDMSDC,WORKREG=R0,QUOTES=YES,DEBUG=YES
         USING DMLXEP1,R12
         ENTRY DMLXEP1
         DC    0F'0',CL8'DMLXEP1'
DMLXEP1  DS    0F
         STM   R0,R15,0(R13)          SAVE OLQ'S REGISTERS
         LA    R13,16*4(,R13)         ADJUST STACK POINTER
         LR    R12,R15                ADDRESSIBILITY
         #GETSTG TYPE=(USER,SHORT),LEN=DMLXSTGL,ADDR=(R11),            X
               PLIST=*,STGID='USER',INIT=X'00'
         USING DMLXSTG,R11
         LR    R5,R13                 STACK POINTER
         SH    R5,=AL2(16*4)          A(OLQ'S REGISTERS)
         L     R14,56(,R5)            OLQ'S RETURN REGISTER
         CLC   =AL2(28),0(R14)        IF NOT A DML COMMAND
         BNE   DMLXEXIT                  CONTINUE DC PROCESSING
         L     R1,4(,R5)              RESTORE A(OLQ'S PARM LIST)
         L     R5,4(,R1)              A(SSCIDBCM+4)
         LA    R5,5(,R5)
         SR    R5,R1                  IDBMSCOM SUBSCRIPT
         EJECT
*----------------------------------------------------------------------
*        Edit code is defined here
*----------------------------------------------------------------------
*----------------------------------------------------------------------
*        'Bind Run Unit' edit code is defined here
*----------------------------------------------------------------------
DMLX1000 DS    0H
         CH    R5,=H'59'              IF NOT 'BIND RUN UNIT'
         BNE   DMLX2000                  SEE IF THIS IS 'OBTAIN'
*        Code 'BIND RUN UNIT' pre-processing here
         B     DMLXEXIT               PERFORM THE 'BIND'
         EJECT
*----------------------------------------------------------------------
*        DML edit code is defined here
*----------------------------------------------------------------------
DMLX2000 DS    0H
         CH    R5,=H'32'              IF NOT 'OBTAIN CALC'
         BNE   DMLX3000                  SEE IF THIS IS 'FINISH'
         L     R5,8(,R1)              A(RECORD NAME)
         CLC   =CL16'EMPLOYEE',0(R5)  IF NOT 'OBTAIN CALC EMPLOYEE'
         BNE   DMLXEXIT                  PERFORM THE 'OBTAIN CALC'
*        Code 'OBTAIN CALC EMPLOYEE' processing here
         L     R5,160(,R8)            A(RECORD IO BUFFER)
         CLC   =C'0048',0(R5)         IF EMP-ID-0415 NOT = 0048
         BNE   DMLXEXIT                  PERFORM THE 'OBTAIN CALC'
ABND2000 L     R5,0(,R1)              A(SSCTRL)
         USING SSCTRLDS,R5
         MVC   ERRSTAT,=C'0399'       'OBTAIN CALC EMPLOYEE' is
         MVC   ERRORREC,=C'SECURITY ERROR  '       not allowed
         B     DMLXRETN               RETURN TO OLQ
         DROP  R5
         EJECT
*----------------------------------------------------------------------
*        FINISH edit code is defined here
*----------------------------------------------------------------------
DMLX3000 DS    0H
         CH    R5,=H'2'               IF NOT 'FINISH RUN UNIT'
         BNE   DMLXEXIT                  PERFORM DML
*        Code 'FINISH RUN UNIT' processing here
         B     DMLXEXIT               PERFORM THE 'FINISH RUN UNIT'
         EJECT
*----------------------------------------------------------------------
*        Exit code is defined here
*----------------------------------------------------------------------
DMLXEXIT L     R15,=V(IDCSACON)       A(CSA)
         SH    R13,=H'64'             POINT TO OLQ'S STACK
         LM    R0,R14,0(R13)          RESTORE OLQ'S REGISTERS
         BR    R15                    EXECUTE REQUESTED COMMAND
DMLXRETN SH    R13,=H'64'             POINT TO OLQ'S STACK
         LM    R0,R15,0(R13)          RESTORE OLQ'S REGISTERS
         LA    R14,2(,R14)            A(NEXT INSTRUCTION)
         BR    R14                    RETURN TO OLQ
         DROP  R11
         LTORG
         END   DMLXEP1 x