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