23 typedef unsigned char uchar;
24 static void die(
char*
fmt, ...);
25 static void safe_query(
MYSQL* mysql,
char*
query,
int read_ok);
26 static void run_query_batch(
int* order,
int num_queries);
27 static void permute(
int *order,
int num_queries);
28 static void permute_aux(
int *order,
int num_queries,
int* fixed);
29 static void dump_result(
MYSQL* mysql,
char*
query);
43 MYSQL lock, sel, del_ins;
45 struct query queries[] =
47 {&del_ins,
"insert delayed into foo values(1)", 1, 0, 0},
48 {&del_ins,
"insert delayed into foo values(1)", 1, 0, 0},
49 {&lock,
"lock tables foo write", 1, 1, 0},
50 {&lock,
"unlock tables", 1,2, 0},
51 {&sel,
"select * from foo", 0,0, 0},
52 {&del_ins,
"insert into foo values(4)", 0,3, 0},
56 static void die(
char*
fmt, ...)
60 fprintf(stderr,
"ERROR: ");
61 vfprintf(stderr, fmt, args);
62 fprintf(stderr,
"\n");
67 static void permute(
int *order,
int num_queries)
70 if(num_queries < 2)
return;
71 if(!(fixed = (
int*)malloc(num_queries *
sizeof(
int))))
72 die(
"malloc() failed");
74 memset(fixed, 0, num_queries *
sizeof(
int));
75 permute_aux(order, num_queries, fixed);
80 static order_ok(
int *order,
int num_queries)
82 int i,j, pri_i, pri_j;
83 for(i = 0; i < num_queries; i++)
85 if((pri_i = queries[order[i]].pri))
86 for(j = i + 1; j < num_queries; j++)
88 pri_j = queries[order[j]].pri;
89 if(pri_j && pri_i > pri_j)
97 static void permute_aux(
int *order,
int num_queries,
int* fixed)
99 int *p,*p1,j,
i,tmp, num_free = 0;
101 for(i = 0; i < num_queries; i++, p++)
107 for(j = 0, p1 = fixed ;
108 j < num_queries; j++,p1++)
116 permute_aux(order, num_queries, fixed);
132 if(order_ok(order, num_queries))
133 run_query_batch(order, num_queries);
137 static void run_query_batch(
int* order,
int num_queries)
142 safe_query(&lock,
"delete from foo", 1);
144 for(i = 0; i < num_queries; i++,order++)
146 q = queries + *order;
147 printf(
"query='%s'\n", q->query);
148 safe_query(q->mysql, q->query, q->read_ok);
151 for(i = 0; i < num_queries; i++,order++)
153 q = queries + *order;
155 dump_result(q->mysql, q->query);
161 static void safe_net_read(
NET* net,
char*
query)
165 if(len == packet_error || !len)
166 die(
"Error running query '%s'", query);
167 if(net->read_pos[0] == 255)
168 die(
"Error running query '%s'", query);
172 static void safe_query(
MYSQL* mysql,
char* query,
int read_ok)
175 NET* net = &mysql->net;
178 die(
"Error running query '%s': %s", query, mysql_error(mysql));
181 safe_net_read(net, query);
185 static void dump_result(
MYSQL* mysql,
char* query)
188 safe_net_read(&mysql->net, query);
189 res = mysql_store_result(mysql);
191 mysql_free_result(res);
194 static int* init_order(
int* num_queries)
197 int *order, *order_end, *p;
200 for(q = queries; q->mysql; q++)
204 if(!(order = (
int*) malloc(n *
sizeof(
int))))
205 die(
"malloc() failed");
206 order_end = order +
n;
207 for(p = order,i = 0; p < order_end; p++,i++)
215 char* user =
"root", *pass =
"", *host =
"localhost", *db =
"test";
216 int *order, num_queries;
217 order = init_order(&num_queries);
218 if(!mysql_init(&lock) || !mysql_init(&sel) || !mysql_init(&del_ins))
219 die(
"error in mysql_init()");
221 mysql_options(&lock, MYSQL_READ_DEFAULT_GROUP,
"mysql");
222 mysql_options(&sel, MYSQL_READ_DEFAULT_GROUP,
"mysql");
223 mysql_options(&del_ins, MYSQL_READ_DEFAULT_GROUP,
"mysql");
225 if(!mysql_real_connect(&lock, host, user, pass, db, 0,0,0 ) ||
226 !mysql_real_connect(&sel, host, user, pass, db, 0,0,0 ) ||
227 !mysql_real_connect(&del_ins, host, user, pass, db, 0,0,0 ))
228 die(
"Error in mysql_real_connect(): %s", mysql_error(&lock));
229 lock.reconnect= sel.reconnect= del_ins.reconnect= 1;
231 permute(order, num_queries);
232 printf(
"count = %d\n", count);
236 mysql_close(&del_ins);