DSN8EAE1

ENCODES AND DECODES COLUMNS OF THE TABLE EMP DRIVEN BY A LIST OF NAMES OF COLUMNS TO BE ENCODED/DECODED .

         TITLE 'DSN8EAE1 - SAMPLE DATA EDIT EXIT'
**********************************************************************
*                                                                    *
*   MODULE NAME = DSN8EAE1                                           *
*                                                                    *
*   DESCRIPTIVE NAME = EDIT EXIT FOR TABLE EMP                       *
*                                                                    *
*      Licensed Materials - Property of IBM                          *
*      5635-DB2                                                      *
*      (C) COPYRIGHT 1982, 2006 IBM Corp.  All Rights Reserved.      *
*                                                                    *
*      STATUS = Version 9                                            *
*                                                                    *
*   FUNCTION =                                                       *
*      ENCODES AND DECODES COLUMNS OF THE TABLE EMP                  *
*      DRIVEN BY A LIST OF NAMES OF COLUMNS TO BE ENCODED/DECODED    *
*                                                                    *
*   NOTES =                                                          *
*      DEPENDENCIES =                                                *
*         THE EXIT IS DRIVEN BY A LIST OF COLUMN NAMES, CHANGES      *
*         TO THESE NAMES HAVE ALSO TO BE MADE IN THIS LIST INTERNAL  *
*         TO THE EXIT.                                               *
*         SINCE THE EXIT IS ONLY DEPENDENT ON THESE COLUMN NAMES IT  *
*         CAN BE EASILY ADAPTED FOR OTHER TABLES.                    *
*         MORE COLUMN NAMES AND THEIR EN/DECODE ROUTINES MAY BE      *
*         ADDED TO THE EXIT.                                         *
*         THE SALARY COLUMN MUST BE DECIMAL(8,2)                     *
*             OTHERWISE IT IS CONSIDERED AS INVALID                  *
*                                                                    *
*         THE LOGIC IS INDEPENDENT OF :                              *
*             COLUMN POSITIONS IN ROW                                *
*             NULL/NOT NULL ATTRIBUTE OF COLUMNS                     *
*         THIS ROUTINE DOES NOT USE THE PROVIDED WORKAREA.           *
*                                                                    *
*      RESTRICTIONS =                                                *
*         THE SALARY COLUMN MUST BE DECIMAL(8,2)                     *
*             OTHERWISE IT IS CONSIDERED AS INVALID                  *
*                                                                    *
*      REGISTER CONVENTIONS =                                        *
*         R0 - R15 SYMBOLS ARE USED FOR REGISTERS                    *
*         REGISTER  0 WORK REGISTER                                  *
*         REGISTER  1 ADDRESS OF PARAMETER LIST (PARMLIST)           *
*         REGISTER  2 WORK REGISTER                                  *
*         REGISTER  3 ADDRESS OF DSNDEXPL                            *
*         REGISTER  4 WORK REGISTER                                  *
*         REGISTER  5 POINTS TO DATA COLUMNS IN THE OUTPUT ROW       *
*         REGISTER  6 POINTS TO TABLE ENTRY OF COLS TO BE EN/DECODED *
*         REGISTER  7 NUMBER OF COLUMNS IN THE ROW                   *
*         REGISTER  8 POINTS TO DATA COLUMNS IN THE INPUT ROW        *
*         REGISTER  9 POINTS TO COLUMN DESCRIPTION ENTRY             *
*         REGISTER 10 POINTS TO ROW DESCRIPTION                      *
*         REGISTER 11 ADDRESS OF DSNDEDIT                            *
*         REGISTER 12 IS THE BASE REGISTER                           *
*         REGISTER 13 IS THE SAVEAREA POINTER                        *
*         REGISTER 14 THE RETURN ADDRESS                             *
*         REGISTER 15 ENTRY ADDRESS                                  *
*                                                                    *
*   MODULE TYPE = PROCEDURE                                          *
*                                                                    *
*      PROCESSOR =  ASSEMBLER XF OR H                                *
*                                                                    *
*      MODULE SIZE = SEE ASSEMBLER LISTING                           *
*                                                                    *
*      ATTRIBUTES = REENTERABLE                                      *
*                                                                    *
*   ENTRY POINT = DSN8EAE1                                           *
*                                                                    *
*      PURPOSE = SEE FUNCTION                                        *
*                                                                    *
*      LINKAGE = CALL DSN8EAE1(EXPL,EDIT)                            *
*                                                                    *
*      INPUT =                                                       *
*         DSNDEXPL            - EXIT ROUTINE PARAMETER LIST          *
*         DSNDEDIT            - INTERFACE BLOCK FOR EDIT EXITS       *
*                                                                    *
*      OUTPUT =                                                      *
*               SET EDITOLTH IN DSNDEDIT                             *
*               EDITED ROW OF DATA, EDITOPTR->DATA                   *
*                                                                    *
*   EXIT-NORMAL = NO ERRORS WERE FOUND DURING EN/DECODING OF COLUMNS.*
*                                                                    *
*   EXIT-ERROR = ERRORS WERE FOUND DURING EN/DECODING OF COLUMNS.    *
*                                                                    *
*      RETURN CODE = 4                                               *
*         REASON CODE =  4    - SALARY COLUMN IS NOT PACKED DECIMAL  *
*         REASON CODE =  8    - SALARY COLUMN IS NOT 5 BYTES         *
*         REASON CODE = 12    - ENCODE/DECODE FLAG IS NOT CORRECT    *
*                                                                    *
*      ABEND CODES = NONE                                            *
*                                                                    *
*      ERROR-MESSAGES = NONE                                         *
*                                                                    *
*   EXTERNAL REFERENCES =                                            *
*      ROUTINES/SERVICES = NONE                                      *
*                                                                    *
*      DATA-AREAS =                                                  *
*                                                                    *
*      CONTROL-BLOCKS =                                              *
*         DSNDEDIT            - INTERFACE BLOCK FOR EDIT EXITS       *
*         DSNDEXPL            - EXIT ROUTINE PARAMETER LIST          *
*         DSNDROW             - DSECT RFMT : ROW DESCRIPTION         *
*                                                                    *
*      MACROS         =                                              *
*         DSNDEDIT            - INTERFACE BLOCK FOR EDIT EXITS       *
*         DSNDEXPL            - EXIT ROUTINE PARAMETER LIST          *
*         DSNDROW             - DSECT RFMT : ROW DESCRIPTION         *
*         RETURN              - HOUSEKEEPING, RETURN TO INVOKER      *
*         SAVE                - HOUSEKEEPING                         *
*                                                                    *
*   TABLES = LOCAL TABLE                                             *
*          LSTCOLS =  ONE ENTRY CONTAINS                             *
*                  NAME OF COLUMN TO BE ENCODED/DECODED AND          *
*                  ADDRESS OF CORRESPONDING EDIT ROUTINE             *
*                                                                    *
*                                                                    *
*   CHANGE-ACTIVITY =                                                *
*     10/13/2005 PATCH AROUND VARLEN FIELDS FOR RRF        D71786 @01*
*                                                                    *
*   PSEUDOCODE      =                                                *
*                                                                    *
*      INITIALIZE THE ADDRESS REGISTERS AND                          *
*                 THE DATA REGISTERS.                                *
*      MOVE INPUT ROW TO OUTPUT ROW.                                 *
*      DO WHILE COLUMN DESCRIPTIONS PRESENT.                         *
*        IF ROW COLUMN IS IN LIST OF COLUMNS TO BE EDITED            *
*          BRANCH TO THE ROUTINE (CALL SALYEDIT).                    *
*      END (WHILE COLUMN DESCRIPTIONS PRESENT).                      *
*      RETURN                                                        *
*                                                                    *
*      SALYEDIT: PROC.                                               *
*        IF SALARY NOT PACKED DECIMAL                                *
*          DECIMAL(8,2) = 5 BYTES LONG ( PLUS ONE FOR NULLS )        *
*          THEN SET THE ERROR REASON AND RETURN CODE.                *
*        ELSE                                                        *
*        IF EDIT CODE = 0 ENCRYPT THE SALARY.                        *
*        IF EDIT CODE = 4 DECRYPT THE SALARY.                        *
*        POSITION POINTER TO EXAMINE THE NEXT COLUMN OF DATA         *
*        IF THE DATA POINTER HAS RUN OFF THE END OF EDITROW, SHUTDOWN*
*      END SALYEDIT.                                                 *
*                                                                    *
**********************************************************************
         EJECT
**********************************************************************
*                                                                    *
*    START OF EXECUTION                                              *
*                                                                    *
**********************************************************************
*
DSN8EAE1 AMODE 31                      ADDRESS IN 31 BITS
DSN8EAE1 RMODE ANY                     RESIDE ANYWHERE
DSN8EAE1 CSECT                         CONTROL SECTION NAME
         SAVE  (14,12),,*              SAVE REGS, EYECATCHER
         LR    R12,R15                 CODE ADDRESSABILITY
         USING DSN8EAE1,R12            TELL THE ASSEMBLER
         USING PARMLIST,R1             NOTE PARM ADDRESSABILITY
         L     R3,PARMEXPL             GET ADDRESS OF DSNDEXPL
         USING EXPL,R3                 SET ADDRESSABILITY
         L     R11,PARMEDIT            GET ADDRESS OF DSNDEDIT
         USING DSNDEDIT,R11            SET ADDRESSABILITY
         L     R10,EDITROW             ADDRESS OF ROW DESCRIPTION
         USING RFMT,R10                SET ADDRESSABILITY
         L     R9,RFMTAFLD             ADDRESS OF COLUMN LIST
         USING FFMT,R9                 SET ADDRESABILITY
         L     R4,EDITOPTR             ADDRESS OF OUTPUT ROW DATA
         L     R8,EDITIPTR             ADDRESS OF INPUT ROW DATA
         L     R1,EDITILTH             GET THE LENGTH OF INPUT DATA
         ST    R1,EDITOLTH             THE OUTPUT LENGTH IS THE SAME
         LR    R0,R8                   POINT TO THE INPUT
         LR    R5,R1                   AND SET THE OUTPUT LENGTH
         MVCL  R4,R0                   MOVE THE INPUT DATA TO OUTPUT
         L     R5,EDITOPTR             ADDRESS OF OUTPUT ROW DATA
         L     R7,RFMTNFLD             SET LOOPCOUNT TO NUM OF COLUMNS
         EJECT
**********************************************************************
*                                                                    *
*   MAIN LOOP, SEARCH LIST FOR A COLUMN TO BE EDITED                 *
*                                                                    *
**********************************************************************
MAINLOOP LA    R6,LSTCOLS              START OF COLUMN NAME LIST
         USING LSTDSECT,R6             SET THE ADDRESSABILITY
FINDCOL  CLC   LSTADDR,LSTEND          NO (MORE) COLUMNS IN LIST
         BE    COLEDIT                 ROW COLUMN NOT TO BE EDITED
         CLC   LSTCOLNM,FFMTFNAM       COMPARE COLUMN NAMES
         BE    FOUNDCOL                COLUMN IS TO BE EDITED
         LA    R6,LSTCEND              LOCATE NEXT LIST ENTRY
         B     FINDCOL                 SEARCH
FOUNDCOL DS    0H                      FOUND A COLUMN
         L     R1,LSTADDR              GET THE ROUTINE ADDRESS
         CLI   FFMTNULL,FFMTNNO        HAS IT 'NOT NULL' ATTRIBUTE
         BE    ZERO(R1)                YES, GO TO EDIT ROUTINE
         CLI   FFMTFTYP,FFMTVARC       IS THIS A VARCHAR COLUMN
         BNE   COLNOTV                 NO, USE THE SIMPLE WAY
         CLI   TWO(R8),FF              VARCHAR, IS IT NULL NOW
         BE    COLEDIT                 YES,IT'S NULL NOW, DON'T EDIT
         B     ZERO(R1)                GO TO EDIT ROUTINE
COLNOTV  CLI   ZERO(R8),FF             IS IT NULL NOW
         BE    COLEDIT                 YES,IT'S NULL NOW, DON'T EDIT
         B     ZERO(R1)                GO TO EDIT ROUTINE
         EJECT
**********************************************************************
*                                                                    *
*   EDIT ROUTINE FOR THE SALARY COLUMN                               *
*                                                                    *
**********************************************************************
SALYEDIT DS    0H
         LA    R1,REASDEC              POINT TO ERROR RETURN REASON
         CLI   FFMTFTYP,FFMTDEC        IS IT 'PACKED DEC'
         BNE   ERROR                   NO,CHANGE OR REMOVE THIS EXIT
         LR    R2,R5                   POINT TO THE INPUT AREA
         LR    R4,R8                   POINT TO THE OUTPUT AREA
         LA    R1,REASLEN              POINT TO ERROR RETURN REASON
         CLI   FFMTNULL,FFMTNNO        HAS IT 'NOT NULL' ATTRIBUTE
         BE    COLNOTN                 YES, USE THE SIMPLE WAY
         CLC   FFMTFLEN,SALYLENN       6 BYTES LONG (DECIMAL(8,X)),NULL
         BNE   ERROR                   NO,CHANGE OR REMOVE THIS EXIT
         LA    R2,ONE(R2)              POINT PAST THE NULL BYTE
         LA    R4,ONE(R4)              POINT PAST THE NULL BYTE
         B     COLLENOK                NO,CHANGE OR REMOVE THIS EXIT
COLNOTN  CLC   FFMTFLEN,SALYLEN        5 BYTES LONG (DECIMAL(8,X))
         BNE   ERROR                   NO,CHANGE OR REMOVE THIS EXIT
COLLENOK LA    R0,EDITENC              ENCODE/DECODE BRANCH
         C     R0,EDITCODE             ENCODE/DECODE BRANCH
         BE    SALYENC                 IT IS THE ENCODE CODE
         LA    R0,EDITDEC              ENCODE/DECODE BRANCH
         C     R0,EDITCODE             ENCODE/DECODE BRANCH
         BE    SALYDEC                 IT IS THE DECODE CODE
         LA    R1,REASPARM             POINT TO ERROR RETURN REASON
         B     ERROR                   THE ENCODE/DECODE FLAG IS WRONG
SALYENC  MVC   TWO(ONE,R2),ONE(R4)     ENCRYPT THE SALARY
         MVC   ONE(ONE,R2),TWO(R4)     JUST REARRANGE THE DATA
         MVC   FOUR(ONE,R2),THREE(R4)  THIS MAKES NO PRETENSE OF
         MVC   THREE(ONE,R2),FOUR(R4)  PROVIDING ANY SECURITY
         B     COLEDIT                 EDITING IS COMPLETE
SALYDEC  MVC   TWO(ONE,R2),ONE(R4)     DECRYPT THE SALARY
         MVC   ONE(ONE,R2),TWO(R4)     JUST RE-REVERSE THE DATA
         MVC   FOUR(ONE,R2),THREE(R4)  IN THE DATA
         MVC   THREE(ONE,R2),FOUR(R4)  BYTE BY BYTE
*                                      EDITING IS COMPLETE
*                                      END OF SALARY EDIT ROUTINE
         EJECT
COLEDIT  DS    0H                      COLUMN WAS EDITED OR SKIPPED
*                                      GET TO NEXT COLUMN IN ROW
         L     R1,FFMTFLEN             GET MAXIMUM LENGTH OF COLUMN
         CLI   FFMTFTYP,FFMTVARC       IS THIS A VARCHAR COLUMN
         BNE   COLNEXT                 NO, USE THE SIMPLE WAY
         CLI   RFMTTYPE,RFMTVNRF       YES, IS THIS BASIC ROW FMT?  @01
         BE    NXTDESCR                NO, DON'T ADVANCE POINTERS   @01
         LH    R1,0(R8)                YES, VARCHAR, GET THE ACTUAL LEN
         A     R1,F2                   THEN ADD TWO FOR THE LENGTH
COLNEXT  DS    0H                      ERROR FOR A COLUMN TO BE EDITED
         AR    R5,R1                   NEXT COLUMN IN OUTPUT ROW
         AR    R8,R1                   NEXT COLUMN IN INPUT ROW
         L     R2,EDITIPTR             GET ADDRESS OF THE INPUT BUFFER
         A     R2,EDITILTH             GET END ADDR OF THE INPUT BUFFER
         CR    R2,R8                   MUST CHECK FOR END OF BUFFER!
         BNH   RETURN                  SHUTDOWN IF BUFFER IS PROCESSED
NXTDESCR DS    0H                                                   @01
         LA    R9,FFMTE                NEXT COLUMN DESCRIPTION
         BCT   R7,MAINLOOP             HANDLE NEXT COLUMN OF THE ROW
RETURN   DS    0H                      ERROR FOR A COLUMN TO BE EDITED
         RETURN (14,12)                RETURN WITH CODE IN EXPLRC1
*                                      EDIT ERRORS
ERROR    DS    0H                      ERROR FOR A COLUMN TO BE EDITED
         MVC   EXPLRC1,ERRCODE         SET THE ERROR RETURN CODE
         MVC   EXPLRC2,0(R1)           SET THE ERROR RETURN REASON
         B     RETURN                  THEN EXIT
         EJECT
**********************************************************************
*                                                                    *
*   DECLARE THE CONSTANTS FOR THE PROGRAM                            *
*                                                                    *
**********************************************************************
F2       DC    F'2'                    L'VARCHAR LENGTH FIELD
SALYLEN  DC    F'5'                    L'SALARY IN BYTES IF NOT NULL
SALYLENN DC    F'6'                    L'SALARY IN BYTES IF NULLABLE
ERRCODE  DC    H'4'                    ERROR RETURN CODE
*                                      ERROR REASON CODES
REASDEC  DC    F'4'                    DATA WAS NOT DECIMAL
REASLEN  DC    F'8'                    DATA WAS NOT LENGTH EXPECTED
REASPARM DC    F'12'                   ENCODE/DECODE FLAG WAS BAD
*
         DSNTIACN
         SPACE 5
COLLEN   EQU   18                      LENGTH OF COLUMN NAME, LSTCOLS
LSTCOLS  DS    0F                      LIST OF COLUMNS TO BE EDITED
         DC    A(SALYEDIT),CL(COLLEN)'SALARY'  EDIT ROUTINE, COLUMN
LSTEND   DC    A(0)                    END OF LIST
*
PATCH    DC    C'PATCH AREA - DSN8EAE1 &SYSDATE &SYSTIME'
PSPACE   DC    25S(*)
**********************************************************************
*                                                                    *
*   DECLARE THE DUMMY SECTIONS                                       *
*                                                                    *
**********************************************************************
         SPACE 5
*
*                                      LIST OF COLUMNS FORMAT (LSTCOLS)
*
LSTDSECT DSECT                         SAME AS LSTCOLS
LSTADDR  DS    A                       ADDRESS OF ROUTINE TO BE CALLED
LSTCOLNM DS    CL(COLLEN)              COLUMN NAME
LSTCEND  DS    0F                      SET THE BOUNDARY, END OF LIST
         SPACE 5
*                                      PARAMETER LIST PASSED TO EXIT
*
PARMLIST DSECT                         PARAMETER DSECT
PARMEXPL DS    A                       ADDRESS OF DSNDEXPL
PARMEDIT DS    A                       ADDRESS OF DSNDEDIT
         SPACE 5
*
*                                      PARAMETERS PASSED TO EXIT
*
         DSNDEXPL
         SPACE 5
*
*                                      PARAMETERS PASSED TO EDIT EXIT
*
         DSNDEDIT
         SPACE 5
*
*                                      DESCRIPTION OF ROWS
*
         DSNDROW
         END   DSN8EAE1