You can write a program named ZBIND that uses standard IBM calling conventions and link-edit it with the Data Adapter IDMSR module (member IDMSR in the 'prefix.IDMS.LOAD' data set). When a user executes a FOCUS TABLE request against an IDMS database, the IDMS Data Adapter calls the ZBIND exit before issuing the IDMS BIND RUN UNIT command.
A sample COBOL program, located in member ZBINDPGM in the 'prefix.IDMS.DATA' PDS can be used to check if a user has authorization to access the subschema that is associated with the FOCUS request. There are six parameters passed to the program from the IDMS Data Adapter:
USER PIC X(08)
SUBSCHEMA PIC X(08)
DBNAME PIC X(08)
NODE PIC X(08)
DICTNAME PIC X(08)
DICTNODE PIC X(08)
STATUS PIC X(04)
On return of a non-zero status code, the user receives the following error message:
(FOC4405) BIND RUN-UNIT DENIED BY USER EXIT ZBIND FOR SUBSCHEMA: subschema
The following is a listing of the ZBINDPGM program provided on the tape:
*RETRIEVAL
*NO-ACTIVITY-LOG
IDENTIFICATION DIVISION.
PROGRAM-ID. ZBIND.
***********************************************************
* PROGRAM: ZBIND
* PURPOSE: CHECK TO SEE IF A USER ISSUING A FOCUS REQUEST
* HAS ACCESS TO THE SUBSCHEMA REQUESTED.
* THIS PROGRAM MAY BE USED FREELY BY THOSE
* WHO NEED AN EXAMPLE TO CODE THEIR OWN EXIT.
***********************************************************
DATE-WRITTEN. AUG 1992.
DATE-COMPILED. DATE COMPILED
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
IDMS-CONTROL SECTION.
PROTOCOL. MODE IS BATCH DEBUG IDMS-RECORDS MANUAL.
SCHEMA SECTION.
DB IDMSNWKA WITHIN IDMSNTWK.
DATA DIVISION.
EJECT
FILE SECTION.
EJECT
WORKING-STORAGE SECTION.
01 WS-START.
02 FILLER PIC X(33) VALUE
'ZBIND WORKING STG STARTS HERE==>'.
01 COPY IDMS SUBSCHEMA-CONTROL.
01 COPY IDMS RECORD USER-047.
01 COPY IDMS RECORD ACCESS-045.
01 COPY IDMS RECORD SS-026.
LINKAGE SECTION.
01 PUSER PIC X(8).
01 PSS PIC X(8).
01 PDBNAME PIC X(8).
01 PNODE PIC X(8).
01 PDICT PIC X(8).
01 PDICTNODE PIC X(8).
01 PSTAT PIC X(4).
**********************************************************
*
* RETURN CODE - 0000 - USER HAS ACCESS TO SUBSCHEMA
* - 0016 - USER NOT IN DICTIONARY
* - 0032 - USER DOES NOT HAVE ACCESS TO SUBSCHEMA
* - 9999 - PASSED PARMS USER AND/OR SS INVALID
* - NNNN - ERROR DURING IDMS-STATS PROCESSING.
* WHERE NNNN = ERROR-STATUS
*
***********************************************************
PROCEDURE DIVISION USING PUSER,
PSS,
PDBNAME,
PNODE,
PDICT,
PDICTNODE,
PSTAT.
0000-MAINLINE.
*** DISPLAY '"' PUSER '"'
*** '"' PSS '"'.
*** RESET ERROR-STATUS TO ENSURE REENTRANCY
MOVE '1400' TO ERROR-STATUS.
MOVE 'ZBIND' TO PROGRAM-NAME.
*** CHECK FOR INVALID PASSED PARMS
IF PUSER = SPACE OR
PSS = SPACE
MOVE '9999' TO PSTAT
GOBACK.
*** CHECK FOR PRESENCE OF DBNAME PARM - DETERMINE WHICH BIND
NOTE: THIS PROGRAM ASSUMES THE DBNAME PASSED IS THE DBNAME
WHICH MAPS THE IDMSNWKA SUBSCHEMA TO THE REQUESTED
DICTIONARY.
IT DOES ==> NOT <== LOOK AT THE DICTNAME PARAMETER
PASSED
TO THE EXIT.
IF PDBNAME = SPACE
BIND RUN-UNIT
ELSE
BIND RUN-UNIT DBNAME PDBNAME.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GOBACK.
*** BIND AND READY
BIND USER-047.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
BIND ACCESS-045.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
BIND SS-026.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
READY USAGE-MODE IS RETRIEVAL.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
*** SEE IF USER IS IN THE DICTIONARY
MOVE PUSER TO USER-NAME-047.
FIND CALC USER-047.
IF DB-REC-NOT-FOUND
MOVE '0016' TO PSTAT
GO TO 9999-WRAP-UP.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
*** LOOP THRU USER-ACCESS-SS RECS TO SEE IF RELATIONSHIP EXISTS
1200-NEXT-ACCESS.
FIND NEXT ACCESS-045 WITHIN USER-ACCESS.
IF DB-END-OF-SET
MOVE '0032' TO PSTAT
GO TO 9999-WRAP-UP.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
IF NOT SS-ACCESS MEMBER
GO TO 1200-NEXT-ACCESS.
OBTAIN OWNER WITHIN SS-ACCESS.
IF ANY-ERROR-STATUS
MOVE ERROR-STATUS TO PSTAT
GO TO 9999-WRAP-UP.
IF SS-NAM-026 = PSS
MOVE '0000' TO PSTAT
GO TO 9999-WRAP-UP.
GO TO 1200-NEXT-ACCESS.
9999-WRAP-UP.
FINISH.
GOBACK.
EJECT
*COPY IDMS IDMS-STATUS.
*IDMS-ABORT SECTION.
*I-A-EXIT. EXIT.
The following JCL, member ZBIND in the 'prefix.IDMS.DATA' PDS can be used to link edit the ZBIND user written program.
//LINK EXEC PGM=IEWL,
// PARM='LET,NCAL,SIZE=(1024K),LIST'
//OBJLIB DD DSN=prefix.ZBIND.OBJLIB,DISP=SHR
//MAINTAIN DD DSN=prefix.IDMS.DATA,DISP=SHR
//LOAD DD DSN=prefix.IDMS.LOAD,DISP=SHR
//SYSLMOD DD DSN=prefix.OUTPUT.LOADLIB,DISP=SHR
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(10,1))
//SYSPRINT DD SYSOUT=*
//SYSLIN DD *
INCLUDE OBJLIB(ZBIND)
INCLUDE MAINTAIN(IDMSR)
INCLUDE LOAD(IDMSR)
ENTRY IDMSR
NAME IDMSR(R)
/*
//
where:
Information Builders |