diff --git a/include/ccaosdb.h b/include/ccaosdb.h index c4342d1429276cd2e97758bab0b72b3db91c807c..4704c22ddd2235bbbe979198e48b45a43a4a7d6c 100644 --- a/include/ccaosdb.h +++ b/include/ccaosdb.h @@ -431,7 +431,6 @@ int caosdb_entity_delete_parent(caosdb_entity_parent *out); int caosdb_entity_create_datatype(caosdb_entity_datatype *out); int caosdb_entity_delete_datatype(caosdb_entity_datatype *out); // VALUE CONSTRUCTORS (resolve overloaded constructors) -int caosdb_entity_create_value(caosdb_entity_value *out, caosdb_entity_value *in); int caosdb_entity_create_int_value(caosdb_entity_value *out, const int64_t value); int caosdb_entity_create_string_value(caosdb_entity_value *out, const char *value); int caosdb_entity_create_double_value(caosdb_entity_value *out, const double value); diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp index 920b70bc83396ea0cc847926a722a2c7d680a625..7dd555bcada9df80623f43511f75b1c9f2e64ee5 100644 --- a/src/ccaosdb.cpp +++ b/src/ccaosdb.cpp @@ -23,6 +23,7 @@ #include "caosdb/connection.h" #include "caosdb/constants.h" #include "caosdb/data_type.h" // for DataType, AtomicDat... +#include "caosdb/value.h" #include "caosdb/utility.h" #include "caosdb/status_code.h" #include "caosdb/logging.h" @@ -46,6 +47,8 @@ extern "C" { #define WRAPPED_MESSAGE_CAST(name) static_cast<caosdb::entity::Message *>(name->wrapped_message) +#define WRAPPED_VALUE_CAST(name) static_cast<caosdb::entity::Value *>(name->wrapped_value) + #define ENUM_NAME_FROM_VALUE(arg, etype) \ caosdb::utility::getEnumNameFromValue<caosdb::entity::etype>(arg) @@ -146,6 +149,38 @@ extern "C" { body_part return 0; \ }) +/** + * Macro for scalar value creators + */ +#define CREATE_VALUE(fname, arg) \ + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_create_##fname(caosdb_entity_value *out, arg), { \ + if (out->_deletable) { \ + return caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR; \ + } \ + out->wrapped_value = new caosdb::entity::Value(value); \ + out->_deletable = true; \ + return 0; \ + }) +/** + * Macro for list-value creators + */ +#define CREATE_LIST_VALUE(fname, type, arg, assign) \ + ERROR_RETURN_CODE( \ + GENERIC_ERROR, \ + int caosdb_entity_create_##fname(caosdb_entity_value *out, arg, const int length), { \ + if (out->_deletable) { \ + return caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR; \ + } \ + std::vector<type> value_vec; \ + for (int i = 0; i < length; i++) { \ + value_vec.push_back(assign); \ + } \ + out->wrapped_value = new caosdb::entity::Value(value_vec); \ + out->_deletable = true; \ + return 0; \ + }) + int caosdb_constants_LIBCAOSDB_VERSION_MAJOR() { return caosdb::LIBCAOSDB_VERSION_MAJOR; } int caosdb_constants_LIBCAOSDB_VERSION_MINOR() { return caosdb::LIBCAOSDB_VERSION_MINOR; } @@ -625,6 +660,23 @@ ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_delete_parent(caosdb_entity_p return 0; }) +CREATE_VALUE(int_value, const int64_t value) +CREATE_VALUE(string_value, const char *value) +CREATE_VALUE(double_value, const double value) +CREATE_VALUE(bool_value, const bool value) +CREATE_LIST_VALUE(int_list_value, int64_t, const int64_t *value, value[i]) +CREATE_LIST_VALUE(string_list_value, std::string, const char **value, std::string(value[i])) +CREATE_LIST_VALUE(double_list_value, double, const double *value, value[i]) +CREATE_LIST_VALUE(bool_list_value, bool, const bool *value, value[i]) + +ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_delete_value(caosdb_entity_value *out), { + if (out->_deletable) { + delete WRAPPED_VALUE_CAST(out); + } + out->_deletable = false; + return 0; +}) + CAOSDB_ENTITY_GET(id, GetId()) ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_entity_get_role(caosdb_entity_entity *entity, char **out), { diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp index 7772a0976637e1e6ada4f9d11abf3dce7754063f..fce4f969779fb1dbb6ee8cdd00642347b3b1e913 100644 --- a/test/test_ccaosdb.cpp +++ b/test/test_ccaosdb.cpp @@ -127,6 +127,36 @@ TEST_F(test_ccaosdb, test_query) { EXPECT_EQ(return_code, 0); } +TEST_F(test_ccaosdb, test_value) { + + caosdb_entity_value string_value; + int return_code(caosdb_entity_create_string_value(&string_value, "value")); + EXPECT_EQ(return_code, 0); + + caosdb_entity_value int_value; + return_code = caosdb_entity_create_int_value(&int_value, 27); + EXPECT_EQ(return_code, 0); + + caosdb_entity_value bool_value; + return_code = caosdb_entity_create_bool_value(&bool_value, true); + EXPECT_EQ(return_code, 0); + + caosdb_entity_value double_value; + return_code = caosdb_entity_create_double_value(&double_value, 2.7); + EXPECT_EQ(return_code, 0); + + // TODO(fspreck) Test is... and as... functions + + return_code = caosdb_entity_delete_value(&string_value); + EXPECT_EQ(return_code, 0); + return_code = caosdb_entity_delete_value(&int_value); + EXPECT_EQ(return_code, 0); + return_code = caosdb_entity_delete_value(&bool_value); + EXPECT_EQ(return_code, 0); + return_code = caosdb_entity_delete_value(&double_value); + EXPECT_EQ(return_code, 0); +} + TEST_F(test_ccaosdb, test_entity) { caosdb_entity_entity entity;