PRINT GEN TITLE 'ALC$VSAM - VSAM FILE PROCESSING' *********************************************************************** * A L C $ V S A M * *---------------------------------------------------------------------* * * * * * THIS PROGRAM WILL PERFORM VSAM I/O PROCESSING ON ANY VSAM FILE * * SIGNIFIED BY THE "//OVSAM" DD STATEMENT. *********************************************************************** R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 R00 EQU 0 R01 EQU 1 R02 EQU 2 R03 EQU 3 R04 EQU 4 R05 EQU 5 R06 EQU 6 R07 EQU 7 R08 EQU 8 R09 EQU 9 ALC$VSAM CSECT USING *,R11,R12 R11,R12=BASE REGISTERS STM R14,R12,12(R13) SAVE REGISTERS LR R11,R15 ADDRESSIBILITY LA R12,2048(0,R11) LA R12,2048(0,R12) LR R1,R13 SAVE SAVE AREA POINTER LA R13,SAVEAREA POINT TO MY SAVEAREA ST R13,8(0,R1) SET FORW CHAIN IN CALLERS SAREA ST R1,4(0,R13) SET BACK CHAIN IN MY SAVEAREA L R1,24(0,R1) REACQUIRE R1 AS IT CAME HERE B $$START DS 0F DC C'*' PGMID DC CL8'ALC$VSAM' DC C'*' COMPDATE DC CL8'&SYSDATE' COMPTIME DC CL8'&SYSTIME' SAVEAREA DC 18F'0' VSAMSAVE DC 18F'0' $$START EQU * LM R8,R9,0(R1) R8=PARMS * R9=RECORD AREA USING $$PARMS,R8 ADDRESSIBILITY TO PARM AREA ST R9,AREA$ADR SAVE ADDRESS OF REC AREA XC $$R15(6),$$R15 CLEAR RETURN CODE AREA LA R13,VSAMSAVE POINT TO SAVEAREA FOR VSAM CLC $$FUNC,=X'0001' OPEN FILE? BE $OPEN YES--> THEN OPEN IT CLC $$FUNC,=X'0002' WRITE A RECORD? BE $WRITE YES--> THEN WRITE IT CLC $$FUNC,=X'0003' CLOSE FILE? BE $CLOSE YES--> THEN CLOSE IT MVC $$R15(6),=6X'FF' SET BAD RETURN CODE $GOBACK EQU * LA R13,SAVEAREA RECLAIM REAL SAVE AREA L R13,4(0,R13) POINT BACK TO CALLERS SAVEAREA LM R14,R12,12(R13) RESTORE REGISTERS XR R15,R15 CLEAR RETURN CODE BR R14 GOBACK TO MOMMA EJECT $CLOSE EQU * MVC $$COMP,=C'CLOSE ' SAVE COMPONENT BEING USED CLOSE VSAMACB STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 GOOD RETURN FROM MODCB? BNZ $ERRACB NO---> GET FDBK CODE AND EXIT $CLOSE99 EQU * B $GOBACK EJECT $OPEN EQU * XC $$KEYL(14),$$KEYL CLEAR THIS AREA CLI $$RESET,C'Y' OPEN WITH RESET OPTION? BNE $OPEN100 NO---> CONTINUE MVC $$COMP,=C'MODCBA' SAVE COMPONENT BEING USED * SET ACB TO OPEN WITH RESET OPTION MODCB ACB=VSAMACB,MACRF=(RST) STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 GOOD RETURN FROM MODCB? BNZ $ERRACB NO---> GET FDBK CODE AND EXIT * SET RPL SO RECORDS ARE LOAD SEQUENTIALLY MVC $$COMP,=C'MODCBR' SAVE COMPONENT BEING USED MODCB RPL=VSAMRPL,OPTCD=(SEQ) STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 GOOD RETURN FROM MODCB? BNZ $ERRRPL NO---> GET FDBK CODE AND EXIT $OPEN100 EQU * MVC $$COMP,=C'OPEN ' SAVE COMPONENT BEING USED OPEN VSAMACB STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 GOOD RETURN FROM OPEN? BNZ $ERRACB NO---> GET FDBK CODE AND EXIT MVC $$COMP,=C'SHWCBA' SAVE COMPONENT BEING USED SHOWCB ACB=VSAMACB,AREA=OPENAREA,LENGTH=24, * FIELDS=(KEYLEN,LRECL,NDELR,NINSR,NUPDR,RKP) STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 GOOD RETURN FROM SHOWCB? BNZ $ERRACB NO---> GET FDBK CODE AND EXIT MVC $$KEYL,OPENKEYL+2 MOVE KEYLENGTH TO USER AREA MVC $$KEYO,OPENRKP+2 MOVE RELATIVE KEY POS MVC $$MAXRL,OPENLREC+2 MOVE MAX REC LENGTH MVC $$INS,OPENINSR+2 MOVE NUM OF INSERTED RECS MVC $$UPD,OPENUPDR+2 MOVE NUM OF UPDATED RECS MVC $$DEL,OPENNDEL+2 MOVE NUM OF DELETED RECS $OPEN999 EQU * B $GOBACK EJECT $WRITE EQU * L R2,AREA$ADR GET ADDR OF RECORD LR R3,R2 MOVE ADDR TO WORK AREA A R3,OPENRKP ADD IN KEY OFFSET XR R4,R4 CLEAR WORK AREA LH R4,$$RECL GET RECORD LENGTH L R5,OPENKEYL GET KEYLENGTH * R2=ADDRESS OF RECORD * R3=ADDRESS OF KEY * R4=LENGTH OF RECORD * R5=KEYLENGTH MVC $$COMP,=C'MODCBR' SAVE COMPONENT BEING USED MODCB RPL=VSAMRPL, * AREA=(2), * AREALEN=(4), * ARG=(3), * KEYLEN=(5), * RECLEN=(4) STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 ERROR/ BNZ $ERRRPL YES--> GET FDBK AND ABEND MVC $$COMP,=C'PUT ' SAVE COMPONENT BEING USED PUT RPL=VSAMRPL STH R15,$$R15 SAVE RETURN CODE LTR R15,R15 ERROR/ BNZ $ERRRPL YES--> GET FDBK AND ABEND LH R1,$$INS GET NUM OF INS RECORDS AH R1,=H'1' INCREMENT THIS COUNTER STH R1,$$INS AND SAVE NEW COUNTER $WRITE99 EQU * B $GOBACK GO BACK TO MOMMA EJECT *--------------------------------------------------------------------* * ROUTINE TO GET INFO ABOUT A FAILING REQUEST TO A ACB *--------------------------------------------------------------------* $ERRACB EQU * SHOWCB ACB=VSAMACB,AREA=FDBKCODE,LENGTH=4, * FIELDS=(ERROR) LTR R15,R15 GOOD RETURN BNZ $GOBACK NO, GET OUT MVC $$FDBK,FDBKCODE+2 MOVE FEEDBACK CODE TO USER AREA B $GOBACK GOBACK TO MOMMA EJECT *--------------------------------------------------------------------* * ROUTINE TO GET INFO ABOUT A FAILING REQUEST TO A RPL *--------------------------------------------------------------------* $ERRRPL EQU * SHOWCB RPL=VSAMRPL,AREA=FDBKCODE,LENGTH=8, * FIELDS=(FDBK,FTNCD) LTR R15,R15 GOOD RETURN BNZ $GOBACK NO, GET OUT MVC $$FDBK,FDBKCODE+2 MOVE FEEDBACK CODE TO USER AREA MVC $$REQ,FUNCCODE+2 MOVE FUNCTION CODE TO USER AREA B $GOBACK GOBACK TO MOMMA LTORG ********************************************************************** * CONSTANTS,DSECTS * ********************************************************************** LTORG DS 0F FDBKCODE DS F FEEDBACK/ERROR CODE FROM RPL OR ACB FUNCCODE DS F FUNCTION CODE FROM RPL OPENAREA EQU * AREA USED TO DISPLAY INFO ABOUNT A ACB OPENKEYL DS F KEY LENGTH OF ACB OPENLREC DS F LENGTH OF RECORDS OPENNDEL DS F NUMBER OF RECORDS DELETED OPENINSR DS F NUMBER OF RECORDS INSERTED OPENUPDR DS F NUMBER OF RECORDS UPDATED OPENRKP DS F RELATIVE KEY POSITION * AREA$ADR DS F ADDRESS OF RECORD TEMPAREA DS CL20 EJECT VSAMACB ACB AM=VSAM,DDNAME=OVSAM, * MACRF=(KEY,DIR,OUT,NRS) EJECT VSAMRPL RPL AM=VSAM,ACB=VSAMACB, * AREA=TEMPAREA, * AREALEN=20, * ARG=TEMPAREA, * KEYLEN=10, * RECLEN=20, * OPTCD=(KEY,DIR,NUP) EJECT $$PARMS DSECT $$FUNC DS H FUNCTION TO PERFORM $$R15 DS H R15 RETURN FROM ANY VSAM OPERATION $$FDBK DS H VSAM FEEDBACK CODE $$REQ DS H VSAM REQUEST CODE $$KEYL DS H KEYLENGH OF THIS VSAM FILE $$KEYO DS H KEY OFFSET OF THIS VSAM FIE $$MAXRL DS H MAX RECORD LENGTH $$RECL DS H RECORD LENGTH OF THIS RECORD $$INS DS H NUMBER OF RECORDS INSERTED $$UPD DS H NUMBER OF RECORDS UPDATED $$DEL DS H NUMBER OF RECORDS DELETED $$RESET DS CL1 INDICATOR TO OPEN FILE WITH RESET OPTION $$COMP DS CL5 VSAM COMPONENT BEING USED END ALC$VSAM