make ext_engine: duckdb to work
This commit is contained in:
@@ -2,24 +2,32 @@
|
||||
#define __DATASOURCE_CONN_H__
|
||||
struct Context;
|
||||
|
||||
#ifndef __AQQueryResult__
|
||||
#define __AQQueryResult__ 1
|
||||
struct AQQueryResult {
|
||||
void* res;
|
||||
unsigned ref;
|
||||
};
|
||||
enum DataSourceType {
|
||||
Invalid,
|
||||
MonetDB,
|
||||
MariaDB,
|
||||
DuckDB,
|
||||
SQLite
|
||||
#endif
|
||||
|
||||
#ifndef __AQBACKEND_TYPE__
|
||||
#define __AQBACKEND_TYPE__ 1
|
||||
enum Backend_Type {
|
||||
BACKEND_AQuery,
|
||||
BACKEND_MonetDB,
|
||||
BACKEND_MariaDB,
|
||||
BACKEND_DuckDB,
|
||||
BACKEND_SQLite,
|
||||
BACKEND_TOTAL
|
||||
};
|
||||
#endif
|
||||
|
||||
struct DataSource {
|
||||
void* server = nullptr;
|
||||
Context* cxt = nullptr;
|
||||
bool status = false;
|
||||
char* query = nullptr;
|
||||
DataSourceType type = Invalid;
|
||||
Backend_Type DataSourceType = BACKEND_AQuery;
|
||||
|
||||
void* res = nullptr;
|
||||
void* ret_col = nullptr;
|
||||
@@ -29,7 +37,7 @@ struct DataSource {
|
||||
void* handle;
|
||||
|
||||
DataSource() = default;
|
||||
explicit DataSource(Context* cxt = nullptr) = delete;
|
||||
explicit DataSource(Context* cxt) = delete;
|
||||
|
||||
virtual void connect(Context* cxt) = 0;
|
||||
virtual void exec(const char* q) = 0;
|
||||
@@ -38,6 +46,10 @@ struct DataSource {
|
||||
virtual void close() = 0;
|
||||
virtual bool haserror() = 0;
|
||||
// virtual void print_results(const char* sep = " ", const char* end = "\n");
|
||||
virtual ~DataSource() = 0;
|
||||
virtual ~DataSource() {};
|
||||
};
|
||||
// TODO: replace with super class
|
||||
//typedef DataSource* (*create_server_t)(Context* cxt);
|
||||
typedef void* (*create_server_t)(Context* cxt);
|
||||
void* CreateNULLServer(Context*);
|
||||
#endif //__DATASOURCE_CONN_H__
|
||||
@@ -11,7 +11,8 @@ void DuckdbServer::connect(Context* cxt) {
|
||||
static_cast<duckdb_database*>(malloc(sizeof(duckdb_database)));
|
||||
this->handle = db_handle;
|
||||
bool status = duckdb_open(nullptr, db_handle);
|
||||
duckdb_connection* conn_handle;
|
||||
duckdb_connection* conn_handle =
|
||||
static_cast<duckdb_connection*>(malloc(sizeof(duckdb_connection)));;
|
||||
status = status || duckdb_connect(*db_handle, conn_handle);
|
||||
this->server = conn_handle;
|
||||
if (status != 0) {
|
||||
@@ -20,6 +21,7 @@ void DuckdbServer::connect(Context* cxt) {
|
||||
}
|
||||
|
||||
DuckdbServer::DuckdbServer(Context* cxt) {
|
||||
this->DataSourceType = BACKEND_DuckDB;
|
||||
this->cxt = cxt;
|
||||
connect(cxt);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "DataSource_conn.h"
|
||||
|
||||
struct DuckdbServer : DataSource {
|
||||
explicit DuckdbServer(Context* cxt = nullptr);
|
||||
explicit DuckdbServer(Context* cxt);
|
||||
void connect(Context* cxt);
|
||||
void exec(const char* q);
|
||||
void* getCol(int col_idx, int type);
|
||||
|
||||
@@ -633,3 +633,5 @@ get_procedure(Context* cxt, const char* name) {
|
||||
};
|
||||
return res->second;
|
||||
}
|
||||
|
||||
void* CreateNULLServer(Context*) { return nullptr; }
|
||||
|
||||
+15
-4
@@ -63,11 +63,17 @@ enum Log_level {
|
||||
LOG_SILENT
|
||||
};
|
||||
|
||||
#ifndef __AQBACKEND_TYPE__
|
||||
#define __AQBACKEND_TYPE__ 1
|
||||
enum Backend_Type {
|
||||
BACKEND_AQuery,
|
||||
BACKEND_MonetDB,
|
||||
BACKEND_MariaDB
|
||||
BACKEND_MariaDB,
|
||||
BACKEND_DuckDB,
|
||||
BACKEND_SQLite,
|
||||
BACKEND_TOTAL
|
||||
};
|
||||
#endif
|
||||
|
||||
struct QueryStats{
|
||||
long long monet_time;
|
||||
@@ -81,10 +87,14 @@ struct Config{
|
||||
int buffer_sizes[];
|
||||
};
|
||||
|
||||
#ifndef __AQQueryResult__
|
||||
#define __AQQueryResult__ 1
|
||||
struct AQQueryResult {
|
||||
void* res;
|
||||
uint32_t ref;
|
||||
void* res;
|
||||
unsigned ref;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
struct Session{
|
||||
struct Statistic{
|
||||
@@ -114,7 +124,8 @@ struct Context {
|
||||
int n_buffers, *sz_bufs;
|
||||
void **buffers;
|
||||
|
||||
void* alt_server = nullptr;
|
||||
void* curr_server;
|
||||
void* alt_server[BACKEND_TOTAL] = {nullptr};
|
||||
Log_level log_level = LOG_INFO;
|
||||
|
||||
Session current;
|
||||
|
||||
@@ -9,7 +9,7 @@ inline size_t my_strlen(const char* str){
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Server::connect(
|
||||
void MariadbServer::connect(
|
||||
Context* cxt, const char* host, const char* user, const char* passwd,
|
||||
const char* db_name, const unsigned int port,
|
||||
const char* unix_socket, const unsigned long client_flag
|
||||
@@ -35,12 +35,12 @@ void Server::connect(
|
||||
this->status = true;
|
||||
}
|
||||
|
||||
void Server::exec(const char*q){
|
||||
void MariadbServer::exec(const char*q){
|
||||
auto res = mysql_real_query(server, q, my_strlen(q));
|
||||
if(res) printf("Execution Error: %d, %s\n", res, mysql_error(server));
|
||||
}
|
||||
|
||||
void Server::close(){
|
||||
void MariadbServer::close(){
|
||||
if(this->status && this->server){
|
||||
mysql_close(server);
|
||||
server = 0;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#endif
|
||||
struct Context;
|
||||
|
||||
struct Server{
|
||||
struct MariadbServer{
|
||||
MYSQL *server = nullptr;
|
||||
Context *cxt = nullptr;
|
||||
bool status = false;
|
||||
@@ -20,5 +20,5 @@ struct Server{
|
||||
);
|
||||
void exec(const char* q);
|
||||
void close();
|
||||
~Server();
|
||||
~MariadbServer();
|
||||
};
|
||||
+15
-14
@@ -71,16 +71,17 @@ namespace types{
|
||||
};
|
||||
}
|
||||
|
||||
Server::Server(Context* cxt){
|
||||
MonetdbServer::MonetdbServer(Context* cxt) {
|
||||
this->DataSourceType = BACKEND_MonetDB;
|
||||
if (cxt){
|
||||
connect(cxt);
|
||||
}
|
||||
}
|
||||
|
||||
void Server::connect(Context *cxt){
|
||||
void MonetdbServer::connect(Context *cxt){
|
||||
auto server = static_cast<monetdbe_database*>(this->server);
|
||||
if (cxt){
|
||||
cxt->alt_server = this;
|
||||
cxt->alt_server[DataSourceType] = this;
|
||||
this->cxt = cxt;
|
||||
}
|
||||
else{
|
||||
@@ -89,7 +90,7 @@ void Server::connect(Context *cxt){
|
||||
}
|
||||
|
||||
if (server){
|
||||
printf("Error: Server %p already connected. Restart? (Y/n). \n", server);
|
||||
printf("Error: MonetdbServer %p already connected. Restart? (Y/n). \n", server);
|
||||
char c[50];
|
||||
std::cin.getline(c, 49);
|
||||
for(int i = 0; i < 50; ++i) {
|
||||
@@ -122,7 +123,7 @@ void Server::connect(Context *cxt){
|
||||
}
|
||||
}
|
||||
|
||||
void Server::exec(const char* q){
|
||||
void MonetdbServer::exec(const char* q){
|
||||
auto server = static_cast<monetdbe_database*>(this->server);
|
||||
auto _res = static_cast<monetdbe_result*>(this->res);
|
||||
monetdbe_cnt _cnt = 0;
|
||||
@@ -137,7 +138,7 @@ void Server::exec(const char* q){
|
||||
}
|
||||
}
|
||||
|
||||
bool Server::haserror(){
|
||||
bool MonetdbServer::haserror(){
|
||||
if (last_error){
|
||||
puts(last_error);
|
||||
last_error = nullptr;
|
||||
@@ -149,7 +150,7 @@ bool Server::haserror(){
|
||||
}
|
||||
|
||||
|
||||
void Server::print_results(const char* sep, const char* end){
|
||||
void MonetdbServer::print_results(const char* sep, const char* end){
|
||||
|
||||
if (!haserror()){
|
||||
auto _res = static_cast<monetdbe_result*> (res);
|
||||
@@ -190,7 +191,7 @@ void Server::print_results(const char* sep, const char* end){
|
||||
}
|
||||
}
|
||||
|
||||
void Server::close(){
|
||||
void MonetdbServer::close(){
|
||||
if(this->server){
|
||||
auto server = static_cast<monetdbe_database*>(this->server);
|
||||
monetdbe_close(*server);
|
||||
@@ -199,7 +200,7 @@ void Server::close(){
|
||||
}
|
||||
}
|
||||
|
||||
void* Server::getCol(int col_idx){
|
||||
void* MonetdbServer::getCol(int col_idx, int){
|
||||
if(res){
|
||||
auto _res = static_cast<monetdbe_result*>(this->res);
|
||||
auto err_msg = monetdbe_result_fetch(_res,
|
||||
@@ -224,7 +225,7 @@ void* Server::getCol(int col_idx){
|
||||
|
||||
#define AQ_MONETDB_FETCH(X) case monetdbe_##X: \
|
||||
return (long long)((X *)(_ret_col->data))[0];
|
||||
long long Server::getFirstElement() {
|
||||
long long MonetdbServer::getFirstElement() {
|
||||
if(!this->haserror() && res) {
|
||||
auto _res = static_cast<monetdbe_result*>(this->res);
|
||||
auto err_msg = monetdbe_result_fetch(_res,
|
||||
@@ -266,11 +267,11 @@ long long Server::getFirstElement() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Server::~Server(){
|
||||
MonetdbServer::~MonetdbServer(){
|
||||
close();
|
||||
}
|
||||
|
||||
bool Server::havehge() {
|
||||
bool MonetdbServer::havehge() {
|
||||
#if defined(_MONETDBE_LIB_) and defined(HAVE_HGE)
|
||||
// puts("true");
|
||||
return HAVE_HGE;
|
||||
@@ -299,7 +300,7 @@ constexpr prt_fn_t monetdbe_prtfns[] = {
|
||||
constexpr uint32_t output_buffer_size = 65536;
|
||||
void print_monetdb_results(void* _srv, const char* sep = " ", const char* end = "\n",
|
||||
uint32_t limit = std::numeric_limits<uint32_t>::max()) {
|
||||
auto srv = static_cast<Server *>(_srv);
|
||||
auto srv = static_cast<MonetdbServer *>(_srv);
|
||||
if (!srv->haserror() && srv->cnt && limit) {
|
||||
char buffer[output_buffer_size];
|
||||
auto _res = static_cast<monetdbe_result*> (srv->res);
|
||||
@@ -360,7 +361,7 @@ cleanup:
|
||||
|
||||
|
||||
int ExecuteStoredProcedureEx(const StoredProcedure *p, Context* cxt){
|
||||
auto server = static_cast<Server*>(cxt->alt_server);
|
||||
auto server = static_cast<MonetdbServer*>(cxt->alt_server[BACKEND_MonetDB]);
|
||||
int ret = 0;
|
||||
bool return_from_procedure = false;
|
||||
void* handle = nullptr;
|
||||
|
||||
+9
-21
@@ -1,31 +1,19 @@
|
||||
#ifndef __MONETDB_CONN_H__
|
||||
#define __MONETDB_CONN_H__
|
||||
#include "DataSource_conn.h"
|
||||
|
||||
struct Context;
|
||||
|
||||
struct Server{
|
||||
void *server = nullptr;
|
||||
Context *cxt = nullptr;
|
||||
bool status = false;
|
||||
char* query = nullptr;
|
||||
int type = 1;
|
||||
|
||||
void* res = nullptr;
|
||||
void* ret_col = nullptr;
|
||||
long long cnt = 0;
|
||||
char* last_error = nullptr;
|
||||
|
||||
explicit Server(Context* cxt = nullptr);
|
||||
void connect(Context* cxt);
|
||||
void exec(const char* q);
|
||||
void *getCol(int col_idx);
|
||||
struct MonetdbServer : DataSource {
|
||||
explicit MonetdbServer(Context* cxt);
|
||||
void connect(Context* cxt) override;
|
||||
void exec(const char* q) override;
|
||||
void *getCol(int col_idx, int) override;
|
||||
long long getFirstElement();
|
||||
void close();
|
||||
bool haserror();
|
||||
void close() override;
|
||||
bool haserror() override;
|
||||
static bool havehge();
|
||||
void print_results(const char* sep = " ", const char* end = "\n");
|
||||
friend void print_monetdb_results(void* _srv, const char* sep, const char* end, int limit);
|
||||
~Server();
|
||||
~MonetdbServer() override;
|
||||
};
|
||||
|
||||
struct monetdbe_table_data{
|
||||
|
||||
+30
-12
@@ -7,6 +7,16 @@
|
||||
|
||||
#include "libaquery.h"
|
||||
#include "monetdb_conn.h"
|
||||
#include "duckdb_conn.h"
|
||||
|
||||
constexpr create_server_t get_server[] = {
|
||||
CreateNULLServer,
|
||||
[](Context* cxt) -> void*{ return new MonetdbServer(cxt); },
|
||||
CreateNULLServer,
|
||||
[](Context* cxt) -> void*{ return new DuckdbServer(cxt); },
|
||||
CreateNULLServer,
|
||||
};
|
||||
|
||||
#pragma region misc
|
||||
#ifdef THREADING
|
||||
#include "threading.h"
|
||||
@@ -89,7 +99,7 @@ extern "C" int __DLLEXPORT__ binary_info() {
|
||||
__AQEXPORT__(bool)
|
||||
have_hge() {
|
||||
#if defined(__MONETDB_CONN_H__)
|
||||
return Server::havehge();
|
||||
return MonetdbServer::havehge();
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
@@ -205,13 +215,20 @@ int dll_main(int argc, char** argv, Context* cxt){
|
||||
cxt->cfg = cfg;
|
||||
cxt->n_buffers = cfg->n_buffers;
|
||||
cxt->sz_bufs = buf_szs;
|
||||
if (cfg->backend_type == BACKEND_MonetDB && cxt->alt_server == nullptr)
|
||||
{
|
||||
auto alt_server = new Server(cxt);
|
||||
alt_server->exec("SELECT '**** WELCOME TO AQUERY++! ****';");
|
||||
puts(*(const char**)(alt_server->getCol(0)));
|
||||
cxt->alt_server = alt_server;
|
||||
}
|
||||
|
||||
|
||||
const auto& update_backend = [&cxt, &cfg](){
|
||||
auto& curr_server = cxt->alt_server[cfg->backend_type];
|
||||
if (curr_server == nullptr) {
|
||||
curr_server = get_server[cfg->backend_type](cxt);
|
||||
cxt->alt_server[cfg->backend_type] = curr_server;
|
||||
static_cast<DataSource*>(curr_server)->exec("SELECT '**** WELCOME TO AQUERY++! ****';");
|
||||
puts(*(const char**)(static_cast<DataSource*>(curr_server)->getCol(0, types::Types<const char*>::getType())));
|
||||
}
|
||||
cxt->curr_server = curr_server;
|
||||
};
|
||||
update_backend();
|
||||
|
||||
while(cfg->running){
|
||||
ENGINE_ACQUIRE();
|
||||
if (cfg->new_query) {
|
||||
@@ -221,10 +238,11 @@ start:
|
||||
|
||||
void *handle = nullptr;
|
||||
void *user_module_handle = nullptr;
|
||||
if (cfg->backend_type == BACKEND_MonetDB){
|
||||
if (cxt->alt_server == nullptr)
|
||||
cxt->alt_server = new Server(cxt);
|
||||
Server* server = reinterpret_cast<Server*>(cxt->alt_server);
|
||||
if (cfg->backend_type == BACKEND_MonetDB||
|
||||
cfg->backend_type == BACKEND_DuckDB
|
||||
) {
|
||||
update_backend();
|
||||
auto server = reinterpret_cast<DataSource*>(cxt->curr_server);
|
||||
if(n_recv > 0){
|
||||
if (cfg->backend_type == BACKEND_AQuery || cfg->has_dll) {
|
||||
const char* proc_name = "./dll.so";
|
||||
|
||||
@@ -67,7 +67,7 @@ void TableInfo<Ts ...>::monetdb_append_table(void* srv, const char* alt_name) {
|
||||
auto last_comma = create_table_str.find_last_of(',');
|
||||
if (last_comma != static_cast<decltype(last_comma)>(-1)) {
|
||||
create_table_str[last_comma] = ')';
|
||||
Server* server = (Server*)srv;
|
||||
MonetdbServer* server = (MonetdbServer*)srv;
|
||||
// puts("create table...");
|
||||
// puts(create_table_str.c_str());
|
||||
server->exec(create_table_str.c_str());
|
||||
|
||||
@@ -169,7 +169,7 @@ public:
|
||||
return distinct_copy();
|
||||
}
|
||||
// TODO: think of situations where this is a temp!! (copy on write!!!)
|
||||
template <bool _grow = true>
|
||||
template <bool _grow = true, bool _resize = false>
|
||||
inline void grow(uint32_t sz = 0) {
|
||||
if constexpr (_grow)
|
||||
sz = this->size;
|
||||
@@ -192,6 +192,8 @@ public:
|
||||
n_container = (_Ty*)malloc(new_capacity * sizeof(_Ty));
|
||||
memcpy(n_container, container, sizeof(_Ty) * size);
|
||||
}
|
||||
if constexpr(_resize)
|
||||
size = sz;
|
||||
memset(n_container + size, 0, sizeof(_Ty) * (new_capacity - size));
|
||||
// if (capacity)
|
||||
// free(container);
|
||||
@@ -200,8 +202,7 @@ public:
|
||||
}
|
||||
}
|
||||
inline void resize(const uint32_t sz){
|
||||
size = sz;
|
||||
grow<false>(sz);
|
||||
grow<false, true>(sz);
|
||||
}
|
||||
inline void reserve(const uint32_t sz){
|
||||
grow<false>(sz);
|
||||
|
||||
Reference in New Issue
Block a user