diff --git a/cpp/negentropy_wrapper.h b/cpp/negentropy_wrapper.h index b59d90f..f766da2 100644 --- a/cpp/negentropy_wrapper.h +++ b/cpp/negentropy_wrapper.h @@ -9,17 +9,35 @@ #include "negentropy.h" #include "negentropy/storage/BTreeLMDB.h" + +#define length(array) ((sizeof(array)) / (sizeof(array[0]))) + //This is a C-wrapper for the C++ library that helps in integrating negentropy with nim code. //TODO: Do error handling by catching exceptions -EXTERNC void* storage_new(){ +EXTERNC void* storage_new(const char* db_path, const char* name){ negentropy::storage::BTreeLMDB* storage; +/* + auto env = lmdb::env::create(); + env.set_max_dbs(64); + env.open(db_path, 0); + + lmdb::dbi btreeDbi; + + { + auto txn = lmdb::txn::begin(env); + btreeDbi = negentropy::storage::BTreeLMDB::setupDB(txn, name); + txn.commit(); + } */ + //TODO: Finish constructor //storage = new negentropy::storage::BTreeLMDB(); return storage; } EXTERNC void* negentropy_new(void* storage, uint64_t frameSizeLimit){ + //TODO: Make these typecasts into macros?? negentropy::storage::BTreeLMDB* lmdbStorage; + //TODO: reinterpret cast is risky, need to use more safe type conversion. lmdbStorage = reinterpret_cast(storage); Negentropy* ne; @@ -54,3 +72,61 @@ EXTERNC void negentropy_setinitiator(void* negentropy){ } + +EXTERNC bool storage_insert(void* storage, uint64_t createdAt, const char* id){ + negentropy::storage::BTreeLMDB* lmdbStorage; + lmdbStorage = reinterpret_cast(storage); + + //TODO: Error handling. Is it required? + //How does out of memory get handled? + return lmdbStorage->insert(createdAt, id); +} + + +EXTERNC bool storage_erase(void* storage, uint64_t createdAt, const char* id){ + negentropy::storage::BTreeLMDB* lmdbStorage; + lmdbStorage = reinterpret_cast(storage); + + //TODO: Error handling + return lmdbStorage->erase(createdAt, id); +} + + +EXTERNC const char* reconcile(void* negentropy, const char* query){ + Negentropy *ngn_inst; + ngn_inst = reinterpret_cast*>(negentropy); + + std::string* output = new std::string(); + try { + *output = ngn_inst->reconcile(std::string_view(query)); + } catch(negentropy::err e){ + //TODO:Find a way to return this error + return NULL; + } + return output->c_str(); +} + +EXTERNC const char* reconcile_with_ids(void* negentropy, const char* query, const char* have_ids[], + uint64_t have_ids_len, const char* need_ids[], uint64_t need_ids_len){ + Negentropy *ngn_inst; + ngn_inst = reinterpret_cast*>(negentropy); + + std::optional* output; + std::vector haveIds(have_ids, have_ids+have_ids_len); + + std::vector needIds(need_ids, need_ids+need_ids_len); + + try { + *output = ngn_inst->reconcile(std::string_view(query), haveIds, needIds); + } catch(negentropy::err e){ + //TODO:Find a way to return this error + return NULL; + } + if (output->has_value()) { + //TODO: Figure out diff between error and this. + return NULL; + }else { + + return output->value().c_str(); + } +} \ No newline at end of file