Merge branch '2.1' into develop

This commit is contained in:
Johan Wikman
2017-03-03 13:37:14 +02:00
56 changed files with 2355 additions and 630 deletions

View File

@ -23,3 +23,5 @@ file(GLOB GENERATD_HEADERS "${CMAKE_BINARY_DIR}/include/maxscale/*.hh")
foreach(var ${GENERATD_HEADERS})
install_header(${var} devel)
endforeach()
add_subdirectory(protocol)

View File

@ -33,7 +33,9 @@ MXS_BEGIN_DECLS
* from the @c createInstance function of a filter module and subsequently
* passing it back to the API functions of the filter.
*/
typedef void *MXS_FILTER;
typedef struct mxs_filter
{
} MXS_FILTER;
/**
* MXS_FILTER_SESSION is an opaque type representing the session related
@ -43,7 +45,9 @@ typedef void *MXS_FILTER;
* from the @c newSession function of a filter module and subsequently
* passing it back to the API functions of the filter.
*/
typedef void *MXS_FILTER_SESSION;
typedef struct mxs_filter_session
{
} MXS_FILTER_SESSION;
/**
* @verbatim

View File

@ -28,7 +28,7 @@ namespace maxscale
* are virtual. That is by design, as the class will be used in a context where
* the concrete class is known. That is, there is no need for the virtual mechanism.
*/
class FilterSession
class FilterSession : public MXS_FILTER_SESSION
{
public:
/**
@ -200,7 +200,7 @@ protected:
* @endcode
*/
template<class FilterType, class FilterSessionType>
class Filter
class Filter : public MXS_FILTER
{
public:
static MXS_FILTER* createInstance(const char* zName, char** pzOptions, MXS_CONFIG_PARAMETER* ppParams)
@ -209,36 +209,36 @@ public:
MXS_EXCEPTION_GUARD(pFilter = FilterType::create(zName, pzOptions, ppParams));
return reinterpret_cast<MXS_FILTER*>(pFilter);
return pFilter;
}
static MXS_FILTER_SESSION* newSession(MXS_FILTER* pInstance, MXS_SESSION* pSession)
{
FilterType* pFilter = reinterpret_cast<FilterType*>(pInstance);
void* pFilterSession;
FilterType* pFilter = static_cast<FilterType*>(pInstance);
FilterSessionType* pFilterSession;
MXS_EXCEPTION_GUARD(pFilterSession = pFilter->newSession(pSession));
return reinterpret_cast<MXS_FILTER_SESSION*>(pFilterSession);
return pFilterSession;
}
static void closeSession(MXS_FILTER*, MXS_FILTER_SESSION* pData)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
MXS_EXCEPTION_GUARD(pFilterSession->close());
}
static void freeSession(MXS_FILTER*, MXS_FILTER_SESSION* pData)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
MXS_EXCEPTION_GUARD(delete pFilterSession);
}
static void setDownstream(MXS_FILTER*, MXS_FILTER_SESSION* pData, MXS_DOWNSTREAM* pDownstream)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
typename FilterSessionType::Downstream down(*pDownstream);
@ -247,7 +247,7 @@ public:
static void setUpstream(MXS_FILTER* pInstance, MXS_FILTER_SESSION* pData, MXS_UPSTREAM* pUpstream)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
typename FilterSessionType::Upstream up(*pUpstream);
@ -256,7 +256,7 @@ public:
static int routeQuery(MXS_FILTER* pInstance, MXS_FILTER_SESSION* pData, GWBUF* pPacket)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
int rv = 0;
MXS_EXCEPTION_GUARD(rv = pFilterSession->routeQuery(pPacket));
@ -266,7 +266,7 @@ public:
static int clientReply(MXS_FILTER* pInstance, MXS_FILTER_SESSION* pData, GWBUF* pPacket)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
int rv = 0;
MXS_EXCEPTION_GUARD(rv = pFilterSession->clientReply(pPacket));
@ -278,13 +278,13 @@ public:
{
if (pData)
{
FilterSessionType* pFilterSession = reinterpret_cast<FilterSessionType*>(pData);
FilterSessionType* pFilterSession = static_cast<FilterSessionType*>(pData);
MXS_EXCEPTION_GUARD(pFilterSession->diagnostics(pDcb));
}
else
{
FilterType* pFilter = reinterpret_cast<FilterType*>(pInstance);
FilterType* pFilter = static_cast<FilterType*>(pInstance);
MXS_EXCEPTION_GUARD(pFilter->diagnostics(pDcb));
}
@ -294,7 +294,7 @@ public:
{
uint64_t rv = 0;
FilterType* pFilter = reinterpret_cast<FilterType*>(pInstance);
FilterType* pFilter = static_cast<FilterType*>(pInstance);
MXS_EXCEPTION_GUARD(rv = pFilter->getCapabilities());
@ -303,7 +303,7 @@ public:
static void destroyInstance(MXS_FILTER* pInstance)
{
FilterType* pFilter = reinterpret_cast<FilterType*>(pInstance);
FilterType* pFilter = static_cast<FilterType*>(pInstance);
MXS_EXCEPTION_GUARD(delete pFilter);
}

View File

@ -1,5 +1,5 @@
file(GLOB HEADERS "*.h*")
foreach(var ${HEADERS})
get_filename_component(header ${var} NAME)
install_header(${header} devel)
install_custom_file(${header} ${CMAKE_INSTALL_INCLUDEDIR}/maxscale/protocol devel)
endforeach()

View File

@ -84,13 +84,12 @@ MXS_BEGIN_DECLS
#define MYSQL_CHARSET_OFFSET 12
#define MYSQL_CLIENT_CAP_OFFSET 4
#define MYSQL_CLIENT_CAP_SIZE 4
#define MARIADB_CAP_OFFSET MYSQL_CHARSET_OFFSET + 19
#define GW_MYSQL_PROTOCOL_VERSION 10 // version is 10
#define GW_MYSQL_HANDSHAKE_FILLER 0x00
#define GW_MYSQL_SERVER_CAPABILITIES_BYTE1 0xff
#define GW_MYSQL_SERVER_CAPABILITIES_BYTE2 0xf7
#define GW_MYSQL_SERVER_LANGUAGE 0x08
#define GW_MYSQL_MAX_PACKET_LEN 0xffffffL;
#define GW_MYSQL_MAX_PACKET_LEN 0xffffffL
#define GW_MYSQL_SCRAMBLE_SIZE 20
#define GW_SCRAMBLE_LENGTH_323 8
@ -190,7 +189,8 @@ typedef struct mysql_session
typedef enum
{
GW_MYSQL_CAPABILITIES_NONE = 0,
GW_MYSQL_CAPABILITIES_LONG_PASSWORD = (1 << 0),
/** This is sent by pre-10.2 clients */
GW_MYSQL_CAPABILITIES_CLIENT_MYSQL = (1 << 0),
GW_MYSQL_CAPABILITIES_FOUND_ROWS = (1 << 1),
GW_MYSQL_CAPABILITIES_LONG_FLAG = (1 << 2),
GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB = (1 << 3),
@ -210,35 +210,60 @@ typedef enum
GW_MYSQL_CAPABILITIES_MULTI_RESULTS = (1 << 17),
GW_MYSQL_CAPABILITIES_PS_MULTI_RESULTS = (1 << 18),
GW_MYSQL_CAPABILITIES_PLUGIN_AUTH = (1 << 19),
GW_MYSQL_CAPABILITIES_CONNECT_ATTRS = (1 << 20),
GW_MYSQL_CAPABILITIES_AUTH_LENENC_DATA = (1 << 21),
GW_MYSQL_CAPABILITIES_EXPIRE_PASSWORD = (1 << 22),
GW_MYSQL_CAPABILITIES_SESSION_TRACK = (1 << 23),
GW_MYSQL_CAPABILITIES_DEPRECATE_EOF = (1 << 24),
GW_MYSQL_CAPABILITIES_SSL_VERIFY_SERVER_CERT = (1 << 30),
GW_MYSQL_CAPABILITIES_REMEMBER_OPTIONS = (1 << 31),
GW_MYSQL_CAPABILITIES_CLIENT = (GW_MYSQL_CAPABILITIES_LONG_PASSWORD |
GW_MYSQL_CAPABILITIES_FOUND_ROWS |
GW_MYSQL_CAPABILITIES_LONG_FLAG |
GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB |
GW_MYSQL_CAPABILITIES_LOCAL_FILES |
GW_MYSQL_CAPABILITIES_PLUGIN_AUTH |
GW_MYSQL_CAPABILITIES_TRANSACTIONS |
GW_MYSQL_CAPABILITIES_PROTOCOL_41 |
GW_MYSQL_CAPABILITIES_MULTI_STATEMENTS |
GW_MYSQL_CAPABILITIES_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_PS_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_SECURE_CONNECTION),
GW_MYSQL_CAPABILITIES_CLIENT_COMPRESS = (GW_MYSQL_CAPABILITIES_LONG_PASSWORD |
GW_MYSQL_CAPABILITIES_FOUND_ROWS |
GW_MYSQL_CAPABILITIES_LONG_FLAG |
GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB |
GW_MYSQL_CAPABILITIES_LOCAL_FILES |
GW_MYSQL_CAPABILITIES_PLUGIN_AUTH |
GW_MYSQL_CAPABILITIES_TRANSACTIONS |
GW_MYSQL_CAPABILITIES_PROTOCOL_41 |
GW_MYSQL_CAPABILITIES_MULTI_STATEMENTS |
GW_MYSQL_CAPABILITIES_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_PS_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_COMPRESS
),
GW_MYSQL_CAPABILITIES_CLIENT = (
GW_MYSQL_CAPABILITIES_CLIENT_MYSQL |
GW_MYSQL_CAPABILITIES_FOUND_ROWS |
GW_MYSQL_CAPABILITIES_LONG_FLAG |
GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB |
GW_MYSQL_CAPABILITIES_LOCAL_FILES |
GW_MYSQL_CAPABILITIES_PLUGIN_AUTH |
GW_MYSQL_CAPABILITIES_TRANSACTIONS |
GW_MYSQL_CAPABILITIES_PROTOCOL_41 |
GW_MYSQL_CAPABILITIES_MULTI_STATEMENTS |
GW_MYSQL_CAPABILITIES_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_PS_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_SECURE_CONNECTION),
GW_MYSQL_CAPABILITIES_SERVER = (
GW_MYSQL_CAPABILITIES_CLIENT_MYSQL |
GW_MYSQL_CAPABILITIES_FOUND_ROWS |
GW_MYSQL_CAPABILITIES_LONG_FLAG |
GW_MYSQL_CAPABILITIES_CONNECT_WITH_DB |
GW_MYSQL_CAPABILITIES_NO_SCHEMA |
GW_MYSQL_CAPABILITIES_ODBC |
GW_MYSQL_CAPABILITIES_LOCAL_FILES |
GW_MYSQL_CAPABILITIES_IGNORE_SPACE |
GW_MYSQL_CAPABILITIES_PROTOCOL_41 |
GW_MYSQL_CAPABILITIES_INTERACTIVE |
GW_MYSQL_CAPABILITIES_IGNORE_SIGPIPE |
GW_MYSQL_CAPABILITIES_TRANSACTIONS |
GW_MYSQL_CAPABILITIES_RESERVED |
GW_MYSQL_CAPABILITIES_SECURE_CONNECTION |
GW_MYSQL_CAPABILITIES_MULTI_STATEMENTS |
GW_MYSQL_CAPABILITIES_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_PS_MULTI_RESULTS |
GW_MYSQL_CAPABILITIES_PLUGIN_AUTH),
} gw_mysql_capabilities_t;
/**
* Capabilities supported by MariaDB 10.2 and later, stored in the last 4 bytes
* of the 10 byte filler of the initial handshake packet.
*
* The actual capability bytes use by the server are left shifted by an extra 32
* bits to get one 64 bit capability that combines the old and new capabilities.
* Since we only use these in the non-shifted form, the definitions declared here
* are right shifted by 32 bytes and can be directly copied into the extra capabilities.
*/
#define MXS_MARIA_CAP_PROGRESS (1 << 0)
#define MXS_MARIA_CAP_COM_MULTI (1 << 1)
#define MXS_MARIA_CAP_STMT_BULK_OPERATIONS (1 << 2)
typedef enum enum_server_command mysql_server_cmd_t;
static const mysql_server_cmd_t MYSQL_COM_UNDEFINED = (mysql_server_cmd_t) - 1;
@ -277,6 +302,7 @@ typedef struct
uint8_t scramble[MYSQL_SCRAMBLE_LEN]; /*< server scramble, created or received */
uint32_t server_capabilities; /*< server capabilities, created or received */
uint32_t client_capabilities; /*< client capabilities, created or received */
uint32_t extra_capabilities; /*< MariaDB 10.2 capabilities */
unsigned long tid; /*< MySQL Thread ID, in handshake */
unsigned int charset; /*< MySQL character set at connect time */
bool ignore_reply; /*< If the reply should be discarded */

View File

@ -34,7 +34,21 @@ MXS_BEGIN_DECLS
* from the @c createInstance function of a router module and subsequently
* passing it back to the API functions of the router.
*/
typedef void *MXS_ROUTER;
typedef struct mxs_router
{
} MXS_ROUTER;
/**
* MXS_ROUTER_SESSION is an opaque type representing the session related
* data of a particular router instance.
*
* MaxScale itself does not do anything with it, except for receiving it
* from the @c newSession function of a router module and subsequently
* passing it back to the API functions of the router.
*/
typedef struct mxs_router_session
{
} MXS_ROUTER_SESSION;
typedef enum error_action
{
@ -66,19 +80,19 @@ typedef enum error_action
typedef struct mxs_router_object
{
MXS_ROUTER *(*createInstance)(SERVICE *service, char **options);
void *(*newSession)(MXS_ROUTER *instance, MXS_SESSION *session);
void (*closeSession)(MXS_ROUTER *instance, void *router_session);
void (*freeSession)(MXS_ROUTER *instance, void *router_session);
int32_t (*routeQuery)(MXS_ROUTER *instance, void *router_session, GWBUF *queue);
MXS_ROUTER_SESSION *(*newSession)(MXS_ROUTER *instance, MXS_SESSION *session);
void (*closeSession)(MXS_ROUTER *instance, MXS_ROUTER_SESSION *router_session);
void (*freeSession)(MXS_ROUTER *instance, MXS_ROUTER_SESSION *router_session);
int32_t (*routeQuery)(MXS_ROUTER *instance, MXS_ROUTER_SESSION *router_session, GWBUF *queue);
void (*diagnostics)(MXS_ROUTER *instance, DCB *dcb);
void (*clientReply)(MXS_ROUTER* instance, void* router_session, GWBUF* queue,
void (*clientReply)(MXS_ROUTER* instance, MXS_ROUTER_SESSION *router_session, GWBUF *queue,
DCB *backend_dcb);
void (*handleError)(MXS_ROUTER* instance,
void* router_session,
GWBUF* errmsgbuf,
DCB* backend_dcb,
void (*handleError)(MXS_ROUTER *instance,
MXS_ROUTER_SESSION *router_session,
GWBUF *errmsgbuf,
DCB *backend_dcb,
mxs_error_action_t action,
bool* succp);
bool* succp);
uint64_t (*getCapabilities)(MXS_ROUTER *instance);
void (*destroyInstance)(MXS_ROUTER *instance);
} MXS_ROUTER_OBJECT;

View File

@ -42,7 +42,7 @@ MXS_BEGIN_DECLS
*/
typedef struct spinlock
{
int lock; /*< Is the lock held? */
volatile int lock;/*< Is the lock held? */
#if SPINLOCK_PROFILE
int spins; /*< Number of spins on this lock */
int maxspins; /*< Max no of spins to acquire lock */