aboutsummaryrefslogtreecommitdiff
path: root/mysql/libmysql/mysql_trace.h
diff options
context:
space:
mode:
Diffstat (limited to 'mysql/libmysql/mysql_trace.h')
-rw-r--r--mysql/libmysql/mysql_trace.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/mysql/libmysql/mysql_trace.h b/mysql/libmysql/mysql_trace.h
new file mode 100644
index 0000000..6ec4e76
--- /dev/null
+++ b/mysql/libmysql/mysql_trace.h
@@ -0,0 +1,165 @@
+/* Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#ifndef MYSQL_TRACE_INCLUDED
+#define MYSQL_TRACE_INCLUDED
+/**
+ @file
+
+ =====================================================
+ Declarations for client-side tracing infrastructure
+ =====================================================
+
+ See libmysql/mysql_trace.c for a brief description. Trace plugin
+ declarations are in plugin_trace.h header.
+*/
+
+
+C_MODE_START
+
+/*
+ Disable trace hooks if the infrastructure is not enabled or if
+ libmysql code is used from within the (embedded) server.
+*/
+#if !defined(CLIENT_PROTOCOL_TRACING) \
+ || defined(MYSQL_SERVER) \
+ || defined(EMBEDDED_LIBRARY)
+
+#define MYSQL_TRACE(E, M, ARGS)
+#define MYSQL_TRACE_STAGE(M, S)
+
+#else
+
+#include <mysql/plugin_trace.h>
+#include <sql_common.h> /* for MYSQL_EXTENSION() */
+#include <stdarg.h>
+
+
+/**
+ Per connection protocol tracing state
+
+ For each connection which is traced an instance of this structure
+ is pointed by the trace_data member of st_mysql_extension structure
+ attached to that connection handle.
+
+ If trace_data is NULL, for an initialized connection, then it means
+ that tracing in this connection is disabled.
+*/
+
+struct st_mysql_trace_info
+{
+ struct st_mysql_client_plugin_TRACE *plugin;
+ void *trace_plugin_data;
+ enum protocol_stage stage;
+};
+
+#define TRACE_DATA(M) (MYSQL_EXTENSION_PTR(M)->trace_data)
+
+
+/*
+ See libmysql/mysql_trace.c for documentation and implementation of
+ these functions.
+*/
+
+void mysql_trace_trace(struct st_mysql*,
+ enum trace_event,
+ struct st_trace_event_args);
+void mysql_trace_start(struct st_mysql*);
+
+
+/**
+ The main protocol tracing hook.
+
+ It is placed in places in the libmysql code where trace events occur.
+ If tracing of the connection is not disabled, it calls
+ mysql_trace_trace() function to report the event to the
+ trace plugin.
+
+ @param E trace event (without TRACE_EVENT_ prefix)
+ @param M connection handle (pointer to MYSQL structure)
+ @param ARGS event specific arguments
+
+ Event arguments are processed with appropriate TRACE_ARGS_* macro
+ (see below) to put them inside st_trace_event_args structure.
+*/
+
+#define MYSQL_TRACE(E, M, ARGS) \
+ do { \
+ if (NULL == TRACE_DATA(M)) break; \
+ { \
+ struct st_trace_event_args event_args= \
+ TRACE_ARGS_ ## E ARGS; \
+ mysql_trace_trace(M, \
+ TRACE_EVENT_ ## E, \
+ event_args); \
+ } \
+ } while(0)
+
+
+/**
+ A hook to set the current protocol stage.
+
+ @param M connection handle (pointer to MYSQL structure)
+ @param S the current stage (without PROTOCOL_STAGE_ prefix)
+
+ If tracing is not disabled, the stage is stored in connection's
+ tracing state. A special case is if the current stage is the
+ initial CONNECTING one. In that case function mysql_trace_start()
+ is called to initialize tracing in this connection, provided that
+ a trace plugin is loaded.
+*/
+
+#define MYSQL_TRACE_STAGE(M, S) \
+ do { \
+ if (TRACE_DATA(M)) \
+ TRACE_DATA(M)->stage= PROTOCOL_STAGE_ ## S; \
+ else if (trace_plugin && \
+ (PROTOCOL_STAGE_CONNECTING == PROTOCOL_STAGE_ ## S)) \
+ mysql_trace_start(M); \
+ } while(0)
+
+/*
+ Macros to parse event arguments and initialize the
+ st_trace_event_args structure accordingly. See description of
+ the structure in plugin_trace.h.
+*/
+
+#define TRACE_ARGS_SEND_SSL_REQUEST(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+#define TRACE_ARGS_SEND_AUTH_RESPONSE(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+#define TRACE_ARGS_SEND_AUTH_DATA(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+#define TRACE_ARGS_AUTH_PLUGIN(PluginName) { PluginName, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_SEND_COMMAND(Command, HdrSize, ArgSize, Header, Args) \
+ { NULL, Command, Header, HdrSize, Args, ArgSize }
+#define TRACE_ARGS_SEND_FILE(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+
+#define TRACE_ARGS_PACKET_SENT(Size) { NULL, 0, NULL, 0, NULL, Size }
+#define TRACE_ARGS_PACKET_RECEIVED(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+#define TRACE_ARGS_INIT_PACKET_RECEIVED(Size, Packet) { NULL, 0, NULL, 0, Packet, Size }
+
+#define TRACE_ARGS_ERROR() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_READ_PACKET() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_CONNECTING() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_CONNECTED() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_DISCONNECTED() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_AUTHENTICATED() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_SSL_CONNECT() { NULL, 0, NULL, 0, NULL, 0 }
+#define TRACE_ARGS_SSL_CONNECTED() { NULL, 0, NULL, 0, NULL, 0 }
+
+
+#endif /* !defined(CLIENT_PROTOCOL_TRACING) || defined(MYSQL_SERVER) */
+
+C_MODE_END
+
+#endif