From e054766ec186f423a83ea9bda2fd12ee74885060 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Sat, 6 Nov 2021 14:01:06 +0100
Subject: [PATCH] WIP: fix conan setup

---
 conanfile.py                                          |  6 ++++--
 include/caosdb/configuration.h                        | 11 +++++++++--
 include/caosdb/info.h                                 | 11 ++++++-----
 include/caosdb/logging.h                              |  9 ++-------
 include/caosdb/transaction.h                          |  2 +-
 src/caosdb/configuration.cpp                          |  9 +++++----
 src/caosdb/connection.cpp                             |  2 +-
 .../file_transmission/download_request_handler.cpp    |  7 -------
 src/caosdb/logging.cpp                                |  4 +---
 src/caosdb/protobuf_helper.cpp                        |  6 ++----
 src/caosdb/transaction.cpp                            |  3 ++-
 test/test_data_type.cpp                               |  3 +--
 12 files changed, 34 insertions(+), 39 deletions(-)

diff --git a/conanfile.py b/conanfile.py
index 3495107..b37a045 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 83b4781..1c3f014 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 e9e7e17..87b1b32 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 73f14ca..eb99f9a 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 634c7a0..006b9f3 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 3d78ac7..aa35901 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 fcf4b11..9951cbf 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 755c8a4..e915075 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 ddbda4f..ead331d 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 9633f58..2b58476 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 d315bf8..7abaa17 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 b1e714d..5d0fa1b 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) {
-- 
GitLab