有没有办法在不安装R包的情况下将MonetDBLite用作C++应用程序中的存储引擎?还是有其他方法可以将MonetDB用作SQLite之类的嵌入式数据库?
最佳答案
您可以从C / C++等使用它,如下所示:
从GitHub下载/克隆R包源
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代码。现在从您自己的程序中使用它:
这是使用嵌入式MonetDB的示例C程序:
#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
文件与已编译的程序一起发送,而不需要与其他源代码树一起发送。作为旁注,我们希望将来可以简化此过程。
关于c++ - 在C++/Qt应用程序中不带R的MonetDBLite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37359507/