summaryrefslogtreecommitdiff
path: root/sql/event.cc
diff options
context:
space:
mode:
authorandrey@lmy004. <>2006-01-30 14:28:48 +0100
committerandrey@lmy004. <>2006-01-30 14:28:48 +0100
commit9d7d8767dd56274b4b3f7fed39e4e467c0101e79 (patch)
tree8ef0243df685fd27f6f69d8bcff5e5743c6a0648 /sql/event.cc
parent6f9f3221eadfd536134747fb83842faa19bb0c50 (diff)
parentd847ac54caf4853d757c1f96a60b15cd2a338073 (diff)
downloadmariadb-git-9d7d8767dd56274b4b3f7fed39e4e467c0101e79.tar.gz
post-commit merge
Diffstat (limited to 'sql/event.cc')
-rw-r--r--sql/event.cc63
1 files changed, 41 insertions, 22 deletions
diff --git a/sql/event.cc b/sql/event.cc
index 4a6fff581a3..abca622835a 100644
--- a/sql/event.cc
+++ b/sql/event.cc
@@ -77,7 +77,7 @@ evex_queue_init(EVEX_QUEUE_TYPE *queue)
}
-static
+
int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs)
{
return cs->coll->strnncollsp(cs, (unsigned char *) s.str,s.length,
@@ -182,7 +182,9 @@ evex_open_event_table(THD *thd, enum thr_lock_type lock_type, TABLE **table)
int
evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
- const LEX_STRING ev_name, TABLE *table)
+ const LEX_STRING ev_name,
+ const LEX_STRING user_name,
+ TABLE *table)
{
byte key[MAX_KEY_LENGTH];
DBUG_ENTER("evex_db_find_event_aux");
@@ -196,11 +198,17 @@ evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
same fields.
*/
if (dbname.length > table->field[EVEX_FIELD_DB]->field_length ||
- ev_name.length > table->field[EVEX_FIELD_NAME]->field_length)
+ ev_name.length > table->field[EVEX_FIELD_NAME]->field_length ||
+ user_name.length > table->field[EVEX_FIELD_DEFINER]->field_length)
+
DBUG_RETURN(EVEX_KEY_NOT_FOUND);
- table->field[0]->store(dbname.str, dbname.length, &my_charset_bin);
- table->field[1]->store(ev_name.str, ev_name.length, &my_charset_bin);
+ table->field[EVEX_FIELD_DB]->store(dbname.str, dbname.length, &my_charset_bin);
+ table->field[EVEX_FIELD_NAME]->store(ev_name.str, ev_name.length,
+ &my_charset_bin);
+ table->field[EVEX_FIELD_DEFINER]->store(user_name.str, user_name.length,
+ &my_charset_bin);
+
key_copy(key, table->record[0], table->key_info, table->key_info->key_length);
if (table->file->index_read_idx(table->record[0], 0, key,
@@ -290,10 +298,15 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
from 1. Thus +1 offset is needed!
*/
table->field[EVEX_FIELD_TRANSIENT_INTERVAL]->store((longlong)et->interval+1);
+
+ table->field[EVEX_FIELD_EXECUTE_AT]->set_null();
}
else if (et->execute_at.year)
{
// fix_fields already called in init_execute_at
+ table->field[EVEX_FIELD_INTERVAL_EXPR]->set_null();
+ table->field[EVEX_FIELD_TRANSIENT_INTERVAL]->set_null();
+
table->field[EVEX_FIELD_EXECUTE_AT]->set_notnull();
table->field[EVEX_FIELD_EXECUTE_AT]->store_time(&et->execute_at,
MYSQL_TIMESTAMP_DATETIME);
@@ -358,9 +371,9 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
goto err;
}
-
+
DBUG_PRINT("info", ("check existance of an event with the same name"));
- if (!evex_db_find_event_aux(thd, et->dbname, et->name, table))
+ if (!evex_db_find_event_aux(thd, et->dbname, et->name, et->definer, table))
{
if (create_if_not)
{
@@ -410,10 +423,9 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
goto err;
}
- strxmov(definer, et->definer_user.str, "@", et->definer_host.str, NullS);
- if ((ret=table->field[EVEX_FIELD_DEFINER]->
- store(definer, et->definer_user.length + 1 + et->definer_host.length,
- system_charset_info)))
+ if ((ret=table->field[EVEX_FIELD_DEFINER]->store(et->definer.str,
+ et->definer.length,
+ system_charset_info)))
{
my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str, ret);
goto err;
@@ -476,7 +488,9 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
TABLE *table;
int ret= EVEX_OPEN_TABLE_FAILED;
DBUG_ENTER("db_update_event");
+ DBUG_PRINT("enter", ("dbname: %.*s", et->dbname.length, et->dbname.str));
DBUG_PRINT("enter", ("name: %.*s", et->name.length, et->name.str));
+ DBUG_PRINT("enter", ("user: %.*s", et->name.length, et->name.str));
if (new_name)
DBUG_PRINT("enter", ("rename to: %.*s", new_name->m_name.length,
new_name->m_name.str));
@@ -497,7 +511,8 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
goto err;
}
- if (!evex_db_find_event_aux(thd, new_name->m_db, new_name->m_name, table))
+ if (!evex_db_find_event_aux(thd, new_name->m_db, new_name->m_name,
+ et->definer, table))
{
my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), new_name->m_name.str);
goto err;
@@ -510,7 +525,7 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
row (copied into record[1] later
*/
if (EVEX_KEY_NOT_FOUND == evex_db_find_event_aux(thd, et->dbname, et->name,
- table))
+ et->definer, table))
{
my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), et->name.str);
goto err;
@@ -559,6 +574,7 @@ err:
db_find_event()
thd THD
name the name of the event to find
+ definer who owns the event
ett event's data if event is found
tbl TABLE object to use when not NULL
@@ -568,11 +584,11 @@ err:
*/
static int
-db_find_event(THD *thd, sp_name *name, event_timed **ett, TABLE *tbl)
+db_find_event(THD *thd, sp_name *name, LEX_STRING definer, event_timed **ett,
+ TABLE *tbl)
{
TABLE *table;
int ret;
- const char *definer;
char *ptr;
event_timed *et;
DBUG_ENTER("db_find_event");
@@ -587,7 +603,8 @@ db_find_event(THD *thd, sp_name *name, event_timed **ett, TABLE *tbl)
goto done;
}
- if ((ret= evex_db_find_event_aux(thd, name->m_db, name->m_name, table)))
+ if ((ret= evex_db_find_event_aux(thd, name->m_db, name->m_name, definer,
+ table)))
{
my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name->m_name.str);
goto done;
@@ -628,6 +645,7 @@ done:
evex_load_and_compile_event()
thd THD
spn the name of the event to alter
+ definer who is the owner
use_lock whether to obtain a lock on LOCK_event_arrays or not
RETURN VALUE
@@ -637,7 +655,8 @@ done:
*/
static int
-evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
+evex_load_and_compile_event(THD * thd, sp_name *spn, LEX_STRING definer,
+ bool use_lock)
{
int ret= 0;
MEM_ROOT *tmp_mem_root;
@@ -652,7 +671,7 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
thd->reset_n_backup_open_tables_state(&backup);
// no need to use my_error() here because db_find_event() has done it
- if ((ret= db_find_event(thd, spn, &ett, NULL)))
+ if ((ret= db_find_event(thd, spn, definer, &ett, NULL)))
goto done;
thd->restore_backup_open_tables_state(&backup);
@@ -773,7 +792,7 @@ evex_create_event(THD *thd, event_timed *et, uint create_options,
if (evex_is_running && et->status == MYSQL_EVENT_ENABLED)
{
sp_name spn(et->dbname, et->name);
- ret= evex_load_and_compile_event(thd, &spn, true);
+ ret= evex_load_and_compile_event(thd, &spn, et->definer, true);
}
VOID(pthread_mutex_unlock(&LOCK_evex_running));
@@ -826,11 +845,11 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name,
if (et->status == MYSQL_EVENT_ENABLED)
{
if (new_name)
- ret= evex_load_and_compile_event(thd, new_name, false);
+ ret= evex_load_and_compile_event(thd, new_name, et->definer, false);
else
{
sp_name spn(et->dbname, et->name);
- ret= evex_load_and_compile_event(thd, &spn, false);
+ ret= evex_load_and_compile_event(thd, &spn, et->definer, false);
}
if (ret == EVEX_COMPILE_ERROR)
my_error(ER_EVENT_COMPILE_ERROR, MYF(0));
@@ -868,7 +887,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
goto done;
}
- if (!(ret= evex_db_find_event_aux(thd, et->dbname, et->name, table)))
+ if (!(ret= evex_db_find_event_aux(thd, et->dbname,et->name,et->definer,table)))
{
if ((ret= table->file->ha_delete_row(table->record[0])))
{