MaxScale/include/maxscale/protocol/mariadb_client.hh
2018-12-05 11:12:20 +02:00

88 lines
2.6 KiB
C++

/*
* Copyright (c) 2018 MariaDB Corporation Ab
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
*
* Change Date: 2022-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2 or later of the General
* Public License.
*/
#pragma once
#include <maxscale/ccdefs.hh>
#include <deque>
#include <maxbase/poll.h>
#include <maxscale/buffer.hh>
#include <maxscale/service.hh>
#include <maxscale/protocol/mysql.hh>
/** A DCB-like client abstraction which ignores responses */
class LocalClient : public MXB_POLL_DATA
{
LocalClient(const LocalClient&);
LocalClient& operator=(const LocalClient&);
public:
~LocalClient();
/**
* Create a local client for a service
*
* @param session Client session
* @param service Service to connect to
*
* @return New virtual client or NULL on error
*/
static LocalClient* create(MYSQL_session* session, MySQLProtocol* proto, SERVICE* service);
static LocalClient* create(MYSQL_session* session, MySQLProtocol* proto, SERVER* server);
/**
* Queue a new query for execution
*
* @param buffer Buffer containing the query
*
* @return True if query was successfully queued
*/
bool queue_query(GWBUF* buffer);
/**
* Destroy the client by sending a COM_QUIT to the backend
*
* @note After calling this function, object must be treated as a deleted object
*/
void self_destruct();
private:
static LocalClient* create(MYSQL_session* session, MySQLProtocol* proto, const char* ip, uint64_t port);
LocalClient(MYSQL_session* session, MySQLProtocol* proto, int fd);
static uint32_t poll_handler(MXB_POLL_DATA* data, MXB_WORKER* worker, uint32_t events);
void process(uint32_t events);
GWBUF* read_complete_packet();
void drain_queue();
void error();
void close();
/** Client states */
enum vc_state
{
VC_WAITING_HANDSHAKE, // Initial state
VC_RESPONSE_SENT, // Handshake received and response sent
VC_OK, // Authentication is complete, ready for queries
VC_ERROR // Something went wrong
};
vc_state m_state;
int m_sock;
mxs::Buffer m_partial;
size_t m_expected_bytes;
std::deque<mxs::Buffer> m_queue;
MYSQL_session m_client;
MySQLProtocol m_protocol;
bool m_self_destruct;
};