From 6581762676de635fa0ed1d91e49439d8e473c9c4 Mon Sep 17 00:00:00 2001 From: florian <f.spreckelsen@inidscale.com> Date: Mon, 9 Aug 2021 16:09:51 +0200 Subject: [PATCH] WIP: Add multi-id retrieval --- include/ccaosdb.h | 4 ++-- src/ccaosdb.cpp | 15 +++++++++++++++ test/test_ccaosdb.cpp | 28 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/include/ccaosdb.h b/include/ccaosdb.h index cc57a6f..245d961 100644 --- a/include/ccaosdb.h +++ b/include/ccaosdb.h @@ -249,8 +249,8 @@ int caosdb_connection_connection_create_transaction( caosdb_transaction_transaction *out); int caosdb_transaction_transaction_retrieve_by_id( caosdb_transaction_transaction *transaction, const char *id); -// TODO(fspreck) retrieve_by_ids what do we do about iterators in Extern C? Is -// this even a problem? +int caosdb_transaction_transaction_retrieve_by_ids( + caosdb_transaction_transaction *transaction, const char *ids[]); int caosdb_transaction_transaction_execute( caosdb_transaction_transaction *transaction); // TODO(fspreck) execute_asynchronously may be added as a separate diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp index e649c01..0b1c7df 100644 --- a/src/ccaosdb.cpp +++ b/src/ccaosdb.cpp @@ -9,6 +9,7 @@ #include <iostream> #include <stdio.h> #include <string.h> +#include <vector> extern "C" { @@ -268,6 +269,20 @@ ERROR_RETURN_CODE(GENERIC_ERROR, transaction->wrapped_transaction); return wrapped_transaction->RetrieveById(std::string(id)); }) +ERROR_RETURN_CODE( + GENERIC_ERROR, + int caosdb_transaction_transaction_retrieve_by_ids( + caosdb_transaction_transaction *transaction, const char *ids[]), + { + auto *wrapped_transaction = static_cast<caosdb::transaction::Transaction *>( + transaction->wrapped_transaction); + // Fill a string vector with the contents of the array of char arrays. + std::vector<std::string> str_ids; + for (const char **i = ids; *i; ++i) { + str_ids.push_back(std::string(*i)); + } + return wrapped_transaction->RetrieveById(str_ids.begin(), str_ids.end()); + }) ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_transaction_transaction_execute( diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp index 48b6d37..ff05fa0 100644 --- a/test/test_ccaosdb.cpp +++ b/test/test_ccaosdb.cpp @@ -79,4 +79,32 @@ TEST_F(test_ccaosdb, test_execute_transaction) { return_code = caosdb_transaction_transaction_execute(&transaction); EXPECT_EQ(return_code, caosdb::StatusCode::CONNECTION_ERROR); + + caosdb_transaction_transaction multi_transaction; + caosdb_connection_connection_create_transaction(&connection, + &multi_transaction); + + // We explicitely want to define a C-style array here, so we disable + // linting + const char *ids[] = {"id1", "id2", "id3"}; // NOLINT + return_code = + caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids); + EXPECT_EQ(return_code, 0); +} + +TEST_F(test_ccaosdb, test_multi_retrieve) { + caosdb_connection_connection connection; + caosdb_connection_connection_manager_get_connection(&connection, + "local-caosdb-admin"); + + caosdb_transaction_transaction multi_transaction; + caosdb_connection_connection_create_transaction(&connection, + &multi_transaction); + + // We explicitely want to define a C-style array here, so we disable + // linting + const char *ids[] = {"id1", "id2", "id3"}; // NOLINT + int return_code( + caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids)); + EXPECT_EQ(return_code, 0); } -- GitLab