Skip to content

Commit c4f67ac

Browse files
committed
Refactor FdbHandle methods to be member functions
1 parent 865da32 commit c4f67ac

4 files changed

Lines changed: 187 additions & 323 deletions

File tree

rust/crates/fdb-sys/cpp/fdb_bridge.cpp

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -588,13 +588,13 @@ std::unique_ptr<FdbHandle> new_fdb_from_path_with_user_config(rust::Str path, ru
588588
// Archive functions
589589
// ============================================================================
590590

591-
void archive(FdbHandle& handle, const KeyData& key, rust::Slice<const uint8_t> data) {
591+
void FdbHandle::archive(const KeyData& key, rust::Slice<const uint8_t> data) {
592592
fdb5::Key fdb_key = to_fdb_key(key);
593-
handle.inner().archive(fdb_key, data.data(), data.size());
593+
inner().archive(fdb_key, data.data(), data.size());
594594
}
595595

596-
void archive_raw(FdbHandle& handle, rust::Slice<const uint8_t> data) {
597-
handle.inner().archive(data.data(), data.size());
596+
void FdbHandle::archive_raw(rust::Slice<const uint8_t> data) {
597+
inner().archive(data.data(), data.size());
598598
}
599599

600600
namespace {
@@ -645,54 +645,52 @@ class RustReaderHandle : public eckit::DataHandle {
645645

646646
} // namespace
647647

648-
void archive_reader(FdbHandle& handle, rust::Box<ReaderBox> reader) {
648+
void FdbHandle::archive_reader(rust::Box<ReaderBox> reader) {
649649
RustReaderHandle adapter(std::move(reader));
650-
handle.inner().archive(adapter);
650+
inner().archive(adapter);
651651
}
652652

653653
// ============================================================================
654654
// Retrieve functions
655655
// ============================================================================
656656

657-
std::unique_ptr<eckit::DataHandle> retrieve(FdbHandle& handle, rust::Str request) {
657+
std::unique_ptr<eckit::DataHandle> FdbHandle::retrieve(rust::Str request) {
658658
auto mars = parse_to_mars_request(std::string(request));
659-
return std::unique_ptr<eckit::DataHandle>(handle.inner().retrieve(mars));
659+
return std::unique_ptr<eckit::DataHandle>(inner().retrieve(mars));
660660
}
661661

662662
// ============================================================================
663663
// Read functions (by URI)
664664
// ============================================================================
665665

666-
std::unique_ptr<eckit::DataHandle> read_uri(FdbHandle& handle, rust::Str uri) {
666+
std::unique_ptr<eckit::DataHandle> FdbHandle::read_uri(rust::Str uri) {
667667
std::string uri_str{uri};
668668
eckit::URI eckit_uri{uri_str};
669-
return std::unique_ptr<eckit::DataHandle>(handle.inner().read(eckit_uri));
669+
return std::unique_ptr<eckit::DataHandle>(inner().read(eckit_uri));
670670
}
671671

672-
std::unique_ptr<eckit::DataHandle> read_uris(FdbHandle& handle, const rust::Vec<rust::String>& uris,
673-
bool in_storage_order) {
672+
std::unique_ptr<eckit::DataHandle> FdbHandle::read_uris(const rust::Vec<rust::String>& uris, bool in_storage_order) {
674673
std::vector<eckit::URI> eckit_uris;
675674
eckit_uris.reserve(uris.size());
676675
for (const auto& uri : uris) {
677676
eckit_uris.emplace_back(std::string(uri));
678677
}
679-
return std::unique_ptr<eckit::DataHandle>(handle.inner().read(eckit_uris, in_storage_order));
678+
return std::unique_ptr<eckit::DataHandle>(inner().read(eckit_uris, in_storage_order));
680679
}
681680

682-
std::unique_ptr<eckit::DataHandle> read_list_iterator(FdbHandle& handle, ListIteratorHandle& iterator,
683-
bool in_storage_order) {
681+
std::unique_ptr<eckit::DataHandle> FdbHandle::read_list_iterator(ListIteratorHandle& iterator, bool in_storage_order) {
684682
// Calls FDB::read(ListIterator&, bool) directly - most efficient path
685-
return std::unique_ptr<eckit::DataHandle>(handle.inner().read(iterator.inner(), in_storage_order));
683+
return std::unique_ptr<eckit::DataHandle>(inner().read(iterator.inner(), in_storage_order));
686684
}
687685

688686
// ============================================================================
689687
// List functions
690688
// ============================================================================
691689

692-
std::unique_ptr<ListIteratorHandle> list(FdbHandle& handle, rust::Str request, bool deduplicate, int32_t level) {
690+
std::unique_ptr<ListIteratorHandle> FdbHandle::list(rust::Str request, bool deduplicate, int32_t level) {
693691
std::string request_str{request};
694692
auto tool_request = make_tool_request(request_str);
695-
auto it = handle.inner().list(tool_request, deduplicate, level);
693+
auto it = inner().list(tool_request, deduplicate, level);
696694
return std::make_unique<ListIteratorHandle>(std::move(it));
697695
}
698696

@@ -710,10 +708,10 @@ CompactListingData list_iterator_dump_compact(ListIteratorHandle& iterator) {
710708
// Axes query functions
711709
// ============================================================================
712710

713-
rust::Vec<AxisEntry> axes(FdbHandle& handle, rust::Str request, int32_t level) {
711+
rust::Vec<AxisEntry> FdbHandle::axes(rust::Str request, int32_t level) {
714712
std::string request_str{request};
715713
auto tool_request = make_tool_request(request_str);
716-
auto index_axis = handle.inner().axes(tool_request, level);
714+
auto index_axis = inner().axes(tool_request, level);
717715

718716
rust::Vec<AxisEntry> result;
719717
// Iterate over all axes using map() instead of hardcoded list
@@ -733,64 +731,64 @@ rust::Vec<AxisEntry> axes(FdbHandle& handle, rust::Str request, int32_t level) {
733731
// Dump functions
734732
// ============================================================================
735733

736-
std::unique_ptr<DumpIteratorHandle> dump(FdbHandle& handle, rust::Str request, bool simple) {
734+
std::unique_ptr<DumpIteratorHandle> FdbHandle::dump(rust::Str request, bool simple) {
737735
std::string request_str{request};
738736
auto tool_request = make_tool_request(request_str);
739-
auto it = handle.inner().dump(tool_request, simple);
737+
auto it = inner().dump(tool_request, simple);
740738
return std::make_unique<DumpIteratorHandle>(std::move(it));
741739
}
742740

743741
// ============================================================================
744742
// Status functions
745743
// ============================================================================
746744

747-
std::unique_ptr<StatusIteratorHandle> status(FdbHandle& handle, rust::Str request) {
745+
std::unique_ptr<StatusIteratorHandle> FdbHandle::status(rust::Str request) {
748746
std::string request_str{request};
749747
auto tool_request = make_tool_request(request_str);
750-
auto it = handle.inner().status(tool_request);
748+
auto it = inner().status(tool_request);
751749
return std::make_unique<StatusIteratorHandle>(std::move(it));
752750
}
753751

754752
// ============================================================================
755753
// Wipe functions
756754
// ============================================================================
757755

758-
std::unique_ptr<WipeIteratorHandle> wipe(FdbHandle& handle, rust::Str request, bool doit, bool porcelain,
759-
bool unsafe_wipe_all) {
756+
std::unique_ptr<WipeIteratorHandle> FdbHandle::wipe(rust::Str request, bool doit, bool porcelain,
757+
bool unsafe_wipe_all) {
760758
std::string request_str{request};
761759
auto tool_request = make_tool_request(request_str);
762-
auto it = handle.inner().wipe(tool_request, doit, porcelain, unsafe_wipe_all);
760+
auto it = inner().wipe(tool_request, doit, porcelain, unsafe_wipe_all);
763761
return std::make_unique<WipeIteratorHandle>(std::move(it));
764762
}
765763

766764
// ============================================================================
767765
// Purge functions
768766
// ============================================================================
769767

770-
std::unique_ptr<PurgeIteratorHandle> purge(FdbHandle& handle, rust::Str request, bool doit, bool porcelain) {
768+
std::unique_ptr<PurgeIteratorHandle> FdbHandle::purge(rust::Str request, bool doit, bool porcelain) {
771769
std::string request_str{request};
772770
auto tool_request = make_tool_request(request_str);
773-
auto it = handle.inner().purge(tool_request, doit, porcelain);
771+
auto it = inner().purge(tool_request, doit, porcelain);
774772
return std::make_unique<PurgeIteratorHandle>(std::move(it));
775773
}
776774

777775
// ============================================================================
778776
// Stats functions
779777
// ============================================================================
780778

781-
std::unique_ptr<StatsIteratorHandle> stats_iterator(FdbHandle& handle, rust::Str request) {
779+
std::unique_ptr<StatsIteratorHandle> FdbHandle::stats_iterator(rust::Str request) {
782780
std::string request_str{request};
783781
auto tool_request = make_tool_request(request_str);
784-
auto it = handle.inner().stats(tool_request);
782+
auto it = inner().stats(tool_request);
785783
return std::make_unique<StatsIteratorHandle>(std::move(it));
786784
}
787785

788786
// ============================================================================
789787
// Control functions
790788
// ============================================================================
791789

792-
std::unique_ptr<ControlIteratorHandle> control(FdbHandle& handle, rust::Str request, fdb5::ControlAction action,
793-
rust::Slice<const fdb5::ControlIdentifier> identifiers) {
790+
std::unique_ptr<ControlIteratorHandle> FdbHandle::control(rust::Str request, fdb5::ControlAction action,
791+
rust::Slice<const fdb5::ControlIdentifier> identifiers) {
794792
std::string request_str{request};
795793
auto tool_request = make_tool_request(request_str);
796794

@@ -799,24 +797,24 @@ std::unique_ptr<ControlIteratorHandle> control(FdbHandle& handle, rust::Str requ
799797
ctrl_ids |= id;
800798
}
801799

802-
auto it = handle.inner().control(tool_request, action, ctrl_ids);
800+
auto it = inner().control(tool_request, action, ctrl_ids);
803801
return std::make_unique<ControlIteratorHandle>(std::move(it));
804802
}
805803

806804
// ============================================================================
807805
// Callback registration functions
808806
// ============================================================================
809807

810-
void register_flush_callback(FdbHandle& handle, rust::Box<FlushCallbackBox> callback) {
808+
void FdbHandle::register_flush_callback(rust::Box<FlushCallbackBox> callback) {
811809
// Create a shared_ptr to hold the callback box so it can be captured by the lambda
812810
auto callback_ptr = std::make_shared<rust::Box<FlushCallbackBox>>(std::move(callback));
813811

814812
fdb5::FlushCallback cpp_callback = [callback_ptr]() { invoke_flush_callback(**callback_ptr); };
815813

816-
handle.inner().registerFlushCallback(std::move(cpp_callback));
814+
inner().registerFlushCallback(std::move(cpp_callback));
817815
}
818816

819-
void register_archive_callback(FdbHandle& handle, rust::Box<ArchiveCallbackBox> callback) {
817+
void FdbHandle::register_archive_callback(rust::Box<ArchiveCallbackBox> callback) {
820818
// Create a shared_ptr to hold the callback box so it can be captured by the lambda
821819
auto callback_ptr = std::make_shared<rust::Box<ArchiveCallbackBox>>(std::move(callback));
822820

@@ -859,7 +857,7 @@ void register_archive_callback(FdbHandle& handle, rust::Box<ArchiveCallbackBox>
859857
location_length);
860858
};
861859

862-
handle.inner().registerArchiveCallback(std::move(cpp_callback));
860+
inner().registerArchiveCallback(std::move(cpp_callback));
863861
}
864862

865863
// ============================================================================

rust/crates/fdb-sys/cpp/fdb_bridge.h

Lines changed: 38 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,18 @@ struct DbStatsData;
8989
struct StatsElementData;
9090
struct ControlElementData;
9191

92+
// Forward declarations for types used by FdbHandle methods.
93+
class ListIteratorHandle;
94+
class DumpIteratorHandle;
95+
class StatusIteratorHandle;
96+
class WipeIteratorHandle;
97+
class PurgeIteratorHandle;
98+
class StatsIteratorHandle;
99+
class ControlIteratorHandle;
100+
struct ReaderBox;
101+
struct FlushCallbackBox;
102+
struct ArchiveCallbackBox;
103+
92104
// ============================================================================
93105
// Wrapper classes for opaque C++ types
94106
// ============================================================================
@@ -143,6 +155,32 @@ class FdbHandle {
143155
/// Get the FDB type name.
144156
rust::String name() const;
145157

158+
// -------------------------------------------------------------------------
159+
// Operations (exposed to Rust as methods via cxx)
160+
// -------------------------------------------------------------------------
161+
162+
void archive(const KeyData& key, rust::Slice<const uint8_t> data);
163+
void archive_raw(rust::Slice<const uint8_t> data);
164+
void archive_reader(rust::Box<ReaderBox> reader);
165+
166+
std::unique_ptr<eckit::DataHandle> retrieve(rust::Str request);
167+
std::unique_ptr<eckit::DataHandle> read_uri(rust::Str uri);
168+
std::unique_ptr<eckit::DataHandle> read_uris(const rust::Vec<rust::String>& uris, bool in_storage_order);
169+
std::unique_ptr<eckit::DataHandle> read_list_iterator(ListIteratorHandle& iterator, bool in_storage_order);
170+
171+
std::unique_ptr<ListIteratorHandle> list(rust::Str request, bool deduplicate, int32_t level);
172+
rust::Vec<AxisEntry> axes(rust::Str request, int32_t level);
173+
std::unique_ptr<DumpIteratorHandle> dump(rust::Str request, bool simple);
174+
std::unique_ptr<StatusIteratorHandle> status(rust::Str request);
175+
std::unique_ptr<WipeIteratorHandle> wipe(rust::Str request, bool doit, bool porcelain, bool unsafe_wipe_all);
176+
std::unique_ptr<PurgeIteratorHandle> purge(rust::Str request, bool doit, bool porcelain);
177+
std::unique_ptr<StatsIteratorHandle> stats_iterator(rust::Str request);
178+
std::unique_ptr<ControlIteratorHandle> control(rust::Str request, fdb5::ControlAction action,
179+
rust::Slice<const fdb5::ControlIdentifier> identifiers);
180+
181+
void register_flush_callback(rust::Box<FlushCallbackBox> callback);
182+
void register_archive_callback(rust::Box<ArchiveCallbackBox> callback);
183+
146184
private:
147185

148186
fdb5::FDB impl_;
@@ -373,49 +411,6 @@ std::unique_ptr<FdbHandle> new_fdb_from_path(rust::Str path);
373411
/// Same as `new_fdb_from_path` but also applies a YAML "user config".
374412
std::unique_ptr<FdbHandle> new_fdb_from_path_with_user_config(rust::Str path, rust::Str user_config);
375413

376-
// ============================================================================
377-
// Archive functions
378-
// ============================================================================
379-
380-
/// Archive data with an explicit key.
381-
void archive(FdbHandle& handle, const KeyData& key, rust::Slice<const uint8_t> data);
382-
383-
/// Archive raw GRIB data (key is extracted from the message).
384-
void archive_raw(FdbHandle& handle, rust::Slice<const uint8_t> data);
385-
386-
// Forward declaration for the opaque Rust reader box used by
387-
// `archive_reader`. Defined on the Rust side; cxx generates the symbol
388-
// in the same namespace.
389-
struct ReaderBox;
390-
391-
/// Archive raw GRIB data streamed from a Rust `std::io::Read` source.
392-
/// Wraps the Rust reader in an `eckit::DataHandle` subclass and hands it
393-
/// to `fdb5::FDB::archive(eckit::DataHandle&)`, which extracts the key
394-
/// from each GRIB message as it streams.
395-
void archive_reader(FdbHandle& handle, rust::Box<ReaderBox> reader);
396-
397-
// ============================================================================
398-
// Retrieve functions
399-
// ============================================================================
400-
401-
/// Retrieve data matching a request.
402-
std::unique_ptr<eckit::DataHandle> retrieve(FdbHandle& handle, rust::Str request);
403-
404-
// ============================================================================
405-
// Read functions (by URI)
406-
// ============================================================================
407-
408-
/// Read data from a single URI.
409-
std::unique_ptr<eckit::DataHandle> read_uri(FdbHandle& handle, rust::Str uri);
410-
411-
/// Read data from a list of URIs.
412-
std::unique_ptr<eckit::DataHandle> read_uris(FdbHandle& handle, const rust::Vec<rust::String>& uris,
413-
bool in_storage_order);
414-
415-
/// Read data from a list iterator (most efficient - avoids URI conversion).
416-
std::unique_ptr<eckit::DataHandle> read_list_iterator(FdbHandle& handle, ListIteratorHandle& iterator,
417-
bool in_storage_order);
418-
419414
// ============================================================================
420415
// eckit::DataHandle shim functions
421416
// ============================================================================
@@ -438,82 +433,10 @@ uint64_t data_handle_size(eckit::DataHandle& handle);
438433
/// Close the handle. Safe to call more than once.
439434
void data_handle_close(eckit::DataHandle& handle);
440435

441-
// ============================================================================
442-
// List functions
443-
// ============================================================================
444-
445-
/// List data matching a request.
446-
std::unique_ptr<ListIteratorHandle> list(FdbHandle& handle, rust::Str request, bool deduplicate, int32_t level);
447-
448436
/// Drain a `ListIteratorHandle` via `fdb5::ListIterator::dumpCompact` and
449437
/// return the aggregated MARS-request text plus the two counters.
450438
CompactListingData list_iterator_dump_compact(ListIteratorHandle& iterator);
451439

452-
// ============================================================================
453-
// Axes query functions
454-
// ============================================================================
455-
456-
/// Get axes for a request.
457-
rust::Vec<AxisEntry> axes(FdbHandle& handle, rust::Str request, int32_t level);
458-
459-
// ============================================================================
460-
// Dump functions
461-
// ============================================================================
462-
463-
/// Dump database structure.
464-
std::unique_ptr<DumpIteratorHandle> dump(FdbHandle& handle, rust::Str request, bool simple);
465-
466-
// ============================================================================
467-
// Status functions
468-
// ============================================================================
469-
470-
/// Get database status.
471-
std::unique_ptr<StatusIteratorHandle> status(FdbHandle& handle, rust::Str request);
472-
473-
// ============================================================================
474-
// Wipe functions
475-
// ============================================================================
476-
477-
/// Wipe data matching a request.
478-
std::unique_ptr<WipeIteratorHandle> wipe(FdbHandle& handle, rust::Str request, bool doit, bool porcelain,
479-
bool unsafe_wipe_all);
480-
481-
// ============================================================================
482-
// Purge functions
483-
// ============================================================================
484-
485-
/// Purge duplicate data.
486-
std::unique_ptr<PurgeIteratorHandle> purge(FdbHandle& handle, rust::Str request, bool doit, bool porcelain);
487-
488-
// ============================================================================
489-
// Stats functions
490-
// ============================================================================
491-
492-
/// Get statistics iterator.
493-
std::unique_ptr<StatsIteratorHandle> stats_iterator(FdbHandle& handle, rust::Str request);
494-
495-
// ============================================================================
496-
// Control functions
497-
// ============================================================================
498-
499-
/// Control database features.
500-
std::unique_ptr<ControlIteratorHandle> control(FdbHandle& handle, rust::Str request, fdb5::ControlAction action,
501-
rust::Slice<const fdb5::ControlIdentifier> identifiers);
502-
503-
// ============================================================================
504-
// Callback registration functions
505-
// ============================================================================
506-
507-
// Forward declare Rust callback box types
508-
struct FlushCallbackBox;
509-
struct ArchiveCallbackBox;
510-
511-
/// Register a flush callback.
512-
void register_flush_callback(FdbHandle& handle, rust::Box<FlushCallbackBox> callback);
513-
514-
/// Register an archive callback.
515-
void register_archive_callback(FdbHandle& handle, rust::Box<ArchiveCallbackBox> callback);
516-
517440
// ============================================================================
518441
// Test functions (for verifying exception handling)
519442
// ============================================================================

0 commit comments

Comments
 (0)