mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	All our programs which use mysql_real_connect() and mysql_connect() are updated accordingly, though I have deliberately made mysqlimport not reconnect anymore (already true for mysqldump >= 4.1.8). All Connector devs have been warned about the change I'm doing here - which was agreed with Monty, and fixes BUG#2555. VC++Files/libmysqltest/mytest.c: explicit mention of reconnect (no behaviour change) VC++Files/mysqlmanager/mysqlmanagerview.cpp: explicit mention of reconnect (no behaviour change) VC++Files/test1/mysql_thr.c: explicit mention of reconnect (no behaviour change) VC++Files/winmysqladmin/main.cpp: explicit mention of reconnect (no behaviour change) client/mysql.cc: explicit mention of reconnect if embedded (no behaviour change) client/mysqladmin.cc: explicit mention of reconnect (no behaviour change) client/mysqlbinlog.cc: explicit mention of reconnect (no behaviour change) client/mysqlcheck.c: explicit mention of reconnect (no behaviour change) client/mysqlimport.c: explicit mention of NO reconnect (behaviour change). As most time is passed in LOAD DATA INFILE, and as it does not make sense to reconnect after a partly failed LOAD... And as mysqlimport sometimes does LOCK TABLES where we mustn't reconnect... client/mysqlshow.c: explicit mention of reconnect (no behaviour change) client/mysqltest.c: explicit mention of reconnect (no behaviour change). Normally we should not reconnect (it's not good to have silent reconnection in the middle of a test), but 5.0 is too touchy to change it now. I'm marking it TODO. libmysql/libmysql.c: explicit mention of reconnect (no behaviour change) libmysqld/examples/builder-sample/emb_samples.cpp: explicit mention of reconnect (no behaviour change) ndb/test/ndbapi/flex_bench_mysql.cpp: explicit mention of reconnect (no behaviour change) ndb/tools/restore/consumer_restorem.cpp: explicit mention of reconnect (no behaviour change) sql-common/client.c: Changing the default of libmysqlclient : it's now NO reconnection. sql/repl_failsafe.cc: explicit mention of reconnect (no behaviour change) sql/slave.cc: explicit mention of reconnect (no behaviour change) tests/client_test.c: explicit mention of reconnect (no behaviour change) tests/connect_test.c: explicit mention of reconnect (no behaviour change) tests/deadlock_test.c: explicit mention of reconnect (no behaviour change) tests/insert_test.c: explicit mention of reconnect (no behaviour change) tests/list_test.c: explicit mention of reconnect (no behaviour change) tests/select_test.c: explicit mention of reconnect (no behaviour change) tests/showdb_test.c: explicit mention of reconnect (no behaviour change) tests/ssl_test.c: explicit mention of reconnect (no behaviour change) tests/thread_test.c: explicit mention of reconnect (no behaviour change) tools/mysqlmanager.c: explicit mention of reconnect (no behaviour change)
		
			
				
	
	
		
			240 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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));
 | |
|   lock.reconnect= sel.reconnect= del_ins.reconnect= 1;
 | |
| 
 | |
|   permute(order, num_queries);
 | |
|   printf("count = %d\n", count);
 | |
| 
 | |
|   mysql_close(&lock);
 | |
|   mysql_close(&sel);
 | |
|   mysql_close(&del_ins);
 | |
|   free(order);
 | |
| }
 |