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> 74 :
std::runtime_error (str)
94 template<
int... Fields>
97 template<
typename... Args>
105 return T::FieldNameMorpher (str);
117 return MorphFieldNameImpl<T> (str, 0);
120 template<
typename Seq,
int Idx>
125 const QString rawName { boost::fusion::extension::struct_member_name<Seq, Idx>::call () };
126 return MorphFieldName<Seq> (rawName);
130 template<
typename S,
typename N>
133 QStringList operator() ()
const 142 QStringList operator() ()
const 153 template<
typename Seq,
int Idx>
166 QString operator() ()
const {
return "INTEGER"; }
172 QString operator() ()
const {
return "INTEGER"; }
178 QString operator() ()
const {
return "REAL"; }
184 QString operator() ()
const {
return "INTEGER"; }
190 QString operator() ()
const {
return "TEXT"; }
196 QString operator() ()
const {
return "BLOB"; }
202 QString operator() ()
const {
return "TEXT"; }
211 template<
typename T,
typename... Tags>
214 QString operator() ()
const {
return Type2Name<T> () () +
" PRIMARY KEY"; }
217 template<
typename... Tags>
220 QString operator() ()
const {
return Type2Name<int> () () +
" PRIMARY KEY AUTOINCREMENT"; }
223 template<
typename Seq,
int Idx>
226 QString operator() ()
const 236 QVariant operator() (
const T& t)
const 245 QVariant operator() (
const QDateTime& t)
const 247 return t.toString (Qt::ISODate);
260 template<
typename T,
typename... Tags>
265 return static_cast<typename
PKey<T, Tags...
>::value_type> (t);
269 template<
typename Seq,
int Idx>
281 T operator() (
const QVariant& var)
const 283 return var.value<T> ();
290 QDateTime operator() (
const QVariant& var)
const 292 return QDateTime::fromString (var.toString (), Qt::ISODate);
299 T operator() (
const QVariant& var)
const 301 return var.value<T> ();
305 template<
typename T,
typename... Tags>
308 T operator() (
const QVariant& var)
const 310 return var.value<T> ();
314 template<
typename Seq,
int Idx>
337 QStringList operator() (
const QStringList& init,
const T&)
const 353 QStringList operator() (QStringList bounds,
const T& t)
const 356 Q_->bindValue (bounds.takeFirst (),
ToVariant<T> {} (t));
366 int operator() (
int index, T& t)
const 385 return [data, insertQuery, bindPrimaryKey] (
const T& t)
387 boost::fusion::fold<T, QStringList, Inserter> (t, data.
BoundFields_,
Inserter { bindPrimaryKey, insertQuery });
388 if (!insertQuery->exec ())
391 throw QueryException (
"insert query execution failed", insertQuery);
402 template<
typename Seq,
int Idx>
403 using ValueAtC_t =
typename boost::fusion::result_of::value_at_c<Seq, Idx>::type;
405 template<
typename Seq,
typename Idx>
406 using ValueAt_t =
typename boost::fusion::result_of::value_at<Seq, Idx>::type;
408 template<
typename Seq,
typename MemberIdx = boost::mpl::
int_<0>>
411 static_assert ((boost::fusion::result_of::size<Seq>::value) != (MemberIdx::value),
412 "Primary key not found");
421 template<typename Seq, int Idx = FindPKey<Seq>::result_type::value>
433 template<
typename Seq>
436 return HasAutogenPKeyImpl<Seq> (0);
446 return "INSERT OR IGNORE";
448 return "INSERT OR REPLACE";
451 qWarning () << Q_FUNC_INFO
453 <<
static_cast<int> (action);
457 template<
typename Seq>
467 , InsertSuffix_ (
" INTO " + data.Table_ +
468 " (" + QStringList { data.
Fields_ }.join (
", ") +
") VALUES (" +
469 QStringList { data.BoundFields_ }.join (
", ") +
");")
473 template<
bool Autogen = HasAutogenPKey<Seq> ()>
491 template<
bool Autogen = HasAutogenPKey<Seq> ()>
497 template<
bool Autogen = HasAutogenPKey<Seq> ()>
500 auto query = std::make_shared<QSqlQuery> (Data_.
DB_);
502 MakeInserter<Seq> (Data_, query,
false) (t);
508 template<
bool Autogen = HasAutogenPKey<Seq> ()>
512 auto query = std::make_shared<QSqlQuery> (Data_.
DB_);
514 MakeInserter<Seq> (Data_, query,
false) (t);
520 template<
bool Autogen = HasAutogenPKey<Seq> ()>
523 auto query = std::make_shared<QSqlQuery> (Data_.
DB_);
525 MakeInserter<Seq> (Data_, query,
true) (t);
534 auto removedFields = data.
Fields_;
537 const auto& fieldName = removedFields.takeAt (index);
538 const auto& boundName = removedBoundFields.takeAt (index);
540 const auto& statements =
Util::ZipWith (removedFields, removedBoundFields,
541 [] (
const QString& s1,
const QString& s2) -> QString
542 {
return s1 +
" = " + s2; });
544 const auto& update =
"UPDATE " + data.
Table_ +
545 " SET " + QStringList { statements }.join (
", ") +
546 " WHERE " + fieldName +
" = " + boundName +
";";
548 const auto updateQuery = std::make_shared<QSqlQuery> (data.
DB_);
549 updateQuery->prepare (update);
550 return MakeInserter<T> (data, updateQuery,
true);
559 const auto& del =
"DELETE FROM " + data.
Table_ +
560 " WHERE " + data.
Fields_.at (index) +
" = " + boundName +
";";
562 const auto deleteQuery = std::make_shared<QSqlQuery> (data.
DB_);
563 deleteQuery->prepare (del);
565 return [deleteQuery, boundName] (
const T& t)
568 deleteQuery->bindValue (boundName,
570 if (!deleteQuery->exec ())
571 throw QueryException (
"delete query execution failed", deleteQuery);
585 boost::fusion::fold<T, int, Selector> (t, 0,
Selector { q });
595 const auto& selectAll =
"SELECT " + QStringList { data.
Fields_ }.join (
", ") +
" FROM " + data.
Table_ +
";";
596 const auto selectQuery = std::make_shared<QSqlQuery> (data.
DB_);
597 selectQuery->prepare (selectAll);
598 return [selectQuery] {
return PerformSelect<T> (selectQuery); };
601 template<
int HeadT,
int... TailT>
604 static const int Head = HeadT;
611 static const int Head = HeadT;
615 template<
typename FieldsUnpacker,
typename HeadArg,
typename... TailArgs>
621 void operator() (
const HeadArg& arg,
const TailArgs&... tail)
const 623 Query_->bindValue (BoundFields_.at (FieldsUnpacker::Head), arg);
629 template<
typename FieldsUnpacker,
typename HeadArg>
635 void operator() (
const HeadArg& arg)
const 637 Query_->bindValue (BoundFields_.at (FieldsUnpacker::Head), arg);
661 case ExprType::Greater:
665 case ExprType::Equal:
678 case ExprType::LeafStaticPlaceholder:
679 case ExprType::LeafData:
680 return "invalid type";
683 qWarning () << Q_FUNC_INFO
685 <<
static_cast<int> (type);
689 template<ExprType Type>
698 template<ExprType Type1, ExprType Type2>
701 template<ExprType Type>
704 template<ExprType Type>
707 template<ExprType Type>
710 template<ExprType Type>
719 template<ExprType T1, ExprType T2>
727 return type == ExprType::Greater ||
728 type == ExprType::Less ||
729 type == ExprType::Equal ||
730 type == ExprType::Geq ||
731 type == ExprType::Leq ||
732 type == ExprType::Neq;
742 template<
typename Seq,
typename L,
typename R>
744 decltype (std::declval<
typename L::template ValueType_t<Seq>> () == std::declval<
typename R::template ValueType_t<Seq>> ())* =
nullptr)
749 template<
typename Seq,
typename L,
typename R>
755 template<
typename Seq,
typename L,
typename R>
758 return AreComparableTypesImpl<Seq, L, R> (0) ||
759 AreComparableTypesImpl<Seq, R, L> (0);
762 template<ExprType Type,
typename Seq,
typename L,
typename R,
typename =
void>
765 template<
typename Seq,
typename L,
typename R,
typename =
void>
768 template<
typename Seq,
typename L,
typename R>
771 template<ExprType Type,
typename Seq,
typename L,
typename R>
774 template<ExprType Type,
typename L =
void,
typename R =
void>
790 "Incompatible types passed to a relational operator.");
792 return Left_.ToSql (state) +
" " +
TypeToSql (
Type) +
" " + Right_.ToSql (state);
806 static_assert (Idx < boost::fusion::result_of::size<T>::type::value,
"Index out of bounds.");
824 template<
typename ObjT>
827 const auto& name =
":bound_" + QString::number (++state.
LastID_);
836 template<ExprType Type,
typename L,
typename R>
839 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
840 ExprTree<ExprType::Less, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>> operator< (const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
842 static_assert (CheckCompatible<LType, RType> (),
"comparing incompatible subexpressions");
843 return { left, right };
846 template<ExprType LType,
typename LL,
typename LR,
typename R>
849 return left < ExprTree<ExprType::LeafData, R> { right };
852 template<ExprType RType,
typename RL,
typename RR,
typename L>
858 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
859 ExprTree<ExprType::Equal, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>>
operator== (
const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
861 static_assert (CheckCompatible<LType, RType> (),
"comparing incompatible subexpressions");
862 return { left, right };
865 template<ExprType LType,
typename LL,
typename LR,
typename R>
871 template<ExprType RType,
typename RL,
typename RR,
typename L>
877 template<ExprType LType,
typename LL,
typename LR, ExprType RType,
typename RL,
typename RR>
878 ExprTree<ExprType::And, ExprTree<LType, LL, LR>,
ExprTree<RType, RL, RR>>
operator&& (
const ExprTree<LType, LL, LR>& left,
const ExprTree<RType, RL, RR>& right)
880 return { left, right };
883 template<ExprType LType,
typename LL,
typename LR,
typename R>
889 template<ExprType RType,
typename RL,
typename RR,
typename L>
895 template<
typename Seq, ExprType Type,
typename L,
typename R>
900 const auto& sql = tree.
ToSql (state);
907 for (
const auto& pair :
Stlize (state.BoundMembers_))
908 query->bindValue (pair.first, pair.second);
919 static constexpr
pos<0> _0 = {};
920 static constexpr
pos<1> _1 = {};
921 static constexpr
pos<2> _2 = {};
922 static constexpr
pos<3> _3 = {};
923 static constexpr
pos<4> _4 = {};
925 #if __cpp_variable_templates >= 201304 943 template<ExprType Type,
typename L,
typename R>
946 const auto& treeResult = HandleExprTree<T> (tree);
948 const auto& selectAll =
"SELECT " + QStringList { Cached_.
Fields_ }.join (
", ") +
949 " FROM " + Cached_.
Table_ +
950 " WHERE " + treeResult.first +
";";
952 const auto query = std::make_shared<QSqlQuery> (Cached_.
DB_);
953 query->prepare (selectAll);
954 treeResult.second (query);
955 return PerformSelect<T> (query);
958 template<
int Idx, ExprType Type,
typename L,
typename R>
961 const auto& treeResult = HandleExprTree<T> (tree);
963 const auto& selectOne =
"SELECT " + Cached_.
Fields_.value (Idx) +
964 " FROM " + Cached_.
Table_ +
965 " WHERE " + treeResult.first +
";";
967 const auto query = std::make_shared<QSqlQuery> (Cached_.
DB_);
968 query->prepare (selectOne);
969 treeResult.second (query);
977 while (query->next ())
994 template<ExprType Type,
typename L,
typename R>
997 const auto& result = Select_ (tree);
998 if (result.isEmpty ())
1001 return result.value (0);
1004 template<
int Idx, ExprType Type,
typename L,
typename R>
1007 const auto& result = Select_ (p, tree);
1008 if (result.isEmpty ())
1011 return result.value (0);
1015 template<
typename T>
1025 template<ExprType Type,
typename L,
typename R>
1028 const auto& treeResult = HandleExprTree<T> (tree);
1030 const auto& selectAll =
"DELETE FROM " + Cached_.
Table_ +
1031 " WHERE " + treeResult.first +
";";
1033 const auto query = std::make_shared<QSqlQuery> (Cached_.
DB_);
1034 query->prepare (selectAll);
1035 treeResult.second (query);
1040 template<
typename T>
1046 template<
typename T>
1052 template<
typename T>
1058 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename MemberIdx>
1063 template<
typename To,
typename OrigSeq,
typename OrigIdx,
typename T>
1069 template<
typename To,
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
int RefIdx>
1072 using value_type =
typename boost::fusion::result_of::as_vector<
1073 typename boost::fusion::result_of::push_front<
1080 template<
typename Seq,
typename MemberIdx>
1087 typename std::decay<typename boost::fusion::result_of::at<Seq, MemberIdx>::type>::type
1091 template<
typename Seq>
1092 struct CollectRefs_<Seq, typename boost::fusion::result_of::size<Seq>::type>
1097 template<
typename Seq>
1104 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename RefIdx>
1112 template<
typename T>
1115 template<
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename MemberIdx>
1125 template<
typename ObjType,
typename OrigSeq,
typename OrigIdx,
typename RefSeq,
typename RefIdx>
1129 ToVariant<
typename std::decay<
typename boost::fusion::result_of::at<RefSeq, RefIdx>::type>::type> () (boost::fusion::at<RefIdx> (boost::fusion::at_c<0> (pair))));
1133 template<
typename T,
typename RefSeq>
1136 using transform_view =
typename boost::mpl::transform<RefSeq, ExtrObj<boost::mpl::_1>>;
1138 using objects_vector =
typename boost::fusion::result_of::as_vector<objects_view>::type;
1144 boost::fusion::for_each (boost::fusion::zip (objs, RefSeq {}),
SingleBind { Q_ });
1145 return PerformSelect<T> (Q_);
1149 template<
typename T,
typename ObjInfo>
1153 const auto& statements = boost::fusion::fold (references_list {}, QStringList {},
Ref2Select {});
1155 const auto& selectAll =
"SELECT " + QStringList { data.
Fields_ }.join (
", ") +
1157 (statements.isEmpty () ?
"" :
" WHERE ") + statements.join (
" AND ") +
1159 const auto selectQuery = std::make_shared<QSqlQuery> (data.
DB_);
1160 selectQuery->prepare (selectAll);
1165 template<
typename T,
typename Ret>
1168 using type = std::function<QList<Ret> (T)>;
1171 template<
typename T,
typename Ret>
1174 template<
typename T>
1179 template<
typename Vec,
typename OrigObj,
typename OrigIdx,
typename RefObj,
typename RefIdx>
1183 const auto& query =
"SELECT " + QStringList { Data_.
Fields_ }.join (
", ") +
1184 " FROM " + Data_.
Table_ +
1187 const auto selectQuery = std::make_shared<QSqlQuery> (Data_.
DB_);
1188 selectQuery->prepare (query);
1190 auto inserter = [selectQuery, boundName] (
const RefObj& obj)
1192 selectQuery->bindValue (boundName,
1194 return PerformSelect<T> (selectQuery);
1201 template<
typename T,
typename ObjInfo>
1205 const auto& statements = boost::fusion::fold (references_list {}, QStringList {},
Ref2Select {});
1207 const auto& selectAll =
"SELECT " + QStringList { data.
Fields_ }.join (
", ") +
1209 (statements.isEmpty () ?
"" :
" WHERE ") + statements.join (
" AND ") +
1211 const auto selectQuery = std::make_shared<QSqlQuery> (data.
DB_);
1212 selectQuery->prepare (selectAll);
1216 auto singleSelectors = boost::fusion::fold (references_list {}, boost::fusion::vector<> {},
MakeSingleBinder<T> { data });
1217 info.SingleFKeySelectors_ = boost::fusion::as_vector (singleSelectors);
1220 template<
typename T,
typename ObjInfo>
1225 template<
typename T>
1231 template<
typename T>
1237 template<
typename T>
1238 using ConstraintsType = decltype (GetConstraintsTypeImpl<T> (0));
1240 template<
typename T>
1241 struct ConstraintToString;
1243 template<
int... Fields>
1244 struct ConstraintToString<UniqueSubset<Fields...>>
1248 return "UNIQUE (" + QStringList { data.
Fields_.value (Fields)... }.join (
", ") +
")";
1252 template<
typename...>
1253 struct GetConstraintsStringList;
1256 struct GetConstraintsStringList<Constraints<>>
1264 template<
typename Head,
typename...
Tail>
1265 struct GetConstraintsStringList<Constraints<Head, Tail...>>
1269 return QStringList { ConstraintToString<Head> {} (data) } +
1274 template<
typename T>
1279 const auto& constraints = GetConstraintsStringList<ConstraintsType<T>> {} (data);
1280 const auto& constraintsStr = constraints.isEmpty () ?
1282 (
", " + constraints.join (
", "));
1285 [] (
const QString& type,
const QString& field) { return field +
" " + type; });
1286 return "CREATE TABLE " +
1289 statements.join (
", ") +
1294 template<
typename T,
typename Enable =
void>
1295 struct ObjectInfoFKeysHelper
1299 template<
typename T>
1300 struct ObjectInfoFKeysHelper<T, typename std::enable_if<CollectRefs<T>::type_list::size::value == 1, void>::type>
1305 template<
typename T>
1306 struct ObjectInfoFKeysHelper<T, typename std::enable_if<CollectRefs<T>::type_list::size::value >= 2, void>::type>
1311 using transform_view =
typename boost::mpl::transform<objects_vector, WrapAsFunc<boost::mpl::_1, T>>::type;
1316 template<
typename T>
1319 std::function<QList<T> ()> DoSelectAll_;
1329 decltype (DoInsert_) doIns,
1330 decltype (DoUpdate_) doUpdate,
1331 decltype (DoDelete_) doDelete,
1332 decltype (DoSelectByFields_) selectByFields,
1333 decltype (DoSelectOneByFields_) selectOneByFields,
1334 decltype (DoDeleteByFields_) deleteByFields)
1335 : DoSelectAll_ (doSel)
1337 , DoUpdate_ (doUpdate)
1338 , DoDelete_ (doDelete)
1339 , DoSelectByFields_ (selectByFields)
1340 , DoSelectOneByFields_ (selectOneByFields)
1341 , DoDeleteByFields_ (deleteByFields)
1346 template<
typename T>
1352 const auto& table = T::ClassName ();
1355 if (db.record (table).isEmpty ())
1356 RunTextQuery (db, detail::AdaptCreateTable<T> (cachedData));
1358 const auto& selectr = detail::AdaptSelectAll<T> (cachedData);
1360 const auto& updater = detail::AdaptUpdate<T> (cachedData);
1361 const auto& deleter = detail::AdaptDelete<T> (cachedData);
1363 const auto& selectByVal = detail::AdaptSelectFields<T> (cachedData);
1364 const auto& selectOneByVal = detail::AdaptSelectOneFields<T> (cachedData);
1365 const auto& deleteByVal = detail::AdaptDeleteFields<T> (cachedData);
1378 detail::AdaptSelectRef<T> (cachedData, info);
1383 template<
typename T>
1386 template<
typename T>
1389 return std::make_shared<ObjectInfo<T>> (Adapt<T> (db));
QString MorphFieldName(const QString &str)
std::function< void(T)> DoUpdate_
constexpr List< T... > Tail(List< H, T... >)
AdaptInsert(CachedFieldsData data, EnableIf_t< Autogen > *=nullptr)
virtual ~QueryException()
typename boost::mpl::transform< RefSeq, ExtrObj< boost::mpl::_1 >> transform_view
ExprTree< ExprType::And, ExprTree< ExprType::LeafData, L >, ExprTree< RType, RL, RR > > operator&&(const L &left, const ExprTree< RType, RL, RR > &right)
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
detail::SelectOneByFieldsWrapper< T > DoSelectOneByFields_
std::function< void(T)> AdaptDelete(CachedFieldsData data)
QString TypeToSql(ExprType type)
std::enable_if< CollectRefs< T >::type_list::size::value==1 >::type AdaptSelectRef(const CachedFieldsData &data, ObjInfo &info)
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_
std::function< void(T)> MakeInserter(CachedFieldsData data, QSqlQuery_ptr insertQuery, bool bindPrimaryKey)
auto ZipWith(const Container< T1 > &c1, const Container< T2 > &c2, F f) -> WrapType_t< Container< Decay_t< ResultOf_t< F(T1, T2)>>>>
Typelist< Args... > Constraints
constexpr bool HasAutogenPKey()
QString MorphFieldNameImpl(const QString &str, float)
typename std::conditional< IsPKey< ValueAt_t< Seq, MemberIdx >>::value, Lazy< MemberIdx >, Lazy< FindPKey< Seq, typename boost::mpl::next< MemberIdx >>> >::type::type result_type
typename transform_view::type objects_view
const QSqlQuery & GetQuery() const
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
bool operator==(const ModelIterator &left, const ModelIterator &right)
typename boost::fusion::result_of::value_at< Seq, Idx >::type ValueAt_t
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
typename std::enable_if< B, T >::type EnableIf_t
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)
auto Stlize(Assoc &&assoc) -> detail::StlAssocRange< decltype(assoc.begin()), Assoc, PairType >
Converts an Qt's associative sequence assoc to an STL-like iteratable range.
typename References< Seq, Idx >::value_type value_type
SelectOneByFieldsWrapper(const CachedFieldsData &data)
std::shared_ptr< ObjectInfo< T >> ObjectInfo_ptr
QList< QString > BoundFields_
constexpr bool AreComparableTypesImpl(float)
constexpr bool HasAutogenPKeyImpl(float)
QString ToSql(ToSqlState< T > &state) const
std::function< QList< Ret >(T)> type
constexpr bool IsRelational(ExprType type)
const QSqlQuery_ptr & GetQueryPtr() const
auto Map(const Container< T > &c, F f) -> typename std::enable_if<!std::is_same< void, decltype(Invoke(f,*c.begin()))>::value, WrapType_t< Container< typename std::decay< decltype(Invoke(f,*c.begin()))>::type >>>::type
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
QString GetInsertPrefix(InsertAction action)
void RunTextQuery(const QSqlDatabase &db, const QString &text)
Runs the given query text on the given db.
ObjectInfo(decltype(DoSelectAll_) doSel, decltype(DoInsert_) doIns, decltype(DoUpdate_) doUpdate, decltype(DoDelete_) doDelete, decltype(DoSelectByFields_) selectByFields, decltype(DoSelectOneByFields_) selectOneByFields, decltype(DoDeleteByFields_) deleteByFields)
SelectByFieldsWrapper(const CachedFieldsData &data)
detail::DeleteByFieldsWrapper< T > DoDeleteByFields_
std::function< void(T)> AdaptUpdate(const CachedFieldsData &data)
std::function< void(T)> DoDelete_
AdaptInsert(const CachedFieldsData &data, EnableIf_t<!Autogen > *=nullptr)
QPair< QString, std::function< void(QSqlQuery_ptr)> > HandleExprTree(const ExprTree< Type, L, R > &tree)
ValueAtC_t< T, Idx > ValueType_t