diff options
author | unknown <monty@narttu.mysql.fi> | 2003-05-02 15:22:04 +0300 |
---|---|---|
committer | unknown <monty@narttu.mysql.fi> | 2003-05-02 15:22:04 +0300 |
commit | 03c1ec3d685b60d04b0db274c5201149322ac667 (patch) | |
tree | 54bb3048af9dd7caa7cd44bcb2859f2b11b562c8 /tests | |
parent | 4a506d6e23845bf5d8208da741bd85cdcb0d4270 (diff) | |
parent | 762b3175c695b0dc1ae60858826d9879e63acb16 (diff) | |
download | mariadb-git-03c1ec3d685b60d04b0db274c5201149322ac667.tar.gz |
Merge
tests/ssl_test.c:
Auto merged
sql/item_strfunc.cc:
Merge + removed wrong bug fix (?)
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 7 | ||||
-rw-r--r-- | tests/connect_test.c | 65 | ||||
-rw-r--r-- | tests/deadlock_test.c | 238 | ||||
-rw-r--r-- | tests/insert_test.c | 59 | ||||
-rw-r--r-- | tests/list_test.c | 70 | ||||
-rw-r--r-- | tests/select_test.c | 73 | ||||
-rw-r--r-- | tests/showdb_test.c | 66 | ||||
-rw-r--r-- | tests/ssl_test.c | 82 | ||||
-rw-r--r-- | tests/thread_test.c | 251 |
9 files changed, 911 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 5dc6871bd43..1c9a3a81edf 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -26,6 +26,8 @@ EXTRA_DIST = auto_increment.res auto_increment.tst \ pmail.pl mail_to_db.pl table_types.pl \ udf_test udf_test.res myisam-big-rows.tst +noinst_PROGRAMS = insert_test select_test thread_test + # # C Test for 4.1 protocol # @@ -36,6 +38,11 @@ noinst_PROGRAMS = client_test client_test_LDADD= $(LDADD) $(CXXLDFLAGS) client_test_SOURCES= client_test.c client_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) +insert_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) +select_test_DEPENDENCIES= $(LIBRARIES) $(pkglib_LTLIBRARIES) + +thread_test.o: thread_test.c + $(COMPILE) -c @MT_INCLUDES@ $(INCLUDES) $< # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/tests/connect_test.c b/tests/connect_test.c new file mode 100644 index 00000000000..fd81ad635ad --- /dev/null +++ b/tests/connect_test.c @@ -0,0 +1,65 @@ +/* Copyright (C) 2000 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 */ + +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" + +static void change_user(MYSQL *sock,const char *user, const char *password, + const char *db,my_bool warning) +{ + if (mysql_change_user(sock,user,password,db) != warning) + { + fprintf(stderr,"Couldn't change user to: user: '%s', password: '%s', db: '%s': Error: %s\n", + user, password ? password : "", db ? db : "", + mysql_error(sock)); + } +} + + +int main(int argc, char **argv) +{ + MYSQL *sock; + + if (!(sock=mysql_init(0))) + { + fprintf(stderr,"Couldn't initialize mysql struct\n"); + exit(1); + } + mysql_options(sock,MYSQL_READ_DEFAULT_GROUP,"connect"); + if (!mysql_real_connect(sock,NULL,NULL,NULL,NULL,0,NULL,0)) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n",mysql_error(sock)); + perror(""); + exit(1); + } + + if (mysql_select_db(sock,"test")) + { + fprintf(stderr,"Couldn't select database test: Error: %s\n", + mysql_error(sock)); + } + + change_user(sock,"test_user","test_user","test",0); + change_user(sock,"test",NULL,"test",0); + change_user(sock,"test_user",NULL,"test",1); + change_user(sock,"test_user",NULL,NULL,1); + change_user(sock,"test_user","test_user","mysql",1); + + mysql_close(sock); + exit(0); + return 0; +} diff --git a/tests/deadlock_test.c b/tests/deadlock_test.c new file mode 100644 index 00000000000..65a0df5c215 --- /dev/null +++ b/tests/deadlock_test.c @@ -0,0 +1,238 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult 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 */ + +#include <mysql.h> +#include <stdio.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +typedef unsigned char uchar; +static void die(char* fmt, ...); +static void safe_query(MYSQL* mysql, char* query, int read_ok); +static void run_query_batch(int* order, int num_queries); +static void permute(int *order, int num_queries); +static void permute_aux(int *order, int num_queries, int* fixed); +static void dump_result(MYSQL* mysql, char* query); + +int count = 0; + + +struct query +{ + MYSQL* mysql; + char* query; + int read_ok; + int pri; + int dump_result; +}; + +MYSQL lock, sel, del_ins; + +struct query queries[] = +{ + {&del_ins, "insert delayed into foo values(1)", 1, 0, 0}, + {&del_ins, "insert delayed into foo values(1)", 1, 0, 0}, + {&lock, "lock tables foo write", 1, 1, 0}, + {&lock, "unlock tables", 1,2, 0}, + {&sel, "select * from foo", 0,0, 0}, + {&del_ins, "insert into foo values(4)", 0,3, 0}, + {0,0,0} +}; + +static void die(char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "ERROR: "); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n"); + va_end(args); + exit(1); +} + +static void permute(int *order, int num_queries) +{ + int *fixed; + if(num_queries < 2) return; + if(!(fixed = (int*)malloc(num_queries * sizeof(int)))) + die("malloc() failed"); + + memset(fixed, 0, num_queries * sizeof(int)); + permute_aux(order, num_queries, fixed); + + free(fixed); +} + +static order_ok(int *order, int num_queries) +{ + int i,j, pri_i, pri_j; + for(i = 0; i < num_queries; i++) + { + if((pri_i = queries[order[i]].pri)) + for(j = i + 1; j < num_queries; j++) + { + pri_j = queries[order[j]].pri; + if(pri_j && pri_i > pri_j) + return 0; + } + } + + return 1; +} + +static void permute_aux(int *order, int num_queries, int* fixed) +{ + int *p,*p1,j,i,tmp, num_free = 0; + p = fixed; + for(i = 0; i < num_queries; i++, p++) + { + if(!*p) + { + num_free++; + *p = 1; + for(j = 0, p1 = fixed ; + j < num_queries; j++,p1++) + { + if(!*p1) + { + tmp = order[i]; + order[i] = order[j]; + order[j] = tmp; + *p1 = 1; + permute_aux(order, num_queries, fixed); + tmp = order[i]; + order[i] = order[j]; + order[j] = tmp; + *p1 = 0; + } + } + *p = 0; + } + } + + /*printf("num_free = %d\n", num_free); */ + + if(num_free <= 1) + { + count++; + if(order_ok(order, num_queries)) + run_query_batch(order, num_queries); + } +} + +static void run_query_batch(int* order, int num_queries) +{ + int i; + struct query* q; + int *save_order; + safe_query(&lock, "delete from foo", 1); + save_order = order; + for(i = 0; i < num_queries; i++,order++) + { + q = queries + *order; + printf("query='%s'\n", q->query); + safe_query(q->mysql, q->query, q->read_ok); + } + order = save_order; + for(i = 0; i < num_queries; i++,order++) + { + q = queries + *order; + if(q->dump_result) + dump_result(q->mysql, q->query); + } + printf("\n"); + +} + +static void safe_net_read(NET* net, char* query) +{ + int len; + len = my_net_read(net); + if(len == packet_error || !len) + die("Error running query '%s'", query); + if(net->read_pos[0] == 255) + die("Error running query '%s'", query); +} + + +static void safe_query(MYSQL* mysql, char* query, int read_ok) +{ + int len; + NET* net = &mysql->net; + net_clear(net); + if(net_write_command(net,(uchar)COM_QUERY, query,strlen(query))) + die("Error running query '%s': %s", query, mysql_error(mysql)); + if(read_ok) + { + safe_net_read(net, query); + } +} + +static void dump_result(MYSQL* mysql, char* query) +{ + MYSQL_RES* res; + safe_net_read(&mysql->net, query); + res = mysql_store_result(mysql); + if(res) + mysql_free_result(res); +} + +static int* init_order(int* num_queries) +{ + struct query* q; + int *order, *order_end, *p; + int n,i; + + for(q = queries; q->mysql; q++) + ; + + n = q - queries; + if(!(order = (int*) malloc(n * sizeof(int)))) + die("malloc() failed"); + order_end = order + n; + for(p = order,i = 0; p < order_end; p++,i++) + *p = i; + *num_queries = n; + return order; +} + +int main() +{ + char* user = "root", *pass = "", *host = "localhost", *db = "test"; + int *order, num_queries; + order = init_order(&num_queries); + if(!mysql_init(&lock) || !mysql_init(&sel) || !mysql_init(&del_ins)) + die("error in mysql_init()"); + + mysql_options(&lock, MYSQL_READ_DEFAULT_GROUP, "mysql"); + mysql_options(&sel, MYSQL_READ_DEFAULT_GROUP, "mysql"); + mysql_options(&del_ins, MYSQL_READ_DEFAULT_GROUP, "mysql"); + + if(!mysql_real_connect(&lock, host, user, pass, db, 0,0,0 ) || + !mysql_real_connect(&sel, host, user, pass, db, 0,0,0 ) || + !mysql_real_connect(&del_ins, host, user, pass, db, 0,0,0 )) + die("Error in mysql_real_connect(): %s", mysql_error(&lock)); + + permute(order, num_queries); + printf("count = %d\n", count); + + mysql_close(&lock); + mysql_close(&sel); + mysql_close(&del_ins); + free(order); +} diff --git a/tests/insert_test.c b/tests/insert_test.c new file mode 100644 index 00000000000..052c12bfdf0 --- /dev/null +++ b/tests/insert_test.c @@ -0,0 +1,59 @@ +/* Copyright (C) 2000 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 */ + +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" + +#define INSERT_QUERY "insert into test (name,num) values ('item %d', %d)" + + +int main(int argc, char **argv) +{ + int count,num; + MYSQL *sock,mysql; + char qbuf[160]; + + if (argc != 3) + { + fprintf(stderr,"usage : insert_test <dbname> <Num>\n\n"); + exit(1); + } + + mysql_init(&mysql); + if (!(sock = mysql_real_connect(&mysql,NULL,NULL,NULL,argv[1],0,NULL,0))) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n",mysql_error(&mysql)); + perror(""); + exit(1); + } + + num = atoi(argv[2]); + count = 0; + while (count < num) + { + sprintf(qbuf,INSERT_QUERY,count,count); + if(mysql_query(sock,qbuf)) + { + fprintf(stderr,"Query failed (%s)\n",mysql_error(sock)); + exit(1); + } + count++; + } + mysql_close(sock); + exit(0); + return 0; +} diff --git a/tests/list_test.c b/tests/list_test.c new file mode 100644 index 00000000000..06bf16d2751 --- /dev/null +++ b/tests/list_test.c @@ -0,0 +1,70 @@ +/* Copyright (C) 2000 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 */ + +#ifdef __WIN__ +#include <windows.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" + +#define SELECT_QUERY "select name from test where num = %d" + + +int main(int argc, char **argv) +{ + int count, num; + MYSQL mysql,*sock; + MYSQL_RES *res; + char qbuf[160]; + + if (argc != 2) + { + fprintf(stderr,"usage : select_test <dbname>\n\n"); + exit(1); + } + + if (!(sock = mysql_connect(&mysql,NULL,0,0))) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql)); + perror(""); + exit(1); + } + + if (mysql_select_db(sock,argv[1]) < 0) + { + fprintf(stderr,"Couldn't select database %s!\n%s\n",argv[1], + mysql_error(sock)); + exit(1); + } + + if (!(res=mysql_list_dbs(sock,NULL))) + { + fprintf(stderr,"Couldn't list dbs!\n%s\n",mysql_error(sock)); + exit(1); + } + mysql_free_result(res); + if (!(res=mysql_list_tables(sock,NULL))) + { + fprintf(stderr,"Couldn't list tables!\n%s\n",mysql_error(sock)); + exit(1); + } + mysql_free_result(res); + + mysql_close(sock); + exit(0); + return 0; +} diff --git a/tests/select_test.c b/tests/select_test.c new file mode 100644 index 00000000000..ee2a9192865 --- /dev/null +++ b/tests/select_test.c @@ -0,0 +1,73 @@ +/* Copyright (C) 2000 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 */ + +#if defined(_WIN32) || defined(_WIN64) +#include <windows.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" + +#define SELECT_QUERY "select name from test where num = %d" + + +int main(int argc, char **argv) +{ + int count, num; + MYSQL mysql,*sock; + MYSQL_RES *res; + char qbuf[160]; + + if (argc != 3) + { + fprintf(stderr,"usage : select_test <dbname> <num>\n\n"); + exit(1); + } + + mysql_init(&mysql); + if (!(sock = mysql_real_connect(&mysql,NULL,0,0,argv[1],0,NULL,0))) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql)); + perror(""); + exit(1); + } + + count = 0; + num = atoi(argv[2]); + while (count < num) + { + sprintf(qbuf,SELECT_QUERY,count); + if(mysql_query(sock,qbuf)) + { + fprintf(stderr,"Query failed (%s)\n",mysql_error(sock)); + exit(1); + } + if (!(res=mysql_store_result(sock))) + { + fprintf(stderr,"Couldn't get result from %s\n", + mysql_error(sock)); + exit(1); + } +#ifdef TEST + printf("number of fields: %d\n",mysql_num_fields(res)); +#endif + mysql_free_result(res); + count++; + } + mysql_close(sock); + exit(0); + return 0; /* Keep some compilers happy */ +} diff --git a/tests/showdb_test.c b/tests/showdb_test.c new file mode 100644 index 00000000000..df2b3037c00 --- /dev/null +++ b/tests/showdb_test.c @@ -0,0 +1,66 @@ +/* Copyright (C) 2000 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 */ + + +#ifdef __WIN__ +#include <windows.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" + +#define SELECT_QUERY "select name from test where num = %d" + + +int main(int argc, char **argv) +{ + int count, num; + MYSQL mysql,*sock; + MYSQL_RES *res; + char qbuf[160]; + + if (argc != 3) + { + fprintf(stderr,"usage : select_test <dbname> <num>\n\n"); + exit(1); + } + + mysql_init(&mysql); + if (!(sock = mysql_real_connect(&mysql,NULL,0,0,argv[1],0,NULL,0))) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql)); + perror(""); + exit(1); + } + + count = 0; + num = atoi(argv[2]); + while (count < num) + { + sprintf(qbuf,SELECT_QUERY,count); + if(!(res=mysql_list_dbs(sock,NULL))) + { + fprintf(stderr,"Query failed (%s)\n",mysql_error(sock)); + exit(1); + } + printf("number of fields: %d\n",mysql_num_rows(res)); + mysql_free_result(res); + count++; + } + mysql_close(sock); + exit(0); + return 0; /* Keep some compilers happy */ +} diff --git a/tests/ssl_test.c b/tests/ssl_test.c new file mode 100644 index 00000000000..b18e493c267 --- /dev/null +++ b/tests/ssl_test.c @@ -0,0 +1,82 @@ +/* Copyright (C) 2000 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 */ + + +#ifdef __WIN__ +#include <windows.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include "mysql.h" +#include "config.h" +#define SELECT_QUERY "select name from test where num = %d" + + +int main(int argc, char **argv) +{ +#ifdef HAVE_OPENSSL + int count, num; + MYSQL mysql,*sock; + MYSQL_RES *res; + char qbuf[160]; + + if (argc != 3) + { + fprintf(stderr,"usage : ssl_test <dbname> <num>\n\n"); + exit(1); + } + + mysql_init(&mysql); +#ifdef HAVE_OPENSSL + mysql_ssl_set(&mysql,"../SSL/MySQL-client-key.pem", + "../SSL/MySQL-client-cert.pem", + "../SSL/MySQL-ca-cert.pem", 0, 0); +#endif + if (!(sock = mysql_real_connect(&mysql,"127.0.0.1",0,0,argv[1],3306,NULL,0))) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql)); + perror(""); + exit(1); + } + count = 0; + num = atoi(argv[2]); + while (count < num) + { + sprintf(qbuf,SELECT_QUERY,count); + if(mysql_query(sock,qbuf)) + { + fprintf(stderr,"Query failed (%s)\n",mysql_error(sock)); + exit(1); + } + if (!(res=mysql_store_result(sock))) + { + fprintf(stderr,"Couldn't get result from query failed (%s)\n", + mysql_error(sock)); + exit(1); + } +#ifdef TEST + printf("number of fields: %d\n",mysql_num_fields(res)); +#endif + mysql_free_result(res); + count++; + } + mysql_close(sock); +#else /* HAVE_OPENSSL */ + printf("ssl_test: SSL not configured.\n"); +#endif /* HAVE_OPENSSL */ + exit(0); + return 0; /* Keep some compilers happy */ +} diff --git a/tests/thread_test.c b/tests/thread_test.c new file mode 100644 index 00000000000..2900ab712e2 --- /dev/null +++ b/tests/thread_test.c @@ -0,0 +1,251 @@ +/* Copyright (C) 2000 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 */ + +#include <my_global.h> + +#ifndef THREAD + +int main(int argc __attribute__((unused)), char **argv __attribute__((unused))) +{ + printf("This test must be compiled with multithread support to work\n"); + exit(1); +} +#else + +#include <my_sys.h> +#include <my_pthread.h> +#include "mysql.h" +#include <my_getopt.h> + +static my_bool version, verbose, tty_password= 0; +static uint thread_count,number_of_tests=1000,number_of_threads=2; +static pthread_cond_t COND_thread_count; +static pthread_mutex_t LOCK_thread_count; + +static char *database,*host,*user,*password,*unix_socket,*query; +uint tcp_port; + +#ifndef __WIN__ +void *test_thread(void *arg) +#else +unsigned __stdcall test_thread(void *arg) +#endif +{ + MYSQL *mysql; + uint count; + + mysql=mysql_init(NULL); + if (!mysql_real_connect(mysql,host,user,password,database,tcp_port, + unix_socket,0)) + { + fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(mysql)); + perror(""); + goto end; + } + if (verbose) { putchar('*'); fflush(stdout); } + for (count=0 ; count < number_of_tests ; count++) + { + MYSQL_RES *res; + if (mysql_query(mysql,query)) + { + fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql)); + goto end; + } + if (!(res=mysql_store_result(mysql))) + { + fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql)); + goto end; + } + mysql_free_result(res); + if (verbose) { putchar('.'); fflush(stdout); } + } +end: + if (verbose) { putchar('#'); fflush(stdout); } + mysql_close(mysql); + pthread_mutex_lock(&LOCK_thread_count); + thread_count--; + VOID(pthread_cond_signal(&COND_thread_count)); /* Tell main we are ready */ + pthread_mutex_unlock(&LOCK_thread_count); + pthread_exit(0); + return 0; +} + + +static struct my_option my_long_options[] = +{ + {"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, + 0, 0, 0, 0, 0}, + {"database", 'D', "Database to use", (gptr*) &database, (gptr*) &database, + 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host", (gptr*) &host, (gptr*) &host, 0, GET_STR, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"password", 'p', + "Password to use when connecting to server. If password is not given it's asked from the tty.", + 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login if not current user", (gptr*) &user, + (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"version", 'V', "Output version information and exit", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', "Write some progress indicators", (gptr*) &verbose, + (gptr*) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"query", 'Q', "Query to execute in each threads", (gptr*) &query, + (gptr*) &query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"port", 'P', "Port number to use for connection", (gptr*) &tcp_port, + (gptr*) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"socket", 'S', "Socket file to use for connection", (gptr*) &unix_socket, + (gptr*) &unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"test-count", 'c', "Run test count times (default %d)", + (gptr*) &number_of_tests, (gptr*) &number_of_tests, 0, GET_UINT, + REQUIRED_ARG, 1000, 0, 0, 0, 0, 0}, + {"thread-count", 't', "Number of threads to start", + (gptr*) &number_of_threads, (gptr*) &number_of_threads, 0, GET_UINT, + REQUIRED_ARG, 2, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} +}; + + +static const char *load_default_groups[]= { "client",0 }; + +static void usage() +{ + printf("Connection to a mysql server with multiple threads\n"); + if (version) + return; + puts("This software comes with ABSOLUTELY NO WARRANTY.\n"); + printf("Usage: %s [OPTIONS] [database]\n", my_progname); + + my_print_help(my_long_options); + print_defaults("my",load_default_groups); + my_print_variables(my_long_options); + printf("\nExample usage:\n\n\ +%s -Q 'select * from mysql.user' -c %d -t %d\n", + my_progname, number_of_tests, number_of_threads); +} + + +static my_bool +get_one_option(int optid, const struct my_option *opt __attribute__((unused)), + char *argument) +{ + switch (optid) { + case 'p': + if (argument) + { + my_free(password, MYF(MY_ALLOW_ZERO_PTR)); + password= my_strdup(argument, MYF(MY_FAE)); + while (*argument) *argument++= 'x'; /* Destroy argument */ + } + else + tty_password= 1; + break; + case 'V': + version= 1; + usage(); + exit(0); + break; + case '?': + case 'I': /* Info */ + usage(); + exit(1); + break; + } + return 0; +} + + +static void get_options(int argc, char **argv) +{ + int ho_error; + + load_defaults("my",load_default_groups,&argc,&argv); + + if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) + exit(ho_error); + + free_defaults(argv); + if (tty_password) + password=get_tty_password(NullS); + return; +} + + +int main(int argc, char **argv) +{ + pthread_t tid; + pthread_attr_t thr_attr; + int i,error; + MY_INIT(argv[0]); + get_options(argc,argv); + + if ((error=pthread_cond_init(&COND_thread_count,NULL))) + { + fprintf(stderr,"Got error: %d from pthread_cond_init (errno: %d)", + error,errno); + exit(1); + } + pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST); + + if ((error=pthread_attr_init(&thr_attr))) + { + fprintf(stderr,"Got error: %d from pthread_attr_init (errno: %d)", + error,errno); + exit(1); + } + if ((error=pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED))) + { + fprintf(stderr, + "Got error: %d from pthread_attr_setdetachstate (errno: %d)", + error,errno); + exit(1); + } + + printf("Init ok. Creating %d threads\n",number_of_threads); + for (i=1 ; i <= number_of_threads ; i++) + { + int *param= &i; + + if (verbose) { putchar('+'); fflush(stdout); } + pthread_mutex_lock(&LOCK_thread_count); + if ((error=pthread_create(&tid,&thr_attr,test_thread,(void*) param))) + { + fprintf(stderr,"\nGot error: %d from pthread_create (errno: %d) when creating thread: %i\n", + error,errno,i); + pthread_mutex_unlock(&LOCK_thread_count); + exit(1); + } + thread_count++; + pthread_mutex_unlock(&LOCK_thread_count); + } + + printf("Waiting for threads to finnish\n"); + error=pthread_mutex_lock(&LOCK_thread_count); + while (thread_count) + { + if ((error=pthread_cond_wait(&COND_thread_count,&LOCK_thread_count))) + fprintf(stderr,"\nGot error: %d from pthread_cond_wait\n",error); + } + pthread_mutex_unlock(&LOCK_thread_count); + pthread_attr_destroy(&thr_attr); + printf("\nend\n"); + + my_end(0); + return 0; + + exit(0); + return 0; /* Keep some compilers happy */ +} + +#endif /* THREAD */ |