Sample LE C user exit


This topic illustrates a sample user exit written in LE C.

 

/*--------------------------------------------------------------------*/
/*                       D I S C L A I M E R                          */
/*--------------------------------------------------------------------*/
/*                                                                    */
/* THIS IS A SAMPLE LOADPLUS USER EXIT.  THIS EXIT WOULD BE USED      */
/* IN ORDER TO DEFINE USER VARIABLES FOR BUILDING DATASET NAMES FOR   */
/* DYNAMIC WORKFILE ALLOCATION WITH THE DSNPAT KEYWORD AND FOR        */
/* SHRLEVEL CHANGE WITH THE SPILLDSNPAT KEYWORD.                      */
/*                                                                    */
/* THIS EXIT WILL ONLY BE INVOKED WHEN IT IS SPECIFICALLY NAMED       */
/* IN THE AMU$OPTS DSNUEXIT PARAMETER OR IN THE DSNUEXIT PARAMETER OF */
/* THE LOAD COMMAND.  THE SPECIFICATION IN THE LOAD COMMAND WILL      */
/* OVERRIDE THE SPECIFICATION IN THE AMU$OPTS MACRO.  IF THE NAME     */
/* SPECIFIED IS 'NONE' WITHOUT THE SINGLE QUOTE MARKS, THE EXIT WILL  */
/* NOT BE INVOKED.                                                    */
/*                                                                    */
/* NOTE: PLEASE REVIEW THE DOCUMENTATION IN THE REFERENCE MANUAL,     */
/* AND THE FOLLOWING USAGE NOTES PRIOR TO IMPLEMENTING THIS EXIT.     */
/*                                                                    */
/* PLEASE CALL BMC SOFTWARE PRODUCT SUPPORT WITH ANY QUESTIONS YOU    */
/* MAY HAVE IN THIS AREA.                                             */
/*                                                                    */
/*                PHONE: 1-800-537-1813                               */
/*                                                                    */
/*--------------------------------------------------------------------*/
/*                            N O T E S                               */
/*--------------------------------------------------------------------*/
/*                                                                    */
/* AMUEDSL IS CALLED ONCE AT THE BEGINNING OF EITHER THE PRELOAD      */
/* PHASE OR THE COMBINED PHASE.                                       */
/*                                                                    */
/* WHEN INVOKED IT IS PASSED THE ADDRESS OF A USER EXIT BLOCK         */
/*                  DESCRIBED BY THE AMUDSNXP STRUCT.                 */
/*                  THIS CALL IS FROM ASEMBLER MODULE DYNWDSNX        */
/*                                                                    */
/* UPON EXIT    RETRUN CODE FROM THIS EXIT                            */
/*                                                                    */
/*                      0     GOOD RETURN                             */
/*                                                                    */
/*                      OTHER ERROR RETURN, TERMINATE UTILITY         */
/*                                                                    */
/* AMUDSNXP STRUCT  THIS STRUCT CONTAINS BOTH INPUT                   */
/*                  AND OUTPUT FIELDS.  INPUT FIELDS ARE PROVIDED TO  */
/*                  PASS VITAL INFORMATION TO THIS EXIT.  ANY MODIFI- */
/*                  CATIONS TO THESE FIELDS WILL BE DISREGARDED UPON  */
/*                  RETURN TO THE CALLER.  THE OUTPUT FIELDS ARE      */
/*                  PROVIDED TO ALLOW THE EXIT TO PASS INFORMATION    */
/*                  BACK TO THE CALLER.                               */
/*                                                                    */
/*--------------------------------------------------------------------*/
/*                                                                    */
/*--------------------------------------------------------------------*/
/*                                                                    */
/* XPUVARS DEFINES THE OUTPUT AREA OF THE AMUDSNXP STRUCT AT TAG      */
/* XPUVAREA. YOU MAY USE THIS STRUCT TO EASILY REFERENCE THE ARRAY    */
/* DEFINED AT XPUVAREA.                                               */
/*                                                                    */
/* NOTE:                                                              */
/*                                                                    */
/*  THE NUMBER OF ENTRIES IN THE XPUVAREA ARRAY MUST NOT EXCEED 100   */
/*  OR YOU WILL ADDRESS BEYOND THE END OF THE STRUCTURE STORAGE       */
/*  PROVIDED FOR THIS ROUTINE.                                        */
/*                                                                    */
/* VARIABLE NAME:                                                     */
/*                                                                    */
/*  1.  MUST BEGIN WITH AN UNDERSCORE CHARACTER C'_'  X'6D'           */
/*  2.  MUST BEGIN IN THE LEFTMOST BYTE OF XPUVNAME FIELD             */
/*  3.  IF LESS THAN 9 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS */
/*  4.  MAY NOT CONTAIN EMBEDDED BLANKS                               */
/*  5.  NON-BLANK CHARACTERS AFTER THE LEFTMOST BYTE MUST BE NATIONAL */
/*      CHARACTERS WHICH ARE A THROUGH Z, 0 THROUGH 9, #, @, AND $    */
/*  6.  MUST BE UPPER CASE.                                           */
/*                                                                    */
/* VARIABLE DATA:                                                     */
/*                                                                    */
/*  1.  MUST BEGIN IN THE LEFTMOST BYTE OF XPUVDATA FIELD             */
/*  2.  IF LESS THAN 8 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS */
/*  3.  MAY NOT CONTAIN EMBEDDED BLANKS                               */
/*  4.  NON-BLANK CHARACTERS MUST BE 'NATIONAL' CHARACTERS WHICH ARE  */
/*      A THROUGH Z, 0 THROUGH 9, #, @, $, -, AND .                   */
/*                                                                    */
/*--------------------------------------------------------------------*/
#pragma runopts(PLIST(HOST))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define XPUVENT 100
static int monthtab[] = {
             0,                  /*   january   */
             31,                 /*   february  */
             59,                 /*   march     */
             90,                 /*   april     */
             120,                /*   may       */
             151,                /*   june      */
             181,                /*   july      */
             212,                /*   august    */
             243,                /*   september */
             273,                /*   october   */
             304,                /*   november  */
             334                 /*   december  */
} ;
static int leaptab[] = {
             0,                   /*   january   */
             31,                  /*   february  */
             60,                  /*   march     */
             91,                  /*   april     */
             121,                 /*   may       */
             152,                 /*   june      */
             182,                 /*   july      */
             213,                 /*   august    */
             244,                 /*   september */
             274,                 /*   october   */
             305,                 /*   november  */
             335                  /*   december  */
} ;
struct amudsnxp {
     char       xpjobn[8];       /* jobname                         */
     char       xpstep[8];       /* stepname                        */
     char       xpdbname[8];     /* database name                   */
     char       xpspname[8];     /* space name                      */
     char       xpresume[1];     /* resume  (Y or N)                */
     char       xpreplace[1];    /* replace (Y or N)                */
     char       xpresrv1[2];     /* reserved for loadplus           */
     char       xpuser[8];       /* user id                         */
     char       xpssid[4];       /* db2 subsystem id                */
     char       xpdate[6];       /* utility execution date mmddyy   */
     char       xptime[6];       /* utility execution time hhmmss   */
     char       xputilid[16];    /* utility id                      */
     char       xpdate8[8];      /* utility execution date mmddyyyy */
     char       xpgrpnm[4];      /* data sharing group name         */
     char       xpvcat[8];  /* vcat name (from 1st part if partitnd)*/
     char       xpdatej[7];      /* utility execution date ccyyddd  */
     char       xpresrv2[13];    /* reserved for load plus          */
     int           xpusrwd1;     /* user word 1*/
     int           xpusrwd2;     /* user word 2*/
     int           xpusrwd3;     /* user word 3*/
     int           xpusrwd4;     /* user word 4*/
     int           xpusrwd5;     /* user word 5*/
     int           xpusrwd6;     /* user word 6*/
     int           xpusrwd7;     /* user word 7*/
     int           xpusrwd8;     /* user word 8*/
     struct XPUVAREA {
         char xpuvname[9];
         char xpuvdata[8];
     } xpuvars[XPUVENT] ;
} ;
int main    (int argc, char *argv[])
{
    char yr[5];
    char day[4];
    char month[4];
    char wuid[17];
    int i;
    int x;
    int l;
    int wday;
    int wyear;
    int iyear;
    int imonth;
    int totdays;
    int xdisable;
    int pfxlen;
    int sfxstrt;
    int sfxlen;
    struct XPUVAREA *tp;
    struct amudsnxp *xparm;
    xparm = (void *)argv[1];
    tp = xparm->xpuvars;
    x = l = wday = wyear = iyear = imonth = totdays = 0;
    xdisable = i = pfxlen = sfxstrt = sfxlen = 0;
/*--------------------------------------------------------------------*/
/*                                                                    */
/* to disable this exit set    xdisable = 1                           */
/*                                                                    */
/*--------------------------------------------------------------------*/
    if (xdisable)
       return(0);
/*--------------------------------------------------------------------*/
/*                                                                    */
/* CREATE USER-DEFINED VARIABLES                                      */
/*                                                                    */
/* THE FOLLOWING USER VARIABLES WILL BE CREATED:                      */
/*                                                                    */
/*  _JDATE     - JULIAN DATE IN THE FORM OF DYYDDD BUILT FROM THE     */
/*               LOADPLUS SUPPLIED VARIABLE &DATE8                    */
/*                                                                    */
/*  _JCDATE    - JULIAN DATE IN THE FORM OF DYYYYDDD BUILT FROM THE   */
/*               LOADPLUS SUPPLIED VARIABLE &DATE8                    */
/*                                                                    */
/*  _UTILPFX   - UP TO 8 BYTES OF THE FIRST NODE OF THE UTILITY ID    */
/*                                                                    */
/*  _UTILSFX   - UP TO 8 BYTES OF THE REMAINING PORTION OF THE        */
/*               UTILITY ID                                           */
/*                                                                    */
/*--------------------------------------------------------------------*/

/*--------------------------------------------------------------------*/
/*                                                                    */
/* BUILD _JDATE AND _JCDATE USER VARIABLES                            */
/*                                                                    */
/*--------------------------------------------------------------------*/

    memcpy(month,xparm->xpdate8,2);
    memcpy(day,xparm->xpdate8+2,2);
    memcpy(yr,xparm->xpdate8+4,4);
    sscanf(yr,'%d',&wyear);
    sscanf(day,'%d',&wday);
    sscanf(month,'%d',&imonth);
    imonth = imonth - 1;
    if (wyear % 4 == 0 && wyear % 100 != 0 || wyear % 400 == 0)
       totdays = wday + leaptab[imonth];
    else
       totdays = wday + monthtab[imonth];
    sprintf(yr,'%d',wyear);
    sprintf(day,'%03.03d',totdays);
/*--------------------------------------------------------------------*/
/*   clear the user variable area to blanks                           */
/*--------------------------------------------------------------------*/
    memset(tp->xpuvname,' ', sizeof(struct XPUVAREA));
/*--------------------------------------------------------------------*/
/*   clear the user variable area to blanks                           */
/*--------------------------------------------------------------------*/
    memcpy(tp->xpuvname,'_JDATE', 6);
    memcpy(tp->xpuvdata,'D',1);
    memcpy(tp->xpuvdata+1,xparm->xpdate8+6,2);
    memcpy(tp->xpuvdata+3,day,3);
/*--------------------------------------------------------------------*/
/*  sprintf(tp->xpuvdata,'D%-2.2s%3.3s',xparm->xpdate8+6,day); */
/*  do not use this format as the '/0' used by sprintf will cause     */
/*  BMC51239I USER VARIABLE '_JDATE' HAS INVALID DATA                 */
/*--------------------------------------------------------------------*/
    tp++;
/*--------------------------------------------------------------------*/
/*   clear the user variable area to blanks                           */
/*--------------------------------------------------------------------*/
    memset(tp->xpuvname,' ', sizeof(struct XPUVAREA));
    memcpy(tp->xpuvname,'_JCDATE', 7);
    memcpy(tp->xpuvdata,'D',1);
    memcpy(tp->xpuvdata+1,yr,4);
    memcpy(tp->xpuvdata+5,day,3);
/*--------------------------------------------------------------------*/
/*  sprintf(tp->xpuvdata,'D%-4.4s%-3.3s',yr,day);                     */
/*  do not use this format as the '/0' used by sprintf will cause     */
/*  BMC51239I USER VARIABLE '_JCDATE' HAS INVALID DATA                */
/*--------------------------------------------------------------------*/
/*                                                                    */
/* build _utilpfx and _utilsfx user variables                         */
/*                                                                    */
/*--------------------------------------------------------------------*/
    tp++;
    sprintf(wuid,'%16.16s',xparm->xputilid);
/*--------------------------------------------------------------------*/
/*  get the length of xputilid                                        */
/*  find the first deliminator character                              */
/*  limit _UTILPFX and UTILSFX to 8 characters -DSN node limit        */
/*--------------------------------------------------------------------*/
    for (i=0;wuid[i] != '/0'; i++)
    {
        switch (wuid[i])
        {
            case ' ':
            case '.':
            case '+':
            case '|':
            case ';':
            case '-':
            case '/':
            case '':
            case ',':
            case '_':
            case ':':
            case '=':
            case '//':
                if (pfxlen == 0)
                {
                    pfxlen = i;
                    sfxstrt = i + 1;
                }
                break;
            default:
                break;
       }
    }
    if (pfxlen == 0)              /* no delimiter found */
    {
        pfxlen = 8;
        sfxstrt = 8;
    }
    sfxlen = i - sfxstrt;
    if (pfxlen > 8)
        pfxlen = 8;
    if (sfxlen > 8)
        sfxlen = 8;
/*--------------------------------------------------------------------*/
/*   clear the user variable area to blanks                           */
/*--------------------------------------------------------------------*/
    memset(tp->xpuvname,' ', sizeof(struct XPUVAREA));
    memcpy(tp->xpuvname, '_UTILPFX', 8);
    memcpy(tp->xpuvdata, xparm->xputilid,  pfxlen);
/*--------------------------------------------------------------------*/
/*  sprintf(tp->xpuvdata,'%-8.8s',xparm->xputilid);                   */
/*  do not use this format as the '/0' used by sprintf will cause     */
/*  BMC51239I USER VARIABLE '_UTILPFX' HAS INVALID DATA               */
/*--------------------------------------------------------------------*/
    tp++;
/*--------------------------------------------------------------------*/
/*   clear the user variable area to blanks                           */
/*--------------------------------------------------------------------*/
    memset(tp->xpuvname,' ', sizeof(struct XPUVAREA));
    memcpy(tp->xpuvname, '_UTILSFX', 8);
    memcpy(tp->xpuvdata, xparm->xputilid+sfxstrt, sfxlen);
/*--------------------------------------------------------------------*/
/*  sprintf(tp->xpuvdata,'%-8.8s',xparm->xputilid+8);                 */
/*  do not use this format as the '/0' used by sprintf will cause     */
/*  BMC51239I USER VARIABLE '_UTILSPX' HAS INVALID DATA               */
/*--------------------------------------------------------------------*/
    return (0);
}

 

 

Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*

LOADPLUS for DB2 13.1