20 template<
typename T,
typename = decltype (T {}.AsTuple ())>
21 auto operator== (
const T& left,
const T& right)
23 return left.AsTuple () == right.AsTuple ();
28 template<
typename T,
typename... Args>
35 #define TOSTRING(n) inline char* toString (const n& rec) { return toString (#n, rec); } 37 template<
typename T,
typename TupleType = decltype (T {}.AsTuple ())>
42 QByteArray ba { name };
45 std::apply ([&ba] (
const auto&... args) { (ba.append (
toString (args)).append (
", "), ...); }, t.AsTuple ());
47 if (std::tuple_size<TupleType>::value >= 1)
51 return qstrdup (ba.data ());
59 db.setDatabaseName (name);
61 throw std::runtime_error {
"cannot create test database" };
71 auto adapted = Util::oral::AdaptPtr<T, OralFactory> (db);
72 for (
int i = 0; i <
count; ++i)
73 adapted->Insert ({ i, QString::number (i) });
constexpr detail::AggregateType< detail::AggregateFunction::Count, Ptr > count
QSqlDatabase MakeDatabase(const QString &name=":memory:")
detail::SQLite::ImplFactory SQLiteImplFactory
auto PrepareRecords(QSqlDatabase db, int count=3)
char * toString(const char *name, const T &t)
QSqlQuery RunTextQuery(const QSqlDatabase &db, const QString &text)
Runs the given query text on the given db.
QString GenConnectionName(const QString &base)
Generates an unique thread-safe connection name.