#ifndef QUERY_VALUE_EXTRACTOR_HPP #define QUERY_VALUE_EXTRACTOR_HPP #include "matador/sql/fk_value_extractor.hpp" #include "matador/sql/data_type_traits.hpp" #include "matador/utils/foreign_attributes.hpp" #include namespace matador::sql { class value_extractor { private: explicit value_extractor(std::vector &values); public: ~value_extractor() = default; template < class Type > static std::vector extract(const Type &type) { std::vector values; value_extractor gen(values); matador::utils::access::process(gen, type); return std::move(values); } template void on_primary_key(const char *, ValueType &x, typename std::enable_if::value && !std::is_same::value>::type* = 0) { append(x); } void on_primary_key(const char *id, std::string &pk, size_t size); void on_revision(const char *id, unsigned long long &rev); template < class Type > void on_attribute(const char *, Type &x, const utils::field_attributes &/*attr*/ = utils::null_attributes) { append(x); } void on_attribute(const char *id, char *x, const utils::field_attributes &/*attr*/ = utils::null_attributes); void on_attribute(const char *id, std::string &x, const utils::field_attributes &/*attr*/ = utils::null_attributes); template class Pointer> void on_belongs_to(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { values_.emplace_back(fk_value_extractor_.extract(*x)); } template class Pointer> void on_has_one(const char * /*id*/, Pointer &x, const utils::foreign_attributes &/*attr*/) { values_.emplace_back(fk_value_extractor_.extract(*x)); } template void on_has_many(ContainerType &, const char *, const utils::foreign_attributes &/*attr*/) {} template void on_has_many_to_many(const char *id, ContainerType &c, const char *join_column, const char *inverse_join_column, const utils::foreign_attributes &/*attr*/) {} template void on_has_many_to_many(const char *id, ContainerType &c, const utils::foreign_attributes &/*attr*/) {} private: template void append(Type &value) { values_.emplace_back(data_type_traits::create_value(value)); } private: detail::fk_value_extractor fk_value_extractor_; std::vector &values_; }; } #endif //QUERY_VALUE_EXTRACTOR_HPP