Sample INMOD Routine - MultiLoad

Teradata MultiLoad Reference

Product
MultiLoad
Release Number
15.10
Language
English (United States)
Last Update
2018-10-06
dita:id
B035-2409
lifecycle
previous
Product Category
Teradata Tools and Utilities

Sample INMOD Routine

Following is the listing of the mlimod.c sample INMOD routine that is provided with Teradata MultiLoad software:

#include <stdio.h>
#include <stdlib.h>
/**********************************************************************/
/*                                                                    */
/* mlimod.c   - Sample Inmod for Teradata MultiLoad.                  */
/*                                                                    */
/* Purpose    - This inmod generates two integers per record.  The    */
/*              first is even and the second number is odd.           */
/*                                                                    */
/* Note       - The number of records per file is determined by the   */
/*              variable NUM_RECORDS                                  */
/*                                                                    */
/* Execute    - Build Inmod on a UNIX operating system                */
/*                compile and link into shared object                 */
/*                    cc -G mlimod.c - o mlimod.so                    */
/*                                                                    */
/*            - Build Inmod on a Win32 system                         */
/*                compile and link into dynamic link library          */
/*                    cl /DWIN32 /LD mlimod.c                         */
/*                                                                    */
/**********************************************************************/
static int msg_cnt = 0;
typedef struct {
long   ioseq;
short  len;
char   param[2000];
} param_type;
/* This structure is used to pass an odd and an even integer  */
/* back to Teradata MultiLoad */
typedef struct {
long   code;
long   len;
char   data[32768];
} data_type;
#ifdef WIN32                                          /* Change for WIN32 */
__declspec(dllexport) void _dynamn(data_type *data_buf , param_type *parm_buf)
#else
void _dynamn(data_buf, parm_buf)
data_type  *data_buf;
param_type *parm_buf;
#endif 
{
char *myptr;
int  i;
static long RECNUM = 0;       /* number of records to load */
static int odd_counter = 0;  /* odd integer counter */
static int even_counter = 0; /* even integer counter */
#ifdef DEBUG
printf("\n");
printf("jmod2: on input:\n");
printf("jmod2:    message code:   %d\n", data_buf->code);
printf("jmod2:      data bytes:   %d\n", data_buf->len);
if (data_buf->len)
printf("jmod2:            data:   *%s*\n", data_buf->data);
printf("jmod2:     param ioseq:   %d\n", parm_buf->ioseq);
printf("jmod2:     param bytes:   %d\n", parm_buf->len);
if (parm_buf->len)
printf("jmod2:       param str:   %s\n", parm_buf->param);
printf("jmod2:     message cnt:   %d\n", ++msg_cnt);
#endif
switch (data_buf->code)
{
case 0: printf("jmod2: initializing and returning 1st record:\n");
RECNUM = 6;                     
printf("jmod2: Records requested = %ld\n", RECNUM);
if ( RECNUM <= 0 ) {
printf("jmod2: numbers of records is <= 0 [%ld]\n", RECNUM);
}
/* initialize the counters */
odd_counter = 1;
even_counter = 2;
/* copy the counters to the data buffer */
myptr = (char *) &odd_counter;
for (i=0; i<4; ++i, ++myptr) {
data_buf->data[i] = *myptr;
}
myptr = (char *) &even_counter;
for (i=4; i<8; ++i, ++myptr) {
data_buf->data[i] = *myptr;
}
/* go to next values and increment the counters */
odd_counter += 2;
even_counter +=2;
--RECNUM;
/* return  the results */
data_buf->code = 0;
data_buf->len  = 8;
break;
case 1: 
#ifdef DEBUG
printf("jmod2: returning a record:\n");
#endif
if (RECNUM) {
/* copy the counters to the data buffer */
myptr = (char *) &odd_counter;
for (i=0; i<4; ++i, ++myptr) {
data_buf->data[i] = *myptr;
}
myptr = (char *) &even_counter;
for (i=4; i<8; ++i, ++myptr) {
data_buf->data[i] = *myptr;
}
/* increment to next values and decrement record counter */
odd_counter  += 2;
even_counter += 2;
--RECNUM;
/* return  the results */
data_buf->code = 0;
data_buf->len  = 8;
break;
} else {
/* done sending records, return non-zero result */
printf("jmod2: all records sent\n");
data_buf->code = 1;
break;
}
case 2: printf("jmod2: repositioning to last checkpoint (HOST)\n");
data_buf->code = 0;
data_buf->len  = 0;
break;
case 3: printf("jmod2: taking a checkpoint\n");
data_buf->code = 0;
data_buf->len  = 0;
break;
case 4: printf("jmod2: repositioning to last checkpoint (DBC)\n");
data_buf->code = 0;
data_buf->len  = 0;
break;
case 5: printf("jmod2: terminating:\n");
data_buf->code = 0;
data_buf->len  = 0;
break;
case 6: printf("jmod2: initializing and receiving 1st record:\n");
data_buf->data[1] = '%';
data_buf->code = 0;
break;
case 7: printf("jmod2: receiving a record:\n");
data_buf->data[1] = '%';
data_buf->code = 0;
break;
      }
#ifdef DEBUG
printf("jmod2: on output:\n");
printf("jmod2:    message code:   %d\n", data_buf->code);
printf("jmod2:      data bytes:   %d\n", data_buf->len);
if (data_buf->len)
printf("jmod2:            data:   *%s*\n", data_buf->data);
printf("\n");
#endif
}