diff --git a/sql/event.cc b/sql/event.cc index 87a846cd2dd..f8bfde44dde 100644 --- a/sql/event.cc +++ b/sql/event.cc @@ -73,17 +73,11 @@ Warning: bool mysql_event_table_exists= 1; DYNAMIC_ARRAY events_array; -DYNAMIC_ARRAY EXEC_QUEUE_DARR_NAME; -QUEUE EXEC_QUEUE_QUEUE_NAME; +QUEUE EVEX_EQ_NAME; MEM_ROOT evex_mem_root; -//extern volatile uint thread_running; -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// -//////////////// Static functions follow /////////////////////////// -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// + void evex_queue_init(EVEX_QUEUE_TYPE *queue) { @@ -202,6 +196,7 @@ my_time_compare(TIME *a, TIME *b) DBUG_RETURN(0); } + int evex_time_diff(TIME *a, TIME *b) { @@ -519,14 +514,17 @@ db_create_event(THD *thd, event_timed *et) mysql_bin_log.write(&qinfo); } - // No need to close the table, it will be closed in sql_parse::do_command if (dbchanged) (void) mysql_change_db(thd, olddb, 1); + if (table) + close_thread_tables(thd); DBUG_RETURN(EVEX_OK); err: if (dbchanged) (void) mysql_change_db(thd, olddb, 1); + if (table) + close_thread_tables(thd); DBUG_RETURN(EVEX_GENERAL_ERROR); } @@ -742,9 +740,7 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock) VOID(push_dynamic(&events_array,(gptr) ett)); ett_copy= dynamic_element(&events_array, events_array.elements - 1, event_timed*); -/** - VOID(push_dynamic(&evex_executing_queue, (gptr) &ett_copy)); -**/ + evex_queue_insert(&EVEX_EQ_NAME, (EVEX_PTOQEL) ett_copy); /* @@ -754,19 +750,6 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock) ett->free_sphead_on_delete= false; delete ett; - /* - We find where the first element resides in the array. And then do a - qsort of events_array.elements (the current number of elements). - We know that the elements are stored in a contiguous block w/o holes. - */ -/** - qsort((gptr) dynamic_element(&evex_executing_queue, 0, event_timed**), - evex_executing_queue.elements, - sizeof(event_timed **), - (qsort_cmp) event_timed_compare); -**/ - evex_queue_sort(&EVEX_EQ_NAME); - if (use_lock) VOID(pthread_mutex_unlock(&LOCK_event_arrays)); @@ -791,10 +774,10 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) if (use_lock) VOID(pthread_mutex_lock(&LOCK_event_arrays)); -/** - for (i= 0; i < evex_executing_queue.elements; ++i) + + for (i= 0; i < evex_queue_num_elements(EVEX_EQ_NAME); ++i) { - event_timed *et= *dynamic_element(&evex_executing_queue, i, event_timed**); + event_timed *et= evex_queue_element(&EVEX_EQ_NAME, i, event_timed*); DBUG_PRINT("info", ("[%s.%s]==[%s.%s]?",db->str,name->str, et->dbname.str, et->name.str)); if (!sortcmp_lex_string(*name, et->name, system_charset_info) && @@ -802,39 +785,9 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) { int idx= get_index_dynamic(&events_array, (gptr) et); //we are lucky the event is in the executing queue, no need of second pass - if (idx == -1) - { - //this should never happen - DBUG_PRINT("error", (" get_index_dynamic problem. %d." - "i=%d idx=%d evex_ex_queue.buf=%p evex_ex_queue.elements=%d et=%p\n" - "events_array=%p events_array.elements=%d events_array.buf=%p et=%p\n", - __LINE__, i, idx, &evex_executing_queue.buffer, - evex_executing_queue.elements, et, &events_array, - events_array.elements, events_array.buffer, et)); - DBUG_ASSERT(0); - } //destruct first and then remove. the destructor will delete sp_head et->free_sp(); delete_dynamic_element(&events_array, idx); - delete_dynamic_element(&evex_executing_queue, i); - // ok, we have cleaned - goto done; - } - } -**/ - for (i= 0; i < evex_queue_num_elements(EVEX_EQ_NAME); ++i) - { - event_timed *et= *evex_queue_element(&EVEX_EQ_NAME, i, event_timed**); - DBUG_PRINT("info", ("[%s.%s]==[%s.%s]?",db->str,name->str, et->dbname.str, - et->name.str)); - if (!sortcmp_lex_string(*name, et->name, system_charset_info) && - !sortcmp_lex_string(*db, et->dbname, system_charset_info)) - { - int idx= get_index_dynamic(&events_array, (gptr) et); - //we are lucky the event is in the executing queue, no need of second pass - //destruct first and then remove. the destructor will delete sp_head - et->free_sp(); - evex_queue_delete_element(&EVEX_EQ_NAME, idx); evex_queue_delete_element(&EVEX_EQ_NAME, i); // ok, we have cleaned goto done; diff --git a/sql/event_executor.cc b/sql/event_executor.cc index 74ac1b12297..ea5ed6c059b 100644 --- a/sql/event_executor.cc +++ b/sql/event_executor.cc @@ -25,7 +25,7 @@ are not possible because the scheduler thread code is ran inside the main thread (no spawning takes place. If you want to debug client connection then start with --one-thread and make the define - DBUG_FAULTY_THR2 ! + DBUG_FAULTY_THR ! */ #define DBUG_FAULTY_THR2 @@ -202,9 +202,6 @@ event_executor_main(void *arg) thus data should be freed at later stage. */ VOID(my_init_dynamic_array(&events_array, sizeof(event_timed), 50, 100)); -/** - VOID(my_init_dynamic_array(&evex_executing_queue, sizeof(event_timed *), 50, 100)); -**/ evex_queue_init(&EVEX_EQ_NAME); @@ -533,7 +530,7 @@ evex_load_events_from_db(THD *thd) while (!(read_record_info.read_record(&read_record_info))) { event_timed *et, *et_copy; - if (!(et= new event_timed())) + if (!(et= new event_timed)) { DBUG_PRINT("evex_load_events_from_db", ("Out of memory")); ret= -1; diff --git a/sql/event_priv.h b/sql/event_priv.h index f6653e473da..1b0ad078f5a 100644 --- a/sql/event_priv.h +++ b/sql/event_priv.h @@ -113,13 +113,11 @@ evex_queue_sort(EVEX_QUEUE_TYPE *queue); extern bool evex_is_running; extern bool mysql_event_table_exists; extern DYNAMIC_ARRAY events_array; -extern DYNAMIC_ARRAY EXEC_QUEUE_DARR_NAME; -extern QUEUE EXEC_QUEUE_QUEUE_NAME; extern MEM_ROOT evex_mem_root; extern pthread_mutex_t LOCK_event_arrays, LOCK_workers_count, LOCK_evex_running; extern ulonglong evex_main_thread_id; - +extern QUEUE EVEX_EQ_NAME; #endif /* _EVENT_PRIV_H_ */ diff --git a/sql/event_timed.cc b/sql/event_timed.cc index 7c6399e91a1..19f42a44ec6 100644 --- a/sql/event_timed.cc +++ b/sql/event_timed.cc @@ -776,17 +776,7 @@ event_timed::get_show_create_event(THD *thd, uint *length) uint len, tmp_len; len = strlen("CREATE EVENT ") + dbname.length + strlen(".") + name.length + - strlen(" ON SCHEDULE ") + strlen("EVERY 5 MINUTE ") -/* - + strlen("ON COMPLETION ") - + (on_completion==MYSQL_EVENT_ON_COMPLETION_DROP? - strlen("NOT PRESERVE "):strlen("PRESERVE ")) - + (status==MYSQL_EVENT_ENABLED? - strlen("ENABLE "):strlen("DISABLE ")) - + strlen("COMMENT \"") + comment.length + strlen("\" ") -*/ - + strlen("DO ") + - + body.length + strlen(";"); + strlen(" ON SCHEDULE EVERY 5 MINUTE DO ") + body.length + strlen(";"); ret= dst= (char*) alloc_root(thd->mem_root, len + 1); memcpy(dst, "CREATE EVENT ", tmp_len= strlen("CREATE EVENT ")); @@ -797,31 +787,8 @@ event_timed::get_show_create_event(THD *thd, uint *length) dst+= tmp_len; memcpy(dst, name.str, tmp_len= name.length); dst+= tmp_len; - memcpy(dst, " ON SCHEDULE ", tmp_len= strlen(" ON SCHEDULE ")); - dst+= tmp_len; - memcpy(dst, "EVERY 5 MINUTE ", tmp_len= strlen("EVERY 5 MINUTE ")); - dst+= tmp_len; -/* - memcpy(dst, "ON COMPLETION ", tmp_len =strlen("ON COMPLETION ")); - dst+= tmp_len; - memcpy(dst, (on_completion==MYSQL_EVENT_ON_COMPLETION_DROP? - "NOT PRESERVE ":"PRESERVE "), - tmp_len =(on_completion==MYSQL_EVENT_ON_COMPLETION_DROP? 13:9)); - dst+= tmp_len; - - memcpy(dst, (status==MYSQL_EVENT_ENABLED? - "ENABLE ":"DISABLE "), - tmp_len= (status==MYSQL_EVENT_ENABLED? 8:9)); - dst+=tmp_len; - - memcpy(dst, "COMMENT \"", tmp_len= strlen("COMMENT \"")); - dst+= tmp_len; - memcpy(dst, comment.str, tmp_len= comment.length); - dst+= tmp_len; - memcpy(dst, "\" ", tmp_len=2); - dst+= tmp_len; -*/ - memcpy(dst, "DO ", tmp_len=3); + memcpy(dst, " ON SCHEDULE EVERY 5 MINUTE DO ", + tmp_len= strlen(" ON SCHEDULE EVERY 5 MINUTE DO ")); dst+= tmp_len; memcpy(dst, body.str, tmp_len= body.length); @@ -829,9 +796,10 @@ event_timed::get_show_create_event(THD *thd, uint *length) memcpy(dst, ";", 1); ++dst; *dst= '\0'; - + *length= len; dst[len]= '\0'; + sql_print_information("%d %d[%s]", len, dst-ret, ret); return ret; }