diff options
author | unknown <holyfoot/hf@mysql.com/deer.(none)> | 2006-10-23 16:50:01 +0500 |
---|---|---|
committer | unknown <holyfoot/hf@mysql.com/deer.(none)> | 2006-10-23 16:50:01 +0500 |
commit | bda4032fa4b5ce3bb84d8fcb5e1c571027a0574f (patch) | |
tree | 0107bee9648f6738988eae97c771bfb155cc0cc4 /client | |
parent | ab133655360a284567b74be79765031493823479 (diff) | |
parent | 4ddb48c619c5fb703a846f5dd2659a4854a8c0d7 (diff) | |
download | mariadb-git-bda4032fa4b5ce3bb84d8fcb5e1c571027a0574f.tar.gz |
Merge mysql.com:/home/hf/work/w3475/my41-w3475
into mysql.com:/home/hf/work/w3475/my50-w3475
mysql-test/t/flush.test:
Auto merged
mysql-test/t/flush_block_commit.test:
Auto merged
mysql-test/t/innodb-deadlock.test:
Auto merged
mysql-test/t/innodb-lock.test:
Auto merged
mysql-test/t/lock_multi.test:
Auto merged
mysql-test/t/rename.test:
Auto merged
mysql-test/t/show_check.test:
Auto merged
mysql-test/t/status.test:
Auto merged
client/mysqltest.c:
merging
libmysql/libmysql.c:
merging
Diffstat (limited to 'client')
-rw-r--r-- | client/mysqltest.c | 89 |
1 files changed, 81 insertions, 8 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index c0319eee259..f04df7db863 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -23,6 +23,7 @@ * Matt Wagner <matt@mysql.com> * Monty * Jani + * Holyfoot **/ /********************************************************************** @@ -243,6 +244,12 @@ struct connection MYSQL* util_mysql; char *name; MYSQL_STMT* stmt; + + const char *cur_query; + int cur_query_len; + pthread_mutex_t mutex; + pthread_cond_t cond; + int query_done; }; typedef struct @@ -480,6 +487,58 @@ static void handle_error(const char *query, struct st_query *q, const char *err_sqlstate, DYNAMIC_STRING *ds); static void handle_no_error(struct st_query *q); + +#ifdef EMBEDDED_LIBRARY +/* + send_one_query executes query in separate thread what is + necessary in embedded library to run 'send' in proper way. + This implementation doesn't handle errors returned + by mysql_send_query. It's technically possible, though + i don't see where it is needed. +*/ +pthread_handler_decl(send_one_query, arg) +{ + struct connection *cn= (struct connection*)arg; + + mysql_thread_init(); + VOID(mysql_send_query(&cn->mysql, cn->cur_query, cn->cur_query_len)); + + mysql_thread_end(); + pthread_mutex_lock(&cn->mutex); + cn->query_done= 1; + VOID(pthread_cond_signal(&cn->cond)); + pthread_mutex_unlock(&cn->mutex); + pthread_exit(0); + return 0; +} + +static int do_send_query(struct connection *cn, const char *q, int q_len, + int flags) +{ + pthread_t tid; + + if (flags & QUERY_REAP) + return mysql_send_query(&cn->mysql, q, q_len); + + if (pthread_mutex_init(&cn->mutex, NULL) || + pthread_cond_init(&cn->cond, NULL)) + die("Error in the thread library"); + + cn->cur_query= q; + cn->cur_query_len= q_len; + cn->query_done= 0; + if (pthread_create(&tid, NULL, send_one_query, (void*)cn)) + die("Cannot start new thread for query"); + + return 0; +} + +#else /*EMBEDDED_LIBRARY*/ + +#define do_send_query(cn,q,q_len,flags) mysql_send_query(&cn->mysql, q, q_len) + +#endif /*EMBEDDED_LIBRARY*/ + static void do_eval(DYNAMIC_STRING* query_eval, const char *query, my_bool pass_through_escape_chars) { @@ -2038,7 +2097,7 @@ int close_connection(struct st_query *q) #ifndef EMBEDDED_LIBRARY if (q->type == Q_DIRTY_CLOSE) { - if (con->mysql.net.vio) + while (con->mysql.net.vio) { vio_delete(con->mysql.net.vio); con->mysql.net.vio = 0; @@ -3578,7 +3637,6 @@ static int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql) } - /* Run query using MySQL C API @@ -3595,11 +3653,12 @@ static int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql) error - function will not return */ -static void run_query_normal(MYSQL *mysql, struct st_query *command, +static void run_query_normal(struct connection *cn, struct st_query *command, int flags, char *query, int query_len, DYNAMIC_STRING *ds, DYNAMIC_STRING *ds_warnings) { MYSQL_RES *res= 0; + MYSQL *mysql= &cn->mysql; int err= 0, counter= 0; DBUG_ENTER("run_query_normal"); DBUG_PRINT("enter",("flags: %d", flags)); @@ -3610,13 +3669,26 @@ static void run_query_normal(MYSQL *mysql, struct st_query *command, /* Send the query */ - if (mysql_send_query(mysql, query, query_len)) + if (do_send_query(cn, query, query_len, flags)) { handle_error(query, command, mysql_errno(mysql), mysql_error(mysql), mysql_sqlstate(mysql), ds); goto end; } } +#ifdef EMBEDDED_LIBRARY + /* + Here we handle 'reap' command, so we need to check if the + query's thread was finished and probably wait + */ + else if (flags & QUERY_REAP) + { + pthread_mutex_lock(&cn->mutex); + if (!cn->query_done) + pthread_cond_wait(&cn->cond, &cn->mutex); + pthread_mutex_unlock(&cn->mutex); + } +#endif /*EMBEDDED_LIBRARY*/ if (!(flags & QUERY_REAP)) DBUG_VOID_RETURN; @@ -3867,10 +3939,11 @@ static void handle_no_error(struct st_query *q) error - function will not return */ -static void run_query_stmt(MYSQL *mysql, struct st_query *command, +static void run_query_stmt(struct connection *cn, struct st_query *command, char *query, int query_len, DYNAMIC_STRING *ds, DYNAMIC_STRING *ds_warnings) { + MYSQL *mysql= &cn->mysql; MYSQL_RES *res= NULL; /* Note that here 'res' is meta data result set */ MYSQL_STMT *stmt; DYNAMIC_STRING ds_prepare_warnings; @@ -4740,7 +4813,7 @@ int main(int argc, char **argv) q->require_file=require_file; save_file[0]=0; } - run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND); + run_query(cur_con, q, QUERY_REAP|QUERY_SEND); display_result_vertically= old_display_result_vertically; q->last_argument= q->end; query_executed= 1; @@ -4775,7 +4848,7 @@ int main(int argc, char **argv) { q->query= q->first_argument; } - run_query(&cur_con->mysql, q, flags); + run_query(cur_con, q, flags); query_executed= 1; q->last_argument= q->end; break; @@ -4796,7 +4869,7 @@ int main(int argc, char **argv) query and read the result some time later when reap instruction is given on this connection. */ - run_query(&cur_con->mysql, q, QUERY_SEND); + run_query(cur_con, q, QUERY_SEND); query_executed= 1; q->last_argument= q->end; break; |