33 #include <type_traits>
35 #include <boost/fusion/include/for_each.hpp>
36 #include <boost/fusion/include/fold.hpp>
37 #include <boost/fusion/include/filter_if.hpp>
38 #include <boost/fusion/container/vector.hpp>
39 #include <boost/fusion/include/vector.hpp>
40 #include <boost/fusion/include/transform.hpp>
41 #include <boost/fusion/include/zip.hpp>
42 #include <boost/fusion/container/generation/make_vector.hpp>
43 #include <boost/variant/variant.hpp>
44 #include <boost/optional.hpp>
45 #include <QStringList>
73 : std::runtime_error (str)
98 return T::FieldNameMorpher (str);
110 return MorphFieldNameImpl<T> (str, 0);
113 template<
typename Seq,
int Idx>
118 const QString rawName { boost::fusion::extension::struct_member_name<Seq, Idx>::call () };
119 return MorphFieldName<Seq> (rawName);
123 template<
typename S,
typename N>
146 template<
typename Seq,
int Idx>
153 template<
typename T,
typename =
void>
159 QString operator() ()
const {
return "INTEGER"; }
165 QString operator() ()
const {
return "INTEGER"; }
171 QString operator() ()
const {
return "REAL"; }
177 QString operator() ()
const {
return "INTEGER"; }
183 QString operator() ()
const {
return "TEXT"; }
189 QString operator() ()
const {
return "BLOB"; }
195 QString operator() ()
const {
return "TEXT"; }
199 struct Type2Name<E, std::enable_if_t<std::is_enum<E>::value>>
201 QString operator() ()
const {
return "INTEGER"; }
210 template<
typename T,
typename... Tags>
213 QString operator() ()
const {
return Type2Name<T> () () +
" PRIMARY KEY"; }
216 template<
typename... Tags>
219 QString operator() ()
const {
return Type2Name<int> () () +
" PRIMARY KEY AUTOINCREMENT"; }
222 template<
typename Seq,
int Idx>
225 QString operator() ()
const
232 template<
typename T,
typename =
void>
246 return t.toString (Qt::ISODate);
251 struct ToVariant<E, std::enable_if_t<std::is_enum<E>::value>>
255 return static_cast<qint64
> (e);
268 template<
typename T,
typename... Tags>
273 return static_cast<typename
PKey<T, Tags...
>::value_type> (t);
277 template<
typename Seq,
int Idx>
286 template<
typename T,
typename =
void>
291 return var.value<T> ();
300 return QDateTime::fromString (var.toString (), Qt::ISODate);
309 return static_cast<E
> (var.value<qint64> ());
318 return var.value<T> ();
322 template<
typename T,
typename... Tags>
327 return var.value<T> ();
331 template<
typename Seq,
int Idx>
354 QStringList
operator() (
const QStringList& init,
const T&)
const
370 QStringList
operator() (QStringList bounds,
const T& t)
const
402 return [data, insertQuery, bindPrimaryKey] (
const T& t)
404 boost::fusion::fold<T, QStringList, Inserter> (t, data.
BoundFields_,
Inserter { bindPrimaryKey, insertQuery });
405 if (!insertQuery->exec ())
408 throw QueryException (
"insert query execution failed", insertQuery);
419 template<
typename Seq,
int Idx>
420 using ValueAtC_t =
typename boost::fusion::result_of::value_at_c<Seq, Idx>::type;
422 template<
typename Seq,
typename Idx>
423 using ValueAt_t =
typename boost::fusion::result_of::value_at<Seq, Idx>::type;
425 template<
typename Seq,
typename MemberIdx = boost::mpl::
int_<0>>
428 static_assert ((boost::fusion::result_of::size<Seq>::value) != (MemberIdx::value),
429 "Primary key not found");
438 template<typename Seq, int Idx = FindPKey<Seq>::result_type::value>
444 template<
typename Seq>
450 template<
typename Seq>
453 return HasPKeyImpl<Seq> (0);
456 template<typename Seq, int Idx = FindPKey<Seq>::result_type::value>
468 template<
typename Seq>
471 return HasAutogenPKeyImpl<Seq> (0);
481 return "INSERT OR IGNORE";
483 return "INSERT OR REPLACE";
489 template<
typename Seq>
500 " (" + QStringList { data.
Fields_ }.join (
", ") +
") VALUES (" +
501 QStringList { data.BoundFields_ }.join (
", ") +
");")
505 template<
bool Autogen = HasAutogenPKey<Seq> ()>
523 template<
bool Autogen = HasAutogenPKey<Seq> ()>
524 AdaptInsert (
const CachedFieldsData& data, std::enable_if_t<!Autogen>* =
nullptr)
529 template<
bool Autogen = HasAutogenPKey<Seq> ()>
532 auto query = std::make_shared<QSqlQuery> (
Data_.
DB_);
534 MakeInserter<Seq> (
Data_, query,
false) (t);
536 constexpr
auto index = FindPKey<Seq>::result_type::value;
537 boost::fusion::at_c<index> (t) = FromVariant<ValueAtC_t<Seq, index>> {} (query->lastInsertId ());
540 template<
typename SeqPrime = Seq,
bool Autogen = HasAutogenPKey<SeqPrime> ()>
541 std::enable_if_t<Autogen, ValueAtC_t<SeqPrime, FindPKey<SeqPrime>::result_type::value>>
544 auto query = std::make_shared<QSqlQuery> (Data_.DB_);
546 MakeInserter<Seq> (
Data_, query,
false) (t);
552 template<
bool Autogen = HasAutogenPKey<Seq> ()>
555 auto query = std::make_shared<QSqlQuery> (Data_.DB_);
557 MakeInserter<Seq> (
Data_, query,
true) (t);
561 template<
typename Seq,
bool HasPKey = HasPKey<Seq> ()>
564 std::function<void (Seq)> Updater_;
566 template<
bool B = HasPKey>
571 auto removedFields = data.
Fields_;
574 const auto& fieldName = removedFields.takeAt (index);
575 const auto& boundName = removedBoundFields.takeAt (index);
577 const auto& statements =
Util::ZipWith (removedFields, removedBoundFields,
578 [] (
const QString& s1,
const QString& s2) -> QString
579 {
return s1 +
" = " + s2; });
581 const auto& update =
"UPDATE " + data.
Table_ +
582 " SET " + QStringList { statements }.join (
", ") +
583 " WHERE " + fieldName +
" = " + boundName +
";";
585 const auto updateQuery = std::make_shared<QSqlQuery> (data.
DB_);
586 updateQuery->prepare (update);
587 Updater_ = MakeInserter<Seq> (data, updateQuery,
true);
590 template<
bool B = HasPKey>
595 template<
bool B = HasPKey>
602 template<
typename Seq,
bool HasPKey = HasPKey<Seq> ()>
607 template<
bool B = HasPKey>
613 const auto& del =
"DELETE FROM " + data.
Table_ +
614 " WHERE " + data.
Fields_.at (index) +
" = " + boundName +
";";
616 const auto deleteQuery = std::make_shared<QSqlQuery> (data.
DB_);
617 deleteQuery->prepare (del);
619 Deleter_ = [deleteQuery, boundName] (
const Seq& t)
622 deleteQuery->bindValue (boundName,
624 if (!deleteQuery->exec ())
625 throw QueryException (
"delete query execution failed", deleteQuery);
629 template<
bool B = HasPKey>
634 template<
bool B = HasPKey>
651 boost::fusion::fold<T, int, Selector> (t, 0,
Selector { q });
661 const auto& selectAll =
"SELECT " + QStringList { data.
Fields_ }.join (
", ") +
" FROM " + data.
Table_ +
";";
662 const auto selectQuery = std::make_shared<QSqlQuery> (data.
DB_);
663 selectQuery->prepare (selectAll);
664 return [selectQuery] {
return PerformSelect<T> (selectQuery); };
667 template<
int HeadT,
int... TailT>
670 static const int Head = HeadT;
677 static const int Head = HeadT;
681 template<
typename FieldsUnpacker,
typename HeadArg,
typename... TailArgs>
687 void operator() (
const HeadArg& arg,
const TailArgs&... tail)
const
695 template<
typename FieldsUnpacker,
typename HeadArg>
746 return "invalid type";
752 template<ExprType Type>
761 template<ExprType Type1, ExprType Type2>
764 template<ExprType Type>
767 template<ExprType Type>
770 template<ExprType Type>
773 template<ExprType Type>
782 template<ExprType T1, ExprType T2>
805 template<
typename Seq,
typename L,
typename R>
807 decltype (std::declval<
typename L::template ValueType_t<Seq>> () == std::declval<
typename R::template ValueType_t<Seq>> ())* =
nullptr)
812 template<
typename Seq,
typename L,
typename R>
818 template<
typename Seq,
typename L,
typename R>
821 return AreComparableTypesImpl<Seq, L, R> (0) ||
822 AreComparableTypesImpl<Seq, R, L> (0);
825 template<ExprType Type,
typename Seq,
typename L,
typename R,
typename =
void>
828 template<
typename Seq,
typename L,
typename R,
typename =
void>
831 template<
typename Seq,
typename L,
typename R>
834 template<ExprType Type,
typename Seq,
typename L,
typename R>
837 template<ExprType Type,
typename L =
void,
typename R =
void>
853 "Incompatible types passed to a relational operator.");
855 return Left_.ToSql (state) +
" " +
TypeToSql (
Type) +
" " + Right_.ToSql (state);
869 static_assert (Idx < boost::fusion::result_of::size<T>::type::value,
"Index out of bounds.");
887 template<
typename ObjT>
890 const auto& name =
":bound_" + QString::number (++state.
LastID_);
899 template<ExprType Type,
typename L,
typename R>
902 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
903 ExprTree<ExprType::Less, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>> operator< (const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
905 static_assert (CheckCompatible<LType, RType> (),
"comparing incompatible subexpressions");
906 return { left, right };
909 template<ExprType LType,
typename LL,
typename LR,
typename R>
912 return left < ExprTree<ExprType::LeafData, R> { right };
915 template<ExprType RType,
typename RL,
typename RR,
typename L>
921 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
922 ExprTree<ExprType::Equal, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>>
operator== (
const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
924 static_assert (CheckCompatible<LType, RType> (),
"comparing incompatible subexpressions");
925 return { left, right };
928 template<ExprType LType,
typename LL,
typename LR,
typename R>
934 template<ExprType RType,
typename RL,
typename RR,
typename L>
940 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
941 ExprTree<ExprType::And, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>>
operator&& (
const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
943 return { left, right };
946 template<ExprType LType,
typename LL,
typename LR,
typename R>
952 template<ExprType RType,
typename RL,
typename RR,
typename L>
958 template<
typename Seq, ExprType Type,
typename L,
typename R>
963 const auto& sql = tree.
ToSql (state);
970 for (
const auto& pair :
Stlize (state.BoundMembers_))
971 query->bindValue (pair.first, pair.second);
982 static constexpr
pos<0> _0 = {};
983 static constexpr pos<1> _1 = {};
984 static constexpr pos<2> _2 = {};
985 static constexpr pos<3> _3 = {};
986 static constexpr pos<4> _4 = {};
988 #if __cpp_variable_templates >= 201304
990 static constexpr pos<Idx> _ = {};
1006 template<ExprType Type,
typename L,
typename R>
1009 const auto& treeResult = HandleExprTree<T> (tree);
1011 const auto& selectAll =
"SELECT " + QStringList { Cached_.Fields_ }.join (
", ") +
1012 " FROM " + Cached_.Table_ +
1013 " WHERE " + treeResult.first +
";";
1015 const auto query = std::make_shared<QSqlQuery> (Cached_.DB_);
1016 query->prepare (selectAll);
1017 treeResult.second (query);
1018 return PerformSelect<T> (query);
1021 template<
int Idx, ExprType Type,
typename L,
typename R>
1024 const auto& treeResult = HandleExprTree<T> (tree);
1026 const auto& selectOne =
"SELECT " + Cached_.Fields_.value (Idx) +
1027 " FROM " + Cached_.Table_ +
1028 " WHERE " + treeResult.first +
";";
1030 const auto query = std::make_shared<QSqlQuery> (Cached_.DB_);
1031 query->prepare (selectOne);
1032 treeResult.second (query);
1034 if (!query->exec ())
1040 while (query->next ())
1047 template<
typename T>
1057 template<ExprType Type,
typename L,
typename R>
1060 const auto& result = Select_ (tree);
1061 if (result.isEmpty ())
1064 return result.value (0);
1067 template<
int Idx, ExprType Type,
typename L,
typename R>
1070 const auto& result = Select_ (p, tree);
1071 if (result.isEmpty ())
1074 return result.value (0);
1078 template<
typename T>
1088 template<ExprType Type,
typename L,
typename R>
1091 const auto& treeResult = HandleExprTree<T> (tree);
1093 const auto& selectAll =
"DELETE FROM " + Cached_.Table_ +
1094 " WHERE " + treeResult.first +
";";
1096 const auto query = std::make_shared<QSqlQuery> (Cached_.DB_);
1097 query->prepare (selectAll);
1098 treeResult.second (query);
1103 template<
typename T>
1109 template<
typename T>
1115 template<
typename T>
1121 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename MemberIdx>
1126 template<
typename To,
typename OrigSeq,
typename OrigIdx,
typename T>
1132 template<
typename To,
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
int RefIdx>
1135 using value_type =
typename boost::fusion::result_of::as_vector<
1136 typename boost::fusion::result_of::push_front<
1143 template<
typename Seq,
typename MemberIdx>
1150 typename std::decay<typename boost::fusion::result_of::at<Seq, MemberIdx>::type>::type
1154 template<
typename Seq>
1155 struct CollectRefs_<Seq, typename boost::fusion::result_of::size<Seq>::type>
1160 template<
typename Seq>
1167 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename RefIdx>
1175 template<
typename T>
1178 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename MemberIdx>
1188 template<
typename ObjType,
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename RefIdx>
1192 ToVariant<
typename std::decay<
typename boost::fusion::result_of::at<RefSeq, RefIdx>::type>::type> () (boost::fusion::at<RefIdx> (boost::fusion::at_c<0> (pair))));
1196 template<
typename T,
typename RefSeq>
1199 using transform_view =
typename boost::mpl::transform<RefSeq, ExtrObj<boost::mpl::_1>>;
1201 using objects_vector =
typename boost::fusion::result_of::as_vector<objects_view>::type;
1207 boost::fusion::for_each (boost::fusion::zip (objs, RefSeq {}),
SingleBind { Q_ });
1208 return PerformSelect<T> (Q_);
1212 template<
typename T,
typename ObjInfo>
1216 const auto& statements = boost::fusion::fold (references_list {}, QStringList {},
Ref2Select {});
1218 const auto& selectAll =
"SELECT " + QStringList { data.
Fields_ }.join (
", ") +
1220 (statements.isEmpty () ?
"" :
" WHERE ") + statements.join (
" AND ") +
1222 const auto selectQuery = std::make_shared<QSqlQuery> (data.
DB_);
1223 selectQuery->prepare (selectAll);
1228 template<
typename T,
typename Ret>
1231 using type = std::function<QList<Ret> (T)>;
1234 template<
typename T,
typename Ret>
1237 template<
typename T>
1242 template<
typename Vec,
typename OrigObj,
typename OrigIdx,
typename RefObj,
typename RefIdx>
1246 const auto& query =
"SELECT " + QStringList {
Data_.Fields_ }.join (
", ") +
1247 " FROM " +
Data_.Table_ +
1250 const auto selectQuery = std::make_shared<QSqlQuery> (
Data_.DB_);
1251 selectQuery->prepare (query);
1253 auto inserter = [selectQuery, boundName] (
const RefObj& obj)
1255 selectQuery->bindValue (boundName,
1257 return PerformSelect<T> (selectQuery);
1264 template<
typename T,
typename ObjInfo>
1265 typename std::enable_if<CollectRefs<T>::type_list::size::value >= 2>::type
AdaptSelectRef (
const CachedFieldsData& data, ObjInfo& info)
1267 using references_list =
typename CollectRefs<T>::type_list;
1268 const auto& statements = boost::fusion::fold (references_list {}, QStringList {}, Ref2Select {});
1270 const auto& selectAll =
"SELECT " + QStringList { data.Fields_ }.join (
", ") +
1271 " FROM " + data.Table_ +
1272 (statements.isEmpty () ?
"" :
" WHERE ") + statements.join (
" AND ") +
1274 const auto selectQuery = std::make_shared<QSqlQuery> (data.DB_);
1275 selectQuery->prepare (selectAll);
1277 info.SelectByFKeysActor_ = MakeBinder<T, references_list> { selectQuery };
1279 auto singleSelectors = boost::fusion::fold (references_list {}, boost::fusion::vector<> {}, MakeSingleBinder<T> { data });
1280 info.SingleFKeySelectors_ = boost::fusion::as_vector (singleSelectors);
1283 template<
typename T,
typename ObjInfo>
1284 typename std::enable_if<CollectRefs<T>::type_list::size::value <= 0>::type
AdaptSelectRef (
const CachedFieldsData&, ObjInfo&)
1288 template<
typename T>
1294 template<
typename T>
1295 Constraints<> GetConstraintsTypeImpl (
float)
1300 template<
typename T>
1301 using ConstraintsType = decltype (GetConstraintsTypeImpl<T> (0));
1303 template<
typename T>
1304 struct ConstraintToString;
1306 template<
int... Fields>
1307 struct ConstraintToString<UniqueSubset<Fields...>>
1309 QString operator() (
const CachedFieldsData& data)
const
1311 return "UNIQUE (" + QStringList { data.Fields_.value (Fields)... }.join (
", ") +
")";
1315 template<
int... Fields>
1316 struct ConstraintToString<PrimaryKey<Fields...>>
1318 QString operator() (
const CachedFieldsData& data)
const
1320 return "PRIMARY KEY (" + QStringList { data.Fields_.value (Fields)... }.join (
", ") +
")";
1324 template<
typename...>
1325 struct GetConstraintsStringList;
1328 struct GetConstraintsStringList<Constraints<>>
1330 QStringList operator() (
const CachedFieldsData&)
const
1336 template<
typename Head,
typename...
Tail>
1339 QStringList operator() (
const CachedFieldsData& data)
const
1341 return QStringList { ConstraintToString<Head> {} (data) } +
1342 GetConstraintsStringList<Constraints<Tail...>> {} (data);
1346 template<
typename T>
1347 QString AdaptCreateTable (
const CachedFieldsData& data)
1349 const QList<QString> types = boost::fusion::fold (T {}, QStringList {}, Types {});
1351 const auto& constraints = GetConstraintsStringList<ConstraintsType<T>> {} (data);
1352 const auto& constraintsStr = constraints.isEmpty () ?
1354 (
", " + constraints.join (
", "));
1356 const auto& statements =
Util::ZipWith (types, data.Fields_,
1357 [] (
const QString& type,
const QString& field) {
return field +
" " + type; });
1358 return "CREATE TABLE " +
1361 statements.join (
", ") +
1366 template<
typename T,
typename Enable =
void>
1367 struct ObjectInfoFKeysHelper
1371 template<
typename T>
1372 struct ObjectInfoFKeysHelper<T, typename std::enable_if<CollectRefs<T>::type_list::size::value == 1, void>::type>
1374 std::function<QList<T> (
typename MakeBinder<T, typename CollectRefs<T>::type_list>::objects_vector)>
SelectByFKeysActor_;
1377 template<
typename T>
1378 struct ObjectInfoFKeysHelper<T, typename std::enable_if<CollectRefs<T>::type_list::size::value >= 2, void>::type>
1380 using objects_vector =
typename MakeBinder<T, typename CollectRefs<T>::type_list>::objects_vector;
1383 using transform_view =
typename boost::mpl::transform<objects_vector, WrapAsFunc<boost::mpl::_1, T>>::type;
1387 template<
typename T>
1391 const auto& boundFields =
Util::Map (fields, [] (
const QString& str) {
return ':' + str; });
1393 return { table, db, fields, boundFields };
1397 template<
typename T>
1400 std::function<QList<T> ()> DoSelectAll_;
1410 decltype (DoInsert_) doIns,
1411 decltype (DoUpdate_) doUpdate,
1412 decltype (DoDelete_) doDelete,
1413 decltype (DoSelectByFields_) selectByFields,
1414 decltype (DoSelectOneByFields_) selectOneByFields,
1415 decltype (DoDeleteByFields_) deleteByFields)
1416 : DoSelectAll_ (doSel)
1418 , DoUpdate_ (doUpdate)
1419 , DoDelete_ (doDelete)
1420 , DoSelectByFields_ (selectByFields)
1421 , DoSelectOneByFields_ (selectOneByFields)
1422 , DoDeleteByFields_ (deleteByFields)
1427 template<
typename T>
1430 const auto& cachedData = detail::BuildCachedFieldsData<T> (db);
1432 if (db.record (cachedData.Table_).isEmpty ())
1433 RunTextQuery (db, detail::AdaptCreateTable<T> (cachedData));
1435 const auto& selectr = detail::AdaptSelectAll<T> (cachedData);
1440 const auto& selectByVal = detail::AdaptSelectFields<T> (cachedData);
1441 const auto& selectOneByVal = detail::AdaptSelectOneFields<T> (cachedData);
1442 const auto& deleteByVal = detail::AdaptDeleteFields<T> (cachedData);
1455 detail::AdaptSelectRef<T> (cachedData, info);
1460 template<
typename T>
1463 template<
typename T>
1466 return std::make_shared<ObjectInfo<T>> (Adapt<T> (db));
constexpr bool HasPKeyImpl(int)
QString MorphFieldName(const QString &str)
QStringList operator()(QStringList bounds, const T &t) const
virtual ~QueryException()
typename boost::mpl::transform< RefSeq, ExtrObj< boost::mpl::_1 >> transform_view
auto Stlize(Assoc &&assoc) -> detail::StlAssocRange< detail::Identity, detail::Identity, decltype(assoc.begin()), Assoc, PairType >
Converts an Qt's associative sequence assoc to an STL-like iteratable range.
auto Map(const Container< T > &c, F f)
boost::fusion::result_of::as_vector< transform_view >::type SingleFKeySelectors_
AdaptInsert(const CachedFieldsData &data, const PrivateTag &)
const CachedFieldsData Data_
typename boost::fusion::result_of::as_vector< objects_view >::type objects_vector
CachedFieldsData BuildCachedFieldsData(const QSqlDatabase &db, const QString &table=T::ClassName())
auto ZipWith(const Container< T1 > &c1, const Container< T2 > &c2, F f) -> WrapType_t< Container< std::decay_t< std::result_of_t< F(T1, T2)>>>>
detail::AdaptUpdate< T > DoUpdate_
detail::SelectOneByFieldsWrapper< T > DoSelectOneByFields_
constexpr List< T...> Tail(List< H, T...>)
QString TypeToSql(ExprType type)
std::enable_if< CollectRefs< T >::type_list::size::value==1 >::type AdaptSelectRef(const CachedFieldsData &data, ObjInfo &info)
QVariant operator()(const T &t) const
detail::SelectByFieldsWrapper< T > DoSelectByFields_
constexpr bool AreComparableTypes()
constexpr bool CheckCompatible()
typename boost::mpl::transform< objects_vector, WrapAsFunc< boost::mpl::_1, T >>::type transform_view
const CachedFieldsData Data_
int operator()(int index, T &t) const
std::function< void(T)> MakeInserter(CachedFieldsData data, QSqlQuery_ptr insertQuery, bool bindPrimaryKey)
QStringList operator()(const QStringList &init, const T &) const
Typelist< Args...> Constraints
typename std::conditional< IsPKey< ValueAt_t< Seq, MemberIdx >>::value, Lazy< MemberIdx >, Lazy< FindPKey< Seq, typename boost::mpl::next< MemberIdx >::type >> >::type::type result_type
constexpr bool HasAutogenPKey()
AdaptUpdate(const CachedFieldsData &, std::enable_if_t<!B > *=nullptr)
typename transform_view::type objects_view
QString MorphFieldNameImpl(const QString &str, int, decltype(&T::FieldNameMorpher)*=nullptr)
const QSqlQuery & GetQuery() const
std::function< void(Seq)> Deleter_
QList< T > PerformSelect(QSqlQuery_ptr q)
QVariantMap BoundMembers_
typename boost::fusion::result_of::as_vector< typename boost::fusion::result_of::push_front< To, FieldInfo< OrigSeq, OrigIdx, RefSeq, boost::mpl::int_< RefIdx >> >::type >::type value_type
typename boost::fusion::result_of::value_at< Seq, Idx >::type ValueAt_t
bool ValueAtC_t< SeqPrime, FindPKey< SeqPrime >::result_type::value > operator()(const Seq &t, InsertAction action=InsertAction::Default) const
typename WrapAsFunc< T, Ret >::type WrapAsFunc_t
ObjectInfo< T > Adapt(const QSqlDatabase &db)
DeleteByFieldsWrapper< T > AdaptDeleteFields(const CachedFieldsData &data)
typename member_type::value_type value_type
QList< QString > BoundFields_
SelectByFieldsWrapper< T > AdaptSelectFields(const CachedFieldsData &data)
boost::fusion::vector<> type_list
const QString InsertSuffix_
QString ToSql(ToSqlState< T > &) const
Type
Describes the various types of XDG .desktop files.
typename boost::fusion::result_of::value_at_c< Seq, Idx >::type ValueAtC_t
QList< QString > BoundFields_
ObjectInfo_ptr< T > AdaptPtr(const QSqlDatabase &db)
AdaptDelete(const CachedFieldsData &data, std::enable_if_t< B > *=nullptr)
typename References< Seq, Idx >::value_type value_type
SelectOneByFieldsWrapper(const CachedFieldsData &data)
AdaptUpdate(const CachedFieldsData &data, std::enable_if_t< B > *=nullptr)
ExprTree< ExprType::Equal, ExprTree< LType, LL, LR >, ExprTree< RType, RL, RR > > operator==(const ExprTree< LType, LL, LR > &left, const ExprTree< RType, RL, RR > &right)
std::shared_ptr< ObjectInfo< T >> ObjectInfo_ptr
T operator()(const QVariant &var) const
QList< QString > BoundFields_
AdaptDelete(const CachedFieldsData &, std::enable_if_t<!B > *=nullptr)
QString ToSql(ToSqlState< T > &state) const
std::function< QList< Ret >(T)> type
QSqlQuery RunTextQuery(const QSqlDatabase &db, const QString &text)
Runs the given query text on the given db.
constexpr bool IsRelational(ExprType type)
const QSqlQuery_ptr & GetQueryPtr() const
QStringList operator()() const
detail::AdaptDelete< T > DoDelete_
std::function< QList< T >)> AdaptSelectAll(const CachedFieldsData &data)
ExprTree(const L &l, const R &r)
QString ToSql(ToSqlState< ObjT > &state) const
static UTIL_DB_API void DumpError(const QSqlError &error)
Dumps the error to the qWarning() stream.
SelectOneByFieldsWrapper< T > AdaptSelectOneFields(const CachedFieldsData &data)
typename FieldAppender< typename CollectRefs_< Seq, typename boost::mpl::next< MemberIdx >::type >::type_list, Seq, MemberIdx, typename std::decay< typename boost::fusion::result_of::at< Seq, MemberIdx >::type >::type >::value_type type_list
std::shared_ptr< QSqlQuery > QSqlQuery_ptr
DeleteByFieldsWrapper(const CachedFieldsData &data)
detail::AdaptInsert< T > DoInsert_
std::function< QList< T >objects_vector)> SelectByFKeysActor_
QueryException(const std::string &str, const QSqlQuery_ptr &q)
const bool BindPrimaryKey_
typename AsTypelist< T >::Result_t AsTypelist_t
constexpr bool HasAutogenPKeyImpl(int)
QString GetInsertPrefix(InsertAction action)
ObjectInfo(decltype(DoSelectAll_) doSel, decltype(DoInsert_) doIns, decltype(DoUpdate_) doUpdate, decltype(DoDelete_) doDelete, decltype(DoSelectByFields_) selectByFields, decltype(DoSelectOneByFields_) selectOneByFields, decltype(DoDeleteByFields_) deleteByFields)
AdaptInsert(CachedFieldsData data, std::enable_if_t< Autogen > *=nullptr)
SelectByFieldsWrapper(const CachedFieldsData &data)
constexpr bool AreComparableTypesImpl(int, decltype(std::declval< typename L::template ValueType_t< Seq >>()==std::declval< typename R::template ValueType_t< Seq >>())*=nullptr)
detail::DeleteByFieldsWrapper< T > DoDeleteByFields_
ExprTree< ExprType::And, ExprTree< LType, LL, LR >, ExprTree< RType, RL, RR > > operator&&(const ExprTree< LType, LL, LR > &left, const ExprTree< RType, RL, RR > &right)
QPair< QString, std::function< void(QSqlQuery_ptr)> > HandleExprTree(const ExprTree< Type, L, R > &tree)
ValueAtC_t< T, Idx > ValueType_t
FieldsUnpacker< TailT...> Tail_t