mirror of
https://github.com/rbock/sqlpp11.git
synced 2024-11-16 04:47:18 +08:00
Very rough draft for supporting views (#453)
This commit is contained in:
parent
159f4be66f
commit
35a17efc0a
@ -114,10 +114,14 @@ namespace sqlpp
|
|||||||
SQLPP_PORTABLE_STATIC_ASSERT(assert_into_t, "into() required");
|
SQLPP_PORTABLE_STATIC_ASSERT(assert_into_t, "into() required");
|
||||||
|
|
||||||
SQLPP_PORTABLE_STATIC_ASSERT(assert_into_arg_is_table, "argument for into() must be a table");
|
SQLPP_PORTABLE_STATIC_ASSERT(assert_into_arg_is_table, "argument for into() must be a table");
|
||||||
|
SQLPP_PORTABLE_STATIC_ASSERT(assert_into_arg_is_not_a_view, "argument for into() must not be a view");
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct check_into
|
struct check_into
|
||||||
{
|
{
|
||||||
using type = static_combined_check_t<static_check_t<is_raw_table_t<T>::value, assert_into_arg_is_table>>;
|
using type = static_combined_check_t<
|
||||||
|
static_check_t<is_raw_table_t<T>::value, assert_into_arg_is_table>,
|
||||||
|
static_check_t<not is_view_t<T>::value, assert_into_arg_is_not_a_view>
|
||||||
|
>;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using check_into_t = typename check_into<wrap_operand_t<T>>::type;
|
using check_into_t = typename check_into<wrap_operand_t<T>>::type;
|
||||||
|
@ -60,6 +60,7 @@ namespace sqlpp
|
|||||||
using _nodes = detail::type_vector<Table>;
|
using _nodes = detail::type_vector<Table>;
|
||||||
|
|
||||||
static_assert(is_table_t<Table>::value, "argument has to be a table");
|
static_assert(is_table_t<Table>::value, "argument has to be a table");
|
||||||
|
static_assert(not is_view_t<Table>::value, "argument must not be a view");
|
||||||
static_assert(required_tables_of<Table>::size::value == 0, "table depends on another table");
|
static_assert(required_tables_of<Table>::size::value == 0, "table depends on another table");
|
||||||
|
|
||||||
using _data_t = single_table_data_t<Database, Table>;
|
using _data_t = single_table_data_t<Database, Table>;
|
||||||
@ -113,11 +114,15 @@ namespace sqlpp
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
SQLPP_PORTABLE_STATIC_ASSERT(assert_update_table_arg_is_table_t, "argument for update() must be a table");
|
SQLPP_PORTABLE_STATIC_ASSERT(assert_update_table_arg_is_table, "argument for update() must be a table");
|
||||||
|
SQLPP_PORTABLE_STATIC_ASSERT(assert_update_table_arg_is_no_a_view, "argument for update() must not be a view");
|
||||||
template <typename Table>
|
template <typename Table>
|
||||||
struct check_update_table
|
struct check_update_table
|
||||||
{
|
{
|
||||||
using type = static_combined_check_t<static_check_t<is_table_t<Table>::value, assert_update_table_arg_is_table_t>>;
|
using type = static_combined_check_t<
|
||||||
|
static_check_t<is_table_t<Table>::value, assert_update_table_arg_is_table>,
|
||||||
|
static_check_t<not is_view_t<Table>::value, assert_update_table_arg_is_no_a_view>
|
||||||
|
>;
|
||||||
};
|
};
|
||||||
template <typename Table>
|
template <typename Table>
|
||||||
using check_update_table_t = typename check_update_table<Table>::type;
|
using check_update_table_t = typename check_update_table<Table>::type;
|
||||||
|
@ -43,7 +43,7 @@ namespace sqlpp
|
|||||||
template <typename Table, typename... ColumnSpec>
|
template <typename Table, typename... ColumnSpec>
|
||||||
struct table_t : public ColumnSpec::_alias_t::template _member_t<column_t<Table, ColumnSpec>>...
|
struct table_t : public ColumnSpec::_alias_t::template _member_t<column_t<Table, ColumnSpec>>...
|
||||||
{
|
{
|
||||||
using _traits = make_traits<no_value_t, tag::is_raw_table, tag::is_table>;
|
using _traits = make_traits<no_value_t, tag::is_raw_table, tag::is_table, tag_if<tag::is_view, is_view_t<Table>::value>>;
|
||||||
|
|
||||||
using _nodes = detail::type_vector<>;
|
using _nodes = detail::type_vector<>;
|
||||||
using _provided_tables = detail::type_set<Table>;
|
using _provided_tables = detail::type_set<Table>;
|
||||||
|
@ -182,6 +182,7 @@ namespace sqlpp
|
|||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_noop)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_noop)
|
||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_missing)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_missing)
|
||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_return_value)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_return_value)
|
||||||
|
SQLPP_VALUE_TRAIT_GENERATOR(is_view)
|
||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_table)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_table)
|
||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_raw_table)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_raw_table)
|
||||||
SQLPP_VALUE_TRAIT_GENERATOR(is_pre_join)
|
SQLPP_VALUE_TRAIT_GENERATOR(is_pre_join)
|
||||||
|
@ -142,6 +142,32 @@ namespace test
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
struct ViewFoo_
|
||||||
|
{
|
||||||
|
struct _alias_t
|
||||||
|
{
|
||||||
|
static constexpr const char _literal[] = "view_foo";
|
||||||
|
using _name_t = sqlpp::make_char_sequence<sizeof(_literal), _literal>;
|
||||||
|
template <typename T>
|
||||||
|
struct _member_t
|
||||||
|
{
|
||||||
|
T tabFoo;
|
||||||
|
T& operator()()
|
||||||
|
{
|
||||||
|
return tabFoo;
|
||||||
|
}
|
||||||
|
const T& operator()() const
|
||||||
|
{
|
||||||
|
return tabFoo;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
using _traits = sqlpp::make_traits<sqlpp::no_value_t, sqlpp::tag::is_view>;
|
||||||
|
};
|
||||||
|
struct ViewFoo : sqlpp::table_t<ViewFoo_, TabFoo_::Delta, TabFoo_::Epsilon, TabFoo_::Omega, TabFoo_::Psi, TabFoo_::Book>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
namespace TabBar_
|
namespace TabBar_
|
||||||
{
|
{
|
||||||
struct Alpha
|
struct Alpha
|
||||||
|
@ -68,6 +68,7 @@ int Select(int, char*[])
|
|||||||
|
|
||||||
const auto f = test::TabFoo{};
|
const auto f = test::TabFoo{};
|
||||||
const auto t = test::TabBar{};
|
const auto t = test::TabBar{};
|
||||||
|
const auto vf = test::ViewFoo{};
|
||||||
const auto tab_a = f.as(sqlpp::alias::a);
|
const auto tab_a = f.as(sqlpp::alias::a);
|
||||||
|
|
||||||
getColumn(db, t.alpha);
|
getColumn(db, t.alpha);
|
||||||
@ -108,6 +109,12 @@ int Select(int, char*[])
|
|||||||
std::cout << row.alpha << std::endl;
|
std::cout << row.alpha << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto& row :
|
||||||
|
db(select(all_of(vf)).from(vf).where(vf.book == "sql")))
|
||||||
|
{
|
||||||
|
std::cout << row.book << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& row : db(select(all_of(t), all_of(f))
|
for (const auto& row : db(select(all_of(t), all_of(f))
|
||||||
.from(t.join(f).on(t.alpha > f.omega).join(tab_a).on(t.alpha == tab_a.omega))
|
.from(t.join(f).on(t.alpha > f.omega).join(tab_a).on(t.alpha == tab_a.omega))
|
||||||
.unconditionally()))
|
.unconditionally()))
|
||||||
|
Loading…
Reference in New Issue
Block a user