diff --git a/conanfile.py b/conanfile.py index 3495107311d4e0d467313dc4d8b088a508349d55..b37a045453b008b60c67985bf02effc02a6cc31c 100644 --- a/conanfile.py +++ b/conanfile.py @@ -14,10 +14,12 @@ class CaosdbConan(ConanFile): default_options = {"shared": False, "fPIC": True} generators = "cmake" requires = [ - ("boost/1.77.0"), - ("gtest/1.11.0"), + ("boost/1.76.0"), ("grpc/1.39.1"), ] + build_requires = [ + ("gtest/1.11.0"), + ] exports = "*.cpp", "*.h", "*.cmake", "*CMakeLists.txt", "*.in", "*.proto", "*.c" exports_sources = "src", "doc", "include", "test", "cmake", "proto" diff --git a/include/caosdb/configuration.h b/include/caosdb/configuration.h index 83b47810e7756555c201b57538b6f8ba738d1e43..1c3f0148a6679fd152563bd11859d2cab28a9d1a 100644 --- a/include/caosdb/configuration.h +++ b/include/caosdb/configuration.h @@ -25,6 +25,7 @@ #include "caosdb/certificate_provider.h" // for CertificateProvider, path #include "caosdb/exceptions.h" // for ConfigurationError #include "caosdb/logging.h" // for CAOSDB_LOG_... +#include "caosdb/protobuf_helper.h" // for reset_arena #include "caosdb/utility.h" // for load_json_file // IWYU pragma: no_include "boost/json/fwd.hpp" #include <boost/filesystem/operations.hpp> // for exists @@ -32,10 +33,12 @@ #include <boost/json/object.hpp> // for object #include <boost/json/value.hpp> // for value #include <boost/json/value_ref.hpp> // IWYU pragma: keep +#include <google/protobuf/arena.h> // for Arena #include <grpcpp/security/credentials.h> // for ChannelCredentials #include <iosfwd> // for ostream -#include <memory> // for unique_ptr, shared_ptr -#include <string> // for string +#include <iostream> +#include <memory> // for unique_ptr, shared_ptr +#include <string> // for string namespace caosdb::configuration { using boost::filesystem::exists; @@ -47,6 +50,7 @@ using caosdb::authentication::Authenticator; using caosdb::authentication::PlainPasswordAuthenticator; using caosdb::exceptions::ConfigurationError; using caosdb::utility::load_json_file; +using google::protobuf::Arena; using grpc::ChannelCredentials; const std::string logger_name = "caosdb::configuration"; @@ -218,7 +222,10 @@ public: ConfigurationManager(ConfigurationManager const &) = delete; void operator=(ConfigurationManager const &) = delete; + inline static auto GetArena() -> Arena * { return &GetInstance().arena; } + private: + Arena arena; value json_configuration; ConnectionConfigurationHelper connection_configuration_helper; LoggingConfigurationHelper logging_configuration_helper; diff --git a/include/caosdb/info.h b/include/caosdb/info.h index e9e7e1773ab81a4676e5be65e904a8026a22d60a..87b1b3278597178cf572b6f00d62eed8f8a66c0f 100644 --- a/include/caosdb/info.h +++ b/include/caosdb/info.h @@ -54,11 +54,12 @@ public: * CaosDBConnection::GetVersionInfo() instead to get the version of the * server behind the given connection. */ - explicit inline VersionInfo(ProtoVersionInfo *info) : info(info) { - if (this->info->GetArena() == nullptr) { - caosdb::utility::get_arena()->Own(this->info); - } - }; + explicit inline VersionInfo(ProtoVersionInfo *info) + : info(info){ + // if (this->info->GetArena() == nullptr) { + // caosdb::utility::get_arena()->Own(this->info); + //} + }; [[nodiscard]] inline auto GetMajor() const -> int32_t { return this->info->major(); } [[nodiscard]] inline auto GetMinor() const -> int32_t { return this->info->minor(); } [[nodiscard]] inline auto GetPatch() const -> int32_t { return this->info->patch(); } diff --git a/include/caosdb/logging.h b/include/caosdb/logging.h index 73f14cad5ad779dcb2bdb134325ad7397f436edb..eb99f9a51b3630ce48849acf935b316044aa82b2 100644 --- a/include/caosdb/logging.h +++ b/include/caosdb/logging.h @@ -41,19 +41,14 @@ typedef boost::log::sources::severity_channel_logger_mt<int, std::string> boost_ class logger { public: - static auto destroy() -> void { - auto &instance = logger::GetInstance(); - delete instance._logger_instance; - } - static auto get() -> boost_logger_class & { return *logger::GetInstance()._logger_instance; } + static auto get() -> boost_logger_class & { return logger::GetInstance()._logger_instance; } private: - logger() { this->_logger_instance = new boost_logger_class(); }; static logger &GetInstance() { static logger instance; return instance; } - boost_logger_class *_logger_instance; + boost_logger_class _logger_instance; }; /** diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h index 634c7a0d01b613e4fb6ad4d56e037693d9abc2c2..006b9f39e97164ca48bb1f1e9bc97c66295e20a7 100644 --- a/include/caosdb/transaction.h +++ b/include/caosdb/transaction.h @@ -407,7 +407,7 @@ public: * Instead, do Execute() or WaitForIt() and only call this method afterwards. */ [[nodiscard]] inline auto GetResultSet() const noexcept -> const ResultSet & { - if (!this->result_set) { + if (this->result_set == nullptr) { CAOSDB_LOG_ERROR(logger_name) << "GetResultSet was called before the transaction has terminated. This is a programming " "error of the code which uses the transaction."; diff --git a/src/caosdb/configuration.cpp b/src/caosdb/configuration.cpp index 3d78ac70600f2dcbb62199a40c6ec5d5a0299823..aa35901c9bd116dba17c4ceed164e4ccbac6dfe7 100644 --- a/src/caosdb/configuration.cpp +++ b/src/caosdb/configuration.cpp @@ -46,10 +46,11 @@ #include <exception> // IWYU pragma: keep // IWYU pragma: no_include <bits/exception.h> #include <grpcpp/security/credentials.h> // for SslCredentials -#include <iterator> // for next -#include <map> // for map -#include <stdexcept> // for out_of_range -#include <string> // for string, operator+ +#include <iostream> +#include <iterator> // for next +#include <map> // for map +#include <stdexcept> // for out_of_range +#include <string> // for string, operator+ namespace caosdb::configuration { using boost::filesystem::exists; diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp index fcf4b119f5dcf4dacf268fd3d6c19f9b036b93fe..9951cbf69f1905b861b679128dc34fc9a548e3e1 100644 --- a/src/caosdb/connection.cpp +++ b/src/caosdb/connection.cpp @@ -82,7 +82,7 @@ auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> Transaction error_message); } } else { - this->version_info = std::make_unique<VersionInfo>(response->release_version_info()); + this->version_info = std::make_unique<VersionInfo>(response->mutable_version_info()); } return status; diff --git a/src/caosdb/file_transmission/download_request_handler.cpp b/src/caosdb/file_transmission/download_request_handler.cpp index 755c8a438f0634ee62761a257173918e53280b50..e915075bdc5c8583c3e2ed2a5b7d979811e34942 100644 --- a/src/caosdb/file_transmission/download_request_handler.cpp +++ b/src/caosdb/file_transmission/download_request_handler.cpp @@ -128,22 +128,15 @@ void DownloadRequestHandler::handleNewCallState() { CAOSDB_LOG_TRACE(logger_name) << "Enter DownloadRequestHandler::handleNewCallState. local_path = " << file_descriptor_.local_path << ", download_id = " << file_descriptor_.file_transmission_id; - CAOSDB_LOG_TRACE(logger_name) << "HERE 1"; fileWriter_ = std::make_unique<FileWriter>(file_descriptor_.local_path); - CAOSDB_LOG_TRACE(logger_name) << "HERE 2"; auto *tid = request_->mutable_file_transmission_id(); - CAOSDB_LOG_TRACE(logger_name) << "HERE 3"; tid->CopyFrom(*(file_descriptor_.file_transmission_id)); - CAOSDB_LOG_TRACE(logger_name) << "HERE 4"; rpc_ = stub_->PrepareAsyncFileDownload(&ctx_, *request_, cq_); - CAOSDB_LOG_TRACE(logger_name) << "HERE 5"; transaction_status = TransactionStatus::EXECUTING(); - CAOSDB_LOG_TRACE(logger_name) << "HERE 6"; state_ = CallState::SendingRequest; - CAOSDB_LOG_TRACE(logger_name) << "HERE 7"; rpc_->StartCall(tag_); CAOSDB_LOG_TRACE(logger_name) << "Leave DownloadRequestHandler::handleNewCallState"; } diff --git a/src/caosdb/logging.cpp b/src/caosdb/logging.cpp index ddbda4f05a2582ae058f63f7b4c1c8453b9960dd..ead331da4f91d0053d413846158425f2bdb0667e 100644 --- a/src/caosdb/logging.cpp +++ b/src/caosdb/logging.cpp @@ -20,6 +20,7 @@ */ #include "caosdb/logging.h" #include "caosdb/log_level.h" +#include "caosdb/protobuf_helper.h" #include <boost/core/swap.hpp> // for swap #include <boost/iterator/iterator_facade.hpp> #include <boost/log/attributes/clock.hpp> @@ -44,9 +45,6 @@ #include <utility> // for move #include <vector> -void __attribute__((constructor)) startup() {} -void __attribute__((destructor)) shutdown() { caosdb::logging::logger::destroy(); } - namespace caosdb::logging { LoggingConfiguration::LoggingConfiguration(int level) : LevelConfiguration(level) {} diff --git a/src/caosdb/protobuf_helper.cpp b/src/caosdb/protobuf_helper.cpp index 9633f58eec141e717a33e0a3f815e456179500d0..2b5847687d4926324cbbd5d4f49caca4131dc951 100644 --- a/src/caosdb/protobuf_helper.cpp +++ b/src/caosdb/protobuf_helper.cpp @@ -19,16 +19,14 @@ * */ #include "caosdb/protobuf_helper.h" +#include "caosdb/configuration.h" #include <google/protobuf/arena.h> // for Arena namespace caosdb::utility { using google::protobuf::Arena; -auto get_arena() -> Arena * { - static Arena arena; - return &arena; -} +auto get_arena() -> Arena * { return caosdb::configuration::ConfigurationManager::GetArena(); } auto reset_arena() -> void { get_arena()->Reset(); } diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp index d315bf890fdaf5d2382f4fe2b3d2e57ba3a57bc2..7abaa1778b41353a4f8b6fef6acf75507a78ed03 100644 --- a/src/caosdb/transaction.cpp +++ b/src/caosdb/transaction.cpp @@ -251,7 +251,8 @@ auto Transaction::ExecuteAsynchronously() noexcept -> StatusCode { // NOLINT auto *entity_response = sub_response.mutable_retrieve_response()->mutable_entity_response(); auto entity_id = entity_response->entity().id(); - download_files[entity_id].file_transmission_id = entity_response->release_download_id(); + download_files[entity_id].file_transmission_id = + entity_response->unsafe_arena_release_download_id(); // TODO(tf) handle error } } diff --git a/test/test_data_type.cpp b/test/test_data_type.cpp index b1e714d705b23dcaef6354e17cf94e411f1d8335..5d0fa1b1a2748553a5c20ebadc04ad2b839d435f 100644 --- a/test/test_data_type.cpp +++ b/test/test_data_type.cpp @@ -39,8 +39,6 @@ #include <utility> // for pair namespace caosdb::entity { -using ProtoEntity = caosdb::entity::v1alpha1::Entity; -using ProtoParent = caosdb::entity::v1alpha1::Parent; using ProtoDataType = caosdb::entity::v1alpha1::DataType; using ProtoAtomicDataType = caosdb::entity::v1alpha1::AtomicDataType; @@ -65,6 +63,7 @@ TEST(test_data_type, test_atomic) { EXPECT_TRUE(data_type.IsAtomic()); EXPECT_EQ(data_type.GetAsAtomic(), map_el.first); } + caosdb::utility::reset_arena(); } TEST(test_data_type, test_reference) {