Files
MaxScale/server/modules/routing/avrorouter/sql.hh
Markus Mäkelä 7723e7c933 Add modified Replicator for avrorouter
Repurposed the Replicator from the CDC integration project as a
replication event processing service. It is similar to the CDC version of
the Replicator and is still in the same namespace but it lacks all of the
cross-thread communication that was a part of the integration project.
2019-04-17 14:13:44 +03:00

130 lines
3.4 KiB
C++

/*
* Copyright (c) 2019 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 <mysql.h>
#include <mariadb_rpl.h>
#include <memory>
#include "config.hh"
// Convenience class that wraps a MYSQL connection and provides a minimal C++ interface
class SQL
{
public:
SQL(const SQL&) = delete;
SQL& operator=(const SQL&) = delete;
using Event = std::unique_ptr<MARIADB_RPL_EVENT, std::function<decltype(mariadb_free_rpl_event)>>;
/**
* Create a new connection from a list of servers
*
* The first available server is chosen from the provided list
*
* @param servers List of server candidates
* @param connect_timeout Connect timeout in seconds, defaults to 10 seconds
* @param read_timeout Read timeout in seconds, defaults to 5 seconds
*
* @return The error message and a unique_ptr. If an error occurred, the error string contains the
* error description and the unique_ptr is empty.
*/
static std::pair<std::string, std::unique_ptr<SQL>> connect(const std::vector<cdc::Server>& servers,
int connect_timeout = 30,
int read_timeout = 60);
~SQL();
/**
* Execute a query
*
* @param sql SQL to execute
*
* @return True on success, false on error
*/
bool query(const std::string& sql);
bool query(const std::vector<std::string>& sql);
/**
* Return latest error string
*
* @return The latest error
*/
std::string error() const
{
return mysql_error(m_mysql);
}
/**
* Return latest error number
*
* @return The latest number
*/
int errnum() const
{
return mysql_errno(m_mysql);
}
/**
* Return the server where the connection was created
*
* @return The server where the connection was created
*/
const cdc::Server& server() const
{
return m_server;
}
/**
* Start replicating data from the server
*
* @param server_id Server ID to connect with
*
* @return True if replication was started successfully
*/
bool replicate(int server_id);
/**
* Fetch one replication event
*
* @return The next replicated event or null on error
*/
Event fetch_event()
{
return Event {mariadb_rpl_fetch(m_rpl, nullptr), mariadb_free_rpl_event};
}
/**
* Pointer to the raw event data
*/
uint8_t* event_data() const
{
return m_rpl->buffer;
}
private:
SQL(MYSQL* mysql, const cdc::Server& server);
MYSQL* m_mysql {nullptr}; // Database handle
MYSQL_RES* m_res {nullptr}; // Open result set
MARIADB_RPL* m_rpl {nullptr}; // Replication handle
cdc::Server m_server; // The server where the connection was made
};
// String conversion helper
static inline std::string to_string(const MARIADB_STRING& str)
{
return std::string(str.str, str.length);
}