#include "boltdb.h" BoltDB::BoltDB() { } BoltDB* BoltDB::createFrom(QString filePath, QString &errorOut) { auto opts = ::Bolt_Options_New_Readonly(); QByteArray filePathBytes(filePath.toUtf8()); GoString filePathGS = Interop::toGoString_WeakRef(&filePathBytes); auto open_ret = ::Bolt_Open(filePathGS, 0444, opts); if (open_ret.r1.n != 0) { errorOut = QString(open_ret.r1.p); return nullptr; } BoltDB *ret = new BoltDB(); ret->gmsDbRef = open_ret.r0; return ret; } template struct Wrapper { T t; }; static void byteArrayCallback(void* ctx, GoString text) { auto fn = static_cast*>(ctx); fn->t(QByteArray::fromRawData(text.p, text.n)); } bool BoltDB::listBucketsAtRoot(QString& errorOut, NameReciever cb) { auto containerVar = Wrapper{cb}; GoString err = ::Bolt_ListBucketsAtRoot( this->gmsDbRef, (GoUintptr)(&containerVar), byteArrayCallback // -fpermissive ); if (err.n > 0) { errorOut = QString(err.p); return false; } return true; } BoltDB::~BoltDB() { GoString err = ::Bolt_Close(this->gmsDbRef); if (err.n != 0) { // Error closing database! // Need to display an alert... somewhere } }