#include #include #include #include #include void print_mysql_error(MYSQL *dbh, char *message) { printf("%s: (Errno: %d, SQLState: %s) %s\n", message, mysql_errno(dbh), mysql_sqlstate(dbh), mysql_error(dbh)); } int main() { MYSQL *dbh; MYSQL_RES *query_result; MYSQL_ROW row; char japanese_message[] = {(char)0x95, (char) 0x00}; char query[200],escaped_message[10]; int n, status, mode; long long sid; char *create_table_sql = "CREATE TABLE IF NOT EXISTS t (a SERIAL, b INT)"; char *insert_sql = "INSERT INTO t (b) VALUES(1)"; char *select_sql = "SELECT MAX(a) FROM t"; char *gtid_next_sql_fmt = "SET GTID_NEXT = '%s'"; char *gtid, *gtid_next, *gtid_next_sql; /* INIT */ dbh = mysql_init(NULL); status = mysql_options(dbh, MYSQL_SET_CHARSET_NAME, (void*)"utf8"); assert(status == 0); if (!mysql_real_connect(dbh, "127.0.0.1", "msandbox", "msandbox", "test", 5711, NULL, 0)) { print_mysql_error(dbh, "Error during connecting to MySQL Server"); exit(1); }; assert(mysql_query(dbh,"select version()") == 0); query_result = mysql_store_result(dbh); assert((row = mysql_fetch_row(query_result))!= NULL); printf("mysql version is: %s\n", row[0]); mysql_free_result(query_result); status = mysql_query(dbh, create_table_sql); if (status) { print_mysql_error(dbh, "Error during requesting a query"); exit(2); } assert(mysql_query(dbh,"select @@global.gtid_executed") == 0); query_result = mysql_store_result(dbh); assert((row = mysql_fetch_row(query_result))!= NULL); gtid = strndup(row[0], 16 * 1024); mysql_free_result(query_result); mode = 0; for (n = 0, sid = 0; n < strlen(gtid); n++) { if (mode == 0 && gtid[n] == ':') { mode = 1; } if (mode == 1 && gtid[n] == '-') { sid = atoll(>id[n+1]); break; } } if (sid == 0) { for (n = 0, sid = 0; n < strlen(gtid); n++) { if (gtid[n] == ':') { sid = atoll(>id[n+1]); break; } } } if (sid == 0) { printf("Failed to retrieve SID.\n"); exit(1); } gtid_next = calloc(1, strlen(gtid) + 1); for (n = 0; n < strlen(gtid); n++) { gtid_next[n] = gtid[n]; if (gtid[n] == ':') { snprintf(>id_next[n+1], strlen(gtid) - n + 1, "%lld", sid + 1); break; } } printf("Current GTID/Next GTID: %s/%s\n", gtid, gtid_next); free(gtid); gtid = NULL; n = strlen(gtid_next_sql_fmt) + strlen(gtid_next) + 1; gtid_next_sql = malloc(n); snprintf(gtid_next_sql, n, gtid_next_sql_fmt, gtid_next); printf("Executing: %s\n", gtid_next_sql); status = mysql_query(dbh, gtid_next_sql); if (status) { print_mysql_error(dbh, "Error during requesting a query"); exit(2); } free(gtid_next); free(gtid_next_sql); mysql_autocommit(dbh, 0); for (n = 0; n < 10; n++) { mysql_query(dbh, insert_sql); } n = 1; mysql_query(dbh, select_sql); query_result = mysql_use_result(dbh); while((row = mysql_fetch_row(query_result))) { printf("%d:\t%s\n", n++, row[0]); fflush(stdout); } mysql_free_result(query_result); mysql_commit(dbh); enum enum_session_state_type type; for (type = SESSION_TRACK_BEGIN; type <= SESSION_TRACK_END; type++) { const char *data; size_t length; if (mysql_session_track_get_first(dbh, type, &data, &length) == 0) { printf("Type=%d:\n", type); printf("mysql_session_track_get_first() returns: %*.*s\n", (int) length, (int) length, data); /* check for more data */ while (mysql_session_track_get_next(dbh, type, &data, &length) == 0) { printf("mysql_session_track_get_next() returns: %*.*s\n", (int) length, (int) length, data); } } else { printf("Session status did not changed for type: %d\n", type); } } mysql_close(dbh); }