Skip to content

Commit 808640a

Browse files
authored
Follow up on requested changes from #5359 (#5368)
#5359 was merged and then there were some additional changes requested. This pull request implements those changes. - [fix a comment typo](#5359 (comment)) - [avoid nested C API calls and fix memory leak](#5359 (comment)) - [add a test with schema evolution](#5359 (comment)) --- TYPE: BUG DESC: Follow up on #5359
1 parent 8133b35 commit 808640a

File tree

3 files changed

+49
-15
lines changed

3 files changed

+49
-15
lines changed

test/src/unit-cppapi-enumerations.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,34 @@ TEST_CASE_METHOD(
902902
REQUIRE(rc != TILEDB_OK);
903903
}
904904

905+
TEST_CASE_METHOD(
906+
CPPEnumerationFx,
907+
"C API: ArraySchemaEvolution - Add Enumeration, retrieve with "
908+
"ArraySchema::get_enumeration_from_name",
909+
"[enumeration][array-schema-evolution][array-schema-get-enumeration-from-"
910+
"name][rest]") {
911+
create_array();
912+
913+
// Evolve once to add an enumeration.
914+
ArraySchemaEvolution ase(ctx_);
915+
std::vector<std::string> var_values{"one", "two", "three"};
916+
auto var_enmr = Enumeration::create(ctx_, "ase_var_enmr", var_values);
917+
ase.add_enumeration(var_enmr);
918+
auto attr4 = Attribute::create<uint16_t>(ctx_, "attr4");
919+
AttributeExperimental::set_enumeration_name(ctx_, attr4, "ase_var_enmr");
920+
ase.add_attribute(attr4);
921+
// Apply evolution to the array and reopen.
922+
ase.array_evolve(uri_);
923+
924+
auto schema = Array::load_schema(ctx_, uri_);
925+
auto actual_enumeration = ArraySchemaExperimental::get_enumeration_from_name(
926+
ctx_, schema, "ase_var_enmr");
927+
928+
CHECK(test::is_equivalent_enumeration(
929+
*var_enmr.ptr()->enumeration(),
930+
*actual_enumeration.ptr()->enumeration()));
931+
}
932+
905933
TEST_CASE_METHOD(
906934
CPPEnumerationFx,
907935
"CPP: Enumeration Query - Basic",

tiledb/api/c_api/array_schema/array_schema_api.cc

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -210,24 +210,30 @@ capi_return_t tiledb_array_schema_get_enumeration_from_attribute_name(
210210
ensure_array_schema_is_valid(array_schema);
211211
ensure_output_pointer_is_valid(enumeration);
212212

213-
tiledb_attribute_t* attribute;
214-
capi_return_t getattr = tiledb_array_schema_get_attribute_from_name(
215-
ctx, array_schema, attribute_name, &attribute);
216-
if (tiledb_status(getattr) != TILEDB_OK) {
217-
return getattr;
213+
if (attribute_name == nullptr) {
214+
throw CAPIException("'attribute_name' must not be null");
215+
}
216+
std::string attribute_name_string(attribute_name);
217+
auto found_attr = array_schema->shared_attribute(attribute_name_string);
218+
if (!found_attr) {
219+
throw CAPIException(
220+
std::string("Attribute name: ") +
221+
(attribute_name_string.empty() ? "<anonymous>" : attribute_name) +
222+
" does not exist for array " + array_schema->array_uri().to_string());
218223
}
219224

220-
tiledb_string_t* enumeration_name_inner;
221-
capi_return_t getenmr = tiledb_attribute_get_enumeration_name(
222-
ctx, attribute, &enumeration_name_inner);
223-
if (tiledb_status(getenmr) != TILEDB_OK) {
224-
return getenmr;
225+
auto enumeration_name = found_attr->get_enumeration_name();
226+
if (!enumeration_name.has_value()) {
227+
*enumeration = nullptr;
228+
return TILEDB_OK;
225229
}
226230

227-
std::string enumeration_name(enumeration_name_inner->view());
228-
return api_entry_with_context<
229-
tiledb::api::tiledb_array_schema_get_enumeration_from_name>(
230-
ctx, array_schema, enumeration_name.c_str(), enumeration);
231+
array_schema->load_enumeration(ctx, enumeration_name->c_str());
232+
233+
auto ptr = array_schema->get_enumeration(enumeration_name->c_str());
234+
*enumeration = tiledb_enumeration_handle_t::make_handle(ptr);
235+
236+
return TILEDB_OK;
231237
}
232238

233239
capi_return_t tiledb_array_schema_add_enumeration(

tiledb/api/c_api/array_schema/array_schema_api_experimental.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ TILEDB_EXPORT capi_return_t tiledb_array_schema_timestamp_range(
6868
uint64_t* hi) TILEDB_NOEXCEPT;
6969

7070
/**
71-
* Retrieves an enumeration from an array schema using the enumeration name,
71+
* Retrieves an enumeration from an array schema using the enumeration name.
7272
*
7373
* **Example:**
7474
*

0 commit comments

Comments
 (0)