Information
Limited support BMC provides limited support for this version of the product. As a result, BMC no longer accepts comments in this space. If you encounter problems with the product version or the space, contact BMC Support.BMC recommends upgrading to the latest version of the product. To see documentation for that version, see LOADPLUS for DB2 13.1.

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 11.2