DSN8O3VP sample application

The DSN8O3VP sample program validates the installation of DB2® ODBC.

The following code contains the sample program DSN810.SDSNSAMP(DSN8O3VP).
 
 /*********************************************************************/
 /*  DB2 ODBC 3.0 installation certification test to validate         */
 /*  installation.                                                    */
 /*                                                                   */
 /*  DSNTEJ8 is sample JCL to that can be used to run this            */
 /*  application.                                                     */
 /*********************************************************************/
 /******************************************************************/
 /* Include the 'C' include files                                  */
 /******************************************************************/
   #include <stdio.h>
   #include <string.h>
   #include <stdlib.h>
   #include "sqlcli1.h"
   /******************************************************************/
   /* Variables                                                      */
   /******************************************************************/
#ifndef NULL
#define NULL   0
#endif
    SQLHENV henv = SQL_NULL_HENV;
    SQLHDBC hdbc = SQL_NULL_HDBC;
    SQLHDBC hstmt= SQL_NULL_HSTMT;
    SQLRETURN rc = SQL_SUCCESS;
    SQLINTEGER      id;
    SQLCHAR         name[51]
    SQLINTEGER      namelen, intlen, colcount;
    struct sqlca    sqlca;
    SQLCHAR   server[18]
    SQLCHAR   uid[30]
    SQLCHAR   pwd[30]
    SQLCHAR   sqlstmt[500]
SQLRETURN check_error(SQLSMALLINT,SQLHANDLE,SQLRETURN,int,char *);
SQLRETURN print_error(SQLSMALLINT,SQLHANDLE,SQLRETURN,int,char *);
SQLRETURN prt_sqlca(void);
#define CHECK_HANDLE( htype, hndl, rc ) if ( rc != SQL_SUCCESS ) \
   {check_error(htype,hndl,rc,__LINE__,__FILE__);goto dberror;}
   /******************************************************************/
   /* Main Program                                                   */
   /******************************************************************/
int main()
{
 printf("DSN8O3VP INITIALIZATION\n");
 printf("DSN8O3VP SQLAllocHandle-Environment\n");
 henv=0;
 rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ;
 CHECK_HANDLE( SQL_HANDLE_ENV, henv, rc );
 printf("DSN8O3VP-henv=%i\n",henv);
 printf("DSN8O3VP SQLAllocHandle-Environment successful\n");
 printf("DSN8O3VP SQLAllocHandle-Connection\n");
 hdbc=0;
 rc=SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc);
 CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc );
 printf("DSN8O3VP-hdbc=%i\n",hdbc);
 printf("DSN8O3VP SQLAllocHandle-Connection successful\n");
 printf("DSN8O3VP SQLConnect\n");
 strcpy((char *)uid,"");
 strcpy((char *)pwd,"");
 strcpy((char *)server,"ignore");
 /* sample is NULL connect to default datasource */
 rc=SQLConnect(hdbc,NULL,0,NULL,0,NULL,0);
 CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc );
 printf("DSN8O3VP successfully issued a SQLconnect\n");
 printf("DSN8O3VP SQLAllocHandle-Statement\n");
 hstmt=0;
 rc=SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt);
 CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc );
 printf("DSN8O3VP hstmt=%i\n",hstmt);
 printf("DSN8O3VP SQLAllocHandle-Statement successful\n");
 printf("DSN8O3VP SQLExecDirect\n");
 strcpy((char *)sqlstmt,"SELECT * FROM SYSIBM.SYSDUMMY1");
 printf("DSN8O3VP sqlstmt=%s\r",sqlstmt);
 rc=SQLExecDirect(hstmt,sqlstmt,SQL_NTS);
 CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc );
 printf("DSN8O3VP successfully issued a SQLExecDirect\n");
 /* sample fetch without looking at values */
 printf("DSN8O3VP SQLFetch\n");
 rc=SQLFetch(hstmt);
 CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc );
 printf("DSN8O3VP successfully issued a SQLFetch\n");
 printf("DSN8O3VP SQLEndTran-Commit\n");
 rc=SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
 CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc );
 printf("DSN8O3VP SQLEndTran-Commit successful\n");
 printf("DSN8O3VP SQLFreeHandle-Statement\n");
 rc=SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
 CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc );
 hstmt=0;
 printf("DSN8O3VP SQLFreeHandle-Statement successful\n");
 /******** SQLDisconnect ******************************************/
 printf("DSN8O3VP SQLDisconnect\n");
 rc=SQLDisconnect(hdbc);
 CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc );
 printf("DSN8O3VP successfully issued a SQLDisconnect\n");
 /******** SQLFreeConnect *****************************************/
 printf("DSN8O3VP SQLFreeHandle-Connection\n");
 rc=SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
 CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc );
 hdbc=0;
 printf("DSN8O3VP SQLFreeHandle-Connection successful\n");
 /******** SQLFreeEnv *********************************************/
 printf("DSN8O3VP SQLFreeHandle-Environment\n");
 rc=SQLFreeHandle(SQL_HANDLE_ENV,henv);
 CHECK_HANDLE( SQL_HANDLE_ENV, henv, rc );
 henv=0;
 printf("DSN8O3VP SQLFreeHandle-Environment successful\n");
 pgmend:
 printf("DSN8O3VP pgmend: Ending sample\n");
 if (rc==0)
  printf("DSN8O3VP Execution was SUCCESSFUL\n");
 else
  {
  printf("DSN8O3VP***************************\n");
  printf("DSN8O3VP Execution FAILED\n");
  printf("DSN8O3VP rc = %i\n", rc  );
  printf("DSN8O3VP ***************************\n");
  }
 return(rc);
 dberror:
 printf("DSN8O3VP dberror: entry dberror rtn\n");
 printf("DSN8O3VP dberror: rc=%d\n",rc);
 printf("DSN8O3VP dberror: environment cleanup attempt\n");
 printf("DSN8O3VP dberror: cleanup SQLFreeEnv\n");
 rc=SQLFreeEnv(henv);
 printf("DSN8O3VP dberror: cleanup SQLFreeEnv rc =%d\n",rc);
 rc=12;
 printf("DSN8O3VP dberror: setting error rc=%d\n",rc);
 goto pgmend;
}  /*END MAIN*/ 
/******************************************************************/
/* check_error                                                    */
/******************************************************************/
/*   RETCODE values   from sqlcli.h                               */
/*#define  SQL_SUCCESS             0                              */
/*#define  SQL_SUCCESS_WITH_INFO   1                              */
/*#define  SQL_NO_DATA_FOUND       100                            */
/*#define  SQL_NEED_DATA           99                             */
/*#define  SQL_NO_DATA             SQL_NO_DATA_FOUND              */
/*#define  SQL_STILL_EXECUTING     2       not currently returned */
/*#define  SQL_ERROR               -1                             */
/*#define  SQL_INVALID_HANDLE      -2                             */
/******************************************************************/
SQLRETURN check_error( SQLSMALLINT htype, /* A handle type */
                       SQLHANDLE   hndl,  /* A handle */
                       SQLRETURN   frc,   /* Return code */
                       int         line,  /* Line error issued */
                       char *      file   /* file error issued */
                     ) {
    SQLCHAR         cli_sqlstate[SQL_SQLSTATE_SIZE + 1];
    SQLINTEGER      cli_sqlcode;
    SQLSMALLINT     length;
    printf("DSN8O3VP entry check_error rtn\n");
    switch (frc) {
    case SQL_SUCCESS:
      break;
    case SQL_INVALID_HANDLE:
      printf("DSN8O3VP check_error> SQL_INVALID HANDLE \n");
      break;
    case SQL_ERROR:
      printf("DSN8O3VP check_error> SQL_ERROR\n");
      break;
    case SQL_SUCCESS_WITH_INFO:
      printf("DSN8O3VP check_error>  SQL_SUCCESS_WITH_INFO\n");
      break;
    case SQL_NO_DATA_FOUND:
      printf("DSN8O3VP check_error> SQL_NO_DATA_FOUND\n");
      break;
    default:
      printf("DSN8O3VP check_error> Received rc from api rc=%i\n",frc);
      break;
    } /*end switch*/
    print_error(htype,hndl,frc,line,file);
    printf("DSN8O3VP SQLGetSQLCA\n");
    rc = SQLGetSQLCA(henv, hdbc, hstmt, &sqlca);
    if( rc == SQL_SUCCESS )
      prt_sqlca();
    else
      printf("DSN8O3VP check_error SQLGetSQLCA failed rc=%i\n",rc);
    printf("DSN8O3VP exit check_error rtn\n");
    return (frc);
}  /* end check_error */ 
/******************************************************************/
/* print_error                                                    */
/* calls SQLGetDiagRec() displays SQLSTATE and message            */
/******************************************************************/
SQLRETURN print_error( SQLSMALLINT htype, /* A handle type */
                       SQLHANDLE   hndl,  /* A handle */
                       SQLRETURN   frc,   /* Return code */
                       int         line,  /* error from line */
                       char *      file   /* error from file */
                     ) {
    SQLCHAR     buffer[SQL_MAX_MESSAGE_LENGTH + 1] ;
    SQLCHAR     sqlstate[SQL_SQLSTATE_SIZE + 1] ;
    SQLINTEGER  sqlcode ;
    SQLSMALLINT length, i ;
    SQLRETURN   prc;
    printf("DSN8O3VP entry print_error rtn\n");
    printf("DSN8O3VP rc=%d reported from file:%s,line:%d ---\n",
            frc,
            file,
            line
          ) ;
    i = 1 ;
    while ( SQLGetDiagRec( htype,
                           hndl,
                           i,
                           sqlstate,
                           &sqlcode,
                           buffer,
                           SQL_MAX_MESSAGE_LENGTH + 1,
                           &length
                         ) == SQL_SUCCESS ) {
       printf( "DSN8O3VP SQLSTATE: %s\n", sqlstate ) ;
       printf( "DSN8O3VP Native Error Code: %ld\n", sqlcode ) ;
       printf( "DSN8O3VP buffer: %s \n", buffer ) ;
       i++ ;
    }
    printf( ">--------------------------------------------------\n" ) ;
    printf("DSN8O3VP exit print_error rtn\n");
    return( SQL_ERROR ) ;
}  /* end print_error */ 
/******************************************************************/
/* prt_sqlca                                                      */
/******************************************************************/
SQLRETURN
  prt_sqlca()
  {
    int i;
    printf("DSN8O3VP entry prt_sqlca rtn\n");
    printf("\r\rDSN8O3VP*** Printing the SQLCA:\r");
    printf("\nDSN8O3VP SQLCAID .... %s",sqlca.sqlcaid);
    printf("\nDSN8O3VP SQLCABC .... %d",sqlca.sqlcabc);
    printf("\nDSN8O3VP SQLCODE .... %d",sqlca.sqlcode);
    printf("\nDSN8O3VP SQLERRML ... %d",sqlca.sqlerrml);
    printf("\nDSN8O3VP SQLERRMC ... %s",sqlca.sqlerrmc);
    printf("\nDSN8O3VP SQLERRP  ... %s",sqlca.sqlerrp);
    for (i = 0; i < 6; i++)
      printf("\nDSN8O3VP SQLERRD%d ... %d",i+1,sqlca.sqlerrd??(i??));
    for (i = 0; i < 10; i++)
      printf("\nDSN8O3VP SQLWARN%d ... %c",i,sqlca.sqlwarn[i]);
    printf("\nDSN8O3VP SQLWARNA ... %c",sqlca.sqlwarn[10]);
    printf("\nDSN8O3VP SQLSTATE ... %s",sqlca.sqlstate);
    printf("\nDSN8O3VP exit prt_sqlca rtn\n");
    return(0);
  }  /* End of prt_sqlca */
/*******************************************************************/
/* END DSN8O3VP                                                    */
/*******************************************************************/