Commit 8e793916 authored by Sergey Vojtovich's avatar Sergey Vojtovich

BUG#47059 - In audit plugin I cannot see the event subclasses,

            e.g.MYSQL_AUDIT_GENERAL_ERROR

General audit API (MYSQL_AUDIT_GENERAL_CLASS) didn't expose event
subclass to plugins.

This patch exposes event subclass to plugins via
struct mysql_event_general::event_subclass.

This change is not compatible with existing general audit plugins.
Audit interface major version has been incremented.

include/mysql/plugin_audit.h:
  Expose event subclass to audit general plugins.
plugin/audit_null/audit_null.c:
  Added distinct counters for general event sub-classes.
  
  Removed printf() from deinit(). One can easily see number of
  calls via status variables.
  
  To make code nicer, modified class mask to use macro instead
  of hardcoded number.
  
  Incremented audit plugin minor version.
sql/sql_audit.cc:
  Expose event subclass to audit general plugins.
parent 1cdc0b3a
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#define MYSQL_AUDIT_CLASS_MASK_SIZE 1 #define MYSQL_AUDIT_CLASS_MASK_SIZE 1
#define MYSQL_AUDIT_INTERFACE_VERSION 0x0100 #define MYSQL_AUDIT_INTERFACE_VERSION 0x0200
/* /*
The first word in every event class struct indicates the specific The first word in every event class struct indicates the specific
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
*/ */
struct mysql_event struct mysql_event
{ {
int event_class; unsigned int event_class;
}; };
...@@ -52,7 +52,8 @@ struct mysql_event ...@@ -52,7 +52,8 @@ struct mysql_event
struct mysql_event_general struct mysql_event_general
{ {
int event_class; unsigned int event_class;
unsigned int event_subclass;
int general_error_code; int general_error_code;
unsigned long general_thread_id; unsigned long general_thread_id;
const char *general_user; const char *general_user;
......
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
#endif #endif
static volatile int number_of_calls; /* for SHOW STATUS, see below */ static volatile int number_of_calls; /* for SHOW STATUS, see below */
static volatile int number_of_calls_general_log;
static volatile int number_of_calls_general_error;
static volatile int number_of_calls_general_result;
/* /*
...@@ -41,6 +44,9 @@ static volatile int number_of_calls; /* for SHOW STATUS, see below */ ...@@ -41,6 +44,9 @@ static volatile int number_of_calls; /* for SHOW STATUS, see below */
static int audit_null_plugin_init(void *arg __attribute__((unused))) static int audit_null_plugin_init(void *arg __attribute__((unused)))
{ {
number_of_calls= 0; number_of_calls= 0;
number_of_calls_general_log= 0;
number_of_calls_general_error= 0;
number_of_calls_general_result= 0;
return(0); return(0);
} }
...@@ -60,7 +66,6 @@ static int audit_null_plugin_init(void *arg __attribute__((unused))) ...@@ -60,7 +66,6 @@ static int audit_null_plugin_init(void *arg __attribute__((unused)))
static int audit_null_plugin_deinit(void *arg __attribute__((unused))) static int audit_null_plugin_deinit(void *arg __attribute__((unused)))
{ {
printf("audit_null was invoked %u times\n", number_of_calls);
return(0); return(0);
} }
...@@ -76,11 +81,29 @@ static int audit_null_plugin_deinit(void *arg __attribute__((unused))) ...@@ -76,11 +81,29 @@ static int audit_null_plugin_deinit(void *arg __attribute__((unused)))
*/ */
static void audit_null_notify(MYSQL_THD thd __attribute__((unused)), static void audit_null_notify(MYSQL_THD thd __attribute__((unused)),
const struct mysql_event *event const struct mysql_event *event)
__attribute__((unused)))
{ {
/* prone to races, oh well */ /* prone to races, oh well */
number_of_calls++; number_of_calls++;
if (event->event_class == MYSQL_AUDIT_GENERAL_CLASS)
{
const struct mysql_event_general *event_general=
(const struct mysql_event_general *) event;
switch (event_general->event_subclass)
{
case MYSQL_AUDIT_GENERAL_LOG:
number_of_calls_general_log++;
break;
case MYSQL_AUDIT_GENERAL_ERROR:
number_of_calls_general_error++;
break;
case MYSQL_AUDIT_GENERAL_RESULT:
number_of_calls_general_result++;
break;
default:
break;
}
}
} }
...@@ -93,7 +116,7 @@ static struct st_mysql_audit audit_null_descriptor= ...@@ -93,7 +116,7 @@ static struct st_mysql_audit audit_null_descriptor=
MYSQL_AUDIT_INTERFACE_VERSION, /* interface version */ MYSQL_AUDIT_INTERFACE_VERSION, /* interface version */
NULL, /* release_thd function */ NULL, /* release_thd function */
audit_null_notify, /* notify function */ audit_null_notify, /* notify function */
{ (unsigned long) -1 } /* class mask */ { (unsigned long) MYSQL_AUDIT_GENERAL_CLASSMASK } /* class mask */
}; };
/* /*
...@@ -102,8 +125,13 @@ static struct st_mysql_audit audit_null_descriptor= ...@@ -102,8 +125,13 @@ static struct st_mysql_audit audit_null_descriptor=
static struct st_mysql_show_var simple_status[]= static struct st_mysql_show_var simple_status[]=
{ {
{"audit_null_called", (char *)&number_of_calls, SHOW_INT}, { "Audit_null_called", (char *) &number_of_calls, SHOW_INT },
{0,0,0} { "Audit_null_general_log", (char *) &number_of_calls_general_log, SHOW_INT },
{ "Audit_null_general_error", (char *) &number_of_calls_general_error,
SHOW_INT },
{ "Audit_null_general_result", (char *) &number_of_calls_general_result,
SHOW_INT },
{ 0, 0, 0}
}; };
...@@ -121,7 +149,7 @@ mysql_declare_plugin(audit_null) ...@@ -121,7 +149,7 @@ mysql_declare_plugin(audit_null)
PLUGIN_LICENSE_GPL, PLUGIN_LICENSE_GPL,
audit_null_plugin_init, /* init function (when loaded) */ audit_null_plugin_init, /* init function (when loaded) */
audit_null_plugin_deinit, /* deinit function (when unloaded) */ audit_null_plugin_deinit, /* deinit function (when unloaded) */
0x0001, /* version */ 0x0002, /* version */
simple_status, /* status variables */ simple_status, /* status variables */
NULL, /* system variables */ NULL, /* system variables */
NULL NULL
......
...@@ -65,6 +65,7 @@ static void general_class_handler(THD *thd, uint event_subtype, va_list ap) ...@@ -65,6 +65,7 @@ static void general_class_handler(THD *thd, uint event_subtype, va_list ap)
{ {
mysql_event_general event; mysql_event_general event;
event.event_class= MYSQL_AUDIT_GENERAL_CLASS; event.event_class= MYSQL_AUDIT_GENERAL_CLASS;
event.event_subclass= event_subtype;
event.general_error_code= va_arg(ap, int); event.general_error_code= va_arg(ap, int);
event.general_thread_id= thd ? thd->thread_id : 0; event.general_thread_id= thd ? thd->thread_id : 0;
event.general_time= va_arg(ap, time_t); event.general_time= va_arg(ap, time_t);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment