166 lines
6.0 KiB
C
166 lines
6.0 KiB
C
/* 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
|