2121#pragma once
2222
2323#include < memory>
24+ #include < utility>
2425
2526#include " fmt/ostream.h"
2627#include " rocksdb/db.h"
@@ -42,87 +43,49 @@ struct UniqueIterator : std::unique_ptr<rocksdb::Iterator> {
4243 : BaseType(ctx.storage->NewIterator (ctx, options)) {}
4344};
4445
45- namespace details {
46-
47- template <typename T, auto * F, Status::Code C = Status::NotOK, typename ... Args>
48- StatusOr<std::unique_ptr<T>> WrapOutPtrToUnique (Args&&... args) {
49- T* ptr = nullptr ;
50- auto s = (*F)(std::forward<Args>(args)..., &ptr);
51-
52- if (!s.ok ()) {
53- return {C, s.ToString ()};
54- }
55-
56- return ptr;
57- }
58-
59- [[nodiscard]] inline rocksdb::Status DBOpenForReadOnly (
60- const rocksdb::DBOptions& db_options, const std::string& dbname,
61- const std::vector<rocksdb::ColumnFamilyDescriptor>& column_families,
62- std::vector<rocksdb::ColumnFamilyHandle*>* handles, rocksdb::DB** dbptr) {
63- return rocksdb::DB::OpenForReadOnly (db_options, dbname, column_families, handles, dbptr);
64- }
65-
66- [[nodiscard]] inline rocksdb::Status DBOpenForSecondaryInstance (
67- const rocksdb::DBOptions& db_options, const std::string& dbname, const std::string& secondary_path,
68- const std::vector<rocksdb::ColumnFamilyDescriptor>& column_families,
69- std::vector<rocksdb::ColumnFamilyHandle*>* handles, rocksdb::DB** dbptr) {
70- return rocksdb::DB::OpenAsSecondary (db_options, dbname, secondary_path, column_families, handles, dbptr);
71- }
72-
73- } // namespace details
74-
7546inline StatusOr<std::unique_ptr<rocksdb::DB>> DBOpen (const rocksdb::Options& options, const std::string& dbname) {
76- return details::WrapOutPtrToUnique<
77- rocksdb::DB,
78- static_cast < rocksdb::Status (*)( const rocksdb::Options&, const std::string&, rocksdb::DB**)>(rocksdb::DB::Open),
79- Status::DBOpenErr>(options, dbname );
47+ std::unique_ptr<rocksdb::DB> db;
48+ auto s = rocksdb::DB::Open (options, dbname, &db);
49+ if (!s. ok ()) return {Status::DBOpenErr, s. ToString ()};
50+ return std::move (db );
8051}
8152
8253inline StatusOr<std::unique_ptr<rocksdb::DB>> DBOpen (
8354 const rocksdb::DBOptions& db_options, const std::string& dbname,
8455 const std::vector<rocksdb::ColumnFamilyDescriptor>& column_families,
8556 std::vector<rocksdb::ColumnFamilyHandle*>* handles) {
86- return details::WrapOutPtrToUnique<
87- rocksdb::DB,
88- static_cast <rocksdb::Status (*)(const rocksdb::DBOptions&, const std::string&,
89- const std::vector<rocksdb::ColumnFamilyDescriptor>&,
90- std::vector<rocksdb::ColumnFamilyHandle*>*, rocksdb::DB**)>(rocksdb::DB::Open),
91- Status::DBOpenErr>(db_options, dbname, column_families, handles);
57+ std::unique_ptr<rocksdb::DB> db;
58+ auto s = rocksdb::DB::Open (db_options, dbname, column_families, handles, &db);
59+ if (!s.ok ()) return {Status::DBOpenErr, s.ToString ()};
60+ return std::move (db);
9261}
9362
9463inline StatusOr<std::unique_ptr<rocksdb::DB>> DBOpenForReadOnly (
9564 const rocksdb::DBOptions& db_options, const std::string& dbname,
9665 const std::vector<rocksdb::ColumnFamilyDescriptor>& column_families,
9766 std::vector<rocksdb::ColumnFamilyHandle*>* handles) {
98- return details::WrapOutPtrToUnique<
99- rocksdb::DB,
100- static_cast <rocksdb::Status (*)(
101- const rocksdb::DBOptions&, const std::string&, const std::vector<rocksdb::ColumnFamilyDescriptor>&,
102- std::vector<rocksdb::ColumnFamilyHandle*>*, rocksdb::DB**)>(details::DBOpenForReadOnly),
103- Status::DBOpenErr>(db_options, dbname, column_families, handles);
67+ std::unique_ptr<rocksdb::DB> db;
68+ auto s = rocksdb::DB::OpenForReadOnly (db_options, dbname, column_families, handles, &db);
69+ if (!s.ok ()) return {Status::DBOpenErr, s.ToString ()};
70+ return std::move (db);
10471}
10572
10673inline StatusOr<std::unique_ptr<rocksdb::DB>> DBOpenAsSecondaryInstance (
10774 const rocksdb::DBOptions& db_options, const std::string& dbname, const std::string& secondary_path,
10875 const std::vector<rocksdb::ColumnFamilyDescriptor>& column_families,
10976 std::vector<rocksdb::ColumnFamilyHandle*>* handles) {
110- return details::WrapOutPtrToUnique<
111- rocksdb::DB,
112- static_cast <rocksdb::Status (*)(const rocksdb::DBOptions&, const std::string&, const std::string&,
113- const std::vector<rocksdb::ColumnFamilyDescriptor>&,
114- std::vector<rocksdb::ColumnFamilyHandle*>*, rocksdb::DB**)>(
115- details::DBOpenForSecondaryInstance),
116- Status::DBOpenErr>(db_options, dbname, secondary_path, column_families, handles);
77+ std::unique_ptr<rocksdb::DB> db;
78+ auto s = rocksdb::DB::OpenAsSecondary (db_options, dbname, secondary_path, column_families, handles, &db);
79+ if (!s.ok ()) return {Status::DBOpenErr, s.ToString ()};
80+ return std::move (db);
11781}
11882
11983inline StatusOr<std::unique_ptr<rocksdb::BackupEngine>> BackupEngineOpen (rocksdb::Env* db_env,
12084 const rocksdb::BackupEngineOptions& options) {
121- return details::WrapOutPtrToUnique<
122- rocksdb::BackupEngine,
123- static_cast <rocksdb::IOStatus (*)(rocksdb::Env*, const rocksdb::BackupEngineOptions&, rocksdb::BackupEngine**)>(
124- rocksdb::BackupEngine::Open),
125- Status::DBBackupErr>(db_env, options);
85+ rocksdb::BackupEngine* backup_engine = nullptr ;
86+ auto s = rocksdb::BackupEngine::Open (options, db_env, &backup_engine);
87+ if (!s.ok ()) return {Status::DBBackupErr, s.ToString ()};
88+ return std::unique_ptr<rocksdb::BackupEngine>(backup_engine);
12689}
12790
12891} // namespace util
0 commit comments