#ifdef _WIN32 #include #endif #include #include #include SQLHENV henv; SQLHDBC hdbc, hdbc2; SQLHSTMT hstmt, hstmt2; #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); } } #define CONN_STRING "Driver={MySQL ODBC 5.1 Driver};Server=localhost;User=root;Database=test;NO_CACHE=1" int main(int argc, char * argv[]) { SQLRETURN rc; SQLCHAR connOut[255], szName[128]; SQLCHAR *res; SQLINTEGER strl= 0, conn_id= 0; SQLCHAR connKill[128]; int i, bufsize= 65536; SQLSMALLINT szConnOut, cbNameLength, dataType, decimalDigits, nullable; int error_num= 0; SQLLEN len1, len2; SQLCHAR pColumnName[64], pBuffer2[64]; res= malloc(bufsize); 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, CONN_STRING, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT)); ok_dbc(hdbc, SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)); /* alloc and init 2nd connection */ ok_env(henv, SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc2)); ok_dbc(hdbc2, SQLDriverConnect(hdbc2, NULL, CONN_STRING, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT)); ok_dbc(hdbc2, SQLAllocHandle(SQL_HANDLE_STMT, hdbc2, &hstmt2)); ok_stmt(hstmt, SQLExecDirect(hstmt, "SELECT connection_id()", SQL_NTS)); ok_stmt(hstmt, SQLFetch(hstmt)); ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_INTEGER, &conn_id, 0, 0)); ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE)); ok_stmt(hstmt, SQLExecDirect(hstmt, "DROP TABLE IF EXISTS bug62271", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "CREATE TABLE bug62271(id INT NOT NULL PRIMARY KEY, txt LONGTEXT);", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "INSERT INTO bug62271 VALUES(1, REPEAT('a', 50000)),(2, REPEAT('b', 50000)),(3, REPEAT('c', 50000)), (4, REPEAT('d', 50000)),(5, REPEAT('e', 50000)),(6, REPEAT('f', 50000)),(7, REPEAT('g', 50000)), (8, REPEAT('h', 50000)),(9, REPEAT('i', 50000)),(10, REPEAT('j', 50000))", SQL_NTS)); ok_stmt(hstmt, SQLExecDirect(hstmt, "SELECT txt FROM bug62271", SQL_NTS)); for(i= 1; i < 5; i++) { ok_stmt(hstmt, SQLFetch(hstmt)); ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, res, bufsize, &strl)); printf("[%d] Fetched %d characters\n", i, strl); strl= 0; } /* From another connection, kill the connection created above */ sprintf(connKill, "KILL %d", conn_id); ok_stmt(hstmt2, SQLExecDirect(hstmt2, (SQLCHAR *)connKill, SQL_NTS)); printf("KILL THE CONNECTION\n", i, strl); /* trying to continue fetching data */ for(i= 5; i < 11 ;i++) { ok_stmt(hstmt, SQLFetch(hstmt)); ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, res, bufsize, &strl)); printf("[%d] Fetched %d characters\n", i, strl); strl= 0; } PROGRAM_END: rc = SQLDisconnect(hdbc); rc = SQLFreeConnect(hdbc); rc = SQLFreeEnv(henv); }