#include #include #include MYSQL *mysql; void example (MYSQL* m) { MYSQL_STMT* stmt; int rc; const char* sql; MYSQL_BIND bind[2]; int int_data=0; unsigned long blob_length =0; my_bool blob_error = 0; /* Create a table with a blob column and insert a single row. */ sql = "DROP TABLE IF EXISTS example"; rc = mysql_real_query (m, sql, strlen(sql)); assert(rc==0); sql = "CREATE TABLE example (int_data int primary key, blob_data TEXT) ENGINE=MyISAM"; rc = mysql_real_query (m, sql, strlen(sql)); assert(rc==0); sql = "INSERT INTO example (int_data,blob_data) values (77,'xxxx')"; rc = mysql_real_query (m, sql, strlen(sql)); assert(rc==0); stmt = mysql_stmt_init (m); assert(stmt); /* Try to fetch the blob without knowing its length in advance, * and without storing all rows on the client. */ sql = "SELECT int_data, blob_data FROM example"; rc = mysql_stmt_prepare (stmt, sql, strlen(sql)); assert(rc == 0); rc = mysql_stmt_execute (stmt); assert(rc==0); memset (bind, 0, sizeof bind); bind[0].buffer_type = MYSQL_TYPE_LONG; bind[0].buffer = &int_data; bind[0].buffer_length = sizeof int_data; bind[1].buffer_type = MYSQL_TYPE_BLOB; bind[1].buffer = NULL; bind[1].buffer_length = 0; bind[1].length = & blob_length; bind[1].error = & blob_error; rc = mysql_stmt_bind_result (stmt, bind); assert(rc==0); /* We expect MYSQL_DATA_TRUNCATED since bind[1].buffer_length == 0. */ rc = mysql_stmt_fetch (stmt); assert (rc == MYSQL_DATA_TRUNCATED); if (rc == MYSQL_DATA_TRUNCATED){ char blob_data[4]; /* Expect error bit to be set, and the actual length to be reported.*/ assert (blob_error); assert (blob_length == 4); memset (blob_data, 0, sizeof(blob_data)); bind[1].buffer = blob_data; bind[1].buffer_length = blob_length; assert (blob_data[0] == 0); assert (bind[1].buffer_length == 4); /* re-fetch the column.*/ rc = mysql_stmt_fetch_column (stmt, &bind[1], 1, 0); assert (rc == 0); /* Expect blob data to be there.*/ assert (blob_length == 4); assert (blob_data[0] == 'x'); /* FAIL!! blob_data is not set.*/ printf("\nBlob length: %ld, data[0]: %c\n", blob_length, blob_data[0]); fflush(0); } } int main() { mysql = mysql_init(NULL); mysql_real_connect(mysql, "localhost", "root", "", "test", 0, NULL, 0); printf("\nServer: %s, client: %s\n", mysql_get_server_info(mysql), mysql_get_client_info()); fflush(0); example(mysql); return 0; }