diff --git a/include/sqlpp11/schema.h b/include/sqlpp11/schema.h new file mode 100644 index 00000000..2c35098a --- /dev/null +++ b/include/sqlpp11/schema.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2013-2015, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SQLPP_SCHEMA_H +#define SQLPP_SCHEMA_H + +#include +#include + +namespace sqlpp +{ + struct schema_t + { + std::string _name; + }; + + template + struct serializer_t + { + using _serialize_check = consistent_t; + using T = schema_t; + + static Context& _(const T& t, Context& context) + { + context << t._name; + return context; + } + }; + +} + +#endif + diff --git a/include/sqlpp11/schema_qualified_table.h b/include/sqlpp11/schema_qualified_table.h new file mode 100644 index 00000000..23347a0a --- /dev/null +++ b/include/sqlpp11/schema_qualified_table.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2013-2015, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SQLPP_SCHEMA_QUALIFIED_TABLE_H +#define SQLPP_SCHEMA_QUALIFIED_TABLE_H + +#include +#include +#include +#include +#include +#include + +namespace sqlpp +{ + template + struct schema_qualified_table_t + { + using _traits = make_traits, tag::is_table>; + + using _nodes = detail::type_vector<>; + using _required_ctes = detail::type_set<>; + using _provided_tables = detail::type_set<>; + + schema_qualified_table_t(schema_t schema, Table table): + _schema(schema), + _table(table) + {} + + template + typename Table::template _foreign_table_alias_t as(const AliasProvider&) const + { + return {*this}; + } + + + schema_t _schema; + Table _table; + }; + + template + struct serializer_t> + { + using _serialize_check = serialize_check_of; + using T = schema_qualified_table_t; + + static Context& _(const T& t, Context& context) + { + serialize(t._schema, context); + context << '.'; + serialize(t._table, context); + return context; + } + }; + + template + auto schema_qualified_table(schema_t schema, Table table) + -> schema_qualified_table_t
+ { + static_assert(required_tables_of
::size::value == 0, "schema qualified tables must not depend on other tables"); + static_assert(required_ctes_of
::size::value == 0, "schema qualified tables must not depend on common table expressions"); + static_assert(is_raw_table_t
::value, "table must be a raw table, i.e. not an alias or common table expression"); + + return {schema, table}; + } + + +} + +#endif + diff --git a/include/sqlpp11/sqlpp11.h b/include/sqlpp11/sqlpp11.h index 5d75783b..e69bb0e3 100644 --- a/include/sqlpp11/sqlpp11.h +++ b/include/sqlpp11/sqlpp11.h @@ -36,6 +36,7 @@ #include #include #include +#include #endif diff --git a/include/sqlpp11/table.h b/include/sqlpp11/table.h index a7a22b65..9c19da4b 100644 --- a/include/sqlpp11/table.h +++ b/include/sqlpp11/table.h @@ -44,7 +44,7 @@ namespace sqlpp public table_base_t, public member_t>... { - using _traits = make_traits; + using _traits = make_traits; using _nodes = detail::type_vector<>; using _provided_tables = detail::type_set
; @@ -52,10 +52,11 @@ namespace sqlpp static_assert(sizeof...(ColumnSpec), "at least one column required per table"); using _required_insert_columns = typename detail::make_type_set_if...>::type; using _column_tuple_t = std::tuple...>; + template + using _foreign_table_alias_t = table_alias_t; template using _alias_t = table_alias_t; - template join_t join(T t) const { diff --git a/include/sqlpp11/type_traits.h b/include/sqlpp11/type_traits.h index 8610532a..128692af 100644 --- a/include/sqlpp11/type_traits.h +++ b/include/sqlpp11/type_traits.h @@ -101,6 +101,7 @@ namespace sqlpp SQLPP_VALUE_TRAIT_GENERATOR(is_missing) SQLPP_VALUE_TRAIT_GENERATOR(is_return_value) SQLPP_VALUE_TRAIT_GENERATOR(is_table) + SQLPP_VALUE_TRAIT_GENERATOR(is_raw_table) SQLPP_VALUE_TRAIT_GENERATOR(is_join) SQLPP_VALUE_TRAIT_GENERATOR(is_pseudo_table) SQLPP_VALUE_TRAIT_GENERATOR(is_column) diff --git a/tests/InterpretTest.cpp b/tests/InterpretTest.cpp index 111f2db3..715e2822 100644 --- a/tests/InterpretTest.cpp +++ b/tests/InterpretTest.cpp @@ -183,6 +183,12 @@ int main() printer.reset(); std::cerr << serialize(select(all_of(t)).from(t).where(t.alpha.in(select(f.epsilon).from(f).where(true))), printer).str() << std::endl; + auto schema = db.attach("lorem"); + auto s = schema_qualified_table(schema, t).as(sqlpp::alias::x); + + printer.reset(); + std::cerr << serialize(select(all_of(s)).from(s).where(true), printer).str() << std::endl; + return 0; diff --git a/tests/MockDb.h b/tests/MockDb.h index c2b3f461..1fddd94f 100644 --- a/tests/MockDb.h +++ b/tests/MockDb.h @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -245,6 +246,12 @@ struct MockDbT: public sqlpp::connection return {}; } + auto attach(std::string name) + -> ::sqlpp::schema_t + { + return {name}; + } + }; using MockDb = MockDbT;