/****************************************************************************** ** ** Source File Name = makeapi.sqc 1.15 ** Licensed Materials - Property of IBM ** ** (C) COPYRIGHT International Business Machines Corp. 1995, 1999 ** All Rights Reserved. ** ** US Government Users Restricted Rights - Use, duplication or ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp. ** ** ** PURPOSE : ** This program is an example of how API programs are compiled and ** bounded for DB2 applications. Input parameters from the command line ** are as follows: ** ** makeapi programName.ext databaseName ** ** The program will discern how to compile and link the programs from ** the extensions that are input from the programName in the command ** line. Preparing and Binding will be done on appropriate programs. ** ** ** STRUCTURES USED : ** sqlopt ** sqlca ** ** APIs USED : ** START DATABASE MANAGER sqlepstart() ** PREOCOMPILE PROGRAM sqlaprep() ** BIND sqlabndx() ** STOP DATABASE MANAGER sqlepstp() ** ** FUNCTIONS DECLARED : ** 'C' COMPILER LIBRARY : ** stdio.h - printf ** string.h - strncpy ** ** DBMS LIBRARY : ** sqlenv.h - see "APIs USED" above ** ** OTHER : ** ** EXTERNAL DEPENDANCIES : ** - Existing database for precompile purposes. ** - Precompile with the SQL precompiler (PREP in DB2) ** - Binding to a database (BIND in DB2) ** - Compiling and linking with the appropriate compiler ** ** EXAMPLE USAGE: ** - "makeapi updat.sqc sample" ** ** 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 <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlenv.h> #include "util.h" #define CHECKERR( CE_STR ) if ( check_error( CE_STR, &sqlca ) != 0 ) return( 1 ) ; EXEC SQL INCLUDE SQLCA ; int main ( int argc, char *argv[] ) { struct sqlopt * sqloptStructPointer ; struct sqloptions * optionsPointer ; int i, rc ; char programName[15] ; char bindName[15] ; char compiler_line[255] ; char linker_line[255] ; char * extension ; char connInput[19] ; char option ; EXEC SQL BEGIN DECLARE SECTION ; char dbAlias[9] ; char userid[9] ; char passwd[19] ; EXEC SQL END DECLARE SECTION ; if ( argc != 3 ) { printf( "\nUSAGE : makeapi program db_name\n\n" ) ; return( 1 ) ; } if ( ( extension = strstr( argv[1], "." ) ) == 0 ) return( 1 ) ; if ( strcmp( extension, ".sqc" ) == 0 || strcmp( extension, ".c" ) == 0 || strcmp( extension, ".o" ) == 0 || strcmp( extension, ".obj" ) == 0 ) { /* this input file needs to be compiled and/or linked */ strcpy( programName, argv[1] ) ; i = strlen( programName ) - 1 ; while ( i > 0 ) { if ( programName[i] == '.' ) { programName[i] = '\0' ; break ; } i-- ; } strcpy( bindName, programName ) ; strcat( bindName, ".bnd" ) ; printf("\nEnsure the compiler and linker options and the path for DB2 include and\n"); printf("library files are set correctly in this program. If they are not,\n"); printf("change the 'compile_line' and/or 'linker_line' strings in the program.\n\n"); #if defined(DB2AIX) strcpy( compiler_line, "xlc -I/usr/lpp/db2_05_00/include -c util.c " ) ; strcat( compiler_line, programName ) ; strcat( compiler_line, ".c" ) ; strcpy( linker_line, "xlc -o " ) ; strcat( linker_line, programName ) ; strcat( linker_line, " " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".o " ) ; strcat( linker_line, "util.o -L/usr/lpp/db2_05_00/lib -ldb2" ) ; #elif defined(DB2HP) strcpy( compiler_line, "cc -Aa +e -I/opt/IBMdb2/v5.0/include -c util.c " ) ; strcat( compiler_line, programName ) ; strcat( compiler_line, ".c" ) ; strcpy( linker_line, "cc -o " ) ; strcat( linker_line, programName ) ; strcat( linker_line, " " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".o " ) ; strcat( linker_line, "util.o -L/opt/IBMdb2/v5.0/lib -ldb2 -lhppa" ) ; #elif defined(DB2SUN) strcpy( compiler_line, "cc -I/opt/IBMdb2/v5.0/include -c util.c " ) ; strcat( compiler_line, programName ) ; strcat( compiler_line, ".c" ) ; strcpy( linker_line, "cc -o " ) ; strcat( linker_line, programName ) ; strcat( linker_line, " " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".o " ) ; strcat( linker_line, "util.o -L/opt/IBMdb2/v5.0/lib -ldb2" ) ; #elif defined(DB2NT) strcpy( compiler_line, "cl -Z7 -Od -c -W2 -D_X86_=1 -DWIN32 -Ic:\\sqllib\\include util.c " ) ; strcat( compiler_line, programName ) ; strcat( compiler_line, ".c" ) ; strcpy( linker_line, "link -debug:full -debugtype:cv -out:" ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".exe " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".obj " ) ; strcat( linker_line, "util.obj db2api.lib" ) ; #elif defined(DB2OS2) strcpy( compiler_line, "icc -C+ -O- -Ti+ -Ic:\\sqllib\\include util.c " ) ; strcat( compiler_line, programName ) ; strcat( compiler_line, ".c" ) ; strcpy( linker_line, "ilink /NOFREE /NOI /DEBUG /ST:32000 /PM:VIO util.obj " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".obj, " ) ; strcat( linker_line, programName ) ; strcat( linker_line, ".exe" ) ; strcat( linker_line, ",,c:\\sqllib\\lib\\db2api;" ) ; #endif if (strstr(argv[1], ".sqc" ) != NULL || strstr(argv[1], ".c" ) != NULL) { if (strstr(argv[1], ".sqc" ) != NULL) { /* the file is an embedded SQL program */ printf( "--->starting the Database Manager\n" ) ; /***********************************\ * START DATABASE MANAGER API called * \***********************************/ sqlepstart(NULL, &sqlca) ; CHECKERR( "START DATABASE MANAGER" ) ; printf( "input your user id: (default: none)\n" ) ; gets( connInput ) ; strcpy( userid, connInput ) ; printf( "input your password: (default: none)\n" ) ; gets( connInput ) ; strcpy( passwd, connInput ) ; printf( "\n--->Connecting to %s database\n", argv[2] ) ; /* by definition of this program, the last argument must be the name of the database */ strcpy( dbAlias, argv[2] ) ; EXEC SQL CONNECT TO :dbAlias USER :userid USING :passwd ; CHECKERR( "CONNECT TO database" ) ; sqloptStructPointer = ( struct sqlopt * ) malloc( sizeof( struct sqlopt ) + ( sizeof( struct sqloptions ) * 2 ) ) ; sqloptStructPointer->header.allocated = 2 ; sqloptStructPointer->header.used = 2 ; optionsPointer = sqloptStructPointer->option ; optionsPointer->type = SQL_BIND_OPT ; optionsPointer->val = 0 ; /* bind with default name */ optionsPointer++ ; optionsPointer->type = SQL_PKG_OPT ; optionsPointer->val = 0 ; printf( "\n--->precompiling the program: %s\n", argv[1] ) ; /*******************************\ * PRECOMPILE PROGRAM API called * \*******************************/ sqlaprep( argv[1], "message.pb1", sqloptStructPointer, &sqlca ) ; CHECKERR( "precompile program" ) ; printf( "precompiling successful\n" ) ; /* nullifying the options for the BIND API */ optionsPointer = sqloptStructPointer->option ; optionsPointer->type = SQL_NO_OPT ; optionsPointer->val = 0 ; optionsPointer++ ; optionsPointer->type = SQL_NO_OPT ; optionsPointer->val = 0 ; printf( "\n--->binding the application: %s\n", bindName ) ; /*****************\ * BIND API called * \*****************/ sqlabndx( bindName, "message.pb2", sqloptStructPointer, &sqlca ) ; CHECKERR( "binding the application" ) ; printf( "\n--->connect resetting\n" ) ; EXEC SQL CONNECT RESET ; CHECKERR( "CONNECT RESET" ) ; printf( "\nWould you like to stop the Database Manager? (y/n)\n" ) ; option = getc( stdin ) ; if ( option == 'y' ) { printf( "\n--->stopping the Database Manager\n" ) ; /**********************************\ * STOP DATABASE MANAGER API called * \**********************************/ sqlepstp(NULL, &sqlca ) ; CHECKERR( "stopping database manager" ) ; } /* endif */ } /* endif */ /* executing the compiler */ printf( "\n--->compiling program %s\n", programName ) ; rc = system( compiler_line ); if (rc) printf( "return value = %d\n", rc ) ; } } else { if ( extension != NULL ) printf( ":%s: can not be compiled, must end with '.c' or '.sqc'\n", argv[1] ) ; } /* executing the linker */ printf( "\n--->linking program %s\n", programName ) ; rc = system( linker_line ); if (rc) printf( "return value = %d\n", rc ) ; return( 0 ) ; } /* end of program : makeapi.sqc */