Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
3f6de6c5
Commit
3f6de6c5
authored
Jul 13, 2006
by
andrey@lmy004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update to ease the patch process
parent
9eee0ee4
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1523 additions
and
418 deletions
+1523
-418
.bzrignore
.bzrignore
+1103
-0
sql/Makefile.am
sql/Makefile.am
+3
-3
sql/event_data_objects.cc
sql/event_data_objects.cc
+165
-159
sql/event_queue.cc
sql/event_queue.cc
+20
-20
sql/event_queue.h
sql/event_queue.h
+1
-3
sql/event_scheduler.cc
sql/event_scheduler.cc
+230
-232
sql/event_scheduler.h
sql/event_scheduler.h
+1
-1
No files found.
.bzrignore
View file @
3f6de6c5
This diff is collapsed.
Click to expand it.
sql/Makefile.am
View file @
3f6de6c5
...
...
@@ -65,8 +65,8 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h
\
parse_file.h sql_view.h sql_trigger.h
\
sql_array.h sql_cursor.h events.h
\
event_db_repository.h event_queue.h
\
sql_plugin.h authors.h sql_partition.h event_data_objects.h
\
event_queue.h event_db_repository.h
\
partition_info.h partition_element.h event_scheduler.h
\
contributors.h
mysqld_SOURCES
=
sql_lex.cc sql_handler.cc sql_partition.cc
\
...
...
@@ -104,8 +104,8 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
gstream.cc spatial.cc sql_help.cc sql_cursor.cc
\
tztime.cc my_time.c my_user.c my_decimal.cc
\
sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.cc
\
sp_cache.cc parse_file.cc sql_trigger.cc
event_scheduler.cc
\
events.cc event_data_objects.cc
\
sp_cache.cc parse_file.cc sql_trigger.cc
\
event
_scheduler.cc event
s.cc event_data_objects.cc
\
event_queue.cc event_db_repository.cc
\
sql_plugin.cc sql_binlog.cc
\
sql_builtin.cc sql_tablespace.cc partition_info.cc
...
...
sql/event_data_objects.cc
View file @
3f6de6c5
...
...
@@ -24,65 +24,12 @@
#define EVEX_MAX_INTERVAL_VALUE 1000000000L
/*
Switches the security context
SYNOPSIS
event_change_security_context()
thd Thread
user The user
host The host of the user
db The schema for which the security_ctx will be loaded
backup Where to store the old context
RETURN VALUE
FALSE OK
TRUE Error (generates error too)
*/
static
bool
event_change_security_context
(
THD
*
thd
,
LEX_STRING
user
,
LEX_STRING
host
,
LEX_STRING
db
,
Security_context
*
backup
)
{
DBUG_ENTER
(
"event_change_security_context"
);
DBUG_PRINT
(
"info"
,(
"%s@%s@%s"
,
user
.
str
,
host
.
str
,
db
.
str
));
#ifndef NO_EMBEDDED_ACCESS_CHECKS
*
backup
=
thd
->
main_security_ctx
;
if
(
acl_getroot_no_password
(
&
thd
->
main_security_ctx
,
user
.
str
,
host
.
str
,
host
.
str
,
db
.
str
))
{
my_error
(
ER_NO_SUCH_USER
,
MYF
(
0
),
user
.
str
,
host
.
str
);
DBUG_RETURN
(
TRUE
);
}
thd
->
security_ctx
=
&
thd
->
main_security_ctx
;
#endif
DBUG_RETURN
(
FALSE
);
}
/*
Restores the security context
SYNOPSIS
event_restore_security_context()
thd Thread
backup Context to switch to
*/
LEX_STRING
db
,
Security_context
*
backup
);
static
void
event_restore_security_context
(
THD
*
thd
,
Security_context
*
backup
)
{
DBUG_ENTER
(
"event_restore_security_context"
);
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if
(
backup
)
{
thd
->
main_security_ctx
=
*
backup
;
thd
->
security_ctx
=
&
thd
->
main_security_ctx
;
}
#endif
DBUG_VOID_RETURN
;
}
event_restore_security_context
(
THD
*
thd
,
Security_context
*
backup
);
/*
Returns a new instance
...
...
@@ -236,47 +183,6 @@ Event_parse_data::init_body(THD *thd)
}
/*
Inits definer (definer_user and definer_host) during parsing.
SYNOPSIS
Event_parse_data::init_definer()
thd Thread
*/
void
Event_parse_data
::
init_definer
(
THD
*
thd
)
{
int
definer_user_len
;
int
definer_host_len
;
DBUG_ENTER
(
"Event_parse_data::init_definer"
);
DBUG_PRINT
(
"info"
,(
"init definer_user thd->mem_root=0x%lx "
"thd->sec_ctx->priv_user=0x%lx"
,
thd
->
mem_root
,
thd
->
security_ctx
->
priv_user
));
definer_user_len
=
strlen
(
thd
->
security_ctx
->
priv_user
);
definer_host_len
=
strlen
(
thd
->
security_ctx
->
priv_host
);
/* + 1 for @ */
DBUG_PRINT
(
"info"
,(
"init definer as whole"
));
definer
.
length
=
definer_user_len
+
definer_host_len
+
1
;
definer
.
str
=
thd
->
alloc
(
definer
.
length
+
1
);
DBUG_PRINT
(
"info"
,(
"copy the user"
));
memcpy
(
definer
.
str
,
thd
->
security_ctx
->
priv_user
,
definer_user_len
);
definer
.
str
[
definer_user_len
]
=
'@'
;
DBUG_PRINT
(
"info"
,(
"copy the host"
));
memcpy
(
definer
.
str
+
definer_user_len
+
1
,
thd
->
security_ctx
->
priv_host
,
definer_host_len
);
definer
.
str
[
definer
.
length
]
=
'\0'
;
DBUG_PRINT
(
"info"
,(
"definer [%s] initted"
,
definer
.
str
));
DBUG_VOID_RETURN
;
}
/*
Sets time for execution for one-time event.
...
...
@@ -645,6 +551,47 @@ Event_parse_data::check_parse_data(THD *thd)
}
/*
Inits definer (definer_user and definer_host) during parsing.
SYNOPSIS
Event_parse_data::init_definer()
thd Thread
*/
void
Event_parse_data
::
init_definer
(
THD
*
thd
)
{
int
definer_user_len
;
int
definer_host_len
;
DBUG_ENTER
(
"Event_parse_data::init_definer"
);
DBUG_PRINT
(
"info"
,(
"init definer_user thd->mem_root=0x%lx "
"thd->sec_ctx->priv_user=0x%lx"
,
thd
->
mem_root
,
thd
->
security_ctx
->
priv_user
));
definer_user_len
=
strlen
(
thd
->
security_ctx
->
priv_user
);
definer_host_len
=
strlen
(
thd
->
security_ctx
->
priv_host
);
/* + 1 for @ */
DBUG_PRINT
(
"info"
,(
"init definer as whole"
));
definer
.
length
=
definer_user_len
+
definer_host_len
+
1
;
definer
.
str
=
thd
->
alloc
(
definer
.
length
+
1
);
DBUG_PRINT
(
"info"
,(
"copy the user"
));
memcpy
(
definer
.
str
,
thd
->
security_ctx
->
priv_user
,
definer_user_len
);
definer
.
str
[
definer_user_len
]
=
'@'
;
DBUG_PRINT
(
"info"
,(
"copy the host"
));
memcpy
(
definer
.
str
+
definer_user_len
+
1
,
thd
->
security_ctx
->
priv_host
,
definer_host_len
);
definer
.
str
[
definer
.
length
]
=
'\0'
;
DBUG_PRINT
(
"info"
,(
"definer [%s] initted"
,
definer
.
str
));
DBUG_VOID_RETURN
;
}
/*
Constructor
...
...
@@ -1667,6 +1614,69 @@ Event_job_data::get_fake_create_event(THD *thd, String *buf)
}
/*
Executes the event (the underlying sp_head object);
SYNOPSIS
Event_job_data::execute()
thd THD
RETURN VALUE
0 success
-99 No rights on this.dbname.str
others retcodes of sp_head::execute_procedure()
*/
int
Event_job_data
::
execute
(
THD
*
thd
)
{
Security_context
save_ctx
;
/* this one is local and not needed after exec */
int
ret
=
0
;
DBUG_ENTER
(
"Event_job_data::execute"
);
DBUG_PRINT
(
"info"
,
(
"EXECUTING %s.%s"
,
dbname
.
str
,
name
.
str
));
if
((
ret
=
compile
(
thd
,
NULL
)))
goto
done
;
event_change_security_context
(
thd
,
definer_user
,
definer_host
,
dbname
,
&
save_ctx
);
/*
THD::~THD will clean this or if there is DROP DATABASE in the SP then
it will be free there. It should not point to our buffer which is allocated
on a mem_root.
*/
thd
->
db
=
my_strdup
(
dbname
.
str
,
MYF
(
0
));
thd
->
db_length
=
dbname
.
length
;
if
(
!
check_access
(
thd
,
EVENT_ACL
,
dbname
.
str
,
0
,
0
,
0
,
is_schema_db
(
dbname
.
str
)))
{
List
<
Item
>
empty_item_list
;
empty_item_list
.
empty
();
if
(
thd
->
enable_slow_log
)
sphead
->
m_flags
|=
sp_head
::
LOG_SLOW_STATEMENTS
;
sphead
->
m_flags
|=
sp_head
::
LOG_GENERAL_LOG
;
ret
=
sphead
->
execute_procedure
(
thd
,
&
empty_item_list
);
}
else
{
DBUG_PRINT
(
"error"
,
(
"%s@%s has no rights on %s"
,
definer_user
.
str
,
definer_host
.
str
,
dbname
.
str
));
ret
=
-
99
;
}
event_restore_security_context
(
thd
,
&
save_ctx
);
done:
thd
->
end_statement
();
thd
->
cleanup_after_query
();
DBUG_PRINT
(
"info"
,
(
"EXECUTED %s.%s ret=%d"
,
dbname
.
str
,
name
.
str
,
ret
));
DBUG_RETURN
(
ret
);
}
/*
Compiles an event before it's execution. Compiles the anonymous
sp_head object held by the event
...
...
@@ -1799,69 +1809,6 @@ Event_job_data::compile(THD *thd, MEM_ROOT *mem_root)
}
/*
Executes the event (the underlying sp_head object);
SYNOPSIS
Event_job_data::execute()
thd THD
RETURN VALUE
0 success
-99 No rights on this.dbname.str
others retcodes of sp_head::execute_procedure()
*/
int
Event_job_data
::
execute
(
THD
*
thd
)
{
Security_context
save_ctx
;
/* this one is local and not needed after exec */
int
ret
=
0
;
DBUG_ENTER
(
"Event_job_data::execute"
);
DBUG_PRINT
(
"info"
,
(
"EXECUTING %s.%s"
,
dbname
.
str
,
name
.
str
));
if
((
ret
=
compile
(
thd
,
NULL
)))
goto
done
;
event_change_security_context
(
thd
,
definer_user
,
definer_host
,
dbname
,
&
save_ctx
);
/*
THD::~THD will clean this or if there is DROP DATABASE in the SP then
it will be free there. It should not point to our buffer which is allocated
on a mem_root.
*/
thd
->
db
=
my_strdup
(
dbname
.
str
,
MYF
(
0
));
thd
->
db_length
=
dbname
.
length
;
if
(
!
check_access
(
thd
,
EVENT_ACL
,
dbname
.
str
,
0
,
0
,
0
,
is_schema_db
(
dbname
.
str
)))
{
List
<
Item
>
empty_item_list
;
empty_item_list
.
empty
();
if
(
thd
->
enable_slow_log
)
sphead
->
m_flags
|=
sp_head
::
LOG_SLOW_STATEMENTS
;
sphead
->
m_flags
|=
sp_head
::
LOG_GENERAL_LOG
;
ret
=
sphead
->
execute_procedure
(
thd
,
&
empty_item_list
);
}
else
{
DBUG_PRINT
(
"error"
,
(
"%s@%s has no rights on %s"
,
definer_user
.
str
,
definer_host
.
str
,
dbname
.
str
));
ret
=
-
99
;
}
event_restore_security_context
(
thd
,
&
save_ctx
);
done:
thd
->
end_statement
();
thd
->
cleanup_after_query
();
DBUG_PRINT
(
"info"
,
(
"EXECUTED %s.%s ret=%d"
,
dbname
.
str
,
name
.
str
,
ret
));
DBUG_RETURN
(
ret
);
}
/*
Checks whether two events are in the same schema
...
...
@@ -1899,3 +1846,62 @@ event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b)
return
!
sortcmp_lex_string
(
name
,
b
->
name
,
system_charset_info
)
&&
!
sortcmp_lex_string
(
db
,
b
->
dbname
,
system_charset_info
);
}
/*
Switches the security context
SYNOPSIS
event_change_security_context()
thd Thread
user The user
host The host of the user
db The schema for which the security_ctx will be loaded
backup Where to store the old context
RETURN VALUE
FALSE OK
TRUE Error (generates error too)
*/
static
bool
event_change_security_context
(
THD
*
thd
,
LEX_STRING
user
,
LEX_STRING
host
,
LEX_STRING
db
,
Security_context
*
backup
)
{
DBUG_ENTER
(
"event_change_security_context"
);
DBUG_PRINT
(
"info"
,(
"%s@%s@%s"
,
user
.
str
,
host
.
str
,
db
.
str
));
#ifndef NO_EMBEDDED_ACCESS_CHECKS
*
backup
=
thd
->
main_security_ctx
;
if
(
acl_getroot_no_password
(
&
thd
->
main_security_ctx
,
user
.
str
,
host
.
str
,
host
.
str
,
db
.
str
))
{
my_error
(
ER_NO_SUCH_USER
,
MYF
(
0
),
user
.
str
,
host
.
str
);
DBUG_RETURN
(
TRUE
);
}
thd
->
security_ctx
=
&
thd
->
main_security_ctx
;
#endif
DBUG_RETURN
(
FALSE
);
}
/*
Restores the security context
SYNOPSIS
event_restore_security_context()
thd Thread
backup Context to switch to
*/
static
void
event_restore_security_context
(
THD
*
thd
,
Security_context
*
backup
)
{
DBUG_ENTER
(
"event_restore_security_context"
);
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if
(
backup
)
{
thd
->
main_security_ctx
=
*
backup
;
thd
->
security_ctx
=
&
thd
->
main_security_ctx
;
}
#endif
DBUG_VOID_RETURN
;
}
sql/event_queue.cc
View file @
3f6de6c5
...
...
@@ -41,6 +41,7 @@ struct event_queue_param
Event_queue
*
queue
;
pthread_mutex_t
LOCK_loaded
;
pthread_cond_t
COND_loaded
;
bool
loading_finished
;
};
...
...
@@ -85,9 +86,14 @@ event_queue_loader_thread(void *arg)
DBUG_ENTER
(
"event_queue_loader_thread"
);
pthread_mutex_lock
(
&
param
->
LOCK_loaded
);
param
->
queue
->
check_system_tables
(
thd
);
param
->
queue
->
load_events_from_db
(
thd
);
param
->
loading_finished
=
TRUE
;
pthread_cond_signal
(
&
param
->
COND_loaded
);
pthread_mutex_unlock
(
&
param
->
LOCK_loaded
);
end:
...
...
@@ -113,8 +119,6 @@ Event_queue::Event_queue()
mutex_last_attempted_lock_in_func
=
""
;
mutex_queue_data_locked
=
mutex_queue_data_attempting_lock
=
FALSE
;
queue_loaded
=
FALSE
;
}
...
...
@@ -195,8 +199,10 @@ Event_queue::init_queue(Event_db_repository *db_repo, Event_scheduler *sched)
event_queue_param_value
=
(
struct
event_queue_param
*
)
my_malloc
(
sizeof
(
struct
event_queue_param
),
MYF
(
0
));
event_queue_param_value
->
thd
=
new_thd
;
event_queue_param_value
->
queue
=
this
;
event_queue_param_value
->
loading_finished
=
FALSE
;
pthread_mutex_init
(
&
event_queue_param_value
->
LOCK_loaded
,
MY_MUTEX_INIT_FAST
);
pthread_cond_init
(
&
event_queue_param_value
->
COND_loaded
,
NULL
);
...
...
@@ -207,8 +213,8 @@ Event_queue::init_queue(Event_db_repository *db_repo, Event_scheduler *sched)
{
do
{
pthread_cond_wait
(
&
event_queue_param_value
->
COND_loaded
,
&
event_queue_param_value
->
LOCK_loaded
);
}
while
(
queue_load
ed
==
FALSE
);
&
event_queue_param_value
->
LOCK_loaded
);
}
while
(
event_queue_param_value
->
loading_finish
ed
==
FALSE
);
}
pthread_mutex_unlock
(
&
event_queue_param_value
->
LOCK_loaded
);
...
...
@@ -662,8 +668,6 @@ Event_queue::load_events_from_db(THD *thd)
close_thread_tables
(
thd
);
queue_loaded
=
TRUE
;
DBUG_PRINT
(
"info"
,
(
"Status code %d. Loaded %d event(s)"
,
ret
,
count
));
DBUG_RETURN
(
ret
);
}
...
...
@@ -683,7 +687,7 @@ Event_queue::load_events_from_db(THD *thd)
TRUE Error
*/
bool
void
Event_queue
::
check_system_tables
(
THD
*
thd
)
{
TABLE_LIST
tables
;
...
...
@@ -702,39 +706,35 @@ Event_queue::check_system_tables(THD *thd)
tables
.
lock_type
=
TL_READ
;
if
((
ret
=
simple_open_n_lock_tables
(
thd
,
&
tables
)))
sql_print_error
(
"Cannot open mysql.db"
);
else
{
ret
=
table_check_intact
(
tables
.
table
,
MYSQL_DB_FIELD_COUNT
,
mysql_db_table_fields
,
&
mysql_db_table_last_check
,
ER_CANNOT_LOAD_FROM_TABLE
);
close_thread_tables
(
thd
);
sql_print_error
(
"Cannot open mysql.db"
);
goto
end
;
}
if
(
ret
)
DBUG_RETURN
(
TRUE
);
ret
=
table_check_intact
(
tables
.
table
,
MYSQL_DB_FIELD_COUNT
,
mysql_db_table_fields
,
&
mysql_db_table_last_check
,
ER_CANNOT_LOAD_FROM_TABLE
);
close_thread_tables
(
thd
);
bzero
((
char
*
)
&
tables
,
sizeof
(
tables
));
tables
.
db
=
(
char
*
)
"mysql"
;
tables
.
table_name
=
tables
.
alias
=
(
char
*
)
"user"
;
tables
.
lock_type
=
TL_READ
;
if
(
(
ret
=
simple_open_n_lock_tables
(
thd
,
&
tables
)
))
if
(
simple_open_n_lock_tables
(
thd
,
&
tables
))
sql_print_error
(
"Cannot open mysql.db"
);
else
{
if
(
tables
.
table
->
s
->
fields
<
29
||
strncmp
(
tables
.
table
->
field
[
29
]
->
field_name
,
STRING_WITH_LEN
(
"Event_priv"
)))
{
sql_print_error
(
"mysql.user has no `Event_priv` column at position 29"
);
ret
=
TRUE
;
}
close_thread_tables
(
thd
);
}
end:
thd
->
restore_backup_open_tables_state
(
&
backup
);
DBUG_
RETURN
(
ret
)
;
DBUG_
VOID_RETURN
;
}
...
...
sql/event_queue.h
View file @
3f6de6c5
...
...
@@ -56,7 +56,7 @@ class Event_queue
void
drop_schema_events
(
THD
*
thd
,
LEX_STRING
schema
);
static
bool
void
check_system_tables
(
THD
*
thd
);
void
...
...
@@ -99,8 +99,6 @@ class Event_queue
/* The sorted queue with the Event_job_data objects */
QUEUE
queue
;
bool
queue_loaded
;
uint
mutex_last_locked_at_line
;
uint
mutex_last_unlocked_at_line
;
uint
mutex_last_attempted_lock_at_line
;
...
...
sql/event_scheduler.cc
View file @
3f6de6c5
This diff is collapsed.
Click to expand it.
sql/event_scheduler.h
View file @
3f6de6c5
...
...
@@ -56,7 +56,7 @@ class Event_scheduler
bool
run
(
THD
*
thd
);
bool
void
init_scheduler
(
Event_queue
*
queue
);
void
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment