From 1fd72722b2ac94e0f4f37ec97e77f750b4b0e4c7 Mon Sep 17 00:00:00 2001 From: Jan Segre Date: Thu, 30 Apr 2026 18:32:07 +0200 Subject: [PATCH] fix: support building against rocksdb-11 --- pyproject.toml | 2 +- rocksdb/_rocksdb.pyx | 1 + rocksdb/cpp/db_helpers.hpp | 186 +++++++++++++++++++++++++++++++++++++ rocksdb/db.pxd | 17 ++-- 4 files changed, 199 insertions(+), 7 deletions(-) create mode 100644 rocksdb/cpp/db_helpers.hpp diff --git a/pyproject.toml b/pyproject.toml index f55d9af8..304748bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "rocksdb" -version = "0.10.0" +version = "0.10.1" description = "Python bindings for RocksDB" readme = "README.md" authors = [ diff --git a/rocksdb/_rocksdb.pyx b/rocksdb/_rocksdb.pyx index 752e5468..c96be9b2 100644 --- a/rocksdb/_rocksdb.pyx +++ b/rocksdb/_rocksdb.pyx @@ -1568,6 +1568,7 @@ cdef class DB(object): del self.cf_options[:] with nogil: st = self.db.Close() + db.DB_Destroy(self.db) self.db = NULL if self.opts is not None: self.opts.in_use = False diff --git a/rocksdb/cpp/db_helpers.hpp b/rocksdb/cpp/db_helpers.hpp new file mode 100644 index 00000000..ee7fd447 --- /dev/null +++ b/rocksdb/cpp/db_helpers.hpp @@ -0,0 +1,186 @@ +#pragma once + +#include +#include +#include + +#include "rocksdb/version.h" +#include "rocksdb/db.h" + +#ifndef ROCKSDB_MAKE_VERSION_INT +#define ROCKSDB_MAKE_VERSION_INT(a, b, c) ((a) * 1000000 + (b) * 1000 + (c)) +#endif +#ifndef ROCKSDB_VERSION_INT +#define ROCKSDB_VERSION_INT \ + ROCKSDB_MAKE_VERSION_INT(ROCKSDB_MAJOR, ROCKSDB_MINOR, ROCKSDB_PATCH) +#endif +#ifndef ROCKSDB_VERSION_GE +#define ROCKSDB_VERSION_GE(a, b, c) \ + (ROCKSDB_VERSION_INT >= ROCKSDB_MAKE_VERSION_INT(a, b, c)) +#endif + +namespace py_rocks { + +inline rocksdb::Status DBOpen( + const rocksdb::Options& options, + const std::string& name, + rocksdb::DB** dbptr) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::Open(options, name, &db); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::Open(options, name, dbptr); +#endif +} + +inline rocksdb::Status DBOpenColumnFamilies( + const rocksdb::Options& options, + const std::string& name, + const std::vector& column_families, + std::vector* handles, + rocksdb::DB** dbptr) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::Open( + options, + name, + column_families, + handles, + &db); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::Open( + options, + name, + column_families, + handles, + dbptr); +#endif +} + +inline rocksdb::Status DBOpenAsSecondary( + const rocksdb::Options& options, + const std::string& name, + const std::string& secondary_path, + rocksdb::DB** dbptr) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::OpenAsSecondary( + options, + name, + secondary_path, + &db); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::OpenAsSecondary(options, name, secondary_path, dbptr); +#endif +} + +inline rocksdb::Status DBOpenAsSecondaryColumnFamilies( + const rocksdb::Options& options, + const std::string& name, + const std::string& secondary_path, + const std::vector& column_families, + std::vector* handles, + rocksdb::DB** dbptr) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::OpenAsSecondary( + options, + name, + secondary_path, + column_families, + handles, + &db); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::OpenAsSecondary( + options, + name, + secondary_path, + column_families, + handles, + dbptr); +#endif +} + +inline rocksdb::Status DBOpenForReadOnly( + const rocksdb::Options& options, + const std::string& name, + rocksdb::DB** dbptr, + bool error_if_wal_file_exists) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::OpenForReadOnly( + options, + name, + &db, + error_if_wal_file_exists); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::OpenForReadOnly( + options, + name, + dbptr, + error_if_wal_file_exists); +#endif +} + +inline rocksdb::Status DBOpenForReadOnlyColumnFamilies( + const rocksdb::Options& options, + const std::string& name, + const std::vector& column_families, + std::vector* handles, + rocksdb::DB** dbptr, + bool error_if_wal_file_exists) { + *dbptr = nullptr; +#if ROCKSDB_VERSION_GE(10, 0, 0) + std::unique_ptr db; + auto status = rocksdb::DB::OpenForReadOnly( + options, + name, + column_families, + handles, + &db, + error_if_wal_file_exists); + if (status.ok()) { + *dbptr = db.release(); + } + return status; +#else + return rocksdb::DB::OpenForReadOnly( + options, + name, + column_families, + handles, + dbptr, + error_if_wal_file_exists); +#endif +} + +inline void DBDestroy(rocksdb::DB* db) { + delete db; +} + +} // namespace py_rocks diff --git a/rocksdb/db.pxd b/rocksdb/db.pxd index 0dc7d462..7e0dd09c 100644 --- a/rocksdb/db.pxd +++ b/rocksdb/db.pxd @@ -185,25 +185,26 @@ cdef extern from "rocksdb/db.h" namespace "rocksdb": Status TryCatchUpWithPrimary() nogil except+ - cdef Status DB_Open "rocksdb::DB::Open"( +cdef extern from "cpp/db_helpers.hpp" namespace "py_rocks": + cdef Status DB_Open "py_rocks::DBOpen"( const options.Options&, const string&, DB**) except+ nogil - cdef Status DB_Open_ColumnFamilies "rocksdb::DB::Open"( + cdef Status DB_Open_ColumnFamilies "py_rocks::DBOpenColumnFamilies"( const options.Options&, const string&, const vector[ColumnFamilyDescriptor]&, vector[ColumnFamilyHandle*]*, DB**) except+ nogil - cdef Status DB_OpenAsSecondary "rocksdb::DB::OpenAsSecondary"( + cdef Status DB_OpenAsSecondary "py_rocks::DBOpenAsSecondary"( const options.Options&, const string&, const string&, DB**) nogil except+ - cdef Status DB_OpenAsSecondary_ColumnFamilies "rocksdb::DB::OpenAsSecondary"( + cdef Status DB_OpenAsSecondary_ColumnFamilies "py_rocks::DBOpenAsSecondaryColumnFamilies"( const options.Options&, const string&, const string&, @@ -211,13 +212,13 @@ cdef extern from "rocksdb/db.h" namespace "rocksdb": vector[ColumnFamilyHandle*]*, DB**) nogil except+ - cdef Status DB_OpenForReadOnly "rocksdb::DB::OpenForReadOnly"( + cdef Status DB_OpenForReadOnly "py_rocks::DBOpenForReadOnly"( const options.Options&, const string&, DB**, cpp_bool) except+ nogil - cdef Status DB_OpenForReadOnly_ColumnFamilies "rocksdb::DB::OpenForReadOnly"( + cdef Status DB_OpenForReadOnly_ColumnFamilies "py_rocks::DBOpenForReadOnlyColumnFamilies"( const options.Options&, const string&, const vector[ColumnFamilyDescriptor]&, @@ -225,6 +226,10 @@ cdef extern from "rocksdb/db.h" namespace "rocksdb": DB**, cpp_bool) except+ nogil + cdef void DB_Destroy "py_rocks::DBDestroy"(DB*) except+ nogil + +cdef extern from "rocksdb/db.h" namespace "rocksdb": + cdef Status RepairDB(const string& dbname, const options.Options&) cdef Status ListColumnFamilies "rocksdb::DB::ListColumnFamilies" (