2016-05-21 10 views
2

Gibt es eine Möglichkeit, MonetDBLite als Speichermodul in einer C++ - Anwendung zu verwenden, ohne das R-Paket zu installieren? Oder gibt es andere Möglichkeiten, MonetDB als eingebettete Datenbank wie SQLite zu verwenden?MonetDBLite ohne R in einer C++/Qt-Anwendung

Antwort

5

können Sie diese verwenden, um von C/C++ usw., etwa so:

Download/klonen die R Paketquelle von GitHub https://github.com/hannesmuehleisen/MonetDBLite, dann gehen zum src Ordner und führen 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

Baut sie mit make -j (dies wird eine Weile dauern)

anschließend können Sie bauen eine MonetDBLite gemeinsam genutzte Bibliothek wie folgt:

gcc -shared -o libmonetdb5.so `find common gdk mal/mal mal/modules mal/optimizer sql embedded -name "*.o" | tr "\n" " "` -lpthread -lpcre -lz -liconv

Sie sollten libmonetdb5.so mit einem großen (5 MB) am Ende Datei, die alle vom MonetDBLite-Code enthält. Jetzt zu verwenden, um es aus dem eigenen Programm:

Hier ist ein Beispiel C-Programm MonetDB eingebettet zu verwenden:

#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(); 
} 

speichert diese in eine Datei im src Ordner (hier test.c) und baut es:

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.

das ist alles sein sollte, wenn Sie es (./a.out) ausführen, sollte es Query result with 9 cols and 44 rows sagen. Beachten Sie, dass Sie nur die Datei libmonetdb5.so zusammen mit dem kompilierten Programm und nicht mit dem Rest des Quellbaums versenden müssen.

Als eine Nebenbemerkung hoffen wir, diesen Prozess in der Zukunft zu rationalisieren.

+0

Siehe auch das neue MonetDBLite-C Beispiel, hier: https://github.com/hannesmuehleisen/MonetDBLite-C#usage-example –