📄 mysql_client_test.c
字号:
/* Copyright (C) 2003-2004 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *//*************************************************************************** This is a test sample to test the new features in MySQL client-server protocol Main author: venu ( venu@mysql.com )***************************************************************************//* XXX: PLEASE RUN THIS PROGRAM UNDER VALGRIND AND VERIFY THAT YOUR TEST DOESN'T CONTAIN WARNINGS/ERRORS BEFORE YOU PUSH.*/#include <my_global.h>#include <my_sys.h>#include <mysql.h>#include <errmsg.h>#include <my_getopt.h>#include <m_string.h>#define VER "2.1"#define MAX_TEST_QUERY_LENGTH 300 /* MAX QUERY BUFFER LENGTH */#define MAX_KEY MAX_INDEXES#define MAX_SERVER_ARGS 64/* set default options */static int opt_testcase = 0;static char *opt_db= 0;static char *opt_user= 0;static char *opt_password= 0;static char *opt_host= 0;static char *opt_unix_socket= 0;static unsigned int opt_port;static my_bool tty_password= 0, opt_silent= 0;static MYSQL *mysql= 0;static char query[MAX_TEST_QUERY_LENGTH];static char current_db[]= "client_test_db";static unsigned int test_count= 0;static unsigned int opt_count= 0;static unsigned int iter_count= 0;static my_bool have_innodb= FALSE;static const char *opt_basedir= "./";static longlong opt_getopt_ll_test= 0;static int embedded_server_arg_count= 0;static char *embedded_server_args[MAX_SERVER_ARGS];static const char *embedded_server_groups[]= { "server", "embedded", "mysql_client_test_SERVER", NullS};static time_t start_time, end_time;static double total_time;const char *default_dbug_option= "d:t:o,/tmp/mysql_client_test.trace";struct my_tests_st{ const char *name; void (*function)();};#define myheader(str) \if (opt_silent < 2) \{ \ fprintf(stdout, "\n\n#####################################\n"); \ fprintf(stdout, "%d of (%d/%d): %s", test_count++, iter_count, \ opt_count, str); \ fprintf(stdout, " \n#####################################\n"); \}#define myheader_r(str) \if (!opt_silent) \{ \ fprintf(stdout, "\n\n#####################################\n"); \ fprintf(stdout, "%s", str); \ fprintf(stdout, " \n#####################################\n"); \}static void print_error(const char *msg);static void print_st_error(MYSQL_STMT *stmt, const char *msg);static void client_disconnect();/* Abort unless given experssion is non-zero. SYNOPSIS DIE_UNLESS(expr) DESCRIPTION We can't use any kind of system assert as we need to preserve tested invariants in release builds as well.*/#define DIE_UNLESS(expr) \ ((void) ((expr) ? 0 : (die(__FILE__, __LINE__, #expr), 0)))#define DIE(expr) \ die(__FILE__, __LINE__, #expr)void die(const char *file, int line, const char *expr){ fprintf(stderr, "%s:%d: check failed: '%s'\n", file, line, expr); abort();}#define myerror(msg) print_error(msg)#define mysterror(stmt, msg) print_st_error(stmt, msg)#define myquery(RES) \{ \ int r= (RES); \ if (r) \ myerror(NULL); \ DIE_UNLESS(r == 0); \}#define myquery_r(r) \{ \if (r) \ myerror(NULL); \DIE_UNLESS(r != 0); \}#define check_execute(stmt, r) \{ \if (r) \ mysterror(stmt, NULL); \DIE_UNLESS(r == 0);\}#define check_execute_r(stmt, r) \{ \if (r) \ mysterror(stmt, NULL); \DIE_UNLESS(r != 0);\}#define check_stmt(stmt) \{ \if ( stmt == 0) \ myerror(NULL); \DIE_UNLESS(stmt != 0); \}#define check_stmt_r(stmt) \{ \if (stmt == 0) \ myerror(NULL);\DIE_UNLESS(stmt == 0);\}#define mytest(x) if (!x) {myerror(NULL);DIE_UNLESS(FALSE);}#define mytest_r(x) if (x) {myerror(NULL);DIE_UNLESS(FALSE);}/* A workaround for Sun Forte 5.6 on Solaris x86 */static int cmp_double(double *a, double *b){ return *a == *b;}/* Print the error message */static void print_error(const char *msg){ if (!opt_silent) { if (mysql && mysql_errno(mysql)) { if (mysql->server_version) fprintf(stdout, "\n [MySQL-%s]", mysql->server_version); else fprintf(stdout, "\n [MySQL]"); fprintf(stdout, "[%d] %s\n", mysql_errno(mysql), mysql_error(mysql)); } else if (msg) fprintf(stderr, " [MySQL] %s\n", msg); }}static void print_st_error(MYSQL_STMT *stmt, const char *msg){ if (!opt_silent) { if (stmt && mysql_stmt_errno(stmt)) { if (stmt->mysql && stmt->mysql->server_version) fprintf(stdout, "\n [MySQL-%s]", stmt->mysql->server_version); else fprintf(stdout, "\n [MySQL]"); fprintf(stdout, "[%d] %s\n", mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); } else if (msg) fprintf(stderr, " [MySQL] %s\n", msg); }}/* Check if the connection has InnoDB tables */static my_bool check_have_innodb(MYSQL *conn){ MYSQL_RES *res; MYSQL_ROW row; int rc; my_bool result; rc= mysql_query(conn, "show variables like 'have_innodb'"); myquery(rc); res= mysql_use_result(conn); DIE_UNLESS(res); row= mysql_fetch_row(res); DIE_UNLESS(row); result= strcmp(row[1], "YES") == 0; mysql_free_result(res); return result;}/* This is to be what mysql_query() is for mysql_real_query(), for mysql_simple_prepare(): a variant without the 'length' parameter.*/MYSQL_STMT *STDCALLmysql_simple_prepare(MYSQL *mysql, const char *query){ MYSQL_STMT *stmt= mysql_stmt_init(mysql); if (stmt && mysql_stmt_prepare(stmt, query, strlen(query))) { mysql_stmt_close(stmt); return 0; } return stmt;}/* Connect to the server */static void client_connect(ulong flag){ int rc; myheader_r("client_connect"); if (!opt_silent) fprintf(stdout, "\n Establishing a connection to '%s' ...", opt_host ? opt_host : ""); if (!(mysql= mysql_init(NULL))) { opt_silent= 0; myerror("mysql_init() failed"); exit(1); } if (!(mysql_real_connect(mysql, opt_host, opt_user, opt_password, opt_db ? opt_db:"test", opt_port, opt_unix_socket, flag))) { opt_silent= 0; myerror("connection failed"); mysql_close(mysql); fprintf(stdout, "\n Check the connection options using --help or -?\n"); exit(1); } mysql->reconnect= 1; if (!opt_silent) fprintf(stdout, " OK"); /* set AUTOCOMMIT to ON*/ mysql_autocommit(mysql, TRUE); if (!opt_silent) { fprintf(stdout, "\nConnected to MySQL server version: %s (%lu)\n", mysql_get_server_info(mysql), (ulong) mysql_get_server_version(mysql)); fprintf(stdout, "\n Creating a test database '%s' ...", current_db); } strxmov(query, "CREATE DATABASE IF NOT EXISTS ", current_db, NullS); rc= mysql_query(mysql, query); myquery(rc); strxmov(query, "USE ", current_db, NullS); rc= mysql_query(mysql, query); myquery(rc); have_innodb= check_have_innodb(mysql); if (!opt_silent) fprintf(stdout, " OK");}/* Close the connection */static void client_disconnect(){ myheader_r("client_disconnect"); if (mysql) { if (!opt_silent) fprintf(stdout, "\n dropping the test database '%s' ...", current_db); strxmov(query, "DROP DATABASE IF EXISTS ", current_db, NullS); mysql_query(mysql, query); if (!opt_silent) fprintf(stdout, " OK"); if (!opt_silent) fprintf(stdout, "\n closing the connection ..."); mysql_close(mysql); fprintf(stdout, " OK\n"); }}/* Query processing */static void client_query(){ int rc; myheader("client_query"); rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); myquery(rc); rc= mysql_query(mysql, "CREATE TABLE t1(" "id int primary key auto_increment, " "name varchar(20))"); myquery(rc); rc= mysql_query(mysql, "CREATE TABLE t1(id int, name varchar(20))"); myquery_r(rc); rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('mysql')"); myquery(rc); rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('monty')"); myquery(rc); rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('venu')"); myquery(rc); rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')"); myquery(rc); rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')"); myquery(rc); rc= mysql_query(mysql, "UPDATE t1 SET name= 'updated' " "WHERE name= 'deleted'"); myquery(rc); rc= mysql_query(mysql, "UPDATE t1 SET id= 3 WHERE name= 'updated'"); myquery_r(rc); myquery(mysql_query(mysql, "drop table t1"));}/* Print dashes */static void my_print_dashes(MYSQL_RES *result){ MYSQL_FIELD *field; unsigned int i, j; mysql_field_seek(result, 0); fputc('\t', stdout); fputc('+', stdout); for(i= 0; i< mysql_num_fields(result); i++) { field= mysql_fetch_field(result); for(j= 0; j < field->max_length+2; j++) fputc('-', stdout); fputc('+', stdout); } fputc('\n', stdout);}/* Print resultset metadata information */static void my_print_result_metadata(MYSQL_RES *result){ MYSQL_FIELD *field; unsigned int i, j; unsigned int field_count; mysql_field_seek(result, 0); if (!opt_silent) { fputc('\n', stdout); fputc('\n', stdout); } field_count= mysql_num_fields(result); for(i= 0; i< field_count; i++) { field= mysql_fetch_field(result); j= strlen(field->name); if (j < field->max_length) j= field->max_length; if (j < 4 && !IS_NOT_NULL(field->flags)) j= 4; field->max_length= j; } if (!opt_silent) { my_print_dashes(result); fputc('\t', stdout); fputc('|', stdout); } mysql_field_seek(result, 0); for(i= 0; i< field_count; i++) { field= mysql_fetch_field(result); if (!opt_silent) fprintf(stdout, " %-*s |", (int) field->max_length, field->name); } if (!opt_silent) { fputc('\n', stdout); my_print_dashes(result); }}/* Process the result set */int my_process_result_set(MYSQL_RES *result){ MYSQL_ROW row; MYSQL_FIELD *field; unsigned int i; unsigned int row_count= 0; if (!result) return 0; my_print_result_metadata(result); while ((row= mysql_fetch_row(result)) != NULL) { mysql_field_seek(result, 0); if (!opt_silent) { fputc('\t', stdout); fputc('|', stdout); } for(i= 0; i< mysql_num_fields(result); i++) { field= mysql_fetch_field(result); if (!opt_silent) { if (row[i] == NULL) fprintf(stdout, " %-*s |", (int) field->max_length, "NULL"); else if (IS_NUM(field->type)) fprintf(stdout, " %*s |", (int) field->max_length, row[i]); else fprintf(stdout, " %-*s |", (int) field->max_length, row[i]); } } if (!opt_silent) { fputc('\t', stdout); fputc('\n', stdout); } row_count++; } if (!opt_silent) { if (row_count) my_print_dashes(result); if (mysql_errno(mysql) != 0) fprintf(stderr, "\n\tmysql_fetch_row() failed\n"); else fprintf(stdout, "\n\t%d %s returned\n", row_count, row_count == 1 ? "row" : "rows"); } return row_count;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -