mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
MDEV-19275 Provide SQL service to plugins.
Protocol_local fixed so it can be used now. Some Protocol:: methods made virtual so they can adapt. as well as net_ok and net_send_error functions. execute_sql_string function is exported to the plugins. To be changed with the mysql_use_result.
This commit is contained in:
parent
68cba09173
commit
b01c426146
15 changed files with 816 additions and 416 deletions
|
@ -491,8 +491,8 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
|
|||
*prev_row= NULL;
|
||||
data->embedded_info->prev_ptr= prev_row;
|
||||
return_ok:
|
||||
net_send_eof(thd, thd->server_status,
|
||||
thd->get_stmt_da()->current_statement_warn_count());
|
||||
thd->protocol->net_send_eof(thd, thd->server_status,
|
||||
thd->get_stmt_da()->current_statement_warn_count());
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
DBUG_RETURN(1);
|
||||
|
|
|
@ -81,4 +81,3 @@ public:
|
|||
uint emb_count_querycache_size(THD *thd);
|
||||
int emb_load_querycache_result(THD *thd, Querycache_stream *src);
|
||||
void emb_store_querycache_result(Querycache_stream *dst, THD* thd);
|
||||
bool net_send_eof(THD *thd, uint server_status, uint total_warn_count);
|
||||
|
|
|
@ -1139,7 +1139,7 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
|||
|
||||
for (uint pos= 0 ; (item= it++); pos++)
|
||||
{
|
||||
if (prot.store_field_metadata(thd, item, pos))
|
||||
if (prot.store_item_metadata(thd, item, pos))
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -1254,8 +1254,7 @@ bool Protocol_binary::write()
|
|||
@retval FALSE Success
|
||||
*/
|
||||
|
||||
bool
|
||||
net_send_ok(THD *thd,
|
||||
bool Protocol::net_send_ok(THD *thd,
|
||||
uint server_status, uint statement_warn_count,
|
||||
ulonglong affected_rows, ulonglong id, const char *message,
|
||||
bool, bool)
|
||||
|
@ -1290,7 +1289,7 @@ net_send_ok(THD *thd,
|
|||
*/
|
||||
|
||||
bool
|
||||
net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
Protocol::net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
{
|
||||
bool error= write_eof_packet(thd, server_status, statement_warn_count);
|
||||
thd->cur_data= 0;
|
||||
|
@ -1298,8 +1297,8 @@ net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
|||
}
|
||||
|
||||
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char *sqlstate)
|
||||
bool Protocol::net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char *sqlstate)
|
||||
{
|
||||
uint error;
|
||||
char converted_err[MYSQL_ERRMSG_SIZE];
|
||||
|
|
|
@ -1087,11 +1087,6 @@ unsigned int STDCALL mysql_field_count(MYSQL *mysql)
|
|||
return mysql->field_count;
|
||||
}
|
||||
|
||||
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql)
|
||||
{
|
||||
return mysql->affected_rows;
|
||||
}
|
||||
|
||||
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
|
||||
{
|
||||
return mysql->insert_id;
|
||||
|
|
|
@ -3735,6 +3735,12 @@ static MYSQL_RES * cli_use_result(MYSQL *mysql)
|
|||
}
|
||||
|
||||
|
||||
my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql)
|
||||
{
|
||||
return mysql->affected_rows;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Return next row of the query results
|
||||
**************************************************************************/
|
||||
|
|
|
@ -2553,7 +2553,7 @@ void close_connection(THD *thd, uint sql_errno)
|
|||
|
||||
if (sql_errno)
|
||||
{
|
||||
net_send_error(thd, sql_errno, ER_DEFAULT(sql_errno), NULL);
|
||||
thd->protocol->net_send_error(thd, sql_errno, ER_DEFAULT(sql_errno), NULL);
|
||||
thd->print_aborted_warning(lvl, ER_DEFAULT(sql_errno));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -32,13 +32,6 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
static const unsigned int PACKET_BUFFER_EXTRA_ALLOC= 1024;
|
||||
/* Declared non-static only because of the embedded library. */
|
||||
bool net_send_error_packet(THD *, uint, const char *, const char *);
|
||||
/* Declared non-static only because of the embedded library. */
|
||||
bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *,
|
||||
bool, bool);
|
||||
/* Declared non-static only because of the embedded library. */
|
||||
bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count);
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
static bool write_eof_packet(THD *, NET *, uint, uint);
|
||||
#endif
|
||||
|
@ -152,11 +145,11 @@ bool Protocol_binary::net_store_data_cs(const uchar *from, size_t length,
|
|||
@retval TRUE An error occurred and the message wasn't sent properly
|
||||
*/
|
||||
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
bool Protocol::net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
{
|
||||
bool error;
|
||||
DBUG_ENTER("net_send_error");
|
||||
DBUG_ENTER("Protocol::net_send_error");
|
||||
|
||||
DBUG_ASSERT(!thd->spcont);
|
||||
DBUG_ASSERT(sql_errno);
|
||||
|
@ -214,11 +207,11 @@ bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
|||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
bool
|
||||
net_send_ok(THD *thd,
|
||||
uint server_status, uint statement_warn_count,
|
||||
ulonglong affected_rows, ulonglong id, const char *message,
|
||||
bool is_eof,
|
||||
bool skip_flush)
|
||||
Protocol::net_send_ok(THD *thd,
|
||||
uint server_status, uint statement_warn_count,
|
||||
ulonglong affected_rows, ulonglong id,
|
||||
const char *message, bool is_eof,
|
||||
bool skip_flush)
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
StringBuffer<MYSQL_ERRMSG_SIZE + 10> store;
|
||||
|
@ -226,7 +219,7 @@ net_send_ok(THD *thd,
|
|||
bool state_changed= false;
|
||||
|
||||
bool error= FALSE;
|
||||
DBUG_ENTER("net_send_ok");
|
||||
DBUG_ENTER("Protocol::net_send_ok");
|
||||
|
||||
if (! net->vio) // hack for re-parsing queries
|
||||
{
|
||||
|
@ -329,11 +322,11 @@ static uchar eof_buff[1]= { (uchar) 254 }; /* Marker for end of fields */
|
|||
*/
|
||||
|
||||
bool
|
||||
net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
Protocol::net_send_eof(THD *thd, uint server_status, uint statement_warn_count)
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
bool error= FALSE;
|
||||
DBUG_ENTER("net_send_eof");
|
||||
DBUG_ENTER("Protocol::net_send_eof");
|
||||
|
||||
/*
|
||||
Check if client understand new format packets (OK instead of EOF)
|
||||
|
@ -420,8 +413,8 @@ static bool write_eof_packet(THD *thd, NET *net,
|
|||
@retval TRUE An error occurred and the messages wasn't sent properly
|
||||
*/
|
||||
|
||||
bool net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
bool Protocol::net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate)
|
||||
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
|
@ -434,7 +427,7 @@ bool net_send_error_packet(THD *thd, uint sql_errno, const char *err,
|
|||
char buff[2+1+SQLSTATE_LENGTH+MYSQL_ERRMSG_SIZE], *pos;
|
||||
my_bool ret;
|
||||
uint8 save_compress;
|
||||
DBUG_ENTER("send_error_packet");
|
||||
DBUG_ENTER("Protocol::send_error_packet");
|
||||
|
||||
if (net->vio == 0)
|
||||
{
|
||||
|
@ -963,7 +956,7 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
|||
for (uint pos= 0; (item=it++); pos++)
|
||||
{
|
||||
prot.prepare_for_resend();
|
||||
if (prot.store_field_metadata(thd, item, pos))
|
||||
if (prot.store_item_metadata(thd, item, pos))
|
||||
goto err;
|
||||
if (prot.write())
|
||||
DBUG_RETURN(1);
|
||||
|
@ -1043,7 +1036,7 @@ bool Protocol::write()
|
|||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
|
||||
bool Protocol_text::store_field_metadata(THD *thd, Item *item, uint pos)
|
||||
bool Protocol_text::store_item_metadata(THD *thd, Item *item, uint pos)
|
||||
{
|
||||
Send_field field(thd, item);
|
||||
return store_field_metadata(thd, field, item->charset_for_protocol(), pos);
|
||||
|
|
|
@ -50,14 +50,13 @@ protected:
|
|||
}
|
||||
#endif
|
||||
uint field_count;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
bool net_store_data(const uchar *from, size_t length);
|
||||
bool net_store_data_cs(const uchar *from, size_t length,
|
||||
CHARSET_INFO *fromcs, CHARSET_INFO *tocs);
|
||||
#else
|
||||
virtual bool net_store_data(const uchar *from, size_t length);
|
||||
virtual bool net_store_data_cs(const uchar *from, size_t length,
|
||||
CHARSET_INFO *fromcs, CHARSET_INFO *tocs);
|
||||
virtual bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *,
|
||||
bool, bool);
|
||||
virtual bool net_send_error_packet(THD *, uint, const char *, const char *);
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
char **next_field;
|
||||
MYSQL_FIELD *next_mysql_field;
|
||||
MEM_ROOT *alloc;
|
||||
|
@ -181,6 +180,9 @@ public:
|
|||
};
|
||||
virtual enum enum_protocol_type type()= 0;
|
||||
|
||||
virtual bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count);
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate);
|
||||
void end_statement();
|
||||
|
||||
friend int send_answer_1(Protocol *protocol, String *s1, String *s2,
|
||||
|
@ -191,7 +193,7 @@ public:
|
|||
|
||||
/** Class used for the old (MySQL 4.0 protocol). */
|
||||
|
||||
class Protocol_text final :public Protocol
|
||||
class Protocol_text :public Protocol
|
||||
{
|
||||
StringBuffer<FLOATING_POINT_BUFFER> buffer;
|
||||
bool store_numeric_string_aux(const char *from, size_t length);
|
||||
|
@ -226,10 +228,10 @@ public:
|
|||
#ifdef EMBEDDED_LIBRARY
|
||||
void remove_last_row() override;
|
||||
#endif
|
||||
bool store_field_metadata(const THD *thd, const Send_field &field,
|
||||
CHARSET_INFO *charset_for_protocol,
|
||||
uint pos);
|
||||
bool store_field_metadata(THD *thd, Item *item, uint pos);
|
||||
virtual bool store_field_metadata(const THD *thd, const Send_field &field,
|
||||
CHARSET_INFO *charset_for_protocol,
|
||||
uint pos);
|
||||
bool store_item_metadata(THD *thd, Item *item, uint pos);
|
||||
bool store_field_metadata_for_list_fields(const THD *thd, Field *field,
|
||||
const TABLE_LIST *table_list,
|
||||
uint pos);
|
||||
|
@ -321,8 +323,6 @@ public:
|
|||
|
||||
|
||||
void send_warning(THD *thd, uint sql_errno, const char *err=0);
|
||||
bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
||||
const char* sqlstate);
|
||||
void net_send_progress_packet(THD *thd);
|
||||
uchar *net_store_data(uchar *to,const uchar *from, size_t length);
|
||||
uchar *net_store_data(uchar *to,int32 from);
|
||||
|
|
|
@ -254,35 +254,36 @@ void mysql_audit_notify_connection_disconnect(THD *thd, int errcode)
|
|||
}
|
||||
|
||||
static inline
|
||||
void mysql_audit_notify_connection_change_user(THD *thd)
|
||||
void mysql_audit_notify_connection_change_user(THD *thd,
|
||||
const Security_context *old_ctx)
|
||||
{
|
||||
if (mysql_audit_connection_enabled())
|
||||
{
|
||||
const Security_context *sctx= thd->security_ctx;
|
||||
mysql_event_connection event;
|
||||
|
||||
event.event_subclass= MYSQL_AUDIT_CONNECTION_CHANGE_USER;
|
||||
event.status= thd->get_stmt_da()->is_error() ?
|
||||
thd->get_stmt_da()->sql_errno() : 0;
|
||||
event.thread_id= (unsigned long)thd->thread_id;
|
||||
event.user= sctx->user;
|
||||
event.user_length= safe_strlen_uint(sctx->user);
|
||||
event.priv_user= sctx->priv_user;
|
||||
event.priv_user_length= strlen_uint(sctx->priv_user);
|
||||
event.external_user= sctx->external_user;
|
||||
event.external_user_length= safe_strlen_uint(sctx->external_user);
|
||||
event.proxy_user= sctx->proxy_user;
|
||||
event.proxy_user_length= strlen_uint(sctx->proxy_user);
|
||||
event.host= sctx->host;
|
||||
event.host_length= safe_strlen_uint(sctx->host);
|
||||
event.ip= sctx->ip;
|
||||
event.ip_length= safe_strlen_uint(sctx->ip);
|
||||
event.user= old_ctx->user;
|
||||
event.user_length= safe_strlen_uint(old_ctx->user);
|
||||
event.priv_user= old_ctx->priv_user;
|
||||
event.priv_user_length= strlen_uint(old_ctx->priv_user);
|
||||
event.external_user= old_ctx->external_user;
|
||||
event.external_user_length= safe_strlen_uint(old_ctx->external_user);
|
||||
event.proxy_user= old_ctx->proxy_user;
|
||||
event.proxy_user_length= strlen_uint(old_ctx->proxy_user);
|
||||
event.host= old_ctx->host;
|
||||
event.host_length= safe_strlen_uint(old_ctx->host);
|
||||
event.ip= old_ctx->ip;
|
||||
event.ip_length= safe_strlen_uint(old_ctx->ip);
|
||||
event.database= thd->db;
|
||||
|
||||
mysql_audit_notify(thd, MYSQL_AUDIT_CONNECTION_CLASS, &event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline
|
||||
void mysql_audit_external_lock_ex(THD *thd, my_thread_id thread_id,
|
||||
const char *user, const char *host, const char *ip, query_id_t query_id,
|
||||
|
|
|
@ -348,6 +348,12 @@ void thd_clear_errors(THD *thd)
|
|||
}
|
||||
|
||||
|
||||
extern "C" unsigned long long thd_query_id(const MYSQL_THD thd)
|
||||
{
|
||||
return((unsigned long long)thd->query_id);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get thread attributes for connection threads
|
||||
|
||||
|
@ -4983,6 +4989,55 @@ extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen)
|
|||
}
|
||||
|
||||
|
||||
extern "C" const char *thd_user_name(MYSQL_THD thd)
|
||||
{
|
||||
if (!thd->security_ctx)
|
||||
return 0;
|
||||
|
||||
return thd->security_ctx->user;
|
||||
}
|
||||
|
||||
|
||||
extern "C" const char *thd_client_host(MYSQL_THD thd)
|
||||
{
|
||||
if (!thd->security_ctx)
|
||||
return 0;
|
||||
|
||||
return thd->security_ctx->host;
|
||||
}
|
||||
|
||||
|
||||
extern "C" const char *thd_client_ip(MYSQL_THD thd)
|
||||
{
|
||||
if (!thd->security_ctx)
|
||||
return 0;
|
||||
|
||||
return thd->security_ctx->ip;
|
||||
}
|
||||
|
||||
|
||||
extern "C" LEX_CSTRING *thd_current_db(MYSQL_THD thd)
|
||||
{
|
||||
return &thd->db;
|
||||
}
|
||||
|
||||
|
||||
extern "C" int thd_current_status(MYSQL_THD thd)
|
||||
{
|
||||
Diagnostics_area *da= thd->get_stmt_da();
|
||||
if (!da)
|
||||
return 0;
|
||||
|
||||
return da->is_error() ? da->sql_errno() : 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd)
|
||||
{
|
||||
return thd->get_command();
|
||||
}
|
||||
|
||||
|
||||
extern "C" int thd_slave_thread(const MYSQL_THD thd)
|
||||
{
|
||||
return(thd->slave_thread);
|
||||
|
|
|
@ -195,7 +195,14 @@ extern char empty_c_string[1];
|
|||
extern MYSQL_PLUGIN_IMPORT const char **errmesg;
|
||||
|
||||
extern "C" LEX_STRING * thd_query_string (MYSQL_THD thd);
|
||||
extern "C" unsigned long long thd_query_id(const MYSQL_THD thd);
|
||||
extern "C" size_t thd_query_safe(MYSQL_THD thd, char *buf, size_t buflen);
|
||||
extern "C" const char *thd_user_name(MYSQL_THD thd);
|
||||
extern "C" const char *thd_client_host(MYSQL_THD thd);
|
||||
extern "C" const char *thd_client_ip(MYSQL_THD thd);
|
||||
extern "C" LEX_CSTRING *thd_current_db(MYSQL_THD thd);
|
||||
extern "C" int thd_current_status(MYSQL_THD thd);
|
||||
extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd);
|
||||
|
||||
/**
|
||||
@class CSET_STRING
|
||||
|
|
|
@ -1494,7 +1494,7 @@ void CONNECT::close_with_error(uint sql_errno,
|
|||
if (thd)
|
||||
{
|
||||
if (sql_errno)
|
||||
net_send_error(thd, sql_errno, message, NULL);
|
||||
thd->protocol->net_send_error(thd, sql_errno, message, NULL);
|
||||
close_connection(thd, close_error);
|
||||
delete thd;
|
||||
set_current_thd(0);
|
||||
|
|
|
@ -1748,7 +1748,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
else
|
||||
auth_rc= acl_authenticate(thd, packet_length);
|
||||
|
||||
mysql_audit_notify_connection_change_user(thd);
|
||||
mysql_audit_notify_connection_change_user(thd, &save_security_ctx);
|
||||
if (auth_rc)
|
||||
{
|
||||
/* Free user if allocated by acl_authenticate */
|
||||
|
|
1040
sql/sql_prepare.cc
1040
sql/sql_prepare.cc
File diff suppressed because it is too large
Load diff
|
@ -200,7 +200,7 @@ public:
|
|||
@retval TRUE error, use get_last_error()
|
||||
to see the error number.
|
||||
*/
|
||||
bool execute_direct(LEX_STRING sql_text);
|
||||
bool execute_direct(Protocol *p, LEX_STRING sql_text);
|
||||
|
||||
/**
|
||||
Same as the previous, but takes an instance of Server_runnable
|
||||
|
@ -213,7 +213,7 @@ public:
|
|||
return a result set
|
||||
@retval TRUE failure
|
||||
*/
|
||||
bool execute_direct(Server_runnable *server_runnable);
|
||||
bool execute_direct(Protocol *p, Server_runnable *server_runnable);
|
||||
|
||||
/**
|
||||
Get the number of affected (deleted, updated)
|
||||
|
@ -309,7 +309,6 @@ private:
|
|||
THD *m_thd;
|
||||
Ed_result_set *m_rsets;
|
||||
Ed_result_set *m_current_rset;
|
||||
friend class Protocol_local;
|
||||
private:
|
||||
void free_old_result();
|
||||
void add_result_set(Ed_result_set *ed_result_set);
|
||||
|
|
Loading…
Reference in a new issue