make ext_engine: duckdb to work

This commit is contained in:
2023-03-24 04:57:25 +08:00
parent 200dc71aad
commit 7c5440c4fb
29 changed files with 237 additions and 124 deletions
+21 -9
View File
@@ -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__
+3 -1
View File
@@ -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);
}
+1 -1
View File
@@ -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);
+2
View File
@@ -633,3 +633,5 @@ get_procedure(Context* cxt, const char* name) {
};
return res->second;
}
void* CreateNULLServer(Context*) { return nullptr; }
+15 -4
View File
@@ -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;
+3 -3
View File
@@ -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;
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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";
+1 -1
View File
@@ -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());
+4 -3
View File
@@ -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);