18 bool MatchesSchema (
const QString& baseName,
const QString& schema, QSqlDatabase& db)
21 "SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '%1'"_qs
26 const auto& existingDDL = result.value (0).toString ();
28 auto figureOutFields = [] (
const QString& str)
30 auto firstOpen = str.indexOf (
'(');
31 auto lastClose = str.lastIndexOf (
')');
32 return str.midRef (firstOpen, lastClose - firstOpen);
34 auto existing = figureOutFields (existingDDL);
35 auto suggested = figureOutFields (schema);
36 return existing == suggested;
40 template<
typename Record,
typename ImplFactory = SQLiteImplFactory>
43 constexpr
auto baseName = Record::ClassName;
44 constexpr
auto thisName =
"copy" + baseName;
45 const auto& schema = ToString<detail::AdaptCreateTableNamed<thisName, ImplFactory, Record> ()> ();
47 const auto& baseNameStr = ToString<baseName> ();
48 const auto& thisNameStr = ToString<thisName> ();
51 qDebug () << Q_FUNC_INFO
53 << db.connectionName ();
57 qDebug () << Q_FUNC_INFO
59 << db.connectionName ();
66 constexpr
auto fields =
JoinTup (detail::FieldNames<Record>,
", ");
69 "INSERT INTO %2 (%1) SELECT %1 FROM %3;"_qs
70 .arg (ToString<fields> (), thisNameStr, baseNameStr));
76 "ALTER TABLE %1 RENAME TO %2;"_qs
77 .arg (thisNameStr, baseNameStr));
UTIL_DB_API void Init()
Initializes the transaction.
constexpr auto JoinTup(auto &&stringsTuple, auto &&sep) noexcept
Provides database transaction lock.
void Migrate(QSqlDatabase &db)
constexpr detail::MemberPtrs< Ptrs... > fields
QSqlQuery RunTextQuery(const QSqlDatabase &db, const QString &text)
Runs the given query text on the given db.
bool MatchesSchema(const QString &baseName, const QString &schema, QSqlDatabase &db)