diff --git a/src/common/db_backend_lmdb.cpp b/src/common/db_backend_lmdb.cpp index 75e60ce4..d23fff80 100644 --- a/src/common/db_backend_lmdb.cpp +++ b/src/common/db_backend_lmdb.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2024 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -394,10 +394,67 @@ namespace tools } return true; } + const char* lmdb_db_backend::name() { return "lmdb"; } + + bool lmdb_db_backend::convert_db_4kb_page_to_16kb_page(const std::string& source_path, const std::string& destination_path) + { + #define MDB_CHECK(x, msg) {int rc = x; CHECK_AND_ASSERT_MES(rc == MDB_SUCCESS, false, "LMDB 4k->16k error: " << msg << ": " << mdb_strerror(rc));} + + MDB_env *env_src = nullptr, *env_dst = nullptr; + + // source + MDB_CHECK(mdb_env_create(&env_src), "failed to create LMDB environment"); + MDB_CHECK(mdb_env_set_mapsize(env_src, 4 * 1024 * 1024), "failed to set mapsize"); // mapsize ? + MDB_CHECK(mdb_env_open(env_src, source_path.c_str(), 0, 0664), "failed to open source LMDB"); + + // destination (16k page size) + MDB_CHECK(mdb_env_create(&env_dst), "failed to create LMDB environment"); + MDB_CHECK(mdb_env_set_mapsize(env_dst, 16 * 1024 * 1024), "failed to set mapsize"); // mapsize ? + + // TODO uncomment after mdb_env_set_pagesize is supported + // MDB_CHECK(mdb_env_set_pagesize(env_dst, 16 * 1024), "failed to set page size to 16K"); + + MDB_CHECK(mdb_env_open(env_dst, destination_path.c_str(), 0, 0664), "failed to open destination LMDB"); + + // begin transactions + MDB_txn *txn_src = nullptr, *txn_dst = nullptr; + MDB_dbi dbi_src, dbi_dst; + MDB_CHECK(mdb_txn_begin(env_src, nullptr, MDB_RDONLY, &txn_src), "failed to begin source transaction"); + MDB_CHECK(mdb_dbi_open(txn_src, nullptr, 0, &dbi_src), "failed to open source database"); + MDB_CHECK(mdb_txn_begin(env_dst, nullptr, 0, &txn_dst), "failed to begin destination transaction"); + MDB_CHECK(mdb_dbi_open(txn_dst, nullptr, MDB_CREATE, &dbi_dst), "failed to open destination database"); + + MDB_cursor *cursor; + MDB_val key, data; + + // Iterate over the source database and copy all key-value pairs to the destination database + MDB_CHECK(mdb_cursor_open(txn_src, dbi_src, &cursor), "failed to open cursor"); + + while (mdb_cursor_get(cursor, &key, &data, MDB_NEXT) == MDB_SUCCESS) + { + MDB_CHECK(mdb_put(txn_dst, dbi_dst, &key, &data, 0), "failed to put data in destination database"); + } + + mdb_cursor_close(cursor); + + // commit transactions + MDB_CHECK(mdb_txn_commit(txn_src), "failed to commit source transaction"); + MDB_CHECK(mdb_txn_commit(txn_dst), "failed to commit destination transaction"); + + mdb_dbi_close(env_src, dbi_src); + mdb_dbi_close(env_dst, dbi_dst); + mdb_env_close(env_src); + mdb_env_close(env_dst); + + return true; + + #undef MDB_CHECK + } + } } diff --git a/src/common/db_backend_lmdb.h b/src/common/db_backend_lmdb.h index ef56c346..c2920f0c 100644 --- a/src/common/db_backend_lmdb.h +++ b/src/common/db_backend_lmdb.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2024 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -36,6 +36,7 @@ namespace tools boost::recursive_mutex m_write_exclusive_lock; std::map m_txs; // size_t -> count of nested read_only transactions bool pop_tx_entry(tx_entry& txe); + public: lmdb_db_backend(); ~lmdb_db_backend(); @@ -60,6 +61,8 @@ namespace tools bool have_tx(); MDB_txn* get_current_tx(); + static bool convert_db_4kb_page_to_16kb_page(const std::string& source_path, const std::string& destination_path); + }; } } diff --git a/src/connectivity_tool/conn_tool.cpp b/src/connectivity_tool/conn_tool.cpp index 07528c56..94df1835 100644 --- a/src/connectivity_tool/conn_tool.cpp +++ b/src/connectivity_tool/conn_tool.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2024 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Cryptonote developers // Distributed under the MIT/X11 software license, see the accompanying @@ -25,6 +25,7 @@ using namespace epee; #include "storages/http_abstract_invoke.h" #include "net/http_client.h" #include "currency_core/genesis_acc.h" +#include "common/db_backend_lmdb.h" #include namespace po = boost::program_options; @@ -63,6 +64,7 @@ namespace const command_line::arg_descriptor arg_pack_file ("pack-file", "perform gzip-packing and calculate hash for a given file"); const command_line::arg_descriptor arg_unpack_file ("unpack-file", "Perform gzip-unpacking and calculate hash for a given file"); const command_line::arg_descriptor arg_target_file ("target-file", "Specify target file for pack-file and unpack-file commands"); + const command_line::arg_descriptor arg_lmdb_page_4to16 ("convert-lmdb-4to16", "Perform LMDB conversion from 4k page size to 16k page size"); //const command_line::arg_descriptor arg_send_ipc ("send-ipc", "Send IPC request to UI"); } @@ -1251,6 +1253,34 @@ bool handle_pack_file(po::variables_map& vm) } } +bool handle_lmdb_page_4to16(po::variables_map& vm) +{ + std::string path_source; + std::string path_target; + + if (!command_line::has_arg(vm, arg_lmdb_page_4to16)) + return false; + + path_source = command_line::get_arg(vm, arg_lmdb_page_4to16); + + if (!command_line::has_arg(vm, arg_target_file)) + { + std::cout << "Error: Parameter target_file is not set." << ENDL; + return false; + } + path_target = command_line::get_arg(vm, arg_target_file); + + if (tools::db::lmdb_db_backend::convert_db_4kb_page_to_16kb_page(path_source, path_target)) + { + std::cout << "Conversion failed" << ENDL; + return false; + } + + std::cout << "Converted successfully" << ENDL; + return true; +} + + //--------------------------------------------------------------------------------------------------------------- int main(int argc, char* argv[]) @@ -1375,6 +1405,10 @@ int main(int argc, char* argv[]) { return handle_pack_file(vm) ? EXIT_SUCCESS : EXIT_FAILURE; } + else if (command_line::has_arg(vm, arg_lmdb_page_4to16)) + { + return handle_lmdb_page_4to16(vm) ? EXIT_SUCCESS : EXIT_FAILURE; + } /*else if (command_line::has_arg(vm, arg_send_ipc)) { handle_send_ipc(command_line::get_arg(vm, arg_send_ipc)) ? EXIT_SUCCESS : EXIT_FAILURE;