From b1b0a8c6e5e66382476ea3c6517bc6ee1e02805c Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Mon, 9 Aug 2021 13:52:24 +0200
Subject: [PATCH] WIP: Implement transactions in Extern C

---
 include/ccaosdb.h     |  4 ++++
 src/ccaosdb.cpp       | 39 +++++++++++++++++++++++++++++++++++++++
 test/test_ccaosdb.cpp | 19 +++++++++++++++++++
 3 files changed, 62 insertions(+)

diff --git a/include/ccaosdb.h b/include/ccaosdb.h
index bb62a51..cc57a6f 100644
--- a/include/ccaosdb.h
+++ b/include/ccaosdb.h
@@ -249,8 +249,12 @@ 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_execute(
   caosdb_transaction_transaction *transaction);
+// TODO(fspreck) execute_asynchronously may be added as a separate
+// function once we actually support asynchronous execution.
 
 typedef struct {
   void *wrapped_result_set;
diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp
index 5f89af1..8934253 100644
--- a/src/ccaosdb.cpp
+++ b/src/ccaosdb.cpp
@@ -241,4 +241,43 @@ ERROR_RETURN_CODE(GENERIC_ERROR,
                         .get();
                     return 0;
                   })
+
+/****************************************************************************
+ * ENTITY STUFF AND TRANSACTIONS
+ ****************************************************************************/
+ERROR_RETURN_CODE(GENERIC_ERROR,
+                  int caosdb_connection_connection_create_transaction(
+                    caosdb_connection_connection *connection,
+                    caosdb_transaction_transaction *out),
+                  {
+                    caosdb::connection::Connection *wrapped_connection =
+                      static_cast<caosdb::connection::Connection *>(
+                        connection->wrapped_connection);
+                    out->wrapped_transaction =
+                      wrapped_connection->CreateTransaction().get();
+                    return 0;
+                  })
+
+ERROR_RETURN_CODE(GENERIC_ERROR,
+                  int caosdb_transaction_transaction_retrieve_by_id(
+                    caosdb_transaction_transaction *transaction,
+                    const char *id),
+                  {
+                    caosdb::transaction::Transaction *wrapped_transaction =
+                      static_cast<caosdb::transaction::Transaction *>(
+                        transaction->wrapped_transaction);
+                    wrapped_transaction->RetrieveById(id);
+                    return 0;
+                  })
+
+ERROR_RETURN_CODE(GENERIC_ERROR,
+                  int caosdb_transaction_transaction_execute(
+                    caosdb_transaction_transaction *transaction),
+                  {
+                    caosdb::transaction::Transaction *wrapped_transaction =
+                      static_cast<caosdb::transaction::Transaction *>(
+                        transaction->wrapped_transaction);
+                    wrapped_transaction->Execute();
+                    return 0;
+                  })
 }
diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp
index abb06dd..055a3c6 100644
--- a/test/test_ccaosdb.cpp
+++ b/test/test_ccaosdb.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "caosdb/configuration.h"
+#include "caosdb/status_code.h"        // for StatusCode
 #include "caosdb_test_utility.h"   // for EXPECT_THROW_MESSAGE, TEST_DATA_DIR
 #include "ccaosdb.h"               // for caosdb_utility_get_env_var
 #include <gtest/gtest-message.h>   // for Message
@@ -61,3 +62,21 @@ TEST_F(test_ccaosdb, test_get_connection) {
                                                       "local-caosdb-admin");
   EXPECT_TRUE(out.wrapped_connection);
 }
+
+TEST_F(test_ccaosdb, test_execute_transaction) {
+  caosdb_connection_connection connection;
+  caosdb_connection_connection_manager_get_connection(&connection,
+                                                      "local-caosdb-admin");
+
+  caosdb_transaction_transaction transaction;
+  caosdb_connection_connection_create_transaction(&connection, &transaction);
+
+  EXPECT_TRUE(transaction.wrapped_transaction);
+
+  int return_code(
+    caosdb_transaction_transaction_retrieve_by_id(&transaction, "some_id"));
+  EXPECT_EQ(return_code, 0);
+
+  return_code = caosdb_transaction_transaction_execute(&transaction);
+  EXPECT_EQ(return_code, caosdb::StatusCode::CONNECTION_ERROR);
+}
-- 
GitLab