⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysql_client_test.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 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 + -