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