Fix the coding style in a few new files.
This commit is contained in:
parent
94e3b91d4e
commit
99030e3f43
44
sql/event.h
44
sql/event.h
@ -43,13 +43,13 @@
|
|||||||
extern ulong opt_event_executor;
|
extern ulong opt_event_executor;
|
||||||
|
|
||||||
enum enum_event_on_completion
|
enum enum_event_on_completion
|
||||||
{
|
{
|
||||||
MYSQL_EVENT_ON_COMPLETION_DROP = 1,
|
MYSQL_EVENT_ON_COMPLETION_DROP = 1,
|
||||||
MYSQL_EVENT_ON_COMPLETION_PRESERVE
|
MYSQL_EVENT_ON_COMPLETION_PRESERVE
|
||||||
};
|
};
|
||||||
|
|
||||||
enum enum_event_status
|
enum enum_event_status
|
||||||
{
|
{
|
||||||
MYSQL_EVENT_ENABLED = 1,
|
MYSQL_EVENT_ENABLED = 1,
|
||||||
MYSQL_EVENT_DISABLED
|
MYSQL_EVENT_DISABLED
|
||||||
};
|
};
|
||||||
@ -60,9 +60,9 @@ enum evex_table_field
|
|||||||
EVEX_FIELD_NAME,
|
EVEX_FIELD_NAME,
|
||||||
EVEX_FIELD_BODY,
|
EVEX_FIELD_BODY,
|
||||||
EVEX_FIELD_DEFINER,
|
EVEX_FIELD_DEFINER,
|
||||||
EVEX_FIELD_EXECUTE_AT,
|
EVEX_FIELD_EXECUTE_AT,
|
||||||
EVEX_FIELD_INTERVAL_EXPR,
|
EVEX_FIELD_INTERVAL_EXPR,
|
||||||
EVEX_FIELD_TRANSIENT_INTERVAL,
|
EVEX_FIELD_TRANSIENT_INTERVAL,
|
||||||
EVEX_FIELD_CREATED,
|
EVEX_FIELD_CREATED,
|
||||||
EVEX_FIELD_MODIFIED,
|
EVEX_FIELD_MODIFIED,
|
||||||
EVEX_FIELD_LAST_EXECUTED,
|
EVEX_FIELD_LAST_EXECUTED,
|
||||||
@ -112,7 +112,7 @@ public:
|
|||||||
ulong sql_mode;
|
ulong sql_mode;
|
||||||
|
|
||||||
const uchar *body_begin;
|
const uchar *body_begin;
|
||||||
|
|
||||||
bool dropped;
|
bool dropped;
|
||||||
bool free_sphead_on_delete;
|
bool free_sphead_on_delete;
|
||||||
uint flags;//all kind of purposes
|
uint flags;//all kind of purposes
|
||||||
@ -123,26 +123,26 @@ public:
|
|||||||
status(MYSQL_EVENT_ENABLED), sphead(0), sql_mode(0),
|
status(MYSQL_EVENT_ENABLED), sphead(0), sql_mode(0),
|
||||||
body_begin(0), dropped(false), free_sphead_on_delete(true),
|
body_begin(0), dropped(false), free_sphead_on_delete(true),
|
||||||
flags(0)
|
flags(0)
|
||||||
|
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&this->LOCK_running, MY_MUTEX_INIT_FAST);
|
pthread_mutex_init(&this->LOCK_running, MY_MUTEX_INIT_FAST);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
~event_timed()
|
~event_timed()
|
||||||
{
|
{
|
||||||
pthread_mutex_destroy(&this->LOCK_running);
|
pthread_mutex_destroy(&this->LOCK_running);
|
||||||
if (free_sphead_on_delete)
|
if (free_sphead_on_delete)
|
||||||
free_sp();
|
free_sp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
init();
|
init();
|
||||||
|
|
||||||
int
|
int
|
||||||
init_definer(THD *thd);
|
init_definer(THD *thd);
|
||||||
|
|
||||||
int
|
int
|
||||||
init_execute_at(THD *thd, Item *expr);
|
init_execute_at(THD *thd, Item *expr);
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ public:
|
|||||||
|
|
||||||
int
|
int
|
||||||
init_ends(THD *thd, Item *ends);
|
init_ends(THD *thd, Item *ends);
|
||||||
|
|
||||||
void
|
void
|
||||||
init_body(THD *thd);
|
init_body(THD *thd);
|
||||||
|
|
||||||
@ -168,38 +168,38 @@ public:
|
|||||||
load_from_row(MEM_ROOT *mem_root, TABLE *table);
|
load_from_row(MEM_ROOT *mem_root, TABLE *table);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
compute_next_execution_time();
|
compute_next_execution_time();
|
||||||
|
|
||||||
void
|
void
|
||||||
mark_last_executed(THD *thd);
|
mark_last_executed(THD *thd);
|
||||||
|
|
||||||
int
|
int
|
||||||
drop(THD *thd);
|
drop(THD *thd);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
update_fields(THD *thd);
|
update_fields(THD *thd);
|
||||||
|
|
||||||
int
|
int
|
||||||
get_create_event(THD *thd, String *buf);
|
get_create_event(THD *thd, String *buf);
|
||||||
|
|
||||||
int
|
int
|
||||||
execute(THD *thd, MEM_ROOT *mem_root= NULL);
|
execute(THD *thd, MEM_ROOT *mem_root= NULL);
|
||||||
|
|
||||||
int
|
int
|
||||||
compile(THD *thd, MEM_ROOT *mem_root= NULL);
|
compile(THD *thd, MEM_ROOT *mem_root= NULL);
|
||||||
|
|
||||||
my_bool
|
my_bool
|
||||||
is_running()
|
is_running()
|
||||||
{
|
{
|
||||||
my_bool ret;
|
my_bool ret;
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&this->LOCK_running));
|
VOID(pthread_mutex_lock(&this->LOCK_running));
|
||||||
ret= running;
|
ret= running;
|
||||||
VOID(pthread_mutex_unlock(&this->LOCK_running));
|
VOID(pthread_mutex_unlock(&this->LOCK_running));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_sp()
|
void free_sp()
|
||||||
{
|
{
|
||||||
delete sphead;
|
delete sphead;
|
||||||
@ -241,7 +241,7 @@ shutdown_events();
|
|||||||
|
|
||||||
|
|
||||||
// auxiliary
|
// auxiliary
|
||||||
int
|
int
|
||||||
event_timed_compare(event_timed **a, event_timed **b);
|
event_timed_compare(event_timed **a, event_timed **b);
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,8 +36,8 @@ evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
|
|||||||
const LEX_STRING rname,
|
const LEX_STRING rname,
|
||||||
const LEX_STRING definer,
|
const LEX_STRING definer,
|
||||||
TABLE *table);
|
TABLE *table);
|
||||||
|
|
||||||
int
|
int
|
||||||
event_timed_compare_q(void *vptr, byte* a, byte *b);
|
event_timed_compare_q(void *vptr, byte* a, byte *b);
|
||||||
|
|
||||||
int db_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
|
int db_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
|
||||||
|
@ -23,10 +23,10 @@
|
|||||||
extern int yyparse(void *thd);
|
extern int yyparse(void *thd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Init all member variables
|
Init all member variables
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init()
|
event_timed::init()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -36,7 +36,7 @@ event_timed::init()
|
|||||||
|
|
||||||
dbname.str= name.str= body.str= comment.str= 0;
|
dbname.str= name.str= body.str= comment.str= 0;
|
||||||
dbname.length= name.length= body.length= comment.length= 0;
|
dbname.length= name.length= body.length= comment.length= 0;
|
||||||
|
|
||||||
set_zero_time(&starts, MYSQL_TIMESTAMP_DATETIME);
|
set_zero_time(&starts, MYSQL_TIMESTAMP_DATETIME);
|
||||||
set_zero_time(&ends, MYSQL_TIMESTAMP_DATETIME);
|
set_zero_time(&ends, MYSQL_TIMESTAMP_DATETIME);
|
||||||
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
||||||
@ -44,25 +44,25 @@ event_timed::init()
|
|||||||
|
|
||||||
definer_user.str= definer_host.str= 0;
|
definer_user.str= definer_host.str= 0;
|
||||||
definer_user.length= definer_host.length= 0;
|
definer_user.length= definer_host.length= 0;
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set a name of the event
|
Set a name of the event
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_name()
|
event_timed::init_name()
|
||||||
thd THD
|
thd THD
|
||||||
spn the name extracted in the parser
|
spn the name extracted in the parser
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
event_timed::init_name(THD *thd, sp_name *spn)
|
event_timed::init_name(THD *thd, sp_name *spn)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("event_timed::init_name");
|
DBUG_ENTER("event_timed::init_name");
|
||||||
uint n; /* Counter for nul trimming */
|
uint n; /* Counter for nul trimming */
|
||||||
/* During parsing, we must use thd->mem_root */
|
/* During parsing, we must use thd->mem_root */
|
||||||
MEM_ROOT *root= thd->mem_root;
|
MEM_ROOT *root= thd->mem_root;
|
||||||
|
|
||||||
@ -85,20 +85,20 @@ event_timed::init_name(THD *thd, sp_name *spn)
|
|||||||
dbname.length= thd->db_length;
|
dbname.length= thd->db_length;
|
||||||
dbname.str= strmake_root(root, thd->db, dbname.length);
|
dbname.str= strmake_root(root, thd->db, dbname.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_PRINT("dbname", ("len=%d db=%s",dbname.length, dbname.str));
|
DBUG_PRINT("dbname", ("len=%d db=%s",dbname.length, dbname.str));
|
||||||
DBUG_PRINT("name", ("len=%d name=%s",name.length, name.str));
|
DBUG_PRINT("name", ("len=%d name=%s",name.length, name.str));
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set body of the event - what should be executed.
|
Set body of the event - what should be executed.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_body()
|
event_timed::init_body()
|
||||||
thd THD
|
thd THD
|
||||||
|
|
||||||
NOTE
|
NOTE
|
||||||
The body is extracted by copying all data between the
|
The body is extracted by copying all data between the
|
||||||
@ -112,7 +112,7 @@ event_timed::init_body(THD *thd)
|
|||||||
MEM_ROOT *root= thd->mem_root;
|
MEM_ROOT *root= thd->mem_root;
|
||||||
|
|
||||||
body.length= thd->lex->ptr - body_begin;
|
body.length= thd->lex->ptr - body_begin;
|
||||||
// Trim nuls at the end
|
// Trim nuls at the end
|
||||||
while (body.length && body_begin[body.length-1] == '\0')
|
while (body.length && body_begin[body.length-1] == '\0')
|
||||||
body.length--;
|
body.length--;
|
||||||
|
|
||||||
@ -126,17 +126,17 @@ event_timed::init_body(THD *thd)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set time for execution for one time events.
|
Set time for execution for one time events.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_execute_at()
|
event_timed::init_execute_at()
|
||||||
expr when (datetime)
|
expr when (datetime)
|
||||||
|
|
||||||
RETURNS
|
RETURN VALUE
|
||||||
0 - OK
|
0 OK
|
||||||
EVEX_PARSE_ERROR - fix_fields failed
|
EVEX_PARSE_ERROR fix_fields failed
|
||||||
EVEX_BAD_PARAMS - datetime is in the past
|
EVEX_BAD_PARAMS datetime is in the past
|
||||||
ER_WRONG_VALUE - wrong value for execute at
|
ER_WRONG_VALUE wrong value for execute at
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -152,9 +152,9 @@ event_timed::init_execute_at(THD *thd, Item *expr)
|
|||||||
if (expr->fix_fields(thd, &expr))
|
if (expr->fix_fields(thd, &expr))
|
||||||
DBUG_RETURN(EVEX_PARSE_ERROR);
|
DBUG_RETURN(EVEX_PARSE_ERROR);
|
||||||
|
|
||||||
// let's check whether time is in the past
|
/* Let's check whether time is in the past */
|
||||||
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,
|
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,
|
||||||
(my_time_t) thd->query_start());
|
(my_time_t) thd->query_start());
|
||||||
|
|
||||||
|
|
||||||
if ((not_used= expr->get_date(<ime, TIME_NO_ZERO_DATE)))
|
if ((not_used= expr->get_date(<ime, TIME_NO_ZERO_DATE)))
|
||||||
@ -166,8 +166,8 @@ event_timed::init_execute_at(THD *thd, Item *expr)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
|
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx.
|
||||||
CONVERT_TZ has similar problem
|
CONVERT_TZ has similar problem.
|
||||||
*/
|
*/
|
||||||
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd,<ime, ¬_used));
|
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd,<ime, ¬_used));
|
||||||
|
|
||||||
@ -178,17 +178,17 @@ event_timed::init_execute_at(THD *thd, Item *expr)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set time for execution for transient events.
|
Set time for execution for transient events.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_interval()
|
event_timed::init_interval()
|
||||||
expr how much?
|
expr how much?
|
||||||
new_interval what is the interval
|
new_interval what is the interval
|
||||||
|
|
||||||
RETURNS
|
RETURNS
|
||||||
0 - OK
|
0 OK
|
||||||
EVEX_PARSE_ERROR - fix_fields failed
|
EVEX_PARSE_ERROR fix_fields failed
|
||||||
EVEX_BAD_PARAMS - Interval is not positive
|
EVEX_BAD_PARAMS Interval is not positive
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -197,7 +197,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
|
|||||||
longlong tmp;
|
longlong tmp;
|
||||||
String value;
|
String value;
|
||||||
INTERVAL interval;
|
INTERVAL interval;
|
||||||
|
|
||||||
DBUG_ENTER("event_timed::init_interval");
|
DBUG_ENTER("event_timed::init_interval");
|
||||||
|
|
||||||
if (expr->fix_fields(thd, &expr))
|
if (expr->fix_fields(thd, &expr))
|
||||||
@ -230,7 +230,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
|
|||||||
case INTERVAL_SECOND:
|
case INTERVAL_SECOND:
|
||||||
expression= interval.second;
|
expression= interval.second;
|
||||||
break;
|
break;
|
||||||
case INTERVAL_YEAR_MONTH: // Allow YEAR-MONTH YYYYYMM
|
case INTERVAL_YEAR_MONTH: // Allow YEAR-MONTH YYYYYMM
|
||||||
expression= interval.year* 12 + interval.month;
|
expression= interval.year* 12 + interval.month;
|
||||||
break;
|
break;
|
||||||
case INTERVAL_DAY_HOUR:
|
case INTERVAL_DAY_HOUR:
|
||||||
@ -265,31 +265,31 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
|
|||||||
}
|
}
|
||||||
if (interval.neg || expression > EVEX_MAX_INTERVAL_VALUE)
|
if (interval.neg || expression > EVEX_MAX_INTERVAL_VALUE)
|
||||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||||
|
|
||||||
this->interval= new_interval;
|
this->interval= new_interval;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set activation time.
|
Set activation time.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_starts()
|
event_timed::init_starts()
|
||||||
expr how much?
|
expr how much?
|
||||||
interval what is the interval
|
interval what is the interval
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
Note that activation time is not execution time.
|
Note that activation time is not execution time.
|
||||||
EVERY 5 MINUTE STARTS "2004-12-12 10:00:00" means that
|
EVERY 5 MINUTE STARTS "2004-12-12 10:00:00" means that
|
||||||
the event will be executed every 5 minutes but this will
|
the event will be executed every 5 minutes but this will
|
||||||
start at the date shown above. Expressions are possible :
|
start at the date shown above. Expressions are possible :
|
||||||
DATE_ADD(NOW(), INTERVAL 1 DAY) -- start tommorow at
|
DATE_ADD(NOW(), INTERVAL 1 DAY) -- start tommorow at
|
||||||
same time.
|
same time.
|
||||||
|
|
||||||
RETURNS
|
RETURNS
|
||||||
0 - OK
|
0 OK
|
||||||
EVEX_PARSE_ERROR - fix_fields failed
|
EVEX_PARSE_ERROR fix_fields failed
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -306,9 +306,9 @@ event_timed::init_starts(THD *thd, Item *new_starts)
|
|||||||
if ((not_used= new_starts->get_date(<ime, TIME_NO_ZERO_DATE)))
|
if ((not_used= new_starts->get_date(<ime, TIME_NO_ZERO_DATE)))
|
||||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||||
|
|
||||||
// let's check whether time is in the past
|
/* Let's check whether time is in the past */
|
||||||
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,
|
thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp,
|
||||||
(my_time_t) thd->query_start());
|
(my_time_t) thd->query_start());
|
||||||
|
|
||||||
DBUG_PRINT("info",("now =%lld", TIME_to_ulonglong_datetime(&time_tmp)));
|
DBUG_PRINT("info",("now =%lld", TIME_to_ulonglong_datetime(&time_tmp)));
|
||||||
DBUG_PRINT("info",("starts=%lld", TIME_to_ulonglong_datetime(<ime)));
|
DBUG_PRINT("info",("starts=%lld", TIME_to_ulonglong_datetime(<ime)));
|
||||||
@ -317,8 +317,8 @@ event_timed::init_starts(THD *thd, Item *new_starts)
|
|||||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
|
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
|
||||||
CONVERT_TZ has similar problem
|
CONVERT_TZ has similar problem
|
||||||
*/
|
*/
|
||||||
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used));
|
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used));
|
||||||
|
|
||||||
@ -328,28 +328,28 @@ event_timed::init_starts(THD *thd, Item *new_starts)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set deactivation time.
|
Set deactivation time.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_ends()
|
event_timed::init_ends()
|
||||||
thd THD
|
thd THD
|
||||||
new_ends when?
|
new_ends when?
|
||||||
|
|
||||||
NOTES
|
NOTES
|
||||||
Note that activation time is not execution time.
|
Note that activation time is not execution time.
|
||||||
EVERY 5 MINUTE ENDS "2004-12-12 10:00:00" means that
|
EVERY 5 MINUTE ENDS "2004-12-12 10:00:00" means that
|
||||||
the event will be executed every 5 minutes but this will
|
the event will be executed every 5 minutes but this will
|
||||||
end at the date shown above. Expressions are possible :
|
end at the date shown above. Expressions are possible :
|
||||||
DATE_ADD(NOW(), INTERVAL 1 DAY) -- end tommorow at
|
DATE_ADD(NOW(), INTERVAL 1 DAY) -- end tommorow at
|
||||||
same time.
|
same time.
|
||||||
|
|
||||||
RETURNS
|
RETURNS
|
||||||
0 - OK
|
0 OK
|
||||||
EVEX_PARSE_ERROR - fix_fields failed
|
EVEX_PARSE_ERROR fix_fields failed
|
||||||
EVEX_BAD_PARAMS - ENDS before STARTS
|
EVEX_BAD_PARAMS ENDS before STARTS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
event_timed::init_ends(THD *thd, Item *new_ends)
|
event_timed::init_ends(THD *thd, Item *new_ends)
|
||||||
{
|
{
|
||||||
TIME ltime;
|
TIME ltime;
|
||||||
@ -361,16 +361,16 @@ event_timed::init_ends(THD *thd, Item *new_ends)
|
|||||||
if (new_ends->fix_fields(thd, &new_ends))
|
if (new_ends->fix_fields(thd, &new_ends))
|
||||||
DBUG_RETURN(EVEX_PARSE_ERROR);
|
DBUG_RETURN(EVEX_PARSE_ERROR);
|
||||||
|
|
||||||
// the field was already fixed in init_ends
|
/* The field was already fixed in init_ends */
|
||||||
if ((not_used= new_ends->get_date(<ime, TIME_NO_ZERO_DATE)))
|
if ((not_used= new_ends->get_date(<ime, TIME_NO_ZERO_DATE)))
|
||||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
|
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx.
|
||||||
CONVERT_TZ has similar problem
|
CONVERT_TZ has similar problem.
|
||||||
*/
|
*/
|
||||||
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used));
|
my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used));
|
||||||
|
|
||||||
if (starts.year && my_time_compare(&starts, <ime) != -1)
|
if (starts.year && my_time_compare(&starts, <ime) != -1)
|
||||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||||
|
|
||||||
@ -380,12 +380,12 @@ event_timed::init_ends(THD *thd, Item *new_ends)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Sets comment.
|
Sets comment.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_comment()
|
event_timed::init_comment()
|
||||||
thd THD - used for memory allocation
|
thd THD - used for memory allocation
|
||||||
comment the string.
|
comment the string.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -401,11 +401,10 @@ event_timed::init_comment(THD *thd, LEX_STRING *set_comment)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Inits definer (definer_user and definer_host) during
|
Inits definer (definer_user and definer_host) during parsing.
|
||||||
parsing.
|
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::init_definer()
|
event_timed::init_definer()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -418,31 +417,31 @@ event_timed::init_definer(THD *thd)
|
|||||||
|
|
||||||
definer_host.str= strdup_root(thd->mem_root, thd->security_ctx->priv_host);
|
definer_host.str= strdup_root(thd->mem_root, thd->security_ctx->priv_host);
|
||||||
definer_host.length= strlen(thd->security_ctx->priv_host);
|
definer_host.length= strlen(thd->security_ctx->priv_host);
|
||||||
|
|
||||||
definer.length= definer_user.length + definer_host.length + 1;
|
definer.length= definer_user.length + definer_host.length + 1;
|
||||||
definer.str= alloc_root(thd->mem_root, definer.length + 1);
|
definer.str= alloc_root(thd->mem_root, definer.length + 1);
|
||||||
|
|
||||||
memcpy(definer.str, definer_user.str, definer_user.length);
|
memcpy(definer.str, definer_user.str, definer_user.length);
|
||||||
definer.str[definer_user.length]= '@';
|
definer.str[definer_user.length]= '@';
|
||||||
|
|
||||||
memcpy(definer.str + definer_user.length + 1, definer_host.str,
|
memcpy(definer.str + definer_user.length + 1, definer_host.str,
|
||||||
definer_host.length);
|
definer_host.length);
|
||||||
definer.str[definer.length]= '\0';
|
definer.str[definer.length]= '\0';
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Loads an event from a row from mysql.event
|
Loads an event from a row from mysql.event
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
||||||
|
|
||||||
REMARKS
|
NOTES
|
||||||
This method is silent on errors and should behave like that. Callers
|
This method is silent on errors and should behave like that. Callers
|
||||||
should handle throwing of error messages. The reason is that the class
|
should handle throwing of error messages. The reason is that the class
|
||||||
should not know about how to deal with communication.
|
should not know about how to deal with communication.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -461,7 +460,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
et= this;
|
et= this;
|
||||||
|
|
||||||
if (table->s->fields != EVEX_FIELD_COUNT)
|
if (table->s->fields != EVEX_FIELD_COUNT)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -500,18 +499,18 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
|||||||
len= et->definer.length - len - 1; //1 is because of @
|
len= et->definer.length - len - 1; //1 is because of @
|
||||||
et->definer_host.str= strmake_root(mem_root, ptr + 1, len);//1: because of @
|
et->definer_host.str= strmake_root(mem_root, ptr + 1, len);//1: because of @
|
||||||
et->definer_host.length= len;
|
et->definer_host.length= len;
|
||||||
|
|
||||||
res1= table->field[EVEX_FIELD_STARTS]->
|
res1= table->field[EVEX_FIELD_STARTS]->
|
||||||
get_date(&et->starts, TIME_NO_ZERO_DATE);
|
get_date(&et->starts, TIME_NO_ZERO_DATE);
|
||||||
|
|
||||||
res2= table->field[EVEX_FIELD_ENDS]->
|
res2= table->field[EVEX_FIELD_ENDS]->
|
||||||
get_date(&et->ends, TIME_NO_ZERO_DATE);
|
get_date(&et->ends, TIME_NO_ZERO_DATE);
|
||||||
|
|
||||||
et->expression= table->field[EVEX_FIELD_INTERVAL_EXPR]->val_int();
|
et->expression= table->field[EVEX_FIELD_INTERVAL_EXPR]->val_int();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If res1 and res2 are true then both fields are empty.
|
If res1 and res2 are true then both fields are empty.
|
||||||
Hence if EVEX_FIELD_EXECUTE_AT is empty there is an error.
|
Hence if EVEX_FIELD_EXECUTE_AT is empty there is an error.
|
||||||
*/
|
*/
|
||||||
if (res1 && res2 && !et->expression && table->field[EVEX_FIELD_EXECUTE_AT]->
|
if (res1 && res2 && !et->expression && table->field[EVEX_FIELD_EXECUTE_AT]->
|
||||||
get_date(&et->execute_at, TIME_NO_ZERO_DATE))
|
get_date(&et->execute_at, TIME_NO_ZERO_DATE))
|
||||||
@ -554,7 +553,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
|||||||
// ToDo : Andrey . Find a way not to allocate ptr on event_mem_root
|
// ToDo : Andrey . Find a way not to allocate ptr on event_mem_root
|
||||||
if ((ptr= get_field(mem_root, table->field[EVEX_FIELD_STATUS])) == NullS)
|
if ((ptr= get_field(mem_root, table->field[EVEX_FIELD_STATUS])) == NullS)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
DBUG_PRINT("load_from_row", ("Event [%s] is [%s]", et->name.str, ptr));
|
DBUG_PRINT("load_from_row", ("Event [%s] is [%s]", et->name.str, ptr));
|
||||||
et->status= (ptr[0]=='E'? MYSQL_EVENT_ENABLED:MYSQL_EVENT_DISABLED);
|
et->status= (ptr[0]=='E'? MYSQL_EVENT_ENABLED:MYSQL_EVENT_DISABLED);
|
||||||
|
|
||||||
@ -571,7 +570,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
|
|||||||
et->comment.length= strlen(et->comment.str);
|
et->comment.length= strlen(et->comment.str);
|
||||||
else
|
else
|
||||||
et->comment.length= 0;
|
et->comment.length= 0;
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
error:
|
error:
|
||||||
DBUG_RETURN(EVEX_GET_FIELD_FAILED);
|
DBUG_RETURN(EVEX_GET_FIELD_FAILED);
|
||||||
@ -579,15 +578,14 @@ error:
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Computes the sum of a timestamp plus interval
|
Computes the sum of a timestamp plus interval
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
get_next_time(TIME *start, int interval_value, interval_type interval)
|
get_next_time(TIME *start, int interval_value, interval_type interval)
|
||||||
|
next the sum
|
||||||
next - the sum
|
start add interval_value to this time
|
||||||
start - add interval_value to this time
|
i_value quantity of time type interval to add
|
||||||
i_value - quantity of time type interval to add
|
i_type type of interval to add (SECOND, MINUTE, HOUR, WEEK ...)
|
||||||
i_type - type of interval to add (SECOND, MINUTE, HOUR, WEEK ...)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -596,7 +594,7 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
|
|||||||
bool ret;
|
bool ret;
|
||||||
INTERVAL interval;
|
INTERVAL interval;
|
||||||
TIME tmp;
|
TIME tmp;
|
||||||
|
|
||||||
bzero(&interval, sizeof(interval));
|
bzero(&interval, sizeof(interval));
|
||||||
|
|
||||||
switch (i_type) {
|
switch (i_type) {
|
||||||
@ -648,14 +646,14 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Computes next execution time.
|
Computes next execution time.
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
event_timed::compute_next_execution_time()
|
event_timed::compute_next_execution_time()
|
||||||
|
|
||||||
REMARKS:
|
NOTES
|
||||||
The time is set in execute_at, if no more executions the latter is set to
|
The time is set in execute_at, if no more executions the latter is set to
|
||||||
0000-00-00.
|
0000-00-00.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@ -673,10 +671,10 @@ event_timed::compute_next_execution_time()
|
|||||||
("Event %s is DISABLED", name.str));
|
("Event %s is DISABLED", name.str));
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
//if one-time no need to do computation
|
/* If one-time, no need to do computation */
|
||||||
if (!expression)
|
if (!expression)
|
||||||
{
|
{
|
||||||
//let's check whether it was executed
|
/* Let's check whether it was executed */
|
||||||
if (last_executed.year)
|
if (last_executed.year)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("compute_next_execution_time",
|
DBUG_PRINT("compute_next_execution_time",
|
||||||
@ -697,7 +695,7 @@ event_timed::compute_next_execution_time()
|
|||||||
|
|
||||||
#ifdef ANDREY_0
|
#ifdef ANDREY_0
|
||||||
sql_print_information("[%s.%s]", dbname.str, name.str);
|
sql_print_information("[%s.%s]", dbname.str, name.str);
|
||||||
sql_print_information("time_now : [%d-%d-%d %d:%d:%d ]",
|
sql_print_information("time_now : [%d-%d-%d %d:%d:%d ]",
|
||||||
time_now.year, time_now.month, time_now.day,
|
time_now.year, time_now.month, time_now.day,
|
||||||
time_now.hour, time_now.minute, time_now.second);
|
time_now.hour, time_now.minute, time_now.second);
|
||||||
sql_print_information("starts : [%d-%d-%d %d:%d:%d ]", starts.year,
|
sql_print_information("starts : [%d-%d-%d %d:%d:%d ]", starts.year,
|
||||||
@ -712,10 +710,10 @@ event_timed::compute_next_execution_time()
|
|||||||
last_executed.second);
|
last_executed.second);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//if time_now is after ends don't execute anymore
|
/* If time_now is after ends don't execute anymore */
|
||||||
if (ends.year && (tmp= my_time_compare(&ends, &time_now)) == -1)
|
if (ends.year && (tmp= my_time_compare(&ends, &time_now)) == -1)
|
||||||
{
|
{
|
||||||
// time_now is after ends. don't execute anymore
|
/* time_now is after ends. don't execute anymore */
|
||||||
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
||||||
if (on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
|
if (on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
|
||||||
dropped= true;
|
dropped= true;
|
||||||
@ -724,17 +722,17 @@ event_timed::compute_next_execution_time()
|
|||||||
|
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Here time_now is before or equals ends if the latter is set.
|
Here time_now is before or equals ends if the latter is set.
|
||||||
Let's check whether time_now is before starts.
|
Let's check whether time_now is before starts.
|
||||||
If so schedule for starts
|
If so schedule for starts.
|
||||||
*/
|
*/
|
||||||
if (starts.year && (tmp= my_time_compare(&time_now, &starts)) < 1)
|
if (starts.year && (tmp= my_time_compare(&time_now, &starts)) < 1)
|
||||||
{
|
{
|
||||||
if (tmp == 0 && my_time_compare(&starts, &last_executed) == 0)
|
if (tmp == 0 && my_time_compare(&starts, &last_executed) == 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
time_now = starts = last_executed
|
time_now = starts = last_executed
|
||||||
do nothing or we will schedule for second time execution at starts.
|
do nothing or we will schedule for second time execution at starts.
|
||||||
*/
|
*/
|
||||||
@ -749,10 +747,10 @@ event_timed::compute_next_execution_time()
|
|||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (starts.year && ends.year)
|
if (starts.year && ends.year)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Both starts and m_ends are set and time_now is between them (incl.)
|
Both starts and m_ends are set and time_now is between them (incl.)
|
||||||
If last_executed is set then increase with m_expression. The new TIME is
|
If last_executed is set then increase with m_expression. The new TIME is
|
||||||
after m_ends set execute_at to 0. And check for on_completion
|
after m_ends set execute_at to 0. And check for on_completion
|
||||||
@ -763,14 +761,14 @@ event_timed::compute_next_execution_time()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
TIME next_exec;
|
TIME next_exec;
|
||||||
|
|
||||||
if (get_next_time(&next_exec, &last_executed, expression, interval))
|
if (get_next_time(&next_exec, &last_executed, expression, interval))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
// There was previous execution
|
/* There was previous execution */
|
||||||
if (my_time_compare(&ends, &next_exec) == -1)
|
if (my_time_compare(&ends, &next_exec) == -1)
|
||||||
{
|
{
|
||||||
// Next execution after ends. No more executions
|
/* Next execution after ends. No more executions */
|
||||||
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
set_zero_time(&execute_at, MYSQL_TIMESTAMP_DATETIME);
|
||||||
if (on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
|
if (on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
|
||||||
dropped= true;
|
dropped= true;
|
||||||
@ -782,20 +780,24 @@ event_timed::compute_next_execution_time()
|
|||||||
}
|
}
|
||||||
else if (!starts.year && !ends.year)
|
else if (!starts.year && !ends.year)
|
||||||
{
|
{
|
||||||
// both starts and m_ends are not set, se we schedule for the next
|
/*
|
||||||
// based on last_executed
|
Both starts and m_ends are not set, so we schedule for the next
|
||||||
|
based on last_executed.
|
||||||
|
*/
|
||||||
if (last_executed.year)
|
if (last_executed.year)
|
||||||
{
|
{
|
||||||
if (get_next_time(&execute_at, &last_executed, expression, interval))
|
if (get_next_time(&execute_at, &last_executed, expression, interval))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
//last_executed not set. Schedule the event for now
|
{
|
||||||
|
/* last_executed not set. Schedule the event for now */
|
||||||
execute_at= time_now;
|
execute_at= time_now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//either starts or m_ends is set
|
/* Either starts or m_ends is set */
|
||||||
if (starts.year)
|
if (starts.year)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -853,10 +855,10 @@ err:
|
|||||||
/*
|
/*
|
||||||
Set the internal last_executed TIME struct to now. NOW is the
|
Set the internal last_executed TIME struct to now. NOW is the
|
||||||
time according to thd->query_start(), so the THD's clock.
|
time according to thd->query_start(), so the THD's clock.
|
||||||
|
|
||||||
Synopsis
|
SYNOPSIS
|
||||||
event_timed::drop()
|
event_timed::drop()
|
||||||
thd - thread context
|
thd thread context
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -877,17 +879,17 @@ event_timed::mark_last_executed(THD *thd)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Drops the event
|
Drops the event
|
||||||
|
|
||||||
Synopsis
|
|
||||||
event_timed::drop()
|
|
||||||
thd - thread context
|
|
||||||
|
|
||||||
RETURNS :
|
SYNOPSIS
|
||||||
0 - OK
|
event_timed::drop()
|
||||||
-1 - Cannot open mysql.event
|
thd thread context
|
||||||
-2 - Cannot find the event in mysql.event (already deleted?)
|
|
||||||
|
RETURN VALUE
|
||||||
others - return code from SE in case deletion of the event row
|
0 OK
|
||||||
|
-1 Cannot open mysql.event
|
||||||
|
-2 Cannot find the event in mysql.event (already deleted?)
|
||||||
|
|
||||||
|
others return code from SE in case deletion of the event row
|
||||||
failed.
|
failed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -904,18 +906,18 @@ event_timed::drop(THD *thd)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Saves status and last_executed_at to the disk if changed.
|
Saves status and last_executed_at to the disk if changed.
|
||||||
|
|
||||||
Synopsis
|
SYNOPSIS
|
||||||
event_timed::drop()
|
event_timed::drop()
|
||||||
thd - thread context
|
thd - thread context
|
||||||
|
|
||||||
Returns :
|
RETURN VALUE
|
||||||
0 - OK
|
0 OK
|
||||||
SP_OPEN_TABLE_FAILED - Error while opening mysql.event for writing
|
SP_OPEN_TABLE_FAILED Error while opening mysql.event for writing
|
||||||
EVEX_WRITE_ROW_FAILED - On error to write to disk
|
EVEX_WRITE_ROW_FAILED On error to write to disk
|
||||||
|
|
||||||
others - return code from SE in case deletion of the event row
|
others return code from SE in case deletion of the event
|
||||||
failed.
|
row failed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@ -929,11 +931,11 @@ event_timed::update_fields(THD *thd)
|
|||||||
DBUG_ENTER("event_timed::update_time_fields");
|
DBUG_ENTER("event_timed::update_time_fields");
|
||||||
|
|
||||||
DBUG_PRINT("enter", ("name: %*s", name.length, name.str));
|
DBUG_PRINT("enter", ("name: %*s", name.length, name.str));
|
||||||
|
|
||||||
//no need to update if nothing has changed
|
/* No need to update if nothing has changed */
|
||||||
if (!(status_changed || last_executed_changed))
|
if (!(status_changed || last_executed_changed))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
thd->reset_n_backup_open_tables_state(&backup);
|
thd->reset_n_backup_open_tables_state(&backup);
|
||||||
|
|
||||||
if (evex_open_event_table(thd, TL_WRITE, &table))
|
if (evex_open_event_table(thd, TL_WRITE, &table))
|
||||||
@ -947,8 +949,8 @@ event_timed::update_fields(THD *thd)
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
store_record(table,record[1]);
|
store_record(table,record[1]);
|
||||||
// Don't update create on row update.
|
/* Don't update create on row update. */
|
||||||
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
||||||
|
|
||||||
if (last_executed_changed)
|
if (last_executed_changed)
|
||||||
{
|
{
|
||||||
@ -963,7 +965,7 @@ event_timed::update_fields(THD *thd)
|
|||||||
table->field[EVEX_FIELD_STATUS]->store((longlong)status);
|
table->field[EVEX_FIELD_STATUS]->store((longlong)status);
|
||||||
status_changed= false;
|
status_changed= false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((table->file->ha_update_row(table->record[1],table->record[0])))
|
if ((table->file->ha_update_row(table->record[1],table->record[0])))
|
||||||
ret= EVEX_WRITE_ROW_FAILED;
|
ret= EVEX_WRITE_ROW_FAILED;
|
||||||
|
|
||||||
@ -977,14 +979,16 @@ done:
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Get SHOW CREATE EVENT as string
|
Get SHOW CREATE EVENT as string
|
||||||
|
|
||||||
thd - Thread
|
SYNOPSIS
|
||||||
buf - String*, should be already allocated. CREATE EVENT goes inside.
|
event_timed::get_create_event(THD *thd, String *buf)
|
||||||
|
thd Thread
|
||||||
Returns:
|
buf String*, should be already allocated. CREATE EVENT goes inside.
|
||||||
0 - OK
|
|
||||||
1 - Error (for now if mysql.event has been tampered and MICROSECONDS
|
RETURN VALUE
|
||||||
interval or derivative has been put there.
|
0 OK
|
||||||
|
1 Error (for now if mysql.event has been tampered and MICROSECONDS
|
||||||
|
interval or derivative has been put there.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1017,9 +1021,9 @@ event_timed::get_create_event(THD *thd, String *buf)
|
|||||||
{
|
{
|
||||||
char dtime_buff[20*2+32];// +32 to make my_snprintf_{8bit|ucs2} happy
|
char dtime_buff[20*2+32];// +32 to make my_snprintf_{8bit|ucs2} happy
|
||||||
buf->append(STRING_WITH_LEN("AT '"));
|
buf->append(STRING_WITH_LEN("AT '"));
|
||||||
/*
|
/*
|
||||||
pass the buffer and the second param tells fills the buffer and returns
|
Pass the buffer and the second param tells fills the buffer and
|
||||||
the number of chars to copy
|
returns the number of chars to copy.
|
||||||
*/
|
*/
|
||||||
buf->append(dtime_buff, my_datetime_to_str(&execute_at, dtime_buff));
|
buf->append(dtime_buff, my_datetime_to_str(&execute_at, dtime_buff));
|
||||||
buf->append(STRING_WITH_LEN("'"));
|
buf->append(STRING_WITH_LEN("'"));
|
||||||
@ -1041,25 +1045,24 @@ event_timed::get_create_event(THD *thd, String *buf)
|
|||||||
append_unescaped(buf, comment.str, comment.length);
|
append_unescaped(buf, comment.str, comment.length);
|
||||||
}
|
}
|
||||||
buf->append(STRING_WITH_LEN(" DO "));
|
buf->append(STRING_WITH_LEN(" DO "));
|
||||||
buf->append(body.str, body.length);
|
buf->append(body.str, body.length);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Executes the event (the underlying sp_head object);
|
Executes the event (the underlying sp_head object);
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
evex_fill_row()
|
evex_fill_row()
|
||||||
thd THD
|
thd THD
|
||||||
mem_root If != NULL use it to compile the event on it
|
mem_root If != NULL use it to compile the event on it
|
||||||
|
|
||||||
Returns
|
RETURNS
|
||||||
0 - success
|
0 success
|
||||||
-100 - event in execution (parallel execution is impossible)
|
-100 event in execution (parallel execution is impossible)
|
||||||
others - retcodes of sp_head::execute_procedure()
|
others retcodes of sp_head::execute_procedure()
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1067,11 +1070,11 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
|
|||||||
{
|
{
|
||||||
List<Item> empty_item_list;
|
List<Item> empty_item_list;
|
||||||
int ret= 0;
|
int ret= 0;
|
||||||
|
|
||||||
DBUG_ENTER("event_timed::execute");
|
DBUG_ENTER("event_timed::execute");
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&this->LOCK_running));
|
VOID(pthread_mutex_lock(&this->LOCK_running));
|
||||||
if (running)
|
if (running)
|
||||||
{
|
{
|
||||||
VOID(pthread_mutex_unlock(&this->LOCK_running));
|
VOID(pthread_mutex_unlock(&this->LOCK_running));
|
||||||
DBUG_RETURN(-100);
|
DBUG_RETURN(-100);
|
||||||
@ -1081,10 +1084,10 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
|
|||||||
|
|
||||||
// TODO Andrey : make this as member variable and delete in destructor
|
// TODO Andrey : make this as member variable and delete in destructor
|
||||||
empty_item_list.empty();
|
empty_item_list.empty();
|
||||||
|
|
||||||
if (!sphead && (ret= compile(thd, mem_root)))
|
if (!sphead && (ret= compile(thd, mem_root)))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
ret= sphead->execute_procedure(thd, &empty_item_list);
|
ret= sphead->execute_procedure(thd, &empty_item_list);
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&this->LOCK_running));
|
VOID(pthread_mutex_lock(&this->LOCK_running));
|
||||||
@ -1106,17 +1109,16 @@ done:
|
|||||||
/*
|
/*
|
||||||
Compiles an event before it's execution. Compiles the anonymous
|
Compiles an event before it's execution. Compiles the anonymous
|
||||||
sp_head object held by the event
|
sp_head object held by the event
|
||||||
|
|
||||||
Synopsis
|
|
||||||
event_timed::compile()
|
|
||||||
thd - thread context, used for memory allocation mostly
|
|
||||||
mem_root - if != NULL then this memory root is used for allocs
|
|
||||||
instead of thd->mem_root
|
|
||||||
|
|
||||||
Returns
|
|
||||||
0 - Success
|
|
||||||
EVEX_COMPILE_ERROR - Error during compilation
|
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
event_timed::compile()
|
||||||
|
thd thread context, used for memory allocation mostly
|
||||||
|
mem_root if != NULL then this memory root is used for allocs
|
||||||
|
instead of thd->mem_root
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0 success
|
||||||
|
EVEX_COMPILE_ERROR error during compilation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1136,21 +1138,21 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
|
|||||||
CHARSET_INFO *old_character_set_client,
|
CHARSET_INFO *old_character_set_client,
|
||||||
*old_collation_connection,
|
*old_collation_connection,
|
||||||
*old_character_set_results;
|
*old_character_set_results;
|
||||||
|
|
||||||
show_create.length(0);
|
show_create.length(0);
|
||||||
old_character_set_client= thd->variables.character_set_client;
|
old_character_set_client= thd->variables.character_set_client;
|
||||||
old_character_set_results= thd->variables.character_set_results;
|
old_character_set_results= thd->variables.character_set_results;
|
||||||
old_collation_connection= thd->variables.collation_connection;
|
old_collation_connection= thd->variables.collation_connection;
|
||||||
|
|
||||||
thd->variables.character_set_client=
|
thd->variables.character_set_client=
|
||||||
thd->variables.character_set_results=
|
thd->variables.character_set_results=
|
||||||
thd->variables.collation_connection=
|
thd->variables.collation_connection=
|
||||||
get_charset_by_csname("utf8", MY_CS_PRIMARY, MYF(MY_WME));
|
get_charset_by_csname("utf8", MY_CS_PRIMARY, MYF(MY_WME));
|
||||||
|
|
||||||
thd->update_charset();
|
thd->update_charset();
|
||||||
|
|
||||||
DBUG_ENTER("event_timed::compile");
|
DBUG_ENTER("event_timed::compile");
|
||||||
// change the memory root for the execution time
|
/* Change the memory root for the execution time */
|
||||||
if (mem_root)
|
if (mem_root)
|
||||||
{
|
{
|
||||||
tmp_mem_root= thd->mem_root;
|
tmp_mem_root= thd->mem_root;
|
||||||
@ -1174,8 +1176,10 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
|
|||||||
{
|
{
|
||||||
DBUG_PRINT("error", ("error during compile or thd->is_fatal_error=%d",
|
DBUG_PRINT("error", ("error during compile or thd->is_fatal_error=%d",
|
||||||
thd->is_fatal_error));
|
thd->is_fatal_error));
|
||||||
// Free lex associated resources
|
/*
|
||||||
// QQ: Do we really need all this stuff here ?
|
Free lex associated resources
|
||||||
|
QQ: Do we really need all this stuff here?
|
||||||
|
*/
|
||||||
sql_print_error("error during compile of %s.%s or thd->is_fatal_error=%d",
|
sql_print_error("error during compile of %s.%s or thd->is_fatal_error=%d",
|
||||||
dbname.str, name.str, thd->is_fatal_error);
|
dbname.str, name.str, thd->is_fatal_error);
|
||||||
if (lex.sphead)
|
if (lex.sphead)
|
||||||
@ -1189,11 +1193,13 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("note", ("success compiling %s.%s", dbname.str, name.str));
|
DBUG_PRINT("note", ("success compiling %s.%s", dbname.str, name.str));
|
||||||
|
|
||||||
sphead= lex.et->sphead;
|
sphead= lex.et->sphead;
|
||||||
sphead->m_db= dbname;
|
sphead->m_db= dbname;
|
||||||
//copy also chistics since they will vanish otherwise we get 0x0 pointer
|
/*
|
||||||
// Todo : Handle sql_mode !!
|
Ccopy also chistics since they will vanish otherwise we get 0x0 pointer
|
||||||
|
TODO: Handle sql_mode!!
|
||||||
|
*/
|
||||||
sphead->set_definer(definer.str, definer.length);
|
sphead->set_definer(definer.str, definer.length);
|
||||||
sphead->set_info(0, 0, &lex.sp_chistics, 0/*sql_mode*/);
|
sphead->set_info(0, 0, &lex.sp_chistics, 0/*sql_mode*/);
|
||||||
sphead->optimize();
|
sphead->optimize();
|
||||||
@ -1214,9 +1220,7 @@ done:
|
|||||||
thd->variables.collation_connection= old_collation_connection;
|
thd->variables.collation_connection= old_collation_connection;
|
||||||
thd->update_charset();
|
thd->update_charset();
|
||||||
|
|
||||||
/*
|
/* Change the memory root for the execution time. */
|
||||||
Change the memory root for the execution time.
|
|
||||||
*/
|
|
||||||
if (mem_root)
|
if (mem_root)
|
||||||
thd->mem_root= tmp_mem_root;
|
thd->mem_root= tmp_mem_root;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user