diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h index c04e38b06d17af2265584d6a4482b58d77b034c3..1ebba4f3613b240aebfe76df5de98da398f9c13d 100644 --- a/include/caosdb/transaction.h +++ b/include/caosdb/transaction.h @@ -405,7 +405,7 @@ private: MultiTransactionRequest *request; mutable MultiTransactionResponse *response; std::string error_message; - int query_count; + mutable long query_count; }; template <class InputIterator> diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp index 1b19925341fa498f91e0ed309f32d674574245b0..28ad666cb9b6009325bca25e7c9a9b60872d5219 100644 --- a/src/caosdb/transaction.cpp +++ b/src/caosdb/transaction.cpp @@ -96,6 +96,8 @@ using caosdb::entity::v1alpha1::MultiTransactionRequest; using caosdb::entity::v1alpha1::MultiTransactionResponse; using WrappedResponseCase = caosdb::entity::v1alpha1::TransactionResponse::WrappedResponseCase; +using QueryResponseCase = + caosdb::entity::v1alpha1::RetrieveResponse::QueryResponseCase; using caosdb::utility::get_arena; using grpc::ClientAsyncResponseReader; using ProtoEntity = caosdb::entity::v1alpha1::Entity; @@ -303,12 +305,26 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus { auto *responses = this->response->mutable_responses(0); switch (responses->wrapped_response_case()) { case WrappedResponseCase::kRetrieveResponse: { - auto *entity = responses->mutable_retrieve_response()->release_entity(); - if (!entity->errors().empty()) { - this->status = TransactionStatus::TRANSACTION_ERROR( - "The request returned with errors."); + auto *retrieve_response = responses->mutable_retrieve_response(); + switch (retrieve_response->query_response_case()) { + case QueryResponseCase::kEntity: { + auto *entity = retrieve_response->release_entity(); + if (!entity->errors().empty()) { + this->status = TransactionStatus::TRANSACTION_ERROR( + "The request returned with errors."); + } + this->result_set = std::make_unique<UniqueResult>(entity); + } break; + case QueryResponseCase::kSelectResult: { + // TODO(tf) Select queries + } break; + case QueryResponseCase::kCountResult: { + this->query_count = retrieve_response->count_result(); + } break; + default: + // TODO(tf) Error + break; } - this->result_set = std::make_unique<UniqueResult>(entity); } break; case WrappedResponseCase::kUpdateResponse: { auto *updatedIdResponse = responses->mutable_update_response();