diff --git a/include/ccaosdb.h b/include/ccaosdb.h index 91ca1fad2fe843e3ea8e8f4cd11cf901eb4b6247..61b86817532b77ccfd24ccb791b18cc31afc6faa 100644 --- a/include/ccaosdb.h +++ b/include/ccaosdb.h @@ -424,7 +424,14 @@ int caosdb_entity_value_is_string(caosdb_entity_value *value, bool *out); int caosdb_entity_value_is_double(caosdb_entity_value *value, bool *out); int caosdb_entity_value_is_integer(caosdb_entity_value *value, bool *out); int caosdb_entity_value_is_bool(caosdb_entity_value *value, bool *out); -int caosdb_entity_value_is_list(caosdb_entity_value *value, bool *out); +int caosdb_entity_value_is_vector(caosdb_entity_value *value, bool *out); +int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out); +int caosdb_entity_value_get_as_double(caosdb_entity_value *value, double *out); +int caosdb_entity_value_get_as_integer(caosdb_entity_value *value, int64_t *out); +int caosdb_entity_value_get_as_bool(caosdb_entity_value *value, bool *out); +int caosdb_entity_value_get_as_vector_size(caosdb_entity_value *value, int *out); +int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value, caosdb_entity_value *out, + const int index); // CONSTRUCTORS AND DESTRUCTORS int caosdb_entity_create_entity(caosdb_entity_entity *out); @@ -441,14 +448,14 @@ 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); int caosdb_entity_create_bool_value(caosdb_entity_value *out, const bool value); -int caosdb_entity_create_int_list_value(caosdb_entity_value *out, const int64_t *value, - const int length); -int caosdb_entity_create_string_list_value(caosdb_entity_value *out, const char **value, +int caosdb_entity_create_int_vector_value(caosdb_entity_value *out, const int64_t *value, + const int length); +int caosdb_entity_create_string_vector_value(caosdb_entity_value *out, const char **value, + const int length); +int caosdb_entity_create_double_vector_value(caosdb_entity_value *out, const double *value, + const int length); +int caosdb_entity_create_bool_vector_value(caosdb_entity_value *out, const bool *value, const int length); -int caosdb_entity_create_double_list_value(caosdb_entity_value *out, const double *value, - const int length); -int caosdb_entity_create_bool_list_value(caosdb_entity_value *out, const bool *value, - const int length); int caosdb_entity_delete_value(caosdb_entity_value *out); // SETTERS FOR EVERYTHING THAT MAY BE SET diff --git a/src/ccaosdb.cpp b/src/ccaosdb.cpp index cb0278f83791efbe9558bd512baa69388ba50bb7..8a7ae4131f513d257e3c0c1b69f975fde595f9dc 100644 --- a/src/ccaosdb.cpp +++ b/src/ccaosdb.cpp @@ -166,7 +166,7 @@ extern "C" { /** * Macro for list-value creators */ -#define CREATE_LIST_VALUE(fname, type, arg, assign) \ +#define CREATE_VECTOR_VALUE(fname, type, arg, assign) \ ERROR_RETURN_CODE( \ GENERIC_ERROR, \ int caosdb_entity_create_##fname(caosdb_entity_value *out, arg, const int length), { \ @@ -182,6 +182,28 @@ extern "C" { return 0; \ }) +/** + * Macro for value is-a functions + */ +#define VALUE_IS(fname, isfunction) \ + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_value_is_##fname(caosdb_entity_value *value, bool *out), { \ + auto *wrapped_value = WRAPPED_VALUE_CAST(value); \ + *out = wrapped_value->isfunction(); \ + return 0; \ + }) + +/** + * Macro for some value getters + */ +#define VALUE_GET_AS(fname, getfunction, arg) \ + ERROR_RETURN_CODE(GENERIC_ERROR, \ + int caosdb_entity_value_get_as_##fname(caosdb_entity_value *value, arg), { \ + auto *wrapped_value = WRAPPED_VALUE_CAST(value); \ + *out = wrapped_value->getfunction(); \ + return 0; \ + }) + int caosdb_constants_LIBCAOSDB_VERSION_MAJOR() { return caosdb::LIBCAOSDB_VERSION_MAJOR; } int caosdb_constants_LIBCAOSDB_VERSION_MINOR() { return caosdb::LIBCAOSDB_VERSION_MINOR; } @@ -665,10 +687,10 @@ 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]) +CREATE_VECTOR_VALUE(int_vector_value, int64_t, const int64_t *value, value[i]) +CREATE_VECTOR_VALUE(string_vector_value, std::string, const char **value, std::string(value[i])) +CREATE_VECTOR_VALUE(double_vector_value, double, const double *value, value[i]) +CREATE_VECTOR_VALUE(bool_vector_value, bool, const bool *value, value[i]) ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_delete_value(caosdb_entity_value *out), { if (out->_deletable) { @@ -937,6 +959,40 @@ ERROR_RETURN_CODE( return 0; }) +VALUE_IS(null, IsNull) +VALUE_IS(string, IsString) +VALUE_IS(double, IsDouble) +VALUE_IS(integer, IsInt64) +VALUE_IS(bool, IsBool) +VALUE_IS(vector, IsVector) + +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_value_get_as_string(caosdb_entity_value *value, char **out), { + auto *wrapped_value = WRAPPED_VALUE_CAST(value); + auto *tmp = + (char *)malloc(sizeof(char) * wrapped_value->GetAsString().length() + 1); + strcpy(tmp, wrapped_value->GetAsString().c_str()); + delete[] * out; + *out = tmp; + return 0; + }) +VALUE_GET_AS(double, GetAsDouble, double *out) +VALUE_GET_AS(integer, GetAsInt64, int64_t *out) +VALUE_GET_AS(bool, GetAsBool, bool *out) +VALUE_GET_AS(vector_size, GetAsVector().size, int *out) +ERROR_RETURN_CODE(GENERIC_ERROR, + int caosdb_entity_value_get_as_vector_at(caosdb_entity_value *value, + caosdb_entity_value *out, + const int index), + { + if (out->_deletable) { + return caosdb::StatusCode::EXTERN_C_ASSIGNMENT_ERROR; + } + auto *wrapped_value = WRAPPED_VALUE_CAST(value); + out->wrapped_value = (void *)(&(wrapped_value->GetAsVector().at(index))); + out->_deletable = false; + return 0; + }) ERROR_RETURN_CODE(GENERIC_ERROR, int caosdb_entity_entity_set_role(caosdb_entity_entity *entity, const char *role), { diff --git a/test/test_ccaosdb.cpp b/test/test_ccaosdb.cpp index 2b10c7ac17f1a89b1157b0a050252b8e447a5e57..4322c135db0024ca90aca52ed783523ba88dc104 100644 --- a/test/test_ccaosdb.cpp +++ b/test/test_ccaosdb.cpp @@ -145,27 +145,117 @@ TEST_F(test_ccaosdb, test_value) { return_code = caosdb_entity_create_double_value(&double_value, 2.7); EXPECT_EQ(return_code, 0); - caosdb_entity_value string_list_value; + caosdb_entity_value string_vector_value; const char *string_values[] = {"a", "b", "c"}; // NOLINT - return_code = caosdb_entity_create_string_list_value(&string_list_value, string_values, 3); + return_code = caosdb_entity_create_string_vector_value(&string_vector_value, string_values, 3); EXPECT_EQ(return_code, 0); - caosdb_entity_value int_list_value; + caosdb_entity_value int_vector_value; const int64_t int_values[] = {1, 2, 3}; // NOLINT - return_code = caosdb_entity_create_int_list_value(&int_list_value, int_values, 3); + return_code = caosdb_entity_create_int_vector_value(&int_vector_value, int_values, 3); EXPECT_EQ(return_code, 0); - caosdb_entity_value double_list_value; + caosdb_entity_value double_vector_value; const double double_values[] = {1.1, 2.2, 3.3}; // NOLINT - return_code = caosdb_entity_create_double_list_value(&double_list_value, double_values, 3); + return_code = caosdb_entity_create_double_vector_value(&double_vector_value, double_values, 3); EXPECT_EQ(return_code, 0); - caosdb_entity_value bool_list_value; + caosdb_entity_value bool_vector_value; const bool bool_values[] = {true, false, false}; // NOLINT - return_code = caosdb_entity_create_bool_list_value(&bool_list_value, bool_values, 3); + return_code = caosdb_entity_create_bool_vector_value(&bool_vector_value, bool_values, 3); EXPECT_EQ(return_code, 0); - // TODO(fspreck) Test is... and as... functions + // One thorough check, afterwards only the ones that should be true + bool is_a(false); + return_code = caosdb_entity_value_is_null(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_FALSE(is_a); + return_code = caosdb_entity_value_is_string(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_TRUE(is_a); + return_code = caosdb_entity_value_is_double(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_FALSE(is_a); + return_code = caosdb_entity_value_is_integer(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_FALSE(is_a); + return_code = caosdb_entity_value_is_bool(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_FALSE(is_a); + return_code = caosdb_entity_value_is_vector(&string_value, &is_a); + EXPECT_EQ(return_code, 0); + EXPECT_FALSE(is_a); + + caosdb_entity_value_is_integer(&int_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_bool(&bool_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_double(&double_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_vector(&string_vector_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_vector(&int_vector_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_vector(&double_vector_value, &is_a); + EXPECT_TRUE(is_a); + + caosdb_entity_value_is_vector(&bool_vector_value, &is_a); + EXPECT_TRUE(is_a); + + // TODO(fspreck) Test as... functions + char *out_string = nullptr; // NOLINT + return_code = caosdb_entity_value_get_as_string(&string_value, &out_string); + EXPECT_EQ(return_code, 0); + EXPECT_STREQ(out_string, "value"); + + int64_t out_int(0); + return_code = caosdb_entity_value_get_as_integer(&int_value, &out_int); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(out_int, 27); + + bool out_bool(false); + return_code = caosdb_entity_value_get_as_bool(&bool_value, &out_bool); + EXPECT_EQ(return_code, 0); + EXPECT_TRUE(out_bool); + + double out_double(0); + return_code = caosdb_entity_value_get_as_double(&double_value, &out_double); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(out_double, 2.7); + + int list_length(0); + return_code = caosdb_entity_value_get_as_vector_size(&string_vector_value, &list_length); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(list_length, 3); + return_code = caosdb_entity_value_get_as_vector_size(&int_vector_value, &list_length); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(list_length, 3); + return_code = caosdb_entity_value_get_as_vector_size(&double_vector_value, &list_length); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(list_length, 3); + return_code = caosdb_entity_value_get_as_vector_size(&bool_vector_value, &list_length); + EXPECT_EQ(return_code, 0); + EXPECT_EQ(list_length, 3); + + // Only check for one, rest should be covered by this + scalar values + caosdb_entity_value out_val; + return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 0); + EXPECT_EQ(return_code, 0); + caosdb_entity_value_get_as_string(&out_val, &out_string); + EXPECT_STREQ(out_string, "a"); + return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 1); + EXPECT_EQ(return_code, 0); + caosdb_entity_value_get_as_string(&out_val, &out_string); + EXPECT_STREQ(out_string, "b"); + return_code = caosdb_entity_value_get_as_vector_at(&string_vector_value, &out_val, 2); + EXPECT_EQ(return_code, 0); + caosdb_entity_value_get_as_string(&out_val, &out_string); + EXPECT_STREQ(out_string, "c"); return_code = caosdb_entity_delete_value(&string_value); EXPECT_EQ(return_code, 0); @@ -175,13 +265,13 @@ TEST_F(test_ccaosdb, test_value) { EXPECT_EQ(return_code, 0); return_code = caosdb_entity_delete_value(&double_value); EXPECT_EQ(return_code, 0); - return_code = caosdb_entity_delete_value(&string_list_value); + return_code = caosdb_entity_delete_value(&string_vector_value); EXPECT_EQ(return_code, 0); - return_code = caosdb_entity_delete_value(&int_list_value); + return_code = caosdb_entity_delete_value(&int_vector_value); EXPECT_EQ(return_code, 0); - return_code = caosdb_entity_delete_value(&double_list_value); + return_code = caosdb_entity_delete_value(&double_vector_value); EXPECT_EQ(return_code, 0); - return_code = caosdb_entity_delete_value(&bool_list_value); + return_code = caosdb_entity_delete_value(&bool_vector_value); EXPECT_EQ(return_code, 0); }