2323
2424#include < nanoarrow/nanoarrow.h>
2525
26+ #include " iceberg/arrow_struct_guard.h"
2627#include " iceberg/manifest_entry.h"
2728#include " iceberg/manifest_list.h"
2829#include " iceberg/schema.h"
@@ -51,6 +52,7 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ParseManifestListEntry(
5152 ArrowArrayView array_view;
5253 auto status = ArrowArrayViewInitFromSchema (&array_view, schema, &error);
5354 ARROW_RETURN_IF_NOT_OK (status, error);
55+ internal::ArrowArrayViewGuard view_guard (&array_view);
5456 status = ArrowArrayViewSetArray (&array_view, array_in, &error);
5557 ARROW_RETURN_IF_NOT_OK (status, error);
5658 status = ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error);
@@ -65,8 +67,6 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ParseManifestListEntry(
6567 for (int64_t idx = 0 ; idx < array_in->n_children ; idx++) {
6668 const auto & field = iceberg_schema.GetFieldByIndex (idx);
6769 if (!field.has_value ()) {
68- ArrowArrayRelease (array_in);
69- ArrowArrayViewReset (&array_view);
7070 return InvalidArgument (" Field not found in schema: {}" , idx);
7171 }
7272 auto field_name = field.value ().get ().name ();
@@ -197,8 +197,6 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ParseManifestListEntry(
197197 }
198198 }
199199#undef PARSE_PRIMITIVE_FIELD
200- ArrowArrayRelease (array_in);
201- ArrowArrayViewReset (&array_view);
202200 return manifest_files;
203201} // namespace iceberg
204202
@@ -213,6 +211,7 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ManifestListReaderImpl::Files
213211 return InvalidArgument (" Get schema failed in reader:{}" ,
214212 arrow_schema.error ().message );
215213 }
214+ internal::ArrowSchemaGuard schema_guard (&arrow_schema.value ());
216215 auto schema = FromArrowSchema (arrow_schema.value (), std::nullopt );
217216 if (!schema.has_value ()) {
218217 return InvalidArgument (" Parse iceberg schema failed:{}" , schema.error ().message );
@@ -224,6 +223,7 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ManifestListReaderImpl::Files
224223 result.error ().message );
225224 }
226225 if (result.value ().has_value ()) {
226+ internal::ArrowArrayGuard array_guard (&result.value ().value ());
227227 auto parse_result = ParseManifestListEntry (
228228 &arrow_schema.value (), &result.value ().value (), *schema.value ());
229229 if (!parse_result.has_value ()) {
@@ -234,6 +234,7 @@ Result<std::vector<std::unique_ptr<ManifestFile>>> ManifestListReaderImpl::Files
234234 std::make_move_iterator (parse_result.value ().begin ()),
235235 std::make_move_iterator (parse_result.value ().end ()));
236236 } else {
237+ // eof
237238 break ;
238239 }
239240 }
0 commit comments