From 354bb40e75d94466e91fe6960523612c9d17ccfb Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 2 Nov 2017 23:11:29 +0300 Subject: Add implementation --- mysql/libmysql/mysql_trace.h | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 mysql/libmysql/mysql_trace.h (limited to 'mysql/libmysql/mysql_trace.h') 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 +#include /* for MYSQL_EXTENSION() */ +#include + + +/** + 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 -- cgit v1.1