diff --git a/include/caosdb/configuration.h b/include/caosdb/configuration.h index 5f254844c1972cc4400856a2470ef2d0dddf1c91..649495f9a3722c9009edcb6b383f5c02941ade28 100644 --- a/include/caosdb/configuration.h +++ b/include/caosdb/configuration.h @@ -22,22 +22,22 @@ #ifndef CAOSDB_CONFIGURATION_H #define CAOSDB_CONFIGURATION_H -#include "caosdb/authentication.h" // for Authenticator, PlainPassw... -#include "caosdb/certificate_provider.h" // for CertificateProvider, path -#include "caosdb/exceptions.h" // for ConfigurationError -#include "caosdb/logging.h" // for SinkConfiguration, Loggin... -#include "caosdb/utility.h" // for load_json_file -#include <google/protobuf/arena.h> // for Arena -#include <google/protobuf/extension_set.h> // for Arena -#include <grpcpp/security/credentials.h> // for ChannelCredentials -#include <boost/json/object.hpp> // for object -#include <boost/json/value.hpp> // for value -#include <boost/json/value_ref.hpp> // for array, object +#include "caosdb/authentication.h" // for Authenticator, PlainPassw... +#include "caosdb/certificate_provider.h" // for CertificateProvider, path +#include "caosdb/exceptions.h" // for ConfigurationError +#include "caosdb/logging.h" // for SinkConfiguration, Loggin... +#include "caosdb/utility.h" // for load_json_file +#include <google/protobuf/arena.h> // for Arena +#include <google/protobuf/extension_set.h> // for Arena +#include <grpcpp/security/credentials.h> // for ChannelCredentials +#include <boost/json/object.hpp> // for object +#include <boost/json/value.hpp> // for value +#include <boost/json/value_ref.hpp> // for array, object // IWYU pragma: no_include "boost/json/fwd.hpp" -#include <filesystem> // for path, exists -#include <iosfwd> // for ostream -#include <memory> // for shared_ptr, unique_ptr -#include <string> // for string +#include <filesystem> // for path, exists +#include <iosfwd> // for ostream +#include <memory> // for shared_ptr, unique_ptr +#include <string> // for string namespace caosdb::configuration { using boost::json::array; diff --git a/include/caosdb/entity.h b/include/caosdb/entity.h index 11955fc91330c435bdc348f2bb5c6ed15aef37b0..155d4ff6f5b12ac9ece29b4fa5f08fdccde29053 100644 --- a/include/caosdb/entity.h +++ b/include/caosdb/entity.h @@ -48,7 +48,6 @@ #include <iosfwd> // for streamsize #include <iterator> // for iterator, output_iterato... #include <map> // for map -#include <random> // for mt19937, rand... #include <stdexcept> // for out_of_range #include <string> // for string, basic... #include <utility> // for move @@ -862,9 +861,7 @@ public: auto SetFilePath(const std::string &path) -> void; inline auto HasFile() const -> bool { return !this->file_descriptor.local_path.empty(); } - auto SetFileTransmissionRegistrationId(const std::string ®istration_id) -> void; inline auto SetFileTransmissionId(FileTransmissionId *file_transmission_id) -> void { - file_transmission_id->set_file_id(GetNextFileId()); file_descriptor.file_transmission_id = file_transmission_id; } @@ -911,17 +908,6 @@ public: } private: - inline auto GetNextFileId() -> std::string { - std::string str = "0123456789abcdef"; - std::mt19937 generator(std::random_device{}()); - std::uniform_int_distribution<int> distribution(0, str.size() - 1); - std::string result(10, '\0'); - - for (auto &dis : result) { - dis = str[distribution(generator)]; - } - return result; - } static auto CreateMessagesField() -> RepeatedPtrField<ProtoMessage> *; auto SetId(const std::string &id) -> void; auto SetVersionId(const std::string &id) -> void; diff --git a/include/caosdb/info.h b/include/caosdb/info.h index 6be1d7221a7d73abc82f13e7eecd9aa2f208a2d4..0c4132f770d7bd68f10a74743246c0c037364f01 100644 --- a/include/caosdb/info.h +++ b/include/caosdb/info.h @@ -53,12 +53,7 @@ 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){}; [[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(); } @@ -68,7 +63,8 @@ public: [[nodiscard]] inline auto GetBuild() const -> const std::string & { return this->info->build(); } private: - ProtoVersionInfo *info; + /// This object is the owner of the Protobuf VersionInfo message. + std::unique_ptr<ProtoVersionInfo> info; }; } // namespace caosdb::info diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h index 6fc429ad0cb10c9df88c705e2874834da628ff6f..0e11d3f1a5d9145795b2bdcd4e1c82c31e360aa2 100644 --- a/include/caosdb/transaction.h +++ b/include/caosdb/transaction.h @@ -517,11 +517,6 @@ private: std::vector<FileDescriptor> upload_files; std::map<std::string, FileDescriptor> download_files; - // auto RegisterUploadFile(RegisterFileUploadResponse *response) -> void; - auto UploadFile(FileUploadResponse *response, const FileDescriptor &file_descriptor, - const std::string ®istration_id) -> void; - auto DownloadFile(FileDownloadResponse *response, const FileTransmissionId &file_transmission_id) - -> void; bool has_query = false; TransactionType transaction_type = TransactionType::NONE; mutable std::unique_ptr<ResultSet> result_set; diff --git a/src/caosdb/connection.cpp b/src/caosdb/connection.cpp index 80209f9bb9d2c1806d6a9966c2af59226dfe4529..02c190ee1beff00fc3cbffa950628a67b5ffa32d 100644 --- a/src/caosdb/connection.cpp +++ b/src/caosdb/connection.cpp @@ -25,14 +25,12 @@ #include "caosdb/info.h" // for VersionInfo #include "caosdb/info/v1/main.grpc.pb.h" // for GeneralInfoService #include "caosdb/info/v1/main.pb.h" // for GetVersionInfoRequest -#include "caosdb/protobuf_helper.h" // for get_arena #include "caosdb/transaction.h" // for Transaction #include "caosdb/transaction_status.h" // for TransactionStatus -#include <google/protobuf/arena.h> // for Arena +#include "grpcpp/impl/codegen/status_code_enum.h" // for StatusCode, UNAUTH... #include <grpcpp/create_channel.h> // for CreateChannel #include <grpcpp/impl/codegen/client_context.h> // for ClientContext #include <grpcpp/impl/codegen/status.h> // for Status -#include <grpcpp/impl/codegen/status_code_enum.h> // for StatusCode, UNAUTH... #include <string> // for string, operator+ namespace caosdb::connection { @@ -46,8 +44,6 @@ using caosdb::info::v1::GetVersionInfoRequest; using caosdb::info::v1::GetVersionInfoResponse; using caosdb::transaction::Transaction; using caosdb::transaction::TransactionStatus; -using caosdb::utility::get_arena; -using google::protobuf::Arena; Connection::Connection(const ConnectionConfiguration &configuration) { const std::string target = @@ -61,11 +57,11 @@ Connection::Connection(const ConnectionConfiguration &configuration) { auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> TransactionStatus { - const auto *request = Arena::CreateMessage<GetVersionInfoRequest>(get_arena()); - auto *response = Arena::CreateMessage<GetVersionInfoResponse>(get_arena()); + const GetVersionInfoRequest request; + GetVersionInfoResponse response; grpc::ClientContext context; const grpc::Status grpc_status = - this->general_info_service->GetVersionInfo(&context, *request, response); + this->general_info_service->GetVersionInfo(&context, request, &response); auto status = TransactionStatus::SUCCESS(); if (!grpc_status.ok()) { @@ -82,7 +78,7 @@ auto Connection::RetrieveVersionInfoNoExceptions() const noexcept -> Transaction error_message); } } else { - this->version_info = std::make_unique<VersionInfo>(response->mutable_version_info()); + this->version_info = std::make_unique<VersionInfo>(response.release_version_info()); } return status; diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp index 5ed366ac4285511fc1907b8b1db06628fd35359f..6c96b8c71ee98aa399e2c7ba1d11d645c0c6801c 100644 --- a/src/caosdb/transaction.cpp +++ b/src/caosdb/transaction.cpp @@ -41,6 +41,7 @@ #include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue #include <map> // for map, operator!= #include <memory> // for unique_ptr +#include <random> // for mt19937, rand... #include <sstream> #include <utility> // for move, pair @@ -52,6 +53,7 @@ using caosdb::entity::v1::MultiTransactionResponse; using TransactionResponseCase = caosdb::entity::v1::TransactionResponse::TransactionResponseCase; using RetrieveResponseCase = caosdb::entity::v1::RetrieveResponse::RetrieveResponseCase; using ProtoEntity = caosdb::entity::v1::Entity; +using caosdb::entity::v1::EntityRequest; using google::protobuf::Arena; using NextStatus = grpc::CompletionQueue::NextStatus; using RegistrationStatus = caosdb::entity::v1::RegistrationStatus; @@ -142,20 +144,39 @@ auto Transaction::DeleteById(const std::string &id) noexcept -> StatusCode { return this->status.GetCode(); } -auto Transaction::InsertEntity(Entity *entity) noexcept -> StatusCode { - ASSERT_CAN_ADD_INSERTION +auto get_next_file_id() -> std::string { + const std::string str = "0123456789abcdef"; + std::mt19937 generator(std::random_device{}()); + std::uniform_int_distribution<int> distribution(0, 15); // NOLINT + std::string result(10, '\0'); // NOLINT - auto *entity_request = - this->request->add_requests()->mutable_insert_request()->mutable_entity_request(); - auto *proto_entity = entity_request->mutable_entity(); + for (auto &dis : result) { + dis = str[distribution(generator)]; + } + return result; +} - // copy the original entity for the transaction +// only used in the next two functions. +auto add_entity_to_request(Entity *entity, EntityRequest *entity_request, + std::vector<FileDescriptor> *upload_files) -> void { + auto *proto_entity = entity_request->mutable_entity(); entity->CopyTo(proto_entity); if (entity->HasFile()) { auto *file_transmission_id = entity_request->mutable_upload_id(); + file_transmission_id->set_file_id(get_next_file_id()); entity->SetFileTransmissionId(file_transmission_id); - upload_files.push_back(entity->GetFileDescriptor()); + upload_files->push_back(entity->GetFileDescriptor()); } +} + +auto Transaction::InsertEntity(Entity *entity) noexcept -> StatusCode { + ASSERT_CAN_ADD_INSERTION + + auto *entity_request = + this->request->add_requests()->mutable_insert_request()->mutable_entity_request(); + + add_entity_to_request(entity, entity_request, &upload_files); + this->status = TransactionStatus::GO_ON(); return this->status.GetCode(); } @@ -165,14 +186,9 @@ auto Transaction::UpdateEntity(Entity *entity) noexcept -> StatusCode { auto *entity_request = this->request->add_requests()->mutable_update_request()->mutable_entity_request(); - auto *proto_entity = entity_request->mutable_entity(); - entity->CopyTo(proto_entity); - if (entity->HasFile()) { - auto *file_transmission_id = entity_request->mutable_upload_id(); - entity->SetFileTransmissionId(file_transmission_id); - upload_files.push_back(entity->GetFileDescriptor()); - } + add_entity_to_request(entity, entity_request, &upload_files); + this->status = TransactionStatus::GO_ON(); return this->status.GetCode(); } @@ -251,8 +267,8 @@ auto Transaction::ExecuteAsynchronously() noexcept -> StatusCode { // NOLINT sub_response.mutable_retrieve_response()->mutable_entity_response(); auto entity_id = entity_response->entity().id(); download_files[entity_id].file_transmission_id = - entity_response->unsafe_arena_release_download_id(); - // TODO(tf) handle error + Arena::CreateMessage<FileTransmissionId>(GetArena()); + download_files[entity_id].file_transmission_id->CopyFrom(entity_response->download_id()); } } }