#ifdef _WIN32 #include #endif #include #include #include #include SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; #define ok_something(A, B, C) rc= B; if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO){ \ error_num= PrintError(C, A, rc); \ goto PROGRAM_END; \ } #define ok_env(A, B) ok_something(A,B, SQL_HANDLE_ENV) #define ok_dbc(A, B) ok_something(A,B, SQL_HANDLE_DBC) #define ok_stmt(A, B) ok_something(A,B, SQL_HANDLE_STMT) SQLINTEGER PrintError(SQLSMALLINT handleType, SQLHANDLE handle, SQLRETURN rcode) { SQLRETURN rc = SQL_ERROR; SQLCHAR sqlState[6]; SQLCHAR eMsg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER nError; SQLSMALLINT msgLen; if (rcode == SQL_NO_DATA) { printf( "NO DATA .. .. .."); return(SQL_NO_DATA); } else { rc = SQLGetDiagRec(handleType, handle, 1, sqlState, &nError, eMsg, sizeof(eMsg), &msgLen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { printf( " Error: %s\n", eMsg); } return (SQL_ERROR); } } int main(int argc, char * argv[]) { SQLRETURN rc; SQLCHAR connOut[255], szName[128]; int error_num= 0; SQL_TIMESTAMP_STRUCT param, ts1, ts2; if(argc < 2) { printf("\nUSAGE:\nbug68272 DSN=test51_dsn"); return 0; } ok_env(henv, SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv)); ok_env(henv, SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_NTS)); ok_env(henv, SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc)); ok_dbc(hdbc, SQLDriverConnect(hdbc, NULL, argv[1], SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT)); ok_dbc(hdbc, SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)); param.year= 2011; param.month= 8; param.day= 6; param.hour= 1; param.minute= 2; param.second= 3; param.fraction= 888; ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS bug60648", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "CREATE TABLE bug60648 (id int, ts timestamp)", SQL_NTS)); ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"INSERT INTO bug60648 "\ "(ts) VALUES (?)", SQL_NTS)); ok_stmt(hstmt, SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, ¶m, 0, NULL)); ok_stmt(hstmt, SQLExecute(hstmt)); ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select ?, bug60648.ts FROM bug60648", SQL_NTS)); ok_stmt(hstmt, SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 0, 0, ¶m, 0, NULL)); ok_stmt(hstmt, SQLExecute(hstmt)); ok_stmt(hstmt, SQLFetch(hstmt)); ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_TYPE_TIMESTAMP, &ts1, 0, NULL)); ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_TYPE_TIMESTAMP, &ts2, 0, NULL)); if(param.year != ts1.year || param.year != ts2.year || param.month != ts1.month || param.month != ts2.month || param.day != ts1.day || param.day != ts2.day || param.hour != ts1.hour || param.hour != ts2.hour || param.minute != ts1.minute || param.minute != ts2.minute || param.second != ts1.second || param.second != ts2.second || param.fraction != ts1.fraction || param.fraction != ts2.fraction ) { printf("\nERROR! Results are not matching the initial parameters!\n"); printf("ts1 [year %hd][month %hd][day %hd][hour %hd][minute %hd][second %hd][fraction %u]\n", ts1.year, ts1.month, ts1.day, ts1.hour, ts1.minute, ts1.second, ts1.fraction); printf("ts2 [year %hd][month %hd][day %hd][hour %hd][minute %hd][second %hd][fraction %u]\n", ts2.year, ts2.month, ts2.day, ts2.hour, ts2.minute, ts2.second, ts2.fraction); } else { printf("\nSUCCESS!\n"); } SQLFreeStmt(hstmt, SQL_CLOSE); PROGRAM_END: SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv); }