/* * trigger most of the available MySQL protocol commando packets * libmysqlclient must be compiled with -DUSE_OLD_FUNCTIONS * * $Id: protest.c 286 2006-08-08 17:22:26Z aschwenke $ */ #include #include #define ZERO(F) \ if (F) {\ printf("Error: 0 != %s\n", #F);\ exit(1);\ } else\ printf("OK: %s\n", #F); #define NONZERO(F) \ if (!(F)) {\ printf("Error: 0 == %s\n", #F);\ exit(1);\ } else\ printf("OK: %s\n", #F); #define BUFSIZE 20 char *values[] = {"eins", "zwei", "drei", "viele", NULL}; #define CREATE "CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 CHAR(10))" #define INSERT "INSERT INTO t1 (c2) VALUES (?)" #define SELECT "/* foobar */ SELECT c2 FROM t1" int main (void) { MYSQL *mysql; MYSQL_RES *res; unsigned int i; //connect to MySQL NONZERO(mysql= mysql_init(NULL)); NONZERO(mysql_real_connect(mysql, "127.0.0.1", NULL, NULL, NULL, 0, NULL, 0)); //switch to `test` database ZERO(mysql_select_db(mysql, "test")); //create database #ifdef USE_OLD_FUNCTIONS ZERO(mysql_create_db(mysql, "test1")); #else ZERO(mysql_query(mysql, " CREATE DATABASE test1")); #endif //change user ZERO(mysql_change_user(mysql, "root", NULL, "test1")); //create a table ZERO(mysql_query(mysql, CREATE)); //list fields NONZERO(res= mysql_list_fields(mysql, "t1", NULL)); mysql_free_result(res); //insert some rows { MYSQL_STMT *stmt; MYSQL_BIND bind; char buffer[BUFSIZE]; my_bool is_null= 0; unsigned long length; //create statement handle NONZERO(stmt= mysql_stmt_init(mysql)); ZERO(mysql_stmt_prepare(stmt, INSERT, strlen(INSERT))); //prepare parameter bind bind.buffer_type= MYSQL_TYPE_STRING; bind.buffer_length= BUFSIZE; bind.buffer= buffer; bind.is_null= &is_null; bind.length= &length; //bind params to statement ZERO(mysql_stmt_bind_param(stmt, &bind)); //insert 4 rows for (i= 0; values[i]; i++) { strncpy(buffer, values[i], BUFSIZE); length= strlen(buffer); ZERO(mysql_stmt_execute(stmt)); } //insert a row with c2=NULL length= 0; is_null= 1; ZERO(mysql_stmt_execute(stmt)); //close statement ZERO(mysql_stmt_close(stmt)); } //flush tables ZERO(mysql_refresh(mysql, REFRESH_TABLES)); //read rows { MYSQL_STMT *stmt; MYSQL_BIND bind[1]; char buffer[BUFSIZE]; my_bool is_null; unsigned long length; int curs= CURSOR_TYPE_READ_ONLY; //prepare result bind memset(bind, 0, sizeof(bind)); bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].buffer= buffer; bind[0].buffer_length= BUFSIZE; bind[0].is_null= &is_null; bind[0].length= &length; //create statement handle NONZERO(stmt= mysql_stmt_init(mysql)); ZERO(mysql_stmt_prepare(stmt, SELECT, strlen(SELECT))); //execute statement ZERO(mysql_stmt_execute(stmt)); //buffer results ZERO(mysql_stmt_store_result(stmt)); //bind result buffer ZERO(mysql_stmt_bind_result(stmt, bind)); //walk result while (! mysql_stmt_fetch(stmt)) {} //reset statement ZERO(mysql_stmt_reset(stmt)); //create a cursor ZERO(mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, &curs)); //execute statement ZERO(mysql_stmt_execute(stmt)); //bind result buffer ZERO(mysql_stmt_bind_result(stmt, bind)); //walk result while (! mysql_stmt_fetch(stmt)) {} //close statement ZERO(mysql_stmt_close(stmt)); } //send DEBUG packet ZERO(mysql_dump_debug_info(mysql)); //ping the server ZERO(mysql_ping(mysql)); //ask for stats NONZERO(mysql_stat(mysql)); //ask for process list NONZERO(res= mysql_list_processes(mysql)); mysql_free_result(res); //drop database #ifdef USE_OLD_FUNCTIONS ZERO(mysql_drop_db(mysql, "test1")); #else ZERO(mysql_query(mysql, "\tDROP DATABASE test1")); #endif #if 0 //get my thread id and kill it NONZERO(i= mysql_thread_id(mysql)); ZERO(mysql_kill(mysql, i)); #endif //close connection mysql_close(mysql); printf("complete\n"); }