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