diff --git a/.test.cpp.swp b/.test.cpp.swp new file mode 100644 index 0000000..76ae544 Binary files /dev/null and b/.test.cpp.swp differ diff --git a/prompt.py b/prompt.py index c94d931..1761ded 100644 --- a/prompt.py +++ b/prompt.py @@ -96,6 +96,16 @@ class Config: self.running = 1 self.n_buffers = n_bufs + def __getter (self, *, i): + return self.np_buf[i] + def __setter(self, v, *, i): + self.np_buf[i] = v + def binder(_i): + from functools import partial + return property(partial(Config.__getter, i = _i), partial(Config.__setter, i = _i)) + + backend_type = binder(4) + @property def running(self): return self.np_buf[0] diff --git a/reconstruct/ast.py b/reconstruct/ast.py index b654710..f8672af 100644 --- a/reconstruct/ast.py +++ b/reconstruct/ast.py @@ -248,6 +248,8 @@ class create_table(ast_node): columns.append(f'{c.name} {c.type.upper()}') self.sql += ', '.join(columns) self.sql += ')' + if self.context.use_columnstore: + self.sql += ' engine=ColumnStore' diff --git a/reconstruct/storage.py b/reconstruct/storage.py index 44ed001..673a546 100644 --- a/reconstruct/storage.py +++ b/reconstruct/storage.py @@ -77,7 +77,8 @@ class Context: self.cols = [] self.datasource = None self.udf_map = dict() - + self.use_columnstore = False + def emit(self, sql:str): self.sql += sql + ' ' diff --git a/server/libaquery.h b/server/libaquery.h index b40769c..9f4a29f 100644 --- a/server/libaquery.h +++ b/server/libaquery.h @@ -25,8 +25,10 @@ struct Context{ int n_buffers, *sz_bufs; void **buffers; + void* alt_server; Log_level log_level = LOG_SILENT; printf_type print = printf; + template void log(Types... args) { if (log_level == LOG_INFO) diff --git a/server/mariadb_conn.cpp b/server/mariadb_conn.cpp new file mode 100644 index 0000000..4e226e4 --- /dev/null +++ b/server/mariadb_conn.cpp @@ -0,0 +1,56 @@ +#include "mariadb_conn.h" +#include "libaquery.h" +#include + +inline size_t my_strlen(const char* str){ + size_t ret = 0; + if(str) + while(*str) ++str; + return ret; +} + +void Server::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 +){ + this->cxt = cxt; + cxt->alt_server = this; + + server = 0; + mysql_init(server); + if (server == 0){ + printf("Error initializing client.\n"); + return; + } + + auto ret = + mysql_real_connect(server, host, user, passwd, db_name, port, unix_socket, client_flag); + + if(ret){ + printf("Error connecting to server: %d, %s\n", ret, mysql_error(server)); + return; + } + + this->status = true; +} + +void Server::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(){ + if(this->status && this->server){ + mysql_close(server); + server = 0; + this->status = false; + } +} + +Server::~Server(){ + if(this->status && this->server){ + this->close(); + mysql_library_end(); + } +} \ No newline at end of file diff --git a/server/mariadb_conn.h b/server/mariadb_conn.h new file mode 100644 index 0000000..888b79c --- /dev/null +++ b/server/mariadb_conn.h @@ -0,0 +1,23 @@ +#ifdef _WIN32 +#include +#else +#include +#endif +struct Context; + +struct Server{ + MYSQL *server = 0; + Context *cxt = 0; + bool status = 0; + char* query = 0; + int type = 0; + + void connect(Context* cxt, const char* host = "bill.local", + const char* user = "root", const char* passwd = "0508", + const char* db_name = "db", const unsigned int port = 3306, + const char* unix_socket = 0, const unsigned long client_flag = 0 + ); + void exec(const char* q); + void close(); + ~Server(); +}; \ No newline at end of file diff --git a/server/monetdb_config.h b/server/monetdb_config.h new file mode 100644 index 0000000..45c5988 --- /dev/null +++ b/server/monetdb_config.h @@ -0,0 +1,466 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. + */ +/* monetdb_config.h.in. Generated from CMakeLists.txt */ + +#ifndef MT_SEEN_MONETDB_CONFIG_H +#define MT_SEEN_MONETDB_CONFIG_H 1 + +#ifdef _MSC_VER + +#if _MSC_VER < 1900 +#error Versions below Visual Studio 2015 are no longer supported +#endif + +/* Prevent pollution through excessive inclusion of include files by Windows.h. */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif + +/* Visual Studio 8 has deprecated lots of stuff: suppress warnings */ +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#define _CRT_RAND_S /* for Windows rand_s, before stdlib.h */ +#define HAVE_RAND_S 1 + +#endif + +#if !defined(_XOPEN_SOURCE) && defined(__CYGWIN__) +#define _XOPEN_SOURCE 700 +#endif + +#include +#if defined(_MSC_VER) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) +/* In this case, malloc and friends are redefined in crtdbg.h to debug + * versions. We need to include stdlib.h first or else we get + * conflicting declarations. */ +#include +#endif + +#define HAVE_SYS_TYPES_H 1 +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +/* standard C-99 include files */ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER + +/* Windows include files */ +#include +#include +#include + +/* indicate to sqltypes.h that windows.h has already been included and + that it doesn't have to define Windows constants */ +#define ALREADY_HAVE_WINDOWS_TYPE 1 + +#define NATIVE_WIN32 1 + +#endif /* _MSC_VER */ + +#if !defined(WIN32) && defined(__CYGWIN__) +#define WIN32 1 +#endif + +// Section: monetdb configure defines +/* #undef HAVE_DISPATCH_DISPATCH_H */ +/* #undef HAVE_DLFCN_H */ +#define HAVE_FCNTL_H 1 +#define HAVE_IO_H 1 +/* #undef HAVE_KVM_H */ +/* #undef HAVE_LIBGEN_H */ +/* #undef HAVE_LIBINTL_H */ +/* #undef HAVE_MACH_MACH_INIT_H */ +/* #undef HAVE_MACH_TASK_H */ +/* #undef HAVE_MACH_O_DYLD_H */ +/* #undef HAVE_NETDB_H */ +/* #undef HAVE_NETINET_IN_H */ +/* #undef HAVE_POLL_H */ +/* #undef HAVE_PROCFS_H */ +/* #undef HAVE_PWD_H */ +/* #undef HAVE_STRINGS_H */ +/* #undef HAVE_STROPTS_H */ +/* #undef HAVE_SYS_FILE_H */ +/* #undef HAVE_SYS_IOCTL_H */ +/* #undef HAVE_SYS_SYSCTL_H */ +/* #undef HAVE_SYS_MMAN_H */ +/* #undef HAVE_SYS_PARAM_H */ +/* #undef HAVE_SYS_RANDOM_H */ +/* #undef HAVE_SYS_RESOURCE_H */ +/* #undef HAVE_SYS_TIME_H */ +/* #undef HAVE_SYS_TIMES_H */ +/* #undef HAVE_SYS_UIO_H */ +/* #undef HAVE_SYS_UN_H */ +/* #undef HAVE_SYS_WAIT_H */ +/* #undef HAVE_TERMIOS_H */ +/* #undef HAVE_UNISTD_H */ +/* #undef HAVE_UUID_UUID_H */ +#define HAVE_WINSOCK_H 1 +/* #undef HAVE_SEMAPHORE_H */ +#define HAVE_GETOPT_H 1 + +/* #undef HAVE_STDATOMIC_H */ + +/* #undef HAVE_DIRENT_H */ +/* #undef HAVE_SYS_SOCKET_H */ +/* #undef HAVE_GETTIMEOFDAY */ +#define HAVE_SYS_STAT_H 1 +/* #undef HAVE_FDATASYNC */ +/* #undef HAVE_ACCEPT4 */ +/* #undef HAVE_ASCTIME_R */ +/* #undef HAVE_CLOCK_GETTIME */ +/* #undef HAVE_CTIME_R */ +/* #undef HAVE_DISPATCH_SEMAPHORE_CREATE */ +/* #undef HAVE_FALLOCATE */ +/* #undef HAVE_FCNTL */ +/* #undef HAVE_FORK */ +/* #undef HAVE_FSYNC */ +#define HAVE_FTIME 1 +/* #undef HAVE_GETENTROPY */ +/* #undef HAVE_GETEXECNAME */ +/* #undef HAVE_GETLOGIN */ +#define HAVE_GETOPT_LONG 1 +/* #undef HAVE_GETRLIMIT */ +/* #undef HAVE_GETTIMEOFDAY */ +/* #undef HAVE_GETUID */ +/* #undef HAVE_GMTIME_R */ +/* #undef HAVE_LOCALTIME_R */ +/* #undef HAVE_STRERROR_R */ +/* #undef HAVE_LOCKF */ +/* #undef HAVE_MADVISE */ +/* #undef HAVE_MREMAP */ +/* #undef HAVE_NANOSLEEP */ +/* #undef HAVE_NL_LANGINFO */ +/* #undef HAVE__NSGETEXECUTABLEPATH */ +/* #undef HAVE_PIPE2 */ +/* #undef HAVE_POLL */ +/* #undef HAVE_POPEN */ +/* #undef HAVE_POSIX_FADVISE */ +/* #undef HAVE_POSIX_FALLOCATE */ +/* #undef HAVE_POSIX_MADVISE */ +#define HAVE_PUTENV 1 +/* #undef HAVE_SETSID */ +#define HAVE_SHUTDOWN 1 +/* #undef HAVE_SIGACTION */ +/* #undef HAVE_STPCPY */ +/* #undef HAVE_STRCASESTR */ +/* #undef HAVE_STRNCASECMP */ +/* #undef HAVE_STRPTIME */ +/* #undef HAVE_STRSIGNAL */ +/* #undef HAVE_SYSCONF */ +/* #undef HAVE_TASK_INFO */ +/* #undef HAVE_TIMES */ +/* #undef HAVE_UNAME */ +/* #undef HAVE_SEMTIMEDOP */ +/* #undef HAVE_PTHREAD_KILL */ +/* #undef HAVE_PTHREAD_SIGMASK */ +#define HAVE_GETOPT 1 + +#define ICONV_CONST +#define FLEXIBLE_ARRAY_MEMBER +#define ENABLE_MAPI 1 +#define HAVE_MAPI 1 +// End Section: monetdb configure defines + +// Section: monetdb macro variables +#define HAVE_ICONV 1 +/* #undef HAVE_PTHREAD_H */ +#define HAVE_LIBPCRE 1 +#define HAVE_LIBBZ2 1 +/* #undef HAVE_CURL */ +#define HAVE_LIBLZMA 1 +#define HAVE_LIBXML 1 +#define HAVE_LIBZ 1 +#define HAVE_LIBLZ4 1 +/* #undef HAVE_PROJ */ +/* #undef HAVE_SNAPPY */ +/* #undef HAVE_FITS */ +/* #undef HAVE_UUID */ +/* #undef HAVE_VALGRIND */ +/* #undef HAVE_NETCDF */ +/* #undef HAVE_READLINE */ +/* #undef HAVE_LIBR */ +#define RHOME "/registry" +#define HAVE_GEOM 1 +/* #undef HAVE_SHP */ +#define HAVE_LIBPY3 1 + +// #define SOCKET_LIBRARIES +#define HAVE_GETADDRINFO 1 +/* #undef HAVE_CUDF */ + +#define MAPI_PORT 50000 +#define MAPI_PORT_STR "50000" + +#ifdef _MSC_VER +#define DIR_SEP '\\' +#define PATH_SEP ';' +#define DIR_SEP_STR "\\" +#define SO_PREFIX "" +#else +#define DIR_SEP '/' +#define PATH_SEP ':' +#define DIR_SEP_STR "/" +/* #undef SO_PREFIX */ +#endif +#define SO_EXT ".dll" + +#define BINDIR "C:/cygwin64/home/monet/x86_64/install/bin" +#define LIBDIR "C:/cygwin64/home/monet/x86_64/install/lib" +#define LOCALSTATEDIR "C:/cygwin64/home/monet/x86_64/install/var" + +// End Section: monetdb macro variables + +// Section: monetdb configure misc +#define MONETDB_RELEASE "Jan2022-SP3" + +#define MONETDB_VERSION "11.43.15" +#define MONETDB_VERSION_MAJOR 11 +#define MONETDB_VERSION_MINOR 43 +#define MONETDB_VERSION_PATCH 15 + +#define GDK_VERSION "25.1.0" +#define GDK_VERSION_MAJOR 25 +#define GDK_VERSION_MINOR 1 +#define GDK_VERSION_PATCH 0 +#define MAPI_VERSION "14.0.2" +#define MAPI_VERSION_MAJOR 14 +#define MAPI_VERSION_MINOR 0 +#define MAPI_VERSION_PATCH 2 +#define MONETDB5_VERSION "32.0.6" +#define MONETDB5_VERSION_MAJOR 32 +#define MONETDB5_VERSION_MINOR 0 +#define MONETDB5_VERSION_PATCH 6 +#define MONETDBE_VERSION "3.0.2" +#define MONETDBE_VERSION_MAJOR 3 +#define MONETDBE_VERSION_MINOR 0 +#define MONETDBE_VERSION_PATCH 2 +#define STREAM_VERSION "16.0.1" +#define STREAM_VERSION_MAJOR 16 +#define STREAM_VERSION_MINOR 0 +#define STREAM_VERSION_PATCH 1 +#define SQL_VERSION "12.0.5" +#define SQL_VERSION_MAJOR 12 +#define SQL_VERSION_MINOR 0 +#define SQL_VERSION_PATCH 5 + +/* Host identifier */ +#define HOST "amd64-pc-windows-msvc" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH "SHA512" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH_TOKEN SHA512 + +#ifndef _Noreturn +#define _Noreturn __declspec(noreturn) +#endif +#ifndef __cplusplus +/* Does your compiler support `inline' keyword? (C99 feature) */ +#ifndef inline +#define inline __inline +#endif +/* Does your compiler support `__restrict__' keyword? (C99 feature) */ +#ifndef __restrict__ +#define __restrict__ restrict +#endif +#endif + +#ifdef _MSC_VER +#ifndef __restrict__ +#define __restrict__ __restrict +#endif +#endif + +// End Section: monetdb configure misc + +// Section: monetdb configure sizes +#define SIZEOF_SIZE_T 8 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +#define SIZEOF_CHAR 1 +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_WCHAR_T 2 +#define HAVE_LONG_LONG 1 /* for ODBC include files */ + +#ifdef _MSC_VER +#ifdef _WIN64 +#define LENP_OR_POINTER_T SQLLEN * +#else +#define LENP_OR_POINTER_T SQLPOINTER +#endif +#else +#define LENP_OR_POINTER_T SQLLEN * +#endif +#define SIZEOF_SQLWCHAR 2 + +/* #undef WORDS_BIGENDIAN */ + +/* Does your compiler support `ssize_t' type? (Posix type) */ +#ifndef ssize_t +#define ssize_t int64_t +#endif + +/* The size of `__int128', as computed by sizeof. */ +/* #undef SIZEOF___INT128 */ + +/* The size of `__int128_t', as computed by sizeof. */ +/* #undef SIZEOF___INT128_T */ + +/* The size of `__uint128_t', as computed by sizeof. */ +/* #undef SIZEOF___UINT128_T */ + +#ifdef SIZEOF___INT128 +typedef __int128 hge; +typedef unsigned __int128 uhge; +#define HAVE_HGE 1 +#define SIZEOF_HGE SIZEOF___INT128 +#elif defined(SIZEOF___INT128_T) && defined(SIZEOF___UINT128_T) +typedef __int128_t hge; +typedef __uint128_t uhge; +#define HAVE_HGE 1 +#define SIZEOF_HGE SIZEOF___INT128_T +#endif + +// End Section: monetdb configure sizes + +/* Does your compiler support `__attribute__' extension? */ +#if !defined(__GNUC__) && !defined(__clang__) && !defined(__attribute__) +#define __attribute__(a) +#endif + +#if !defined(__cplusplus) || __cplusplus < 201103L +#ifndef static_assert +/* static_assert is a C11/C++11 feature, defined in assert.h which also exists + * in many other compilers we ignore it if the compiler doesn't support it + * However in C11 static_assert is a macro, while on C++11 is a keyword */ +#define static_assert(expr, mesg) ((void) 0) +#endif +#endif + +#ifdef HAVE_STRINGS_H +#include /* strcasecmp */ +#endif + +#ifdef _MSC_VER + +#define strdup(s) _strdup(s) + +#ifndef strcasecmp +#define strcasecmp(x,y) _stricmp(x,y) +#endif + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 +#ifndef strncasecmp +#define strncasecmp(x,y,z) _strnicmp(x,y,z) +#endif + +#include +#ifdef lstat +#undef lstat +#endif +#define lstat _stat64 +#ifdef stat +#undef stat +#endif +#define stat _stat64 +#ifdef fstat +#undef fstat +#endif +#define fstat _fstat64 + +static inline char * +stpcpy(char *__restrict__ dst, const char *__restrict__ src) +{ + size_t i; + for (i = 0; src[i]; i++) + dst[i] = src[i]; + dst[i] = 0; + return dst + i; +} + +/* Define to 1 if the system has the type `socklen_t'. */ +#define HAVE_SOCKLEN_T 1 +/* type used by connect */ +#define socklen_t int +#define strtok_r(t,d,c) strtok_s(t,d,c) + +#define HAVE_GETOPT_LONG 1 + +/* there is something very similar to localtime_r on Windows: */ +#include +#define HAVE_LOCALTIME_R 1 +static inline struct tm * +localtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) +{ + return localtime_s(result, timep) == 0 ? result : NULL; +} +#define HAVE_GMTIME_R 1 +static inline struct tm * +gmtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) +{ + return gmtime_s(result, timep) == 0 ? result : NULL; +} + +/* Define if you have ctime_r(time_t*,char *buf,size_t s) */ +#define HAVE_CTIME_R 1 +#define HAVE_CTIME_R3 1 +/* there is something very similar to ctime_r on Windows: */ +#define ctime_r(t,b,s) (ctime_s(b,s,t) ? NULL : (b)) + +#endif /* _MSC_VER */ + +#define HAVE_SOCKLEN_T 1 +#ifndef _MSC_VER +#define SOCKET int +#define closesocket close +#endif + +#ifndef _In_z_ +#define _In_z_ +#endif +#ifndef _Printf_format_string_ +#define _Printf_format_string_ +#endif + +#ifdef _MSC_VER +#define _LIB_STARTUP_FUNC_(f,q) \ + static void f(void); \ + __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ + __pragma(comment(linker,"/include:" q #f "_")) \ + static void f(void) +#ifdef _WIN64 + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"") +#else + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"_") +#endif +#else +#define LIB_STARTUP_FUNC(f) \ + static void f(void) __attribute__((__constructor__)); \ + static void f(void) +#endif + +#endif /* MT_SEEN_MONETDB_CONFIG_H */ diff --git a/server/monetdb_conn.cpp b/server/monetdb_conn.cpp new file mode 100644 index 0000000..8ff0618 --- /dev/null +++ b/server/monetdb_conn.cpp @@ -0,0 +1,50 @@ +#include "monetdb_conn.h" +#include "libaquery.h" +#include + +void Server::connect(Context *cxt){ + if (!cxt){ + cxt->alt_server = this; + this->cxt = cxt; + } + else{ + return; + } + + if (server != 0){ + monetdbe_close(*server); + free(*server); + server = (monetdbe_database*)malloc(sizeof(monetdbe_database)); + } + monetdbe_open(server, nullptr, nullptr); +} + +void Server::exec(const char* q){ + auto qstatus = monetdbe_query(*server, const_cast(q), &res, &cnt); + if (qstatus != nullptr){ + puts("Execution Failed.\n"); + } +} + +void Server::close(){ + if(this->server){ + monetdbe_close(*(this->server)); + free(this->server); + this->server = 0; + } +} + +void* Server::getCol(int col_idx){ + if(res){ + if(monetdbe_result_fetch(res, &ret_col, col_idx) != nullptr) + { + cnt = ret_col->count; + return ret_col->data; + } + } + return 0; +} + +Server::~Server(){ + close(); +} \ No newline at end of file diff --git a/server/monetdb_conn.h b/server/monetdb_conn.h new file mode 100644 index 0000000..a90301b --- /dev/null +++ b/server/monetdb_conn.h @@ -0,0 +1,21 @@ +#include "monetdbe.h" + +struct Context; + +struct Server{ + monetdbe_database *server = 0; + Context *cxt = 0; + bool status = 0; + char* query = 0; + int type = 1; + + monetdbe_result* res = 0; + monetdbe_column* ret_col = 0; + monetdbe_cnt cnt = 0; + + void connect(Context* cxt); + void exec(const char* q); + void *getCol(int col_idx); + void close(); + ~Server(); +}; \ No newline at end of file diff --git a/server/monetdbe.h b/server/monetdbe.h new file mode 100644 index 0000000..7e2fc90 --- /dev/null +++ b/server/monetdbe.h @@ -0,0 +1,188 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. + */ + +#ifndef _MONETDBE_LIB_ +#define _MONETDBE_LIB_ + +#include "monetdb_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef WIN32 +#ifndef LIBMONETDBE +#define monetdbe_export extern __declspec(dllimport) +#else +#define monetdbe_export extern __declspec(dllexport) +#endif +#else +#define monetdbe_export extern +#endif + +typedef int64_t monetdbe_cnt; + +typedef struct { + unsigned char day; + unsigned char month; + short year; +} monetdbe_data_date; + +typedef struct { + unsigned int ms; + unsigned char seconds; + unsigned char minutes; + unsigned char hours; +} monetdbe_data_time; + +typedef struct { + monetdbe_data_date date; + monetdbe_data_time time; +} monetdbe_data_timestamp; + +typedef struct { + size_t size; + char* data; +} monetdbe_data_blob; + +typedef enum { + monetdbe_bool, monetdbe_int8_t, monetdbe_int16_t, monetdbe_int32_t, monetdbe_int64_t, +#ifdef HAVE_HGE + monetdbe_int128_t, +#endif + monetdbe_size_t, monetdbe_float, monetdbe_double, + monetdbe_str, monetdbe_blob, + monetdbe_date, monetdbe_time, monetdbe_timestamp, + + // should be last: + monetdbe_type_unknown +} monetdbe_types; + +typedef struct { + char* name; + unsigned int scale; + unsigned int digits; +} monetdbe_sql_type; + +typedef struct { + monetdbe_types type; + monetdbe_sql_type sql_type; + void *data; + size_t count; + char* name; +} monetdbe_column; + +typedef struct { + size_t nparam; + monetdbe_types *type; +} monetdbe_statement; + +typedef struct { + monetdbe_cnt nrows; + size_t ncols; + char *name; + monetdbe_cnt last_id; /* last auto incremented id */ +} monetdbe_result; + +typedef void* monetdbe_database; + +typedef struct { + const char *host; + int port; + const char *database; + const char *username; + const char *password; + const char *lang; +} monetdbe_remote; + +typedef struct { + const char* port; + const char* usock; +} monetdbe_mapi_server; + +typedef struct { + int memorylimit; // top off the amount of RAM to be used, in MB + int querytimeout; // graceful terminate query after a few seconds + int sessiontimeout; // graceful terminate the session after a few seconds + int nr_threads; // maximum number of worker treads, limits level of parallelism + monetdbe_remote* remote; + monetdbe_mapi_server* mapi_server; + const char *trace_file; // file to which log output should be written +} monetdbe_options; + +#define DEFAULT_STRUCT_DEFINITION(ctype, typename) \ + typedef struct \ + { \ + monetdbe_types type; \ + monetdbe_sql_type sql_type; \ + ctype *data; \ + size_t count; \ + char *name; \ + ctype null_value; \ + double scale; \ + int (*is_null)(ctype *value); \ + } monetdbe_column_##typename + +DEFAULT_STRUCT_DEFINITION(int8_t, bool); +DEFAULT_STRUCT_DEFINITION(int8_t, int8_t); +DEFAULT_STRUCT_DEFINITION(int16_t, int16_t); +DEFAULT_STRUCT_DEFINITION(int32_t, int32_t); +DEFAULT_STRUCT_DEFINITION(int64_t, int64_t); +#ifdef HAVE_HGE +DEFAULT_STRUCT_DEFINITION(__int128, int128_t); +#endif +DEFAULT_STRUCT_DEFINITION(size_t, size_t); + +DEFAULT_STRUCT_DEFINITION(float, float); +DEFAULT_STRUCT_DEFINITION(double, double); + +DEFAULT_STRUCT_DEFINITION(char *, str); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_blob, blob); + +DEFAULT_STRUCT_DEFINITION(monetdbe_data_date, date); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_time, time); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_timestamp, timestamp); +// UUID, INET, XML ? + +monetdbe_export const char *monetdbe_version(void); + +monetdbe_export int monetdbe_open(monetdbe_database *db, char *url, monetdbe_options *opts); +/* 0 ok, -1 (allocation failed), -2 error in db */ +monetdbe_export int monetdbe_close(monetdbe_database db); + +monetdbe_export char* monetdbe_error(monetdbe_database db); + +monetdbe_export char* monetdbe_get_autocommit(monetdbe_database dbhdl, int* result); +monetdbe_export char* monetdbe_set_autocommit(monetdbe_database dbhdl, int value); +monetdbe_export int monetdbe_in_transaction(monetdbe_database dbhdl); + +monetdbe_export char* monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows); +monetdbe_export char* monetdbe_result_fetch(monetdbe_result *mres, monetdbe_column** res, size_t column_index); +monetdbe_export char* monetdbe_cleanup_result(monetdbe_database dbhdl, monetdbe_result* result); + +monetdbe_export char* monetdbe_prepare(monetdbe_database dbhdl, char *query, monetdbe_statement **stmt, monetdbe_result** result); +monetdbe_export char* monetdbe_bind(monetdbe_statement *stmt, void *data, size_t parameter_nr); +monetdbe_export char* monetdbe_execute(monetdbe_statement *stmt, monetdbe_result **result, monetdbe_cnt* affected_rows); +monetdbe_export char* monetdbe_cleanup_statement(monetdbe_database dbhdl, monetdbe_statement *stmt); + +monetdbe_export char* monetdbe_append(monetdbe_database dbhdl, const char* schema, const char* table, monetdbe_column **input, size_t column_count); +monetdbe_export const void* monetdbe_null(monetdbe_database dbhdl, monetdbe_types t); + +monetdbe_export char* monetdbe_get_columns(monetdbe_database dbhdl, const char* schema_name, const char *table_name, size_t *column_count, monetdbe_column **columns); + +monetdbe_export char* monetdbe_dump_database(monetdbe_database dbhdl, const char *backupfile); +monetdbe_export char* monetdbe_dump_table(monetdbe_database dbhdl, const char *schema_name, const char *table_name, const char *backupfile); + +#ifdef __cplusplus +} +#endif + + +#endif