#include #include #include #include static const char *time_type(enum enum_mysql_timestamp_type type) { switch (type) { case MYSQL_TIMESTAMP_NONE: return "NONE"; case MYSQL_TIMESTAMP_ERROR: return "ERROR"; case MYSQL_TIMESTAMP_DATE: return "DATE"; case MYSQL_TIMESTAMP_DATETIME: return "DATETIME"; case MYSQL_TIMESTAMP_TIME: return "TIME"; } return "UNKNOWN-TYPE"; }; static const char *data_type(enum enum_field_types type) { switch (type) { case MYSQL_TYPE_DATE: return "DATE"; case MYSQL_TYPE_DATETIME: return "DATETIME"; case MYSQL_TYPE_TIME: return "TIME"; default: break; } return "UNKNOWN-TYPE"; }; static void check_stmt_rc(int rc, MYSQL_STMT *stmt) { if (rc) { printf("check_stmt_rc failed: %s\n", mysql_stmt_error(stmt)); exit(0); } } #define FAIL_IF(expr, reason)\ if (expr)\ {\ printf("Error: %s (%s: %d)\n", (reason) ? reason : "", __FILE__, __LINE__);\ return 1;\ } static char *server_options[] = \ { "mysql_test", "--defaults-file=/etc/my.cnf", NULL }; int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; static char *server_groups[] = { NULL }; int test_one(MYSQL *mysql, const char *stmtstr, enum enum_field_types dtype) { int rc= 0; MYSQL_STMT *stmt; MYSQL_BIND bind[1]; MYSQL_TIME t; stmt= mysql_stmt_init(mysql); rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr)); check_stmt_rc(rc, stmt); rc= mysql_stmt_execute(stmt); check_stmt_rc(rc, stmt); memset(bind, 0, sizeof(bind)); bind[0].buffer_type= dtype; bind[0].buffer_length= 20; bind[0].buffer= &t; do { if (mysql_stmt_field_count(stmt)) { FAIL_IF(mysql_stmt_field_count(stmt) != 1, "expected 1 column"); if ((rc= mysql_stmt_bind_result(stmt, bind))) { printf("%s /*bind as %s*/: mysql_stmt_bind_result() failed: error='%s'\n", stmtstr, data_type(dtype), mysql_stmt_error(stmt)); goto end; } if ((rc= mysql_stmt_fetch(stmt))) { printf("%-22s -> %s mysql_stmt_fetch() failed: error='%s'\n", stmtstr, data_type(dtype), mysql_stmt_error(stmt)); goto end; } printf("%-22s -> %s = %-9s %04d-%02d-%02d %02d:%02d:%02d.%06d\n", stmtstr, data_type(dtype), time_type(t.time_type), t.year, t.month, t.day, t.hour, t.minute, t.second, (int) t.second_part); } } while (mysql_stmt_next_result(stmt) == 0); end: mysql_stmt_close(stmt); return rc; } int main() { MYSQL *mysql; mysql_library_init(num_elements, server_options, server_groups); mysql= mysql_init(NULL); if (!mysql_real_connect(mysql, "localhost", "root", "", "test", 3306, "/tmp/mysql.sock", 0)) { fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(mysql)); goto libend; } test_one(mysql, "SELECT TIME'800:33:44'", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 1010", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 20101010", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 20101010223344", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 8003344", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 8001112", MYSQL_TYPE_TIME); test_one(mysql, "SELECT 10001112", MYSQL_TYPE_TIME); mysql_close(mysql); libend: mysql_library_end(); return 0; }