diff --git a/mdbx.h++ b/mdbx.h++ index 90d981b8..fd07c123 100644 --- a/mdbx.h++ +++ b/mdbx.h++ @@ -4338,6 +4338,21 @@ public: inline bool clear_map(const ::std::string &name, bool throw_if_absent = false); + /// \brief Переименовывает таблицу ключ-значение. + inline void rename_map(map_handle map, const char *new_name); + /// \brief Переименовывает таблицу ключ-значение. + inline void rename_map(map_handle map, const ::std::string &new_name); + /// \brief Переименовывает таблицу ключ-значение. + /// \return `True` если таблица существует и была переименована, либо + /// `false` в случае отсутствия исходной таблицы. + bool rename_map(const char *old_name, const char *new_name, + bool throw_if_absent = false); + /// \brief Переименовывает таблицу ключ-значение. + /// \return `True` если таблица существует и была переименована, либо + /// `false` в случае отсутствия исходной таблицы. + bool rename_map(const ::std::string &old_name, const ::std::string &new_name, + bool throw_if_absent = false); + using map_stat = ::MDBX_stat; /// \brief Returns statistics for a sub-database. inline map_stat get_map_stat(map_handle map) const; @@ -6319,6 +6334,14 @@ inline bool txn::clear_map(const ::std::string &name, bool throw_if_absent) { return clear_map(name.c_str(), throw_if_absent); } +inline void txn::rename_map(map_handle map, const char *new_name) { + error::success_or_throw(::mdbx_dbi_rename(handle_, map, new_name)); +} + +inline void txn::rename_map(map_handle map, const ::std::string &new_name) { + return rename_map(map, new_name.c_str()); +} + inline txn::map_stat txn::get_map_stat(map_handle map) const { txn::map_stat r; error::success_or_throw(::mdbx_dbi_stat(handle_, map.dbi, &r, sizeof(r))); diff --git a/src/mdbx.c++ b/src/mdbx.c++ index 60ef7ead..45372996 100644 --- a/src/mdbx.c++ +++ b/src/mdbx.c++ @@ -1586,6 +1586,29 @@ bool txn::clear_map(const char *name, bool throw_if_absent) { } } +bool txn::rename_map(const char *old_name, const char *new_name, + bool throw_if_absent) { + map_handle map; + const int err = ::mdbx_dbi_open(handle_, old_name, MDBX_DB_ACCEDE, &map.dbi); + switch (err) { + case MDBX_SUCCESS: + rename_map(map, new_name); + return true; + case MDBX_NOTFOUND: + case MDBX_BAD_DBI: + if (!throw_if_absent) + return false; + MDBX_CXX17_FALLTHROUGH /* fallthrough */; + default: + MDBX_CXX20_UNLIKELY error::throw_exception(err); + } +} + +bool txn::rename_map(const ::std::string &old_name, + const ::std::string &new_name, bool throw_if_absent) { + return rename_map(old_name.c_str(), new_name.c_str(), throw_if_absent); +} + //------------------------------------------------------------------------------ void cursor_managed::close() {