summaryrefslogtreecommitdiff
path: root/sql/event_db_repository.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/event_db_repository.cc')
-rw-r--r--sql/event_db_repository.cc525
1 files changed, 171 insertions, 354 deletions
diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc
index a7daed113bb..22dcdd97a48 100644
--- a/sql/event_db_repository.cc
+++ b/sql/event_db_repository.cc
@@ -29,7 +29,8 @@
time_t mysql_event_last_create_time= 0L;
static
-TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] = {
+TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] =
+{
{
{(char *) STRING_WITH_LEN("db")},
{(char *) STRING_WITH_LEN("char(64)")},
@@ -128,50 +129,49 @@ TABLE_FIELD_W_TYPE event_table_fields[ET_FIELD_COUNT] = {
Puts some data common to CREATE and ALTER EVENT into a row.
SYNOPSIS
- evex_fill_row()
+ mysql_event_fill_row()
thd THD
table The row to fill out
et Event's data
is_update CREATE EVENT or ALTER EVENT
RETURN VALUE
- 0 - OK
- EVEX_GENERAL_ERROR - bad data
- EVEX_GET_FIELD_FAILED - field count does not match. table corrupted?
+ 0 OK
+ EVEX_GENERAL_ERROR Bad data
+ EVEX_GET_FIELD_FAILED Field count does not match. table corrupted?
DESCRIPTION
Used both when an event is created and when it is altered.
*/
static int
-evex_fill_row(THD *thd, TABLE *table, Event_parse_data *et, my_bool is_update)
+mysql_event_fill_row(THD *thd, TABLE *table, Event_parse_data *et,
+ my_bool is_update)
{
CHARSET_INFO *scs= system_charset_info;
- enum enum_events_table_field field_num;
+ enum enum_events_table_field f_num;
+ Field **fields= table->field;
- DBUG_ENTER("evex_fill_row");
+ DBUG_ENTER("mysql_event_fill_row");
DBUG_PRINT("info", ("dbname=[%s]", et->dbname.str));
DBUG_PRINT("info", ("name =[%s]", et->name.str));
DBUG_PRINT("info", ("body =[%s]", et->body.str));
- if (table->field[field_num= ET_FIELD_DEFINER]->
- store(et->definer.str, et->definer.length, scs))
+ if (fields[f_num= ET_FIELD_DEFINER]->
+ store(et->definer.str, et->definer.length, scs))
goto err_truncate;
- if (table->field[field_num= ET_FIELD_DB]->
- store(et->dbname.str, et->dbname.length, scs))
+ if (fields[f_num= ET_FIELD_DB]->store(et->dbname.str, et->dbname.length, scs))
goto err_truncate;
- if (table->field[field_num= ET_FIELD_NAME]->
- store(et->name.str, et->name.length, scs))
+ if (fields[f_num= ET_FIELD_NAME]->store(et->name.str, et->name.length, scs))
goto err_truncate;
/* both ON_COMPLETION and STATUS are NOT NULL thus not calling set_notnull()*/
- table->field[ET_FIELD_ON_COMPLETION]->
- store((longlong)et->on_completion, true);
+ fields[ET_FIELD_ON_COMPLETION]->store((longlong)et->on_completion, TRUE);
- table->field[ET_FIELD_STATUS]->store((longlong)et->status, true);
+ fields[ET_FIELD_STATUS]->store((longlong)et->status, TRUE);
/*
Change the SQL_MODE only if body was present in an ALTER EVENT and of course
@@ -179,52 +179,46 @@ evex_fill_row(THD *thd, TABLE *table, Event_parse_data *et, my_bool is_update)
*/
if (et->body.str)
{
- table->field[ET_FIELD_SQL_MODE]->
- store((longlong)thd->variables.sql_mode, true);
-
- if (table->field[field_num= ET_FIELD_BODY]->
- store(et->body.str, et->body.length, scs))
+ fields[ET_FIELD_SQL_MODE]->store((longlong)thd->variables.sql_mode, TRUE);
+ if (fields[f_num= ET_FIELD_BODY]->store(et->body.str, et->body.length, scs))
goto err_truncate;
}
if (et->expression)
{
- table->field[ET_FIELD_INTERVAL_EXPR]->set_notnull();
- table->field[ET_FIELD_INTERVAL_EXPR]->store((longlong)et->expression, true);
+ fields[ET_FIELD_INTERVAL_EXPR]->set_notnull();
+ fields[ET_FIELD_INTERVAL_EXPR]->store((longlong)et->expression, TRUE);
- table->field[ET_FIELD_TRANSIENT_INTERVAL]->set_notnull();
+ fields[ET_FIELD_TRANSIENT_INTERVAL]->set_notnull();
/*
- In the enum (C) intervals start from 0 but in mysql enum valid values start
- from 1. Thus +1 offset is needed!
+ In the enum (C) intervals start from 0 but in mysql enum valid values
+ start from 1. Thus +1 offset is needed!
*/
- table->field[ET_FIELD_TRANSIENT_INTERVAL]->
- store((longlong)et->interval+1, true);
+ fields[ET_FIELD_TRANSIENT_INTERVAL]->store((longlong)et->interval+1, TRUE);
- table->field[ET_FIELD_EXECUTE_AT]->set_null();
+ fields[ET_FIELD_EXECUTE_AT]->set_null();
if (!et->starts_null)
{
- table->field[ET_FIELD_STARTS]->set_notnull();
- table->field[ET_FIELD_STARTS]->
- store_time(&et->starts, MYSQL_TIMESTAMP_DATETIME);
+ fields[ET_FIELD_STARTS]->set_notnull();
+ fields[ET_FIELD_STARTS]->store_time(&et->starts, MYSQL_TIMESTAMP_DATETIME);
}
if (!et->ends_null)
{
- table->field[ET_FIELD_ENDS]->set_notnull();
- table->field[ET_FIELD_ENDS]->
- store_time(&et->ends, MYSQL_TIMESTAMP_DATETIME);
+ fields[ET_FIELD_ENDS]->set_notnull();
+ fields[ET_FIELD_ENDS]->store_time(&et->ends, MYSQL_TIMESTAMP_DATETIME);
}
}
else if (et->execute_at.year)
{
- table->field[ET_FIELD_INTERVAL_EXPR]->set_null();
- table->field[ET_FIELD_TRANSIENT_INTERVAL]->set_null();
- table->field[ET_FIELD_STARTS]->set_null();
- table->field[ET_FIELD_ENDS]->set_null();
+ fields[ET_FIELD_INTERVAL_EXPR]->set_null();
+ fields[ET_FIELD_TRANSIENT_INTERVAL]->set_null();
+ fields[ET_FIELD_STARTS]->set_null();
+ fields[ET_FIELD_ENDS]->set_null();
- table->field[ET_FIELD_EXECUTE_AT]->set_notnull();
- table->field[ET_FIELD_EXECUTE_AT]->
+ fields[ET_FIELD_EXECUTE_AT]->set_notnull();
+ fields[ET_FIELD_EXECUTE_AT]->
store_time(&et->execute_at, MYSQL_TIMESTAMP_DATETIME);
}
else
@@ -236,48 +230,24 @@ evex_fill_row(THD *thd, TABLE *table, Event_parse_data *et, my_bool is_update)
*/
}
- ((Field_timestamp *)table->field[ET_FIELD_MODIFIED])->set_time();
+ ((Field_timestamp *)fields[ET_FIELD_MODIFIED])->set_time();
if (et->comment.str)
{
- if (table->field[field_num= ET_FIELD_COMMENT]->
- store(et->comment.str, et->comment.length, scs))
+ if (fields[f_num= ET_FIELD_COMMENT]->
+ store(et->comment.str, et->comment.length, scs))
goto err_truncate;
}
DBUG_RETURN(0);
+
err_truncate:
- my_error(ER_EVENT_DATA_TOO_LONG, MYF(0), table->field[field_num]->field_name);
+ my_error(ER_EVENT_DATA_TOO_LONG, MYF(0), fields[f_num]->field_name);
DBUG_RETURN(EVEX_GENERAL_ERROR);
}
/*
- Find row in open mysql.event table representing event
-
- SYNOPSIS
- evex_db_find_event_by_name()
- thd Thread context
- dbname Name of event's database
- rname Name of the event inside the db
- table TABLE object for open mysql.event table.
-
- RETURN VALUE
- 0 - Routine found
- EVEX_KEY_NOT_FOUND - No routine with given name
-*/
-
-int
-evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
- const LEX_STRING ev_name,
- TABLE *table)
-{
- return Events::get_instance()->db_repository->
- find_event_by_name(thd, dbname, ev_name, table);
-}
-
-
-/*
Performs an index scan of event_table (mysql.event) and fills schema_table.
Synopsis
@@ -313,7 +283,7 @@ Event_db_repository::index_read_for_db_for_i_s(THD *thd, TABLE *schema_table,
if (!(key_buf= (byte *)alloc_root(thd->mem_root, key_len)))
{
ret= 1;
- /* don't send error, it would be done by sql_alloc_error_handler() */
+ /* Don't send error, it would be done by sql_alloc_error_handler() */
}
else
{
@@ -441,99 +411,13 @@ Event_db_repository::fill_schema_events(THD *thd, TABLE_LIST *tables, char *db)
/*
- Looks for a named event in mysql.event and in case of success returns
- an object will data loaded from the table.
-
- SYNOPSIS
- Event_db_repository::find_event()
- thd THD
- name the name of the event to find
- ett event's data if event is found
- tbl TABLE object to use when not NULL
- root On which root to load the event
-
- NOTES
- 1) Use sp_name for look up, return in **ett if found
- 2) tbl is not closed at exit
-
- RETURN VALUE
- 0 ok In this case *ett is set to the event
- # error *ett == 0
-*/
-
-int
-Event_db_repository::find_event(THD *thd, LEX_STRING dbname, LEX_STRING name,
- Event_timed **ett, TABLE *tbl)
-{
- TABLE *table;
- int ret;
- Event_timed *et= NULL;
- DBUG_ENTER("Event_db_repository::find_event");
- DBUG_PRINT("enter", ("name: %*s", name.length, name.str));
-
- if (tbl)
- table= tbl;
- else if (open_event_table(thd, TL_READ, &table))
- {
- my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
- ret= EVEX_GENERAL_ERROR;
- goto done;
- }
-
- if ((ret= evex_db_find_event_by_name(thd, dbname, name, table)))
- {
- my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name.str);
- goto done;
- }
- et= new Event_timed;
-
- /*
- 1)The table should not be closed beforehand. ::load_from_row() only loads
- and does not compile
-
- 2)::load_from_row() is silent on error therefore we emit error msg here
- */
- if ((ret= et->load_from_row(table)))
- {
- my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0), "event");
- goto done;
- }
-
-done:
- if (ret)
- {
- delete et;
- et= NULL;
- }
- /* don't close the table if we haven't opened it ourselves */
- if (!tbl && table)
- close_thread_tables(thd);
- *ett= et;
- DBUG_RETURN(ret);
-}
-
-
-int
-Event_db_repository::init_repository()
-{
- return 0;
-}
-
-
-void
-Event_db_repository::deinit_repository()
-{
-}
-
-
-/*
Open mysql.event table for read
SYNOPSIS
Events::open_event_table()
- thd Thread context
- lock_type How to lock the table
- table We will store the open table here
+ thd [in] Thread context
+ lock_type [in] How to lock the table
+ table [out] We will store the open table here
RETURN VALUE
1 Cannot lock table
@@ -574,33 +458,26 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type,
Checks parameters which we got from the parsing phase.
SYNOPSIS
- evex_check_params()
+ check_parse_params()
thd THD
et event's data
RETURNS
0 OK
- EVEX_BAD_PARAMS Error
-
- REMARKS
- Issues error messages
+ EVEX_BAD_PARAMS Error (reported)
*/
-int
-evex_check_params(THD *thd, Event_parse_data *parse_data)
+static int
+check_parse_params(THD *thd, Event_parse_data *parse_data)
{
const char *pos= NULL;
Item *bad_item;
+ int res;
- DBUG_ENTER("evex_check_params");
- DBUG_PRINT("info", ("execute_at=0x%d expr=0x%d starts=0x%d ends=0x%d",
- parse_data->item_execute_at,
- parse_data->item_expression,
- parse_data->item_starts,
- parse_data->item_ends));
+ DBUG_ENTER("check_parse_params");
- parse_data->init_name(thd, parse_data->identifier);
- parse_data->init_definer(thd);
+ if (parse_data->check_parse_data(thd))
+ DBUG_RETURN(EVEX_BAD_PARAMS);
if (!parse_data->dbname.str ||
(thd->lex->sql_command == SQLCOM_ALTER_EVENT && thd->lex->spname &&
@@ -617,68 +494,7 @@ evex_check_params(THD *thd, Event_parse_data *parse_data)
is_schema_db(thd->lex->spname->m_db.str)))))
DBUG_RETURN(EVEX_BAD_PARAMS);
- if (parse_data->item_execute_at)
- {
- DBUG_PRINT("info", ("ONE TIME"));
- if (parse_data->init_execute_at(thd, parse_data->item_execute_at))
- {
- pos= "AT";
- bad_item= parse_data->item_execute_at;
- goto wrong_value;
- }
- }
- else
- {
- int res;
- DBUG_PRINT("info", ("RECURRING"));
-
- if (parse_data->item_expression &&
- (res= parse_data->init_interval(thd, parse_data->item_expression,
- parse_data->interval)))
- {
- switch (res) {
- case EVEX_BAD_PARAMS:
- my_error(ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG, MYF(0));
- break;
- case EVEX_MICROSECOND_UNSUP:
- my_error(ER_NOT_SUPPORTED_YET, MYF(0), "MICROSECOND");
- break;
- default:
- pos= "INTERVAL";
- bad_item= parse_data->item_expression;
- goto wrong_value;
- }
- DBUG_RETURN(EVEX_BAD_PARAMS);
- }
-
- if (parse_data->item_starts &&
- parse_data->init_starts(thd, parse_data->item_starts))
- {
- pos= "STARTS";
- bad_item= parse_data->item_starts;
- goto wrong_value;
- }
-
- if (parse_data->item_ends &&
- parse_data->init_ends(thd, parse_data->item_ends))
- {
- /*
- despite the error name the value is
- eng "ENDS is either invalid or before STARTS"
- */
- my_error(ER_EVENT_ENDS_BEFORE_STARTS, MYF(0));
- DBUG_RETURN(EVEX_BAD_PARAMS);
- }
- }
DBUG_RETURN(0);
-wrong_value:
- {
- char buff[120];
- String str(buff,(uint32) sizeof(buff), system_charset_info);
- String *str2= bad_item->fixed? bad_item->val_str(&str):NULL;
- my_error(ER_WRONG_VALUE, MYF(0), pos, str2? str2->c_ptr():"NULL");
- DBUG_RETURN(EVEX_BAD_PARAMS);
- }
}
@@ -687,18 +503,18 @@ wrong_value:
SYNOPSIS
Event_db_repository::create_event()
- thd THD
- et Event_timed object containing information for the event
- create_if_not If an warning should be generated in case event exists
- rows_affected How many rows were affected
+ thd [in] THD
+ et [in] Object containing info about the event
+ create_if_not [in] Whether to generate anwarning in case event exists
+ rows_affected [out] How many rows were affected
RETURN VALUE
0 - OK
EVEX_GENERAL_ERROR - Failure
DESCRIPTION
- Creates an event. Relies on evex_fill_row which is shared with
- db_update_event. The name of the event is inside "et".
+ Creates an event. Relies on mysql_event_fill_row which is shared with
+ ::update_event. The name of the event is inside "et".
*/
int
@@ -709,7 +525,7 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
CHARSET_INFO *scs= system_charset_info;
TABLE *table;
char olddb[128];
- bool dbchanged= false;
+ bool dbchanged= FALSE;
DBUG_ENTER("Event_db_repository::create_event");
*rows_affected= 0;
@@ -720,15 +536,14 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
goto err;
}
- if (evex_check_params(thd, parse_data))
+ if (check_parse_params(thd, parse_data))
goto err;
DBUG_PRINT("info", ("name: %.*s", parse_data->name.length,
parse_data->name.str));
DBUG_PRINT("info", ("check existance of an event with the same name"));
- if (!evex_db_find_event_by_name(thd, parse_data->dbname,
- parse_data->name, table))
+ if (!find_event_by_name(thd, parse_data->dbname, parse_data->name, table))
{
if (create_if_not)
{
@@ -784,10 +599,10 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
((Field_timestamp *)table->field[ET_FIELD_CREATED])->set_time();
/*
- evex_fill_row() calls my_error() in case of error so no need to
+ mysql_event_fill_row() calls my_error() in case of error so no need to
handle it here
*/
- if ((ret= evex_fill_row(thd, table, parse_data, false)))
+ if ((ret= mysql_event_fill_row(thd, table, parse_data, FALSE)))
goto err;
/* Close active transaction only if We are going to modify disk */
@@ -800,16 +615,6 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
goto err;
}
-#ifdef USE_THIS_CODE_AS_TEMPLATE_WHEN_EVENT_REPLICATION_IS_AGREED
- if (mysql_bin_log.is_open())
- {
- thd->clear_error();
- /* Such a statement can always go directly to binlog, no trans cache */
- thd->binlog_query(THD::MYSQL_QUERY_TYPE, thd->query, thd->query_length,
- FALSE, FALSE);
- }
-#endif
-
*rows_affected= 1;
ok:
if (dbchanged)
@@ -838,7 +643,7 @@ err:
RETURN VALUE
0 OK
- EVEX_GENERAL_ERROR Error occured (my_error() called)
+ EVEX_GENERAL_ERROR Error occured and reported
NOTES
sp_name is passed since this is the name of the event to
@@ -860,7 +665,7 @@ Event_db_repository::update_event(THD *thd, Event_parse_data *parse_data,
goto err;
}
- if (evex_check_params(thd, parse_data))
+ if (check_parse_params(thd, parse_data))
goto err;
DBUG_PRINT("info", ("dbname: %s", parse_data->dbname.str));
@@ -879,7 +684,7 @@ Event_db_repository::update_event(THD *thd, Event_parse_data *parse_data,
goto err;
}
- if (!evex_db_find_event_by_name(thd,new_name->m_db,new_name->m_name,table))
+ if (!find_event_by_name(thd, new_name->m_db, new_name->m_name, table))
{
my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), new_name->m_name.str);
goto err;
@@ -904,10 +709,10 @@ Event_db_repository::update_event(THD *thd, Event_parse_data *parse_data,
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
/*
- evex_fill_row() calls my_error() in case of error so no need to
+ mysql_event_fill_row() calls my_error() in case of error so no need to
handle it here
*/
- if ((ret= evex_fill_row(thd, table, parse_data, true)))
+ if ((ret= mysql_event_fill_row(thd, table, parse_data, TRUE)))
goto err;
if (new_name)
@@ -944,11 +749,12 @@ err:
SYNOPSIS
Event_db_repository::drop_event()
- thd THD
- db database name
- name event's name
- drop_if_exists if set and the event not existing => warning onto the stack
- rows_affected affected number of rows is returned heres
+ thd [in] THD
+ db [in] Database name
+ name [in] Event's name
+ drop_if_exists [in] If set and the event not existing => warning
+ onto the stack
+ rows_affected [out] Affected number of rows is returned heres
RETURN VALUE
0 OK
@@ -974,17 +780,16 @@ Event_db_repository::drop_event(THD *thd, LEX_STRING db, LEX_STRING name,
goto done;
}
- if (!(ret= evex_db_find_event_by_name(thd, db, name, table)))
- {
- /* Close active transaction only if We are going to modify disk */
+ switch ((ret= find_event_by_name(thd, db, name, table))) {
+ case 0:
+ /* Close active transaction only if we are actually going to modify disk */
if ((ret= end_active_trans(thd)))
- goto done;
+ break;
if ((ret= table->file->ha_delete_row(table->record[0])))
my_error(ER_EVENT_CANNOT_DELETE, MYF(0));
- }
- else if (ret == EVEX_KEY_NOT_FOUND)
- {
+ break;
+ case EVEX_KEY_NOT_FOUND:
if (drop_if_exists)
{
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
@@ -993,19 +798,34 @@ Event_db_repository::drop_event(THD *thd, LEX_STRING db, LEX_STRING name,
ret= 0;
} else
my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name.str);
+ break;
+ default:
+ ;
}
done:
- /*
- evex_drop_event() is used by Event_timed::drop therefore
- we have to close our thread tables.
- */
close_thread_tables(thd);
thd->restore_backup_open_tables_state(&backup);
DBUG_RETURN(ret);
}
+/*
+ Positions the internal pointer of `table` to the place where (db, name)
+ is stored.
+
+ SYNOPSIS
+ Event_db_repository::find_event_by_name()
+ thd Thread
+ db Schema
+ name Event name
+ table Opened mysql.event
+
+ RETURN VALUE
+ 0 OK
+ EVEX_KEY_NOT_FOUND No such event
+*/
+
int
Event_db_repository::find_event_by_name(THD *thd, LEX_STRING db,
LEX_STRING name, TABLE *table)
@@ -1043,25 +863,31 @@ Event_db_repository::find_event_by_name(THD *thd, LEX_STRING db,
}
-int
-Event_db_repository::drop_schema_events(THD *thd, LEX_STRING schema)
-{
- return drop_events_by_field(thd, ET_FIELD_DB, schema);
-}
+/*
+ Drops all events in the selected database, from mysql.event.
+ SYNOPSIS
+ Event_db_repository::drop_schema_events()
+ thd Thread
+ schema The database to clean from events
+
+ RETURN VALUE
+ 0 OK
+ !0 Error (Reported)
+*/
int
-Event_db_repository::drop_user_events(THD *thd, LEX_STRING definer)
+Event_db_repository::drop_schema_events(THD *thd, LEX_STRING schema)
{
- return drop_events_by_field(thd, ET_FIELD_DEFINER, definer);
+ return drop_events_by_field(thd, ET_FIELD_DB, schema);
}
/*
- Drops all events in the selected database, from mysql.event.
+ Drops all events by field which has specific value of the field
SYNOPSIS
- drop_events_from_table_by_field()
+ Event_db_repository::drop_events_by_field()
thd Thread
table mysql.event TABLE
field Which field of the row to use for matching
@@ -1116,56 +942,63 @@ Event_db_repository::drop_events_by_field(THD *thd,
/*
- Looks for a named event in mysql.event and then loads it from
- the table, compiles and inserts it into the cache.
+ Looks for a named event in mysql.event and in case of success returns
+ an object will data loaded from the table.
SYNOPSIS
- Event_db_repository::load_named_event_timed()
- thd THD
- etn The name of the event to load and compile on scheduler's root
- etn_new The loaded event
+ Event_db_repository::find_event()
+ thd [in] THD
+ name [in] The name of the event to find
+ ett [out] Event's data if event is found
+ tbl [in] TABLE object to use when not NULL
+
+ NOTES
+ 1) Use sp_name for look up, return in **ett if found
+ 2) tbl is not closed at exit
RETURN VALUE
- NULL Error during compile or the event is non-enabled.
- otherwise Address
+ 0 ok In this case *ett is set to the event
+ # error *ett == 0
*/
int
-Event_db_repository::load_named_event_timed(THD *thd, LEX_STRING dbname,
- LEX_STRING name,
- Event_timed **etn_new)
+Event_db_repository::find_event(THD *thd, LEX_STRING dbname, LEX_STRING name,
+ Event_basic *et)
{
- int ret= 0;
- MEM_ROOT *tmp_mem_root;
- Event_timed *et_loaded= NULL;
- Open_tables_state backup;
+ TABLE *table;
+ int ret;
+ DBUG_ENTER("Event_db_repository::find_event");
+ DBUG_PRINT("enter", ("name: %*s", name.length, name.str));
- DBUG_ENTER("Event_db_repository::load_named_event_timed");
- DBUG_PRINT("enter",("thd=%p name:%*s",thd, name.length, name.str));
+ if (open_event_table(thd, TL_READ, &table))
+ {
+ my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
+ ret= EVEX_GENERAL_ERROR;
+ goto done;
+ }
- thd->reset_n_backup_open_tables_state(&backup);
- /* No need to use my_error() here because db_find_event() has done it */
- ret= find_event(thd, dbname, name, &et_loaded, NULL);
- thd->restore_backup_open_tables_state(&backup);
- /* In this case no memory was allocated so we don't need to clean */
- if (ret)
- DBUG_RETURN(OP_LOAD_ERROR);
+ if ((ret= find_event_by_name(thd, dbname, name, table)))
+ {
+ my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name.str);
+ goto done;
+ }
+ /*
+ 1)The table should not be closed beforehand. ::load_from_row() only loads
+ and does not compile
- if (et_loaded->status != Event_timed::ENABLED)
+ 2)::load_from_row() is silent on error therefore we emit error msg here
+ */
+ if ((ret= et->load_from_row(table)))
{
- /*
- We don't load non-enabled events.
- In db_find_event() `et_new` was allocated on the heap and not on
- scheduler_root therefore we delete it here.
- */
- delete et_loaded;
- DBUG_RETURN(OP_DISABLED_EVENT);
+ my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0), "event");
+ goto done;
}
- et_loaded->compute_next_execution_time();
- *etn_new= et_loaded;
+done:
+ if (table)
+ close_thread_tables(thd);
- DBUG_RETURN(OP_OK);
+ DBUG_RETURN(ret);
}
@@ -1174,50 +1007,34 @@ Event_db_repository::load_named_event_timed(THD *thd, LEX_STRING dbname,
the table, compiles and inserts it into the cache.
SYNOPSIS
- Event_db_repository::load_named_event_job()
- thd THD
- etn The name of the event to load and compile on scheduler's root
- etn_new The loaded event
+ Event_db_repository::load_named_event()
+ thd [in] THD
+ dbname [in] Event's db name
+ name [in] Event's name
+ etn_new [out] The loaded event
RETURN VALUE
- NULL Error during compile or the event is non-enabled.
- otherwise Address
+ OP_OK OK
+ OP_LOAD_ERROR Error during loading from disk
*/
int
-Event_db_repository::load_named_event_job(THD *thd, LEX_STRING dbname,
- LEX_STRING name,
- Event_job_data **etn_new)
+Event_db_repository::load_named_event(THD *thd, LEX_STRING dbname,
+ LEX_STRING name, Event_basic *etn)
{
int ret= 0;
- MEM_ROOT *tmp_mem_root;
- Event_timed *et_loaded= NULL;
Open_tables_state backup;
- DBUG_ENTER("Event_db_repository::load_named_event_job");
- DBUG_PRINT("enter",("thd=%p name:%*s",thd, name.length, name.str));
-#if 0
+ DBUG_ENTER("Event_db_repository::load_named_event");
+ DBUG_PRINT("enter",("thd=0x%lx name:%*s",thd, name.length, name.str));
+
thd->reset_n_backup_open_tables_state(&backup);
- /* No need to use my_error() here because db_find_event() has done it */
- ret= find_event(thd, dbname, name, &et_loaded, NULL);
+ /* No need to use my_error() here because find_event() has done it */
+ ret= find_event(thd, dbname, name, etn);
thd->restore_backup_open_tables_state(&backup);
/* In this case no memory was allocated so we don't need to clean */
if (ret)
DBUG_RETURN(OP_LOAD_ERROR);
- if (et_loaded->status != Event_timed::ENABLED)
- {
- /*
- We don't load non-enabled events.
- In db_find_event() `et_new` was allocated on the heap and not on
- scheduler_root therefore we delete it here.
- */
- delete et_loaded;
- DBUG_RETURN(OP_DISABLED_EVENT);
- }
-
- et_loaded->compute_next_execution_time();
- *etn_new= et_loaded;
-#endif
DBUG_RETURN(OP_OK);
}