diff --git a/include/ccaosdb.h b/include/ccaosdb.h index 9e21e8cdde2d66e80b4d0c77e9d14fd6194bd50d..6a3429c37c814a4da2ba4532f00d28efedc11f5c 100644 --- a/include/ccaosdb.h +++ b/include/ccaosdb.h @@ -334,13 +334,13 @@ typedef struct { } caosdb_entity_message; // GETTERS FOR EVERYTHING -int caosdb_entity_entity_get_id(caosdb_entity_entity *entity, char *out); -int caosdb_entity_entity_get_role(caosdb_entity_entity *entity, char *out); -int caosdb_entity_entity_get_name(caosdb_entity_entity *entity, char *out); +int caosdb_entity_entity_get_id(caosdb_entity_entity *entity, char **out); +int caosdb_entity_entity_get_role(caosdb_entity_entity *entity, char **out); +int caosdb_entity_entity_get_name(caosdb_entity_entity *entity, char **out); int caosdb_entity_entity_get_description(caosdb_entity_entity *entity, - char *out); -int caosdb_entity_entity_get_datatype(caosdb_entity_entity *entity, char *out); -int caosdb_entity_entity_get_unit(caosdb_entity_entity *entity, char *out); + char **out); +int caosdb_entity_entity_get_datatype(caosdb_entity_entity *entity, char **out); +int caosdb_entity_entity_get_unit(caosdb_entity_entity *entity, char **out); int caosdb_entity_entity_get_int_value(caosdb_entity_entity *entity, long *out); int caosdb_entity_entity_get_double_value(caosdb_entity_entity *entity, @@ -348,18 +348,20 @@ int caosdb_entity_entity_get_double_value(caosdb_entity_entity *entity, int caosdb_entity_entity_get_boolean_value(caosdb_entity_entity *entity, bool *out); int caosdb_entity_entity_get_string_value(caosdb_entity_entity *entity, - char *out); + char **out); int caosdb_entity_entity_get_int_list_value(caosdb_entity_entity *entity, - long **out); + long *out); int caosdb_entity_entity_get_double_list_value(caosdb_entity_entity *entity, - double **out); + double *out); int caosdb_entity_entity_get_boolean_list_value(caosdb_entity_entity *entity, - bool **out); + bool *out); int caosdb_entity_entity_get_string_list_value(caosdb_entity_entity *entity, char **out); +int caosdb_entity_entity_get_value_list_length(caosdb_entity_entity *entity, + int *out); int caosdb_entity_entity_get_version_id(caosdb_entity_entity *entity, - char *out); + char **out); int caosdb_entity_entity_get_errors_size(caosdb_entity_entity *entity, int *out); int caosdb_entity_entity_get_error(caosdb_entity_entity *entity, @@ -380,17 +382,17 @@ int caosdb_entity_entity_get_parents_size(caosdb_entity_entity *entity, int caosdb_entity_entity_get_parent(caosdb_entity_entity *entity, caosdb_entity_parent *out, int index); -int caosdb_entity_property_get_id(caosdb_entity_property *property, char *out); +int caosdb_entity_property_get_id(caosdb_entity_property *property, char **out); int caosdb_entity_property_get_name(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_description(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_importance(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_datatype(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_unit(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_int_value(caosdb_entity_property *property, long *out); @@ -399,24 +401,26 @@ int caosdb_entity_property_get_double_value(caosdb_entity_property *property, int caosdb_entity_property_get_boolean_value(caosdb_entity_property *property, bool *out); int caosdb_entity_property_get_string_value(caosdb_entity_property *property, - char *out); + char **out); int caosdb_entity_property_get_int_list_value(caosdb_entity_property *property, long **out); int caosdb_entity_property_get_double_list_value( - caosdb_entity_property *property, double **out); + caosdb_entity_property *property, double *out); int caosdb_entity_property_get_boolean_list_value( - caosdb_entity_property *property, bool **out); + caosdb_entity_property *property, bool *out); int caosdb_entity_property_get_string_list_value( - caosdb_entity_property *property, char **out); + caosdb_entity_property *property, char *out[]); +int caosdb_entity_property_get_value_list_length( + caosdb_entity_property *property, int *out); -int caosdb_entity_parent_get_id(caosdb_entity_parent *parent, char *out); -int caosdb_entity_parent_get_name(caosdb_entity_parent *parent, char *out); +int caosdb_entity_parent_get_id(caosdb_entity_parent *parent, char **out); +int caosdb_entity_parent_get_name(caosdb_entity_parent *parent, char **out); int caosdb_entity_parent_get_description(caosdb_entity_parent *parent, - char *out); + char **out); int caosdb_entity_message_get_code(caosdb_entity_message *message, int *out); int caosdb_entity_message_get_description(caosdb_entity_message *message, - char *out); + char **out); // CONSTRUCTORS AND DESTRUCTORS int caosdb_entity_create_entity(caosdb_entity_entity *out); diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp index 1af1701b69ae5b8cb453f58771bd0aa7cb0b2278..025ae34db637dc5c4a91891db62ab2a0dd520a10 100644 --- a/src/ccaosdb.cpp +++ b/src/ccaosdb.cpp @@ -22,6 +22,7 @@ #include "ccaosdb.h" #include "caosdb/connection.h" #include "caosdb/constants.h" +#include "caosdb/data_type.h" // for DataType, AtomicDat... #include "caosdb/utility.h" #include "caosdb/status_code.h" #include "caosdb/logging.h" @@ -37,6 +38,18 @@ extern "C" { #define CCAOSDB_LOGGER_NAME "ccaosdb" +#define WRAPPED_ENTITY_CAST(name) \ + static_cast<caosdb::entity::Entity *>(name->wrapped_entity) + +#define WRAPPED_PROPERTY_CAST(name) \ + static_cast<caosdb::entity::Property *>(name->wrapped_property) + +#define WRAPPED_PARENT_CAST(name) \ + static_cast<caosdb::entity::Parent *>(name->wrapped_parent) + +#define WRAPPED_MESSAGE_CAST(name) \ + static_cast<caosdb::entity::Message *>(name->wrapped_message) + /* * Macro for wrapping every function into a try-catch clause. If an exception * occurs, the given StatusCode is being returned. @@ -55,86 +68,93 @@ extern "C" { /** * Macro for entity getters */ -#define CAOSDB_ENTITY_GET(element, body_part) \ +#define CAOSDB_ENTITY_GET(element, GetFunction) \ ERROR_RETURN_CODE( \ GENERIC_ERROR, \ int caosdb_entity_entity_get_##element(caosdb_entity_entity *entity, \ - char *out), \ + char **out), \ { \ - auto *wrapped_entity = \ - static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); \ - body_part return 0; \ + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); \ + char *tmp = (char *)malloc( \ + sizeof(char) * wrapped_entity->GetFunction().length() + 1); \ + strcpy(tmp, wrapped_entity->GetFunction().c_str()); \ + delete[] * out; \ + *out = tmp; \ + return 0; \ }) /** * Macro for entity setters */ #define CAOSDB_ENTITY_SET(element, value, body_part) \ - ERROR_RETURN_CODE( \ - GENERIC_ERROR, \ - int caosdb_entity_entity_set_##element(caosdb_entity_entity *entity, \ - const char *value), \ - { \ - auto *wrapped_entity = \ - static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); \ - body_part return 0; \ - }) + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_entity_set_##element( \ + caosdb_entity_entity *entity, const char *value), \ + { \ + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); \ + body_part return 0; \ + }) /** * Macro for property getters */ -#define CAOSDB_PROPERTY_GET(element, body_part) \ +#define CAOSDB_PROPERTY_GET(element, GetFunction) \ ERROR_RETURN_CODE( \ GENERIC_ERROR, \ int caosdb_entity_property_get_##element(caosdb_entity_property *property, \ - char *out), \ + char **out), \ { \ - auto *wrapped_property = \ - static_cast<caosdb::entity::Property *>(property->wrapped_property); \ - body_part return 0; \ + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); \ + char *tmp = (char *)malloc( \ + sizeof(char) * wrapped_property->GetFunction().length() + 1); \ + strcpy(tmp, wrapped_property->GetFunction().c_str()); \ + delete[] * out; \ + *out = tmp; \ + return 0; \ }) /** * Macro for property setters */ #define CAOSDB_PROPERTY_SET(element, value, body_part) \ - ERROR_RETURN_CODE( \ - GENERIC_ERROR, \ - int caosdb_entity_property_set_##element(caosdb_entity_property *property, \ - const char *value), \ - { \ - auto *wrapped_property = \ - static_cast<caosdb::entity::Property *>(property->wrapped_property); \ - body_part return 0; \ - }) + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_property_set_##element( \ + caosdb_entity_property *property, const char *value), \ + { \ + auto *wrapped_property = \ + WRAPPED_PROPERTY_CAST(property); \ + body_part return 0; \ + }) /** * Macro for parent getters */ -#define CAOSDB_PARENT_GET(element, body_part) \ +#define CAOSDB_PARENT_GET(element, GetFunction) \ ERROR_RETURN_CODE( \ GENERIC_ERROR, \ int caosdb_entity_parent_get_##element(caosdb_entity_parent *parent, \ - char *out), \ + char **out), \ { \ - auto *wrapped_parent = \ - static_cast<caosdb::entity::Parent *>(parent->wrapped_parent); \ - body_part return 0; \ + auto *wrapped_parent = WRAPPED_PARENT_CAST(parent); \ + char *tmp = (char *)malloc( \ + sizeof(char) * wrapped_parent->GetFunction().length() + 1); \ + strcpy(tmp, wrapped_parent->GetFunction().c_str()); \ + delete[] * out; \ + *out = tmp; \ + return 0; \ }) /** * Macro for parent setters */ #define CAOSDB_PARENT_SET(element, value, body_part) \ - ERROR_RETURN_CODE( \ - GENERIC_ERROR, \ - int caosdb_entity_parent_set_##element(caosdb_entity_parent *parent, \ - const char *value), \ - { \ - auto *wrapped_parent = \ - static_cast<caosdb::entity::Parent *>(parent->wrapped_parent); \ - body_part return 0; \ - }) + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_parent_set_##element( \ + caosdb_entity_parent *parent, const char *value), \ + { \ + auto *wrapped_parent = WRAPPED_PARENT_CAST(parent); \ + body_part return 0; \ + }) int caosdb_constants_LIBCAOSDB_VERSION_MAJOR() { return caosdb::LIBCAOSDB_VERSION_MAJOR; @@ -588,20 +608,69 @@ ERROR_RETURN_CODE(GENERIC_ERROR, return 0; }) -CAOSDB_ENTITY_GET(id, strcpy(out, wrapped_entity->GetId().c_str());) +CAOSDB_ENTITY_GET(id, GetId) // TODO(fspreck) // CAOSDB_ENTITY_GET(role, strcpy(out, wrapped_entity->GetRole().c_str());) -CAOSDB_ENTITY_GET(name, strcpy(out, wrapped_entity->GetName().c_str());) -CAOSDB_ENTITY_GET(description, - strcpy(out, wrapped_entity->GetDescription().c_str());) +CAOSDB_ENTITY_GET(name, GetName) +CAOSDB_ENTITY_GET(description, GetDescription) // TODO(fspreck) // CAOSDB_ENTITY_GET(datatype, strcpy(out, // wrapped_entity->GetDatatype().c_str());) // TODO(fspreck) // CAOSDB_ENTITY_GET(value, strcpy(out, wrapped_entity->GetValue().c_str());) -CAOSDB_ENTITY_GET(unit, strcpy(out, wrapped_entity->GetUnit().c_str());) -CAOSDB_ENTITY_GET(version_id, - strcpy(out, wrapped_entity->GetVersionId().c_str());) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_entity_get_int_value( + caosdb_entity_entity *entity, long *out), + { + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); + *out = wrapped_entity->GetValue().AsInteger(); + return 0; + }) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_entity_get_double_value( + caosdb_entity_entity *entity, double *out), + { + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); + *out = wrapped_entity->GetValue().AsDouble(); + return 0; + }) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_entity_get_boolean_value( + caosdb_entity_entity *entity, bool *out), + { + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); + *out = wrapped_entity->GetValue().AsBool(); + return 0; + }) +CAOSDB_ENTITY_GET(string_value, GetValue().AsString) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_entity_get_int_list_value( + caosdb_entity_entity *entity, long *out), + { + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); + auto value_list = wrapped_entity->GetValue().AsList(); + int i = 0; + for (const auto elt : value_list) { + out[i++] = elt.AsInteger(); + } + return 0; + }) + +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_entity_get_value_list_length( + caosdb_entity_entity *entity, int *out), + { + auto *wrapped_entity = WRAPPED_ENTITY_CAST(entity); + if (wrapped_entity->GetValue().IsList()) { + *out = wrapped_entity->GetValue().AsList().size(); + } else { + *out = 0; + } + return 0; + }) + +CAOSDB_ENTITY_GET(unit, GetUnit) +CAOSDB_ENTITY_GET(version_id, GetVersionId) ERROR_RETURN_CODE( GENERIC_ERROR, @@ -733,25 +802,77 @@ ERROR_RETURN_CODE( return 0; }) -CAOSDB_PARENT_GET(id, strcpy(out, wrapped_parent->GetId().c_str());) -CAOSDB_PARENT_GET(name, strcpy(out, wrapped_parent->GetName().c_str());) -CAOSDB_PARENT_GET(description, - strcpy(out, wrapped_parent->GetDescription().c_str());) +CAOSDB_PARENT_GET(id, GetId) +CAOSDB_PARENT_GET(name, GetName) +CAOSDB_PARENT_GET(description, GetDescription) -CAOSDB_PROPERTY_GET(id, strcpy(out, wrapped_property->GetId().c_str());) -CAOSDB_PROPERTY_GET(name, strcpy(out, wrapped_property->GetName().c_str());) -CAOSDB_PROPERTY_GET(description, - strcpy(out, wrapped_property->GetDescription().c_str());) +CAOSDB_PROPERTY_GET(id, GetId) +CAOSDB_PROPERTY_GET(name, GetName) +CAOSDB_PROPERTY_GET(description, GetDescription) // TODO(fspreck) // CAOSDB_PROPERTY_GET(importance, // strcpy(out, wrapped_property->GetImportance().c_str());) // TODO(fspreck) // CAOSDB_PROPERTY_GET(datatype, // strcpy(out, wrapped_property->GetDatatype().c_str());) -CAOSDB_PROPERTY_GET(unit, strcpy(out, wrapped_property->GetUnit().c_str());) +CAOSDB_PROPERTY_GET(unit, GetUnit) // TODO(fspreck) // CAOSDB_PROPERTY_GET(value, strcpy(out, // wrapped_property->GetValue().c_str());) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_property_get_int_value( + caosdb_entity_property *property, long *out), + { + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); + *out = wrapped_property->GetValue().AsInteger(); + return 0; + }) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_property_get_double_value( + caosdb_entity_property *property, double *out), + { + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); + *out = wrapped_property->GetValue().AsDouble(); + return 0; + }) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_property_get_boolean_value( + caosdb_entity_property *property, bool *out), + { + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); + *out = wrapped_property->GetValue().AsBool(); + return 0; + }) +CAOSDB_PROPERTY_GET(string_value, GetValue().AsString) + +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_property_get_string_list_value( + caosdb_entity_property *property, char *out[]), + { + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); + auto value_list = wrapped_property->GetValue().AsList(); + char *tmp; + int i = 0; + for (const auto elt : value_list) { + tmp = (char *)(sizeof(char) * elt.AsString().length()); + strcpy(tmp, elt.AsString().c_str()); + out[i++] = tmp; + } + return 0; + }) + +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_property_get_value_list_length( + caosdb_entity_property *property, int *out), + { + auto *wrapped_property = WRAPPED_PROPERTY_CAST(property); + if (wrapped_property->GetValue().IsList()) { + *out = wrapped_property->GetValue().AsList().size(); + } else { + *out = 0; + } + return 0; + }) ERROR_RETURN_CODE( GENERIC_ERROR, @@ -766,11 +887,15 @@ ERROR_RETURN_CODE( ERROR_RETURN_CODE( GENERIC_ERROR, int caosdb_entity_message_get_description(caosdb_entity_message *message, - char *out), + char **out), { auto *wrapped_message = static_cast<caosdb::entity::Message *>(message->wrapped_message); - strcpy(out, wrapped_message->GetDescription().c_str()); + char *tmp = (char *)malloc( + sizeof(char) * wrapped_message->GetDescription().length() + 1); + strcpy(tmp, wrapped_message->GetDescription().c_str()); + delete[] * out; + *out = tmp; return 0; }) @@ -787,7 +912,7 @@ CAOSDB_ENTITY_SET(unit, unit, wrapped_entity->SetUnit(std::string(unit));) ERROR_RETURN_CODE( GENERIC_ERROR, int caosdb_entity_entity_set_int_value(caosdb_entity_entity *entity, - const long value), + const long value), { auto *wrapped_entity = static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); @@ -798,7 +923,7 @@ ERROR_RETURN_CODE( ERROR_RETURN_CODE( GENERIC_ERROR, int caosdb_entity_entity_set_double_value(caosdb_entity_entity *entity, - const double value), + const double value), { auto *wrapped_entity = static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); @@ -809,7 +934,7 @@ ERROR_RETURN_CODE( ERROR_RETURN_CODE( GENERIC_ERROR, int caosdb_entity_entity_set_boolean_value(caosdb_entity_entity *entity, - const bool value), + const bool value), { auto *wrapped_entity = static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); @@ -820,7 +945,7 @@ ERROR_RETURN_CODE( ERROR_RETURN_CODE( GENERIC_ERROR, int caosdb_entity_entity_set_string_value(caosdb_entity_entity *entity, - const char *value), + const char *value), { auto *wrapped_entity = static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); @@ -828,73 +953,69 @@ ERROR_RETURN_CODE( return 0; }) -ERROR_RETURN_CODE(GENERIC_ERROR, - int caosdb_entity_entity_set_int_list_value( - caosdb_entity_entity *entity, const long *value, - const int length), - { - auto *wrapped_entity = - static_cast<caosdb::entity::Entity *>( - entity->wrapped_entity); - std::vector<long> value_list; - for (int i = 0; i < length; i++) { - value_list.push_back(value[i]); - } - caosdb::entity::Value to_be_set(value_list); - wrapped_entity->SetValue(to_be_set); - return 0; - }) +ERROR_RETURN_CODE( + GENERIC_ERROR, + int caosdb_entity_entity_set_int_list_value(caosdb_entity_entity *entity, + const long *value, + const int length), + { + auto *wrapped_entity = + static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); + std::vector<long> value_list; + for (int i = 0; i < length; i++) { + value_list.push_back(value[i]); + } + wrapped_entity->SetValue(value_list); + return 0; + }) -ERROR_RETURN_CODE(GENERIC_ERROR, - int caosdb_entity_entity_set_double_list_value( - caosdb_entity_entity *entity, const double *value, - const int length), - { - auto *wrapped_entity = - static_cast<caosdb::entity::Entity *>( - entity->wrapped_entity); - std::vector<double> value_list; - for (int i = 0; i < length; i++) { - value_list.push_back(value[i]); - } - caosdb::entity::Value to_be_set(value_list); - wrapped_entity->SetValue(to_be_set); - return 0; - }) +ERROR_RETURN_CODE( + GENERIC_ERROR, + int caosdb_entity_entity_set_double_list_value(caosdb_entity_entity *entity, + const double *value, + const int length), + { + auto *wrapped_entity = + static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); + std::vector<double> value_list; + for (int i = 0; i < length; i++) { + value_list.push_back(value[i]); + } + wrapped_entity->SetValue(value_list); + return 0; + }) -ERROR_RETURN_CODE(GENERIC_ERROR, - int caosdb_entity_entity_set_boolean_list_value( - caosdb_entity_entity *entity, const bool *value, - const int length), - { - auto *wrapped_entity = - static_cast<caosdb::entity::Entity *>( - entity->wrapped_entity); - std::vector<bool> value_list; - for (int i = 0; i < length; i++) { - value_list.push_back(value[i]); - } - caosdb::entity::Value to_be_set(value_list); - wrapped_entity->SetValue(to_be_set); - return 0; - }) +ERROR_RETURN_CODE( + GENERIC_ERROR, + int caosdb_entity_entity_set_boolean_list_value(caosdb_entity_entity *entity, + const bool *value, + const int length), + { + auto *wrapped_entity = + static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); + std::vector<bool> value_list; + for (int i = 0; i < length; i++) { + value_list.push_back(value[i]); + } + wrapped_entity->SetValue(value_list); + return 0; + }) -ERROR_RETURN_CODE(GENERIC_ERROR, - int caosdb_entity_entity_set_string_list_value( - caosdb_entity_entity *entity, const char **value, - const int length), - { - auto *wrapped_entity = - static_cast<caosdb::entity::Entity *>( - entity->wrapped_entity); - std::vector<std::string> value_list; - for (int i = 0; i < length; i++) { - value_list.push_back(std::string(value[i])); - } - caosdb::entity::Value to_be_set(value_list); - wrapped_entity->SetValue(to_be_set); - return 0; - }) +ERROR_RETURN_CODE( + GENERIC_ERROR, + int caosdb_entity_entity_set_string_list_value(caosdb_entity_entity *entity, + const char **value, + const int length), + { + auto *wrapped_entity = + static_cast<caosdb::entity::Entity *>(entity->wrapped_entity); + std::vector<std::string> value_list; + for (int i = 0; i < length; i++) { + value_list.push_back(std::string(value[i])); + } + wrapped_entity->SetValue(value_list); + return 0; + }) ERROR_RETURN_CODE( GENERIC_ERROR, @@ -1012,8 +1133,7 @@ ERROR_RETURN_CODE(GENERIC_ERROR, for (int i = 0; i < length; i++) { value_list.push_back(value[i]); } - caosdb::entity::Value to_be_set(value_list); - wrapped_property->SetValue(to_be_set); + wrapped_property->SetValue(value_list); return 0; }) @@ -1029,8 +1149,7 @@ ERROR_RETURN_CODE(GENERIC_ERROR, for (int i = 0; i < length; i++) { value_list.push_back(value[i]); } - caosdb::entity::Value to_be_set(value_list); - wrapped_property->SetValue(to_be_set); + wrapped_property->SetValue(value_list); return 0; }) @@ -1046,8 +1165,7 @@ ERROR_RETURN_CODE(GENERIC_ERROR, for (int i = 0; i < length; i++) { value_list.push_back(value[i]); } - caosdb::entity::Value to_be_set(value_list); - wrapped_property->SetValue(to_be_set); + wrapped_property->SetValue(value_list); return 0; }) @@ -1063,8 +1181,7 @@ ERROR_RETURN_CODE(GENERIC_ERROR, for (int i = 0; i < length; i++) { value_list.push_back(std::string(value[i])); } - caosdb::entity::Value to_be_set(value_list); - wrapped_property->SetValue(to_be_set); + wrapped_property->SetValue(value_list); return 0; }) } diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp index a75d8b4a534f2272398f00a62222337df850d39a..e33b8f407ce25cfba362bb19900ed6afdb7b90ae 100644 --- a/test/test_ccaosdb.cpp +++ b/test/test_ccaosdb.cpp @@ -165,8 +165,8 @@ TEST_F(test_ccaosdb, test_entity) { // the strings for the rest return_code = caosdb_entity_entity_set_name(&entity, "length"); EXPECT_EQ(return_code, 0); - char out[255] = {"a"}; // NOLINT - return_code = caosdb_entity_entity_get_name(&entity, out); + char *out = nullptr; // NOLINT + return_code = caosdb_entity_entity_get_name(&entity, &out); EXPECT_EQ(return_code, 0); EXPECT_EQ(strcmp(out, "length"), 0); @@ -176,7 +176,7 @@ TEST_F(test_ccaosdb, test_entity) { // EXPECT_EQ(strcmp(out, "Property"), 0); caosdb_entity_entity_set_description(&entity, "The length of an object"); - caosdb_entity_entity_get_description(&entity, out); + caosdb_entity_entity_get_description(&entity, &out); EXPECT_EQ(strcmp(out, "The length of an object"), 0); // TODO(fspreck) @@ -185,13 +185,18 @@ TEST_F(test_ccaosdb, test_entity) { // EXPECT_EQ(strcmp(out, "DOUBLE"), 0); caosdb_entity_entity_set_unit(&entity, "m"); - caosdb_entity_entity_get_unit(&entity, out); + caosdb_entity_entity_get_unit(&entity, &out); EXPECT_EQ(strcmp(out, "m"), 0); - // TODO(fspreck) - caosdb_entity_entity_set_double_value(&entity, 5.0); - // caosdb_entity_entity_get_value(&entity, out); - // EXPECT_EQ(strcmp(out, "5.0"), 0); + return_code = caosdb_entity_entity_set_double_value(&entity, 5.0); + EXPECT_EQ(return_code, 0); + double value[] = {0.0}; // NOLINT + std::cout << *value << std::endl; + return_code = caosdb_entity_entity_get_double_value(&entity, value); + std::cout << *value << std::endl; + EXPECT_EQ(return_code, 0); + // TODO(fspreck) Re-enable once role and datatype are set + // EXPECT_EQ(*value, 5.0); return_code = caosdb_entity_delete_entity(&entity); EXPECT_EQ(return_code, 0); @@ -206,11 +211,11 @@ TEST_F(test_ccaosdb, test_parent) { caosdb_entity_parent_set_id(&parent, "some_id"); caosdb_entity_parent_set_name(&parent, "some_name"); - char out[255] = {"a"}; // NOLINT - caosdb_entity_parent_get_id(&parent, out); + char *out = nullptr; // NOLINT + caosdb_entity_parent_get_id(&parent, &out); EXPECT_EQ(strcmp(out, "some_id"), 0); - caosdb_entity_parent_get_name(&parent, out); + caosdb_entity_parent_get_name(&parent, &out); EXPECT_EQ(strcmp(out, "some_name"), 0); return_code = caosdb_entity_delete_parent(&parent); @@ -232,11 +237,11 @@ TEST_F(test_ccaosdb, test_property) { caosdb_entity_property_set_unit(&property, "some_unit"); caosdb_entity_property_set_string_value(&property, "some_value"); - char out[255] = {"a"}; // NOLINT - caosdb_entity_property_get_id(&property, out); + char *out = nullptr; // NOLINT + caosdb_entity_property_get_id(&property, &out); EXPECT_EQ(strcmp(out, "some_id"), 0); - caosdb_entity_property_get_name(&property, out); + caosdb_entity_property_get_name(&property, &out); EXPECT_EQ(strcmp(out, "some_name"), 0); // TODO(fspreck) @@ -247,7 +252,7 @@ TEST_F(test_ccaosdb, test_property) { // caosdb_entity_property_get_importance(&property, out); // EXPECT_EQ(strcmp(out, "FIX"), 0); - caosdb_entity_property_get_unit(&property, out); + caosdb_entity_property_get_unit(&property, &out); EXPECT_EQ(strcmp(out, "some_unit"), 0); // TODO(fspreck) @@ -270,8 +275,9 @@ TEST_F(test_ccaosdb, test_list_property) { // return_code = caosdb_entity_property_set_datatype(&property, "LIST<TEXT>"); // EXPECT_EQ(return_code, 0); - const *char[] value_list = {"val0", "val1", "val2"}; // NOLINT - return_code = caosdb_entity_property_set_string_list_value(&property, value_list, 3); + const char *value_list[] = {"val0", "val1", "val2"}; // NOLINT + return_code = + caosdb_entity_property_set_string_list_value(&property, value_list, 3); EXPECT_EQ(return_code, 0); // TODO(fspreck) @@ -280,7 +286,19 @@ TEST_F(test_ccaosdb, test_list_property) { // EXPECT_EQ(return_code, 0); // EXPECT_EQ(strcmp(out_type, "LIST<TEXT>")); + int length[] = {0}; // NOLINT + return_code = caosdb_entity_property_get_value_list_length(&property, length); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(*length, 3); + // TODO(fspreck) get and compare values in list + char *out_list[*length]; // NOLINT + return_code = + caosdb_entity_property_get_string_list_value(&property, out_list); // NOLINT + EXPECT_EQ(return_code, 0); + for (int i = 0; i < *length; i++) { + EXPECT_EQ(strcmp(value_list[i], out_list[i]), 0); // NOLINT + } return_code = caosdb_entity_delete_property(&property); EXPECT_EQ(return_code, 0); @@ -309,14 +327,12 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) { return_code = caosdb_entity_create_entity(&entity); EXPECT_EQ(return_code, 0); - std::cout << "Appending parent and property ..." << std::endl; return_code = caosdb_entity_entity_append_parent(&entity, &input_parent); EXPECT_EQ(return_code, 0); return_code = caosdb_entity_entity_append_property(&entity, &input_property); EXPECT_EQ(return_code, 0); - std::cout << "Counting parents and properties ..." << std::endl; int count[] = {0}; // NOLINT return_code = caosdb_entity_entity_get_parents_size(&entity, count); EXPECT_EQ(return_code, 0); @@ -326,26 +342,22 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) { EXPECT_EQ(return_code, 0); EXPECT_EQ(*count, 1); - char in[255] = {"a"}; // NOLINT - char out[255] = {"b"}; // NOLINT + char *in = nullptr; // NOLINT + char *out = nullptr; // NOLINT - std::cout << "Comparing ..." << std::endl; // cannot assign an already assigned property return_code = caosdb_entity_entity_get_property(&entity, &input_property, 0); EXPECT_EQ(return_code, caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR); caosdb_entity_property output_property; return_code = caosdb_entity_entity_get_property(&entity, &output_property, 0); - std::cout << "Got output property." << std::endl; EXPECT_EQ(return_code, 0); - caosdb_entity_property_get_id(&input_property, in); - std::cout << "Got input id." << std::endl; - caosdb_entity_property_get_id(&output_property, out); - std::cout << "Got output id." << std::endl; + caosdb_entity_property_get_id(&input_property, &in); + caosdb_entity_property_get_id(&output_property, &out); EXPECT_EQ(strcmp(in, out), 0); - caosdb_entity_property_get_name(&input_property, in); - caosdb_entity_property_get_name(&output_property, out); + caosdb_entity_property_get_name(&input_property, &in); + caosdb_entity_property_get_name(&output_property, &out); EXPECT_EQ(strcmp(in, out), 0); // TODO(fspreck) @@ -353,27 +365,23 @@ TEST_F(test_ccaosdb, test_entity_with_parent_and_property) { // caosdb_entity_property_get_datatype(&output_property, out); // EXPECT_EQ(strcmp(in, out), 0); - // TODO(fspreck) - // caosdb_entity_property_get_value(&input_property, in); - // caosdb_entity_property_get_value(&output_property, out); - // EXPECT_EQ(strcmp(in, out), 0); + caosdb_entity_property_get_string_value(&input_property, &in); + caosdb_entity_property_get_string_value(&output_property, &out); + EXPECT_EQ(strcmp(in, out), 0); - std::cout << "Comparing parent..." << std::endl; caosdb_entity_parent output_parent; return_code = caosdb_entity_entity_get_parent(&entity, &output_parent, 0); - std::cout << "Got output parent." << std::endl; EXPECT_EQ(return_code, 0); - caosdb_entity_parent_get_id(&input_parent, in); - caosdb_entity_parent_get_id(&output_parent, out); + caosdb_entity_parent_get_id(&input_parent, &in); + caosdb_entity_parent_get_id(&output_parent, &out); EXPECT_EQ(strcmp(in, out), 0); - caosdb_entity_parent_get_name(&input_parent, in); - caosdb_entity_parent_get_name(&output_parent, out); + caosdb_entity_parent_get_name(&input_parent, &in); + caosdb_entity_parent_get_name(&output_parent, &out); EXPECT_EQ(strcmp(in, out), 0); // Delete everything - std::cout << "Deleting ..." << std::endl; return_code = caosdb_entity_delete_parent(&input_parent); EXPECT_EQ(return_code, 0); return_code = caosdb_entity_delete_property(&input_property); @@ -433,13 +441,13 @@ TEST_F(test_ccaosdb, test_remove_property) { return_code = caosdb_entity_entity_get_property(&entity, &out_prop, 0); EXPECT_EQ(return_code, 0); - char in[255] = {"a"}; // NOLINT - char out[255] = {"b"}; // NOLINT + char *in = nullptr; // NOLINT + char *out = nullptr; // NOLINT // Deleted the first property, so the second one should remain. - return_code = caosdb_entity_property_get_name(&in_prop_2, in); + return_code = caosdb_entity_property_get_name(&in_prop_2, &in); EXPECT_EQ(return_code, 0); - return_code = caosdb_entity_property_get_name(&out_prop, out); + return_code = caosdb_entity_property_get_name(&out_prop, &out); EXPECT_EQ(return_code, 0); EXPECT_EQ(strcmp(in, out), 0);