#include "stdio.h" #include "stdlib.h" #include "string.h" #include int exit_failure(const char *msg, MYSQL *mysql, MYSQL_RES *res, MYSQL_STMT *stmt); int main(void) { const char* sql_select = "SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"; MYSQL *conn; MYSQL_STMT *stmt; MYSQL_RES *prepare_meta_result; MYSQL_FIELD *column; my_bool attr_get; int i; int ret; conn = mysql_init(NULL); if (conn == NULL) exit_failure("mysql_init() failed", NULL, NULL, NULL); if (!mysql_real_connect(conn, "localhost", "root", "root", "phptest", 0, "/tmp/mysql.sock", 0)) exit_failure("mysql_real_connect() failed", conn, NULL, NULL); printf("%s...\n\n", sql_select); stmt = mysql_stmt_init(conn); if (mysql_stmt_prepare(stmt, sql_select, strlen(sql_select))) exit_failure("mysql_stmt_prepare() failed", conn, NULL, stmt); printf("After prepare...\n"); printf("\t stmt->fields[0].type = %s\n", (stmt->fields[0].type == MYSQL_TYPE_VARCHAR) ? "Varchar" : "Other"); printf("\t stmt->fields[0].max_length = %lu\n", stmt->fields[0].max_length); printf("\t stmt->fields[0].length = %lu\n", stmt->fields[0].length); printf("\n"); if (!(prepare_meta_result = mysql_stmt_result_metadata(stmt))) exit_failure("mysql_stmt_result_metadata() failed", conn, NULL, stmt); printf("Result metadata after prepare...\n"); for (i = 0; i < mysql_num_fields(prepare_meta_result); i++) { column = mysql_fetch_field_direct(prepare_meta_result, i); printf("Column %d - length = %lu\n", i, column->length); } printf("\n"); mysql_free_result(prepare_meta_result); if (mysql_stmt_execute(stmt)) exit_failure("mysql_stmt_execute() failed", conn, NULL, stmt); printf("After execute...\n"); printf("\t stmt->fields[0].type = %s\n", (stmt->fields[0].type == MYSQL_TYPE_VARCHAR) ? "Varchar" : "Other"); printf("\t stmt->fields[0].max_length = %lu\n", stmt->fields[0].max_length); printf("\t stmt->fields[0].length = %lu\n", stmt->fields[0].length); printf("\n"); if (!(prepare_meta_result = mysql_stmt_result_metadata(stmt))) exit_failure("mysql_stmt_result_metadata() failed", conn, NULL, stmt); printf("Result metadata after execute...\n"); for (i = 0; i < mysql_num_fields(prepare_meta_result); i++) { column = mysql_fetch_field_direct(prepare_meta_result, i); printf("Column %d - length = %lu\n", i, column->length); } printf("\n"); mysql_free_result(prepare_meta_result); attr_get = 1; if (mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &attr_get)) exit_failure("mysql_stmt_attr_get() failed", conn, NULL, stmt); if (mysql_stmt_store_result(stmt)) exit_failure("mysql_stmt_store_result() failed", conn, NULL, stmt); printf("After store_result...\n"); printf("\t stmt->fields[0].type = %s\n", (stmt->fields[0].type == MYSQL_TYPE_GEOMETRY) ? "Geometry" : "Other"); printf("\t stmt->fields[0].max_length = %lu\n", stmt->fields[0].max_length); printf("\t stmt->fields[0].length = %lu\n", stmt->fields[0].length); printf("\n"); mysql_stmt_close(stmt); mysql_close(conn); return EXIT_SUCCESS; } int exit_failure(const char *msg, MYSQL *mysql, MYSQL_RES *res, MYSQL_STMT *stmt) { printf("ERROR: %s\n", msg); if (stmt) { printf("[%u] %s\n", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); mysql_stmt_close(stmt); } if (mysql) { if (mysql_errno(mysql)) printf("[%u] %s\n", mysql_errno(mysql), mysql_error(mysql)); if (res) mysql_free_result(res); mysql_close(mysql); } printf("\n"); exit(EXIT_FAILURE); }