Skip to content
Snippets Groups Projects
Commit 364b9519 authored by florian's avatar florian
Browse files

ENH: Add destructor for transactions to Extern C

parent 72e8d4c5
No related branches found
No related tags found
3 merge requests!12F consolidation,!9Draft: API: remove UniqueResult, lower-case at, size for ResultSet,!8ENH: Add retrieval and queries to Extern C interface
Pipeline #11650 failed
...@@ -265,9 +265,17 @@ typedef struct { ...@@ -265,9 +265,17 @@ typedef struct {
void *wrapped_transaction; void *wrapped_transaction;
} caosdb_transaction_transaction; } caosdb_transaction_transaction;
/**
* Create a transaction on an existing connection.
*
* This transaction has to be deleted manually by
* caosdb_transaction_delete_transaction() later on.
*/
int caosdb_connection_connection_create_transaction( int caosdb_connection_connection_create_transaction(
caosdb_connection_connection *connection, caosdb_connection_connection *connection,
caosdb_transaction_transaction *out); caosdb_transaction_transaction *out);
int caosdb_transaction_delete_transaction(
caosdb_transaction_transaction *transaction);
int caosdb_transaction_transaction_retrieve_by_id( int caosdb_transaction_transaction_retrieve_by_id(
caosdb_transaction_transaction *transaction, const char *id); caosdb_transaction_transaction *transaction, const char *id);
int caosdb_transaction_transaction_retrieve_by_ids( int caosdb_transaction_transaction_retrieve_by_ids(
...@@ -302,9 +310,10 @@ typedef struct { ...@@ -302,9 +310,10 @@ typedef struct {
char **version_id; char **version_id;
} caosdb_entity_entity; } caosdb_entity_entity;
int caosdb_transaction_result_set_get_entity( int caosdb_transaction_result_set_at(caosdb_transaction_result_set *result_set,
caosdb_transaction_result_set *result_set, caosdb_entity_entity *entity, caosdb_entity_entity *entity, int index);
int index); int caosdb_transaction_result_set_size(
caosdb_transaction_result_set *result_set, int *out);
typedef struct { typedef struct {
void *wrapped_property; void *wrapped_property;
......
...@@ -276,7 +276,16 @@ ERROR_RETURN_CODE(GENERIC_ERROR, ...@@ -276,7 +276,16 @@ ERROR_RETURN_CODE(GENERIC_ERROR,
static_cast<caosdb::connection::Connection *>( static_cast<caosdb::connection::Connection *>(
connection->wrapped_connection); connection->wrapped_connection);
out->wrapped_transaction = out->wrapped_transaction =
wrapped_connection->CreateTransaction().get(); wrapped_connection->CreateTransaction().release();
return 0;
})
ERROR_RETURN_CODE(GENERIC_ERROR,
int caosdb_transaction_delete_transaction(
caosdb_transaction_transaction *transaction),
{
delete static_cast<caosdb::transaction::Transaction *>(
transaction->wrapped_transaction);
return 0; return 0;
}) })
...@@ -352,4 +361,21 @@ ERROR_RETURN_CODE(GENERIC_ERROR, ...@@ -352,4 +361,21 @@ ERROR_RETURN_CODE(GENERIC_ERROR,
*out = cr; *out = cr;
return 0; return 0;
}) })
ERROR_RETURN_CODE(GENERIC_ERROR,
int caosdb_transaction_result_set_at(
caosdb_transaction_result_set *result_set,
caosdb_entity_entity *entity, int index),
{
// TODO(fspreck) how do we treat this? ResultSet
// is an abstract class, can we always fall back
// to MultiResultSet?
auto *wrapped_result_set =
static_cast<caosdb::transaction::MultiResultSet *>(
result_set->wrapped_result_set);
auto requested_entity = wrapped_result_set->At(index);
entity->wrapped_entity = (void *)(&requested_entity);
return 0;
})
} }
...@@ -75,11 +75,14 @@ TEST_F(test_ccaosdb, test_execute_transaction) { ...@@ -75,11 +75,14 @@ TEST_F(test_ccaosdb, test_execute_transaction) {
int return_code( int return_code(
caosdb_transaction_transaction_retrieve_by_id(&transaction, "some_id")); caosdb_transaction_transaction_retrieve_by_id(&transaction, "some_id"));
EXPECT_EQ(return_code, 0); EXPECT_EQ(return_code, caosdb::StatusCode::GO_ON);
return_code = caosdb_transaction_transaction_execute(&transaction); return_code = caosdb_transaction_transaction_execute(&transaction);
EXPECT_EQ(return_code, caosdb::StatusCode::CONNECTION_ERROR); EXPECT_EQ(return_code, caosdb::StatusCode::CONNECTION_ERROR);
return_code = caosdb_transaction_delete_transaction(&transaction);
EXPECT_EQ(return_code, 0);
caosdb_transaction_transaction multi_transaction; caosdb_transaction_transaction multi_transaction;
caosdb_connection_connection_create_transaction(&connection, caosdb_connection_connection_create_transaction(&connection,
&multi_transaction); &multi_transaction);
...@@ -89,6 +92,9 @@ TEST_F(test_ccaosdb, test_execute_transaction) { ...@@ -89,6 +92,9 @@ TEST_F(test_ccaosdb, test_execute_transaction) {
const char *ids[] = {"id1", "id2", "id3"}; // NOLINT const char *ids[] = {"id1", "id2", "id3"}; // NOLINT
return_code = return_code =
caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids); caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids);
EXPECT_EQ(return_code, caosdb::StatusCode::GO_ON);
return_code = caosdb_transaction_delete_transaction(&multi_transaction);
EXPECT_EQ(return_code, 0); EXPECT_EQ(return_code, 0);
} }
...@@ -106,6 +112,9 @@ TEST_F(test_ccaosdb, test_multi_retrieve) { ...@@ -106,6 +112,9 @@ TEST_F(test_ccaosdb, test_multi_retrieve) {
const char *ids[] = {"id1", "id2", "id3"}; // NOLINT const char *ids[] = {"id1", "id2", "id3"}; // NOLINT
int return_code( int return_code(
caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids)); caosdb_transaction_transaction_retrieve_by_ids(&multi_transaction, ids));
EXPECT_EQ(return_code, caosdb::StatusCode::GO_ON);
return_code = caosdb_transaction_delete_transaction(&multi_transaction);
EXPECT_EQ(return_code, 0); EXPECT_EQ(return_code, 0);
} }
...@@ -119,5 +128,8 @@ TEST_F(test_ccaosdb, test_query) { ...@@ -119,5 +128,8 @@ TEST_F(test_ccaosdb, test_query) {
int return_code(caosdb_transaction_transaction_query( int return_code(caosdb_transaction_transaction_query(
&transaction, "FIND ENTITY WITH id=123")); &transaction, "FIND ENTITY WITH id=123"));
EXPECT_EQ(return_code, caosdb::StatusCode::GO_ON);
return_code = caosdb_transaction_delete_transaction(&transaction);
EXPECT_EQ(return_code, 0); EXPECT_EQ(return_code, 0);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment