/* cc -Wall -I${UNIXODBC}/include -L${UNIXODBC}/lib csqlbug3.c -o csqlbug3 -lodbc */ #include #include #include "sql.h" #include "sqlext.h" /* connection string */ #define CSTR "DSN=Build-test" #define ISOK(m,rc) if(rc!=SQL_SUCCESS) { printf("Failed on %s\n",m); exit(1); } #define ALGNLNG(s) (((s)+sizeof(SQLLEN)-1)&(~(sizeof(SQLLEN)-1))) void odbcdisperrs(HSTMT hstmt) { char buf[256]; char sqlstate[8]; SQLSMALLINT r; r=1; while(SQLGetDiagRec(SQL_HANDLE_STMT,hstmt, r++,(SQLCHAR*)sqlstate,NULL,(SQLCHAR*)buf,sizeof(buf), NULL) == SQL_SUCCESS) { printf("%s, SQLSTATE=%s\n", buf, sqlstate); } } int main(int argc, char **argv) { HENV henv; HDBC hdbc; HSTMT hstmt; int rc; char buf[256]; SQLSMALLINT nbcol; SQLLEN rowcnt; const char *cstr; SQLSMALLINT rsize; SQLINTEGER rts; SQLLEN len; cstr=(argc>=2)?argv[1]:CSTR; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); rc=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,0); ISOK("HENV",rc) rc=SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); ISOK("DBC",rc) printf("DriverConnect: %s\n",cstr); rc=SQLDriverConnect(hdbc,NULL,(SQLCHAR *)cstr,SQL_NTS, (SQLCHAR *)buf,sizeof(buf)/2,&rsize, SQL_DRIVER_NOPROMPT); ISOK("connect",rc) rc=SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); ISOK("newstat",rc) rc=SQLExecDirect(hstmt,(SQLCHAR *)"DROP TABLE IF EXISTS mm2bis",SQL_NTS); ISOK("drop",rc) rc=SQLExecDirect(hstmt,(SQLCHAR *)"CREATE TABLE mm2bis (ndx integer, tut double)",SQL_NTS); ISOK("newtable",rc) rc=SQLExecDirect(hstmt,(SQLCHAR *)"CREATE INDEX mm2ndx ON mm2bis (ndx)",SQL_NTS); ISOK("newindex",rc) rc=SQLStatistics(hstmt,NULL,SQL_NTS,NULL, SQL_NTS, (SQLCHAR *)"mm2bis",SQL_NTS,SQL_INDEX_ALL,SQL_QUICK); odbcdisperrs(hstmt); ISOK("SQLstats",rc) nbcol=0; SQLNumResultCols(hstmt,&nbcol); SQLRowCount(hstmt,&rowcnt); printf("nbcol=%d (should be 13) rowcnt=%d\n",nbcol,(int)rowcnt); rc=SQLFetch(hstmt); ISOK("fetch",rc) rc=SQLGetData(hstmt,7,SQL_C_SLONG,&rts,sizeof(SQLINTEGER),&len); ISOK("getdata-7",rc) printf("index type=%d (should >0) len=%d (should be 4)\n",(int)rts,(int)len); rc=SQLGetData(hstmt,6,SQL_C_CHAR,buf,sizeof(buf),&len); ISOK("getdata-6",rc) printf("index name='%.*s' (should be 'mm2ndx')\n",(int)len,buf); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; }