UNIX OS - FastExport

Teradata FastExport Reference

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

This INMOD example reads the function code and executes different processing functions based on its value.

#include <stdlib.h>
 
/**********************************************************************/
/*                                                                    */
/* feimod.c   - Sample Inmod for FastExport.                          */
/*                                                                    */
/* 	Copyright (C) 1996-2012 by Teradata Corporation.                   */
/*  All Rights Reserved.                                              */
/*  Teradata Corporation CONFIDENTIAL AND TRADE SECRET                */
/*                                                                    */
/* 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 feimod.c - o feimod.so                    */
/*                                                                    */
/*            - Build Inmod on a Win32 system                         */
/*                compile and link into dynamic link library          */
/*                    cl /DWIN32 /LD feimod.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 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
}