diff --git a/include/caosdb/entity.h b/include/caosdb/entity.h index f93c3497ad64e6fb03186b92f2e5bc06f998d3fd..831200c0ff7fdafbd265bb4778b62f51003b6836 100644 --- a/include/caosdb/entity.h +++ b/include/caosdb/entity.h @@ -454,9 +454,7 @@ class Property { public: explicit inline Property(ProtoProperty *other) : value(Value(other->mutable_value())), data_type(DataType(other->mutable_data_type())), - wrapped(other){ - FixValue(); - }; + wrapped(other){}; Property(); /** @@ -553,13 +551,6 @@ public: friend class RepeatedPtrFieldWrapper<Property, ProtoProperty>; private: - - /** - * Workaround until non-string values are supported by the server. - * - * Only has an effect if there is a DataType. - */ - auto FixValue() -> void; static auto CreateProtoProperty() -> ProtoProperty *; Value value; DataType data_type; @@ -611,7 +602,6 @@ public: errors.wrapped = CreateMessagesField(); warnings.wrapped = CreateMessagesField(); infos.wrapped = CreateMessagesField(); - FixValue(); }; explicit Entity(IdResponse *id_response); explicit Entity(ProtoEntity *other) @@ -624,13 +614,11 @@ public: errors.wrapped = CreateMessagesField(); warnings.wrapped = CreateMessagesField(); infos.wrapped = CreateMessagesField(); - FixValue(); }; explicit inline Entity(EntityResponse *response) : Entity(response->release_entity()) { errors.wrapped->Swap(response->mutable_errors()); warnings.wrapped->Swap(response->mutable_warnings()); infos.wrapped->Swap(response->mutable_infos()); - FixValue(); }; [[nodiscard]] inline auto GetId() const noexcept -> const std::string & { return wrapped->id(); }; @@ -756,13 +744,6 @@ private: auto SetId(const std::string &id) -> void; auto SetVersionId(const std::string &id) -> void; - /** - * Workaround until non-string values are supported by the server. - * - * Only has an effect if there is a DataType. - */ - auto FixValue() -> void; - private: FileDescriptor file_descriptor; ProtoEntity *wrapped; diff --git a/src/caosdb/entity.cpp b/src/caosdb/entity.cpp index e927f686f26bb4c6f11e78d974e7ad00ff32ce3d..16ea5dbfc99b173efdac9bdbbfe0d87a2e289fee 100644 --- a/src/caosdb/entity.cpp +++ b/src/caosdb/entity.cpp @@ -20,12 +20,10 @@ * */ #include "caosdb/entity.h" -#include "caosdb/exceptions.h" #include "caosdb/data_type.h" // for DataType #include "caosdb/entity/v1alpha1/main.pb.h" // for Messages #include "caosdb/protobuf_helper.h" // for get_arena #include "caosdb/value.h" // for Value -#include <boost/algorithm/string.hpp> #include <google/protobuf/arena.h> // for Arena #include <google/protobuf/generated_message_util.h> // for Arena::Create... #include <new> // for operator new @@ -44,13 +42,6 @@ using google::protobuf::Arena; Messages::~Messages() = default; -// Forward declarations /////////////////////////////////////////////////////// - -template<typename E> -auto FixValueImpl(E* ent) -> void; - -// Parent ///////////////////////////////////////////////////////////////////// - Parent::Parent() : wrapped(Parent::CreateProtoParent()) { // TODO(fspreck) Re-enable once we have decided how to attach // messages to parents. @@ -75,9 +66,7 @@ auto Parent::SetId(const std::string &id) -> void { this->wrapped->set_id(id); } return this->wrapped->description(); } -Property::Property() : Property(Property::CreateProtoProperty()) { - FixValue(); -} +Property::Property() : Property(Property::CreateProtoProperty()) {} auto Property::CreateProtoProperty() -> ProtoProperty * { return Arena::CreateMessage<ProtoProperty>(get_arena()); @@ -163,11 +152,6 @@ auto Property::SetDataType(const std::string &new_data_type, bool list_type) -> return SetDataType(DataType(new_data_type, list_type)); } -auto Property::FixValue() -> void { - FixValueImpl(this); -} - -// Entity ///////////////////////////////////////////////////////////////////// [[nodiscard]] auto Entity::GetParents() const -> const Parents & { return parents; } auto Entity::AppendParent(const Parent &parent) -> void { this->parents.Append(parent); } @@ -190,12 +174,9 @@ Entity::Entity(IdResponse *id_response) : Entity() { this->errors.wrapped->Swap(id_response->mutable_errors()); this->warnings.wrapped->Swap(id_response->mutable_warnings()); this->infos.wrapped->Swap(id_response->mutable_infos()); - FixValue(); } -Entity::Entity() : Entity(Entity::CreateProtoEntity()) { - FixValue(); -} +Entity::Entity() : Entity(Entity::CreateProtoEntity()) {} auto Entity::CreateMessagesField() -> RepeatedPtrField<ProtoMessage> * { return Arena::CreateMessage<RepeatedPtrField<ProtoMessage>>(get_arena()); @@ -275,104 +256,4 @@ auto Entity::SetFilePath(const std::string &path) -> void { this->wrapped->mutable_file_descriptor()->set_path(path); } -auto Entity::FixValue() -> void { - FixValueImpl(this); -} - -// Utility functions ////////////////////////////////////////////////////////// - -template<typename E> -auto FixValueImpl(E* ent) -> void { - const auto &dtype = ent->GetDataType(); - const auto &value = ent->GetValue(); - auto new_value = Value(); - if (value.IsNull() || ! value.IsString()){ // Don't treat NULL and non-string values. - return; - } - if (value.IsList()) { // Also don't treat empty or non-string lists. - const auto &list = value.AsList(); - if (list.empty() || ! list[0].IsString()) { - return; - } - } - auto atype = AtomicDataType::UNSPECIFIED; - if (dtype.IsList()) { // List Datatype - if (!value.IsList()) { - throw caosdb::exceptions::Exception(StatusCode::OTHER_CLIENT_ERROR, - "DataType is list, but Value is scalar."); - } - auto &list_type = dtype.AsList(); - atype = list_type.GetAtomicDataType(); - if (!list_type.IsListOfAtomic() // References, strings etc. need no treatment. - || atype == AtomicDataType::UNSPECIFIED - || atype == AtomicDataType::TEXT - || atype == AtomicDataType::DATETIME) { - return; - } - if (atype == AtomicDataType::DOUBLE) { - std::vector<double> data; - for (auto &d: value.AsList()) { - data.push_back(std::stod(d.AsString())); - } - new_value = Value(data) ; - } else if (atype == AtomicDataType::INTEGER) { - std::vector<long> data; - for (auto &d: value.AsList()) { - data.push_back(std::stol(d.AsString())); - } - new_value = Value(data) ; - } else if (atype == AtomicDataType::BOOLEAN) { - std::vector<bool> data; - for (auto &d: value.AsList()) { - auto bool_value = d.AsString(); - if (boost::to_upper_copy(bool_value) == "TRUE") { - data.push_back(true); - } else if (boost::to_upper_copy(bool_value) == "FALSE") { - data.push_back(false); - } else { - throw caosdb::exceptions::Exception(StatusCode::OTHER_CLIENT_ERROR, - "Boolean value is neither true nor false."); - } - } - new_value = Value(data) ; - } else { - std::cout << "Unhandled datatype: " << ent->ToString() << std::endl; - throw std::logic_error("Unhandled datatype"); - } - } else { // Scalar Datatype - if (value.IsList()) { - throw caosdb::exceptions::Exception(StatusCode::OTHER_CLIENT_ERROR, - "Value is list, but DataType is scalar."); - } - atype = dtype.AsAtomic(); - if (!dtype.IsAtomic() // References, strings etc. need no treatment. - || atype == AtomicDataType::UNSPECIFIED - || atype == AtomicDataType::TEXT - || atype == AtomicDataType::DATETIME) { - return; - } - if (atype == AtomicDataType::DOUBLE) { - new_value = Value(std::stod(value.AsString())); - } else if (atype == AtomicDataType::INTEGER) { - new_value = Value(std::stol(value.AsString())); - } else if (atype == AtomicDataType::BOOLEAN) { - auto bool_value = value.AsString(); - if (boost::to_upper_copy(bool_value) == "TRUE") { - new_value = Value(true); - } else if (boost::to_upper_copy(bool_value) == "FALSE") { - new_value = Value(false); - } else { - throw caosdb::exceptions::Exception(StatusCode::OTHER_CLIENT_ERROR, - "Boolean value is neither true nor false."); - } - } else { - std::cout << "Unhandled datatype: " << ent->ToString() << std::endl; - throw std::logic_error("Unhandled datatype"); - } - } - - ent->SetValue(new_value); -} - - } // namespace caosdb::entity