added mysql backend
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#ifndef QUERY_POSTGRES_CONNECTION_HPP
|
||||
#define QUERY_POSTGRES_CONNECTION_HPP
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef matador_mysql_EXPORTS
|
||||
#define MATADOR_MYSQL_API __declspec(dllexport)
|
||||
#else
|
||||
#define MATADOR_MYSQL_API __declspec(dllimport)
|
||||
#endif
|
||||
#pragma warning(disable: 4355)
|
||||
#else
|
||||
#define MATADOR_MYSQL_API
|
||||
#endif
|
||||
|
||||
#include "matador/sql/connection_impl.hpp"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
class mysql_connection : public matador::sql::connection_impl
|
||||
{
|
||||
public:
|
||||
explicit mysql_connection(const sql::connection_info &info);
|
||||
void open() override;
|
||||
void close() override;
|
||||
bool is_open() override;
|
||||
|
||||
std::unique_ptr<sql::query_result_impl> fetch(const std::string &stmt) override;
|
||||
std::unique_ptr<sql::statement_impl> prepare(sql::query_context context) override;
|
||||
|
||||
size_t execute(const std::string &stmt) override;
|
||||
|
||||
sql::record describe(const std::string& table) override;
|
||||
|
||||
bool exists(const std::string &schema_name, const std::string &table_name) override;
|
||||
|
||||
private:
|
||||
mutable std::unique_ptr<MYSQL> mysql_;
|
||||
|
||||
using string_to_int_map = std::unordered_map<std::string, unsigned long>;
|
||||
|
||||
static string_to_int_map statement_name_map_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
MATADOR_MYSQL_API matador::sql::connection_impl* create_database(const matador::sql::connection_info &info);
|
||||
|
||||
MATADOR_MYSQL_API void destroy_database(matador::sql::connection_impl *db);
|
||||
}
|
||||
|
||||
#endif //QUERY_POSTGRES_CONNECTION_HPP
|
||||
@@ -0,0 +1,19 @@
|
||||
#ifndef QUERY_POSTGRES_DIALECT_HPP
|
||||
#define QUERY_POSTGRES_DIALECT_HPP
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef matador_mysql_EXPORTS
|
||||
#define MATADOR_MYSQL_API __declspec(dllexport)
|
||||
#else
|
||||
#define MATADOR_MYSQL_API __declspec(dllimport)
|
||||
#endif
|
||||
#pragma warning(disable: 4355)
|
||||
#else
|
||||
#define MATADOR_MYSQL_API
|
||||
#endif
|
||||
|
||||
#include "matador/sql/dialect.hpp"
|
||||
|
||||
extern "C" [[maybe_unused]] MATADOR_MYSQL_API const matador::sql::dialect* get_dialect();
|
||||
|
||||
#endif //QUERY_POSTGRES_DIALECT_HPP
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef QUERY_POSTGRES_ERROR_HPP
|
||||
#define QUERY_POSTGRES_ERROR_HPP
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
void throw_mysql_error(const char *what, const std::string &source);
|
||||
void throw_mysql_error(MYSQL *db, const std::string &source);
|
||||
void throw_mysql_error(MYSQL_STMT *stmt, const std::string &source, const std::string &sql);
|
||||
|
||||
}
|
||||
|
||||
#endif //QUERY_POSTGRES_ERROR_HPP
|
||||
@@ -0,0 +1,72 @@
|
||||
#ifndef QUERY_POSTGRES_PARAMETER_BINDER_H
|
||||
#define QUERY_POSTGRES_PARAMETER_BINDER_H
|
||||
|
||||
#include "matador/sql/parameter_binder.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
struct mysql_result_info
|
||||
{
|
||||
unsigned long length = 0;
|
||||
my_bool is_null = false;
|
||||
my_bool error = false;
|
||||
// std::unique_ptr<char[]> buffer;
|
||||
char *buffer = nullptr;
|
||||
unsigned long buffer_length = 0;
|
||||
bool is_allocated = false;
|
||||
|
||||
~mysql_result_info()
|
||||
{
|
||||
if (is_allocated) {
|
||||
delete [] buffer;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class mysql_parameter_binder final : public sql::parameter_binder
|
||||
{
|
||||
public:
|
||||
explicit mysql_parameter_binder(size_t size);
|
||||
|
||||
void bind(size_t pos, char i) override;
|
||||
void bind(size_t pos, short i) override;
|
||||
void bind(size_t pos, int i) override;
|
||||
void bind(size_t pos, long i) override;
|
||||
void bind(size_t pos, long long int i) override;
|
||||
void bind(size_t pos, unsigned char i) override;
|
||||
void bind(size_t pos, unsigned short i) override;
|
||||
void bind(size_t pos, unsigned int i) override;
|
||||
void bind(size_t pos, unsigned long i) override;
|
||||
void bind(size_t pos, unsigned long long int i) override;
|
||||
void bind(size_t pos, bool b) override;
|
||||
void bind(size_t pos, float d) override;
|
||||
void bind(size_t pos, double d) override;
|
||||
void bind(size_t pos, const char *string) override;
|
||||
void bind(size_t pos, const char *string, size_t size) override;
|
||||
void bind(size_t pos, const std::string &string) override;
|
||||
void bind(size_t pos, const std::string &x, size_t size) override;
|
||||
|
||||
[[nodiscard]] std::vector<MYSQL_BIND>& bind_params();
|
||||
|
||||
private:
|
||||
struct is_null_t
|
||||
{
|
||||
my_bool is_null = false;
|
||||
};
|
||||
|
||||
std::vector<MYSQL_BIND> bind_params_;
|
||||
std::vector<is_null_t> is_null_vector;
|
||||
std::vector<mysql_result_info> info_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //QUERY_POSTGRES_PARAMETER_BINDER_H
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef QUERY_MYSQL_PREPARED_RESULT_READER_HPP
|
||||
#define QUERY_MYSQL_PREPARED_RESULT_READER_HPP
|
||||
|
||||
#include "matador/sql/query_result_reader.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
class mysql_prepared_result_reader : public sql::query_result_reader
|
||||
{
|
||||
public:
|
||||
explicit mysql_prepared_result_reader(MYSQL_STMT *stmt);
|
||||
~mysql_prepared_result_reader() override;
|
||||
|
||||
[[nodiscard]] size_t column_count() const override;
|
||||
[[nodiscard]] const char *column(size_t index) const override;
|
||||
bool fetch() override;
|
||||
|
||||
private:
|
||||
MYSQL_STMT *stmt_{};
|
||||
|
||||
MYSQL_ROW current_row_{};
|
||||
|
||||
size_t row_count_{};
|
||||
size_t column_count_{};
|
||||
int row_index_{-1};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //QUERY_MYSQL_PREPARED_RESULT_READER_HPP
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef QUERY_POSTGRES_RESULT_READER_HPP
|
||||
#define QUERY_POSTGRES_RESULT_READER_HPP
|
||||
|
||||
#include "matador/sql/query_result_reader.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
class mysql_result_reader : public sql::query_result_reader
|
||||
{
|
||||
public:
|
||||
explicit mysql_result_reader(MYSQL_RES *result, unsigned int column_count);
|
||||
~mysql_result_reader() override;
|
||||
|
||||
[[nodiscard]] size_t column_count() const override;
|
||||
[[nodiscard]] const char *column(size_t index) const override;
|
||||
bool fetch() override;
|
||||
|
||||
private:
|
||||
MYSQL_RES *result_{};
|
||||
|
||||
MYSQL_ROW current_row_{};
|
||||
|
||||
size_t row_count_{};
|
||||
size_t column_count_{};
|
||||
int row_index_{-1};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //QUERY_POSTGRES_RESULT_READER_HPP
|
||||
@@ -0,0 +1,37 @@
|
||||
#ifndef QUERY_POSTGRES_STATEMENT_HPP
|
||||
#define QUERY_POSTGRES_STATEMENT_HPP
|
||||
|
||||
#include "matador/sql/statement_impl.hpp"
|
||||
|
||||
#include "mysql_parameter_binder.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <mysql.h>
|
||||
#else
|
||||
#include <mysql/mysql.h>
|
||||
#endif
|
||||
|
||||
namespace matador::backends::mysql {
|
||||
|
||||
class mysql_statement final : public sql::statement_impl
|
||||
{
|
||||
public:
|
||||
mysql_statement(MYSQL_STMT *stmt, const sql::query_context &query);
|
||||
|
||||
size_t execute() override;
|
||||
std::unique_ptr<sql::query_result_impl> fetch() override;
|
||||
void reset() override;
|
||||
protected:
|
||||
sql::parameter_binder& binder() override;
|
||||
|
||||
private:
|
||||
MYSQL_STMT *stmt_{nullptr};
|
||||
|
||||
std::string name_;
|
||||
|
||||
mysql_parameter_binder binder_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //QUERY_POSTGRES_STATEMENT_HPP
|
||||
Reference in New Issue
Block a user