Есть ли способ использовать MonetDBLite в качестве механизма хранения в приложении на C++ без установки пакета R? Или есть ли другие способы использования MonetDB в качестве встроенной базы данных, такой как SQLite?MonetDBLite без R в приложении C++/Qt
ответ
Вы можете использовать это с C/C++ и т.д., например, так:
Скачать/клонировать источник R пакет из GitHub https://github.com/hannesmuehleisen/MonetDBLite, затем перейти к src
папку и запустить Configure:
./configure --enable-embedded --disable-fits --disable-geom --disable-rintegration --disable-gsl --disable-netcdf --disable-jdbc --disable-merocontrol --disable-odbc --disable-console --disable-microhttpd --without-openssl --without-uuid --without-curl --without-bz2 --without-lzma --without-libxml2 --without-perl --without-python2 --without-python3 --without-unixodbc --disable-mapi --without-samtools --without-sphinxclient --without-geos --without-samtools --without-readline --enable-optimize --enable-silent-rules --disable-int128
построить его make -j
(это займет некоторое время)
Вы можете построить разделяемая библиотека MonetDBLite следующим образом:
gcc -shared -o libmonetdb5.so `find common gdk mal/mal mal/modules mal/optimizer sql embedded -name "*.o" | tr "\n" " "` -lpthread -lpcre -lz -liconv
Вы должны закончить с большим (5 MB) файл libmonetdb5.so, который содержит весь код MonetDBLite. Теперь, чтобы использовать его из вашей программы:
Вот пример программы C, чтобы использовать встроенный MonetDB:
#include "monetdb_config.h"
#include "sql_scenario.h"
#include "mal.h"
#include "embedded.h"
int main() {
char* err = NULL;
void* conn = NULL;
res_table* result = NULL;
err = monetdb_startup("/tmp/embedded-dbfarm", 1, 0);
if (err != NULL) {
fprintf(stderr, "Init fail: %s\n", err);
return -1;
}
conn = monetdb_connect();
err = monetdb_query(conn, "SELECT * FROM tables;", 1, (void**) &result);
if (err != NULL) {
fprintf(stderr, "Query fail: %s\n", err);
return -2;
}
fprintf(stderr, "Query result with %i cols and %lu rows\n", result->nr_cols, BATcount(BATdescriptor(result->cols[0].b)));
monetdb_disconnect(conn);
monetdb_shutdown();
}
Сохранить это в файл в src
папке (здесь, test.c
) и построить его:
gcc test.c -Icommon/options -Icommon/stream -Igdk -Imal/mal -Imal/modules/atoms -Imal/modules/mal -Isql/include -Isql/backends/monet5 -Isql/server -Isql/common -Isql/storage -Iembedded -lmonetdb5 -L.
это должно быть все, когда вы запустите его (./a.out
), он должен сказать Query result with 9 cols and 44 rows
. Обратите внимание, что вам нужно отправить файл libmonetdb5.so
вместе с вашей скомпилированной программой, а не остальную часть sourcetree.
В качестве опоры мы надеемся оптимизировать этот процесс в будущем.
Также см. Новый пример MonetDBLite-C здесь: https://github.com/hannesmuehleisen/MonetDBLite-C#usage-example –