このINMODの例は、機能コードを読み取り、その値に応じて異なる処理機能を実行します。
#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 { int 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 { int code; int 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 int 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 }