/******************************************************************************* ** ** Source File Name = fillsrv.sqC 1.7 ** ** Licensed Materials - Property of IBM ** ** (C) COPYRIGHT International Business Machines Corp. 1995, 1997 ** All Rights Reserved. ** ** US Government Users Restricted Rights - Use, duplication or ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp. ** ** ** PURPOSE : ** The server procedure from which is called by "fillcli". ** Input parameters passed through a SQLDA are deciphered, resulting ** in the desired action on the specified table (random data filling). ** ** ** EXTERNAL DEPENDENCIES : ** - Ensure existence of database for precompile purposes. ** - Precompile with the SQL precompiler (PREP in DB2) ** - Bind to a database (BIND in DB2) ** - Compile and link with the IBM Cset++ compiler (AIX and OS/2) ** or the Microsoft Visual C++ compiler (Windows) ** or the compiler supported on your platform. ** ** For more information about these samples see the README file. ** ** For more information on programming in C++, see the ** - "Programming in C and C++" section of the Application Development Guide ** ** For more information on building C++ applications, see the: ** - "Building C++ Applications" section of the Application Building Guide. ** ** For more information on the SQL language see the SQL Reference. ** *******************************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <sql.h> #include <sqlca.h> #include <sqlda.h> #include <sqlenv.h> #include "util.h" EXEC SQL INCLUDE SQLCA ; extern "C" int SQL_API_FN fillsrv( void *, void *, struct sqlda *, struct sqlca * ) ; class FillServer { EXEC SQL BEGIN DECLARE SECTION ; char sql_buffer[255] ; EXEC SQL END DECLARE SECTION ; struct sqlda * local_sqlda ; short org_columns, org_rows ; char char_value[65] ; int GetRandomID( short * ) ; int GetRandomString( char *, int ) ; public: FillServer( struct sqlda * ) ; ~FillServer() ; int ExecTrans( struct sqlda * ) ; } ; FillServer::FillServer( struct sqlda * inout_sqlda ) { memset( ( void * ) char_value, 0, 65 ) ; strcpy( char_value, "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz_-" ) ; org_rows = * ( ( short * ) ( inout_sqlda->sqlvar[1].sqldata ) ) ; org_columns = 5 ; init_da( &local_sqlda, org_columns ) ; local_sqlda->sqld = org_columns ; local_sqlda->sqlvar[0].sqltype = SQL_TYP_NSMALL ; local_sqlda->sqlvar[0].sqllen = sizeof( short ) ; local_sqlda->sqlvar[1].sqltype = SQL_TYP_NCSTR ; local_sqlda->sqlvar[1].sqllen = 14 ; local_sqlda->sqlvar[2].sqltype = SQL_TYP_NSMALL ; local_sqlda->sqlvar[2].sqllen = sizeof( short ) ; local_sqlda->sqlvar[3].sqltype = SQL_TYP_NCSTR ; local_sqlda->sqlvar[3].sqllen = 10 ; local_sqlda->sqlvar[4].sqltype = SQL_TYP_NCSTR ; local_sqlda->sqlvar[4].sqllen = 13 ; alloc_host_vars( local_sqlda ) ; strcpy( ( char * ) local_sqlda->sqlvar[4].sqldata, ( char * ) inout_sqlda->sqlvar[2].sqldata ) ; srand( ( unsigned int ) time( NULL ) ) ; short lv_value = 100 ; memcpy( ( void * ) local_sqlda->sqlvar[0].sqldata, &lv_value, sizeof( short ) ) ; lv_value = 300 ; memcpy( ( void * ) local_sqlda->sqlvar[2].sqldata, &lv_value, sizeof( short ) ) ; } FillServer::~FillServer() { free_da( local_sqlda ) ; } int FillServer::ExecTrans( struct sqlda * inout_sqlda ) { if ( strcmp( ( char * ) inout_sqlda->sqlvar[0].sqldata, "INSERT" ) == 0 ) { memset( ( void * ) sql_buffer, 0, 255 ) ; strcpy( sql_buffer, "INSERT INTO ORG VALUES (?,?,?,?,?)" ) ; EXEC SQL PREPARE st FROM :sql_buffer ; int i = 0 ; while ( i++ < org_rows ) { GetRandomID( ( short * ) local_sqlda->sqlvar[0].sqldata ) ; GetRandomString( ( char * ) local_sqlda->sqlvar[1].sqldata, 14 ) ; GetRandomID( ( short * ) local_sqlda->sqlvar[2].sqldata ) ; GetRandomString( ( char * ) local_sqlda->sqlvar[3].sqldata, 10 ) ; EXEC SQL EXECUTE st USING DESCRIPTOR :*local_sqlda ; } } else if ( strcmp( ( char * ) inout_sqlda->sqlvar[0].sqldata, "DELETE" ) == 0 ) { memset( ( void * ) sql_buffer, 0, 255 ) ; strcpy( sql_buffer, ( char * ) inout_sqlda->sqlvar[2].sqldata ) ; EXEC SQL DELETE FROM ORG WHERE LOCATION = :sql_buffer ; } return( 0 ) ; } int FillServer::GetRandomID( short * random_ID ) { int random_value ; short short_value ; short_value = *random_ID ; random_value = rand() ; random_value &= 0x0F ; if ( random_value < 16 ) short_value += random_value ; short_value++ ; memcpy( ( void * ) random_ID, ( void * ) &short_value, sizeof( short ) ) ; return( 0 ) ; } int FillServer::GetRandomString( char * random_string, int random_len ) { memset( ( void * ) random_string, 0, random_len ) ; random_len-- ; int i = 0 ; while ( i < random_len ) { int random_value = rand() ; random_value &= 0x3F ; if ( random_value < 64 ) random_string[i] = char_value[random_value] ; else random_string[i] = '-' ; i++ ; } return( 0 ) ; } int SQL_API_FN fillsrv( void * reserved1, void * reserved2, struct sqlda * inout_sqlda, struct sqlca * inout_sqlca ) { FillServer server( inout_sqlda ) ; server.ExecTrans( inout_sqlda ) ; return( SQLZ_DISCONNECT_PROC ) ; }