forked from qt-creator/qt-creator
Sqlite: Remove virtual interface dependency
With C++ 17 it is possible to deduce the template argument from the contructor parameter(CTAD). We then do not call anymore a virtual function but a normal function. Change-Id: I61c3ce22322c66b256afab278e768014401b08cc Reviewed-by: Tim Jenssen <tim.jenssen@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
@@ -59,6 +59,8 @@ enum class Type : char { Invalid, Integer, Float, Text, Blob, Null };
|
|||||||
class SQLITE_EXPORT BaseStatement
|
class SQLITE_EXPORT BaseStatement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using Database = ::Sqlite::Database;
|
||||||
|
|
||||||
explicit BaseStatement(Utils::SmallStringView sqlStatement, Database &database);
|
explicit BaseStatement(Utils::SmallStringView sqlStatement, Database &database);
|
||||||
|
|
||||||
BaseStatement(const BaseStatement &) = delete;
|
BaseStatement(const BaseStatement &) = delete;
|
||||||
@@ -403,7 +405,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeferredTransaction m_transaction;
|
DeferredTransaction<typename BaseStatement::Database> m_transaction;
|
||||||
Resetter resetter;
|
Resetter resetter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,6 @@ public:
|
|||||||
void lock() override;
|
void lock() override;
|
||||||
void unlock() override;
|
void unlock() override;
|
||||||
|
|
||||||
private:
|
|
||||||
void deferredBegin() override;
|
void deferredBegin() override;
|
||||||
void immediateBegin() override;
|
void immediateBegin() override;
|
||||||
void exclusiveBegin() override;
|
void exclusiveBegin() override;
|
||||||
@@ -173,6 +172,7 @@ private:
|
|||||||
void sessionCommit() override;
|
void sessionCommit() override;
|
||||||
void sessionRollback() override;
|
void sessionRollback() override;
|
||||||
|
|
||||||
|
private:
|
||||||
void initializeTables();
|
void initializeTables();
|
||||||
void registerTransactionStatements();
|
void registerTransactionStatements();
|
||||||
void deleteTransactionStatements();
|
void deleteTransactionStatements();
|
||||||
|
|||||||
@@ -59,9 +59,12 @@ protected:
|
|||||||
~TransactionInterface() = default;
|
~TransactionInterface() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
class AbstractTransaction
|
class AbstractTransaction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using Transaction = TransactionInterface;
|
||||||
|
|
||||||
AbstractTransaction(const AbstractTransaction &) = delete;
|
AbstractTransaction(const AbstractTransaction &) = delete;
|
||||||
AbstractTransaction &operator=(const AbstractTransaction &) = delete;
|
AbstractTransaction &operator=(const AbstractTransaction &) = delete;
|
||||||
|
|
||||||
@@ -87,11 +90,14 @@ protected:
|
|||||||
bool m_rollback = false;
|
bool m_rollback = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
class AbstractThrowingSessionTransaction
|
class AbstractThrowingSessionTransaction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AbstractThrowingSessionTransaction(const AbstractTransaction &) = delete;
|
using Transaction = TransactionInterface;
|
||||||
AbstractThrowingSessionTransaction &operator=(const AbstractTransaction &) = delete;
|
|
||||||
|
AbstractThrowingSessionTransaction(const AbstractThrowingSessionTransaction &) = delete;
|
||||||
|
AbstractThrowingSessionTransaction &operator=(const AbstractThrowingSessionTransaction &) = delete;
|
||||||
|
|
||||||
void commit()
|
void commit()
|
||||||
{
|
{
|
||||||
@@ -123,16 +129,19 @@ protected:
|
|||||||
bool m_rollback = false;
|
bool m_rollback = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AbstractThrowingTransaction : public AbstractTransaction
|
template<typename TransactionInterface>
|
||||||
|
class AbstractThrowingTransaction : public AbstractTransaction<TransactionInterface>
|
||||||
{
|
{
|
||||||
|
using Base = AbstractTransaction<TransactionInterface>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AbstractThrowingTransaction(const AbstractThrowingTransaction &) = delete;
|
AbstractThrowingTransaction(const AbstractThrowingTransaction &) = delete;
|
||||||
AbstractThrowingTransaction &operator=(const AbstractThrowingTransaction &) = delete;
|
AbstractThrowingTransaction &operator=(const AbstractThrowingTransaction &) = delete;
|
||||||
~AbstractThrowingTransaction() noexcept(false)
|
~AbstractThrowingTransaction() noexcept(false)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (m_rollback)
|
if (Base::m_rollback)
|
||||||
m_interface.rollback();
|
Base::m_interface.rollback();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
if (!std::uncaught_exceptions())
|
if (!std::uncaught_exceptions())
|
||||||
throw;
|
throw;
|
||||||
@@ -141,37 +150,40 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
AbstractThrowingTransaction(TransactionInterface &transactionInterface)
|
AbstractThrowingTransaction(TransactionInterface &transactionInterface)
|
||||||
: AbstractTransaction(transactionInterface)
|
: AbstractTransaction<TransactionInterface>(transactionInterface)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class AbstractNonThrowingDestructorTransaction : public AbstractTransaction
|
template<typename TransactionInterface>
|
||||||
|
class AbstractNonThrowingDestructorTransaction : public AbstractTransaction<TransactionInterface>
|
||||||
{
|
{
|
||||||
|
using Base = AbstractTransaction<TransactionInterface>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AbstractNonThrowingDestructorTransaction(const AbstractNonThrowingDestructorTransaction &) = delete;
|
AbstractNonThrowingDestructorTransaction(const AbstractNonThrowingDestructorTransaction &) = delete;
|
||||||
AbstractNonThrowingDestructorTransaction &operator=(const AbstractNonThrowingDestructorTransaction &) = delete;
|
AbstractNonThrowingDestructorTransaction &operator=(const AbstractNonThrowingDestructorTransaction &) = delete;
|
||||||
~AbstractNonThrowingDestructorTransaction()
|
~AbstractNonThrowingDestructorTransaction()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (m_rollback)
|
if (Base::m_rollback)
|
||||||
m_interface.rollback();
|
Base::m_interface.rollback();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AbstractNonThrowingDestructorTransaction(TransactionInterface &transactionInterface)
|
AbstractNonThrowingDestructorTransaction(TransactionInterface &transactionInterface)
|
||||||
: AbstractTransaction(transactionInterface)
|
: AbstractTransaction<TransactionInterface>(transactionInterface)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename BaseTransaction>
|
template<typename BaseTransaction>
|
||||||
class BasicDeferredTransaction final : public BaseTransaction
|
class BasicDeferredTransaction : public BaseTransaction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BasicDeferredTransaction(TransactionInterface &transactionInterface)
|
BasicDeferredTransaction(typename BaseTransaction::Transaction &transactionInterface)
|
||||||
: BaseTransaction(transactionInterface)
|
: BaseTransaction(transactionInterface)
|
||||||
{
|
{
|
||||||
transactionInterface.deferredBegin();
|
transactionInterface.deferredBegin();
|
||||||
@@ -183,14 +195,38 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using DeferredTransaction = BasicDeferredTransaction<AbstractThrowingTransaction>;
|
template<typename TransactionInterface>
|
||||||
using DeferredNonThrowingDestructorTransaction = BasicDeferredTransaction<AbstractNonThrowingDestructorTransaction>;
|
class DeferredTransaction final
|
||||||
|
: public BasicDeferredTransaction<AbstractThrowingTransaction<TransactionInterface>>
|
||||||
|
{
|
||||||
|
using Base = BasicDeferredTransaction<AbstractThrowingTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Base::Base;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
DeferredTransaction(TransactionInterface &) -> DeferredTransaction<TransactionInterface>;
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
class DeferredNonThrowingDestructorTransaction final
|
||||||
|
: public BasicDeferredTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>
|
||||||
|
{
|
||||||
|
using Base = BasicDeferredTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Base::Base;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
DeferredNonThrowingDestructorTransaction(TransactionInterface &)
|
||||||
|
-> DeferredNonThrowingDestructorTransaction<TransactionInterface>;
|
||||||
|
|
||||||
template<typename BaseTransaction>
|
template<typename BaseTransaction>
|
||||||
class BasicImmediateTransaction final : public BaseTransaction
|
class BasicImmediateTransaction : public BaseTransaction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BasicImmediateTransaction(TransactionInterface &transactionInterface)
|
BasicImmediateTransaction(typename BaseTransaction::Transaction &transactionInterface)
|
||||||
: BaseTransaction(transactionInterface)
|
: BaseTransaction(transactionInterface)
|
||||||
{
|
{
|
||||||
transactionInterface.immediateBegin();
|
transactionInterface.immediateBegin();
|
||||||
@@ -202,14 +238,38 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using ImmediateTransaction = BasicImmediateTransaction<AbstractThrowingTransaction>;
|
template<typename TransactionInterface>
|
||||||
using ImmediateNonThrowingDestructorTransaction = BasicImmediateTransaction<AbstractNonThrowingDestructorTransaction>;
|
class ImmediateTransaction final
|
||||||
|
: public BasicImmediateTransaction<AbstractThrowingTransaction<TransactionInterface>>
|
||||||
|
{
|
||||||
|
using Base = BasicImmediateTransaction<AbstractThrowingTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Base::Base;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
ImmediateTransaction(TransactionInterface &) -> ImmediateTransaction<TransactionInterface>;
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
class ImmediateNonThrowingDestructorTransaction final
|
||||||
|
: public BasicImmediateTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>
|
||||||
|
{
|
||||||
|
using Base = BasicImmediateTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Base::Base;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
ImmediateNonThrowingDestructorTransaction(TransactionInterface &)
|
||||||
|
-> ImmediateNonThrowingDestructorTransaction<TransactionInterface>;
|
||||||
|
|
||||||
template<typename BaseTransaction>
|
template<typename BaseTransaction>
|
||||||
class BasicExclusiveTransaction final : public BaseTransaction
|
class BasicExclusiveTransaction : public BaseTransaction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BasicExclusiveTransaction(TransactionInterface &transactionInterface)
|
BasicExclusiveTransaction(typename BaseTransaction::Transaction &transactionInterface)
|
||||||
: BaseTransaction(transactionInterface)
|
: BaseTransaction(transactionInterface)
|
||||||
{
|
{
|
||||||
transactionInterface.exclusiveBegin();
|
transactionInterface.exclusiveBegin();
|
||||||
@@ -221,24 +281,51 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using ExclusiveTransaction = BasicExclusiveTransaction<AbstractThrowingTransaction>;
|
template<typename TransactionInterface>
|
||||||
using ExclusiveNonThrowingDestructorTransaction
|
class ExclusiveTransaction final
|
||||||
= BasicExclusiveTransaction<AbstractNonThrowingDestructorTransaction>;
|
: public BasicExclusiveTransaction<AbstractThrowingTransaction<TransactionInterface>>
|
||||||
|
|
||||||
class ImmediateSessionTransaction final : public AbstractThrowingSessionTransaction
|
|
||||||
{
|
{
|
||||||
|
using Base = BasicExclusiveTransaction<AbstractThrowingTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ImmediateSessionTransaction(TransactionInterface &transactionInterface)
|
using Base::Base;
|
||||||
: AbstractThrowingSessionTransaction(transactionInterface)
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
ExclusiveTransaction(TransactionInterface &) -> ExclusiveTransaction<TransactionInterface>;
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
class ExclusiveNonThrowingDestructorTransaction final
|
||||||
|
: public BasicExclusiveTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>
|
||||||
|
{
|
||||||
|
using Base = BasicExclusiveTransaction<AbstractNonThrowingDestructorTransaction<TransactionInterface>>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Base::Base;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
ExclusiveNonThrowingDestructorTransaction(TransactionInterface &)
|
||||||
|
-> ExclusiveNonThrowingDestructorTransaction<TransactionInterface>;
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
class ImmediateSessionTransaction final
|
||||||
|
: public AbstractThrowingSessionTransaction<TransactionInterface>
|
||||||
|
{
|
||||||
|
using Base = AbstractThrowingSessionTransaction<TransactionInterface>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImmediateSessionTransaction(typename Base::Transaction &transactionInterface)
|
||||||
|
: AbstractThrowingSessionTransaction<TransactionInterface>(transactionInterface)
|
||||||
{
|
{
|
||||||
transactionInterface.immediateSessionBegin();
|
transactionInterface.immediateSessionBegin();
|
||||||
}
|
}
|
||||||
|
|
||||||
~ImmediateSessionTransaction()
|
~ImmediateSessionTransaction() { Base::m_rollback = !Base::m_isAlreadyCommited; }
|
||||||
{
|
|
||||||
AbstractThrowingSessionTransaction::m_rollback
|
|
||||||
= !AbstractThrowingSessionTransaction::m_isAlreadyCommited;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename TransactionInterface>
|
||||||
|
ImmediateSessionTransaction(TransactionInterface &)
|
||||||
|
-> ImmediateSessionTransaction<TransactionInterface>;
|
||||||
|
|
||||||
} // namespace Sqlite
|
} // namespace Sqlite
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
DatabaseType &database;
|
DatabaseType &database;
|
||||||
Initializer initializer{database};
|
Initializer initializer{database};
|
||||||
Sqlite::ImmediateNonThrowingDestructorTransaction transaction{database};
|
Sqlite::ImmediateNonThrowingDestructorTransaction<DatabaseType> transaction{database};
|
||||||
mutable ReadStatement<1, 2> selectImageStatement{
|
mutable ReadStatement<1, 2> selectImageStatement{
|
||||||
"SELECT image FROM images WHERE name=?1 AND mtime >= ?2", database};
|
"SELECT image FROM images WHERE name=?1 AND mtime >= ?2", database};
|
||||||
mutable ReadStatement<1, 2> selectSmallImageStatement{
|
mutable ReadStatement<1, 2> selectSmallImageStatement{
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
class BaseMockSqliteStatement
|
class BaseMockSqliteStatement
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using Database = SqliteDatabaseMock;
|
||||||
|
|
||||||
BaseMockSqliteStatement() = default;
|
BaseMockSqliteStatement() = default;
|
||||||
BaseMockSqliteStatement(SqliteDatabaseMock &databaseMock)
|
BaseMockSqliteStatement(SqliteDatabaseMock &databaseMock)
|
||||||
: m_databaseMock{&databaseMock}
|
: m_databaseMock{&databaseMock}
|
||||||
@@ -112,9 +114,9 @@ Utils::PathString BaseMockSqliteStatement::fetchValue<Utils::PathString>(int col
|
|||||||
|
|
||||||
template<int ResultCount = 1, int BindParameterCount = 0>
|
template<int ResultCount = 1, int BindParameterCount = 0>
|
||||||
class MockSqliteStatement
|
class MockSqliteStatement
|
||||||
: public Sqlite::StatementImplementation<NiceMock<BaseMockSqliteStatement>, ResultCount, BindParameterCount>
|
: public Sqlite::StatementImplementation<BaseMockSqliteStatement, ResultCount, BindParameterCount>
|
||||||
{
|
{
|
||||||
using Base = Sqlite::StatementImplementation<NiceMock<BaseMockSqliteStatement>, ResultCount, BindParameterCount>;
|
using Base = Sqlite::StatementImplementation<BaseMockSqliteStatement, ResultCount, BindParameterCount>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MockSqliteStatement(SqliteDatabaseMock &databaseMock)
|
explicit MockSqliteStatement(SqliteDatabaseMock &databaseMock)
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
|
Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
|
||||||
Sqlite::ImmediateTransaction transaction{database};
|
Sqlite::ImmediateTransaction<Sqlite::Database> transaction{database};
|
||||||
Initializer initializer{database};
|
Initializer initializer{database};
|
||||||
Sqlite::ReadStatement<2> selectViewsStatement{"SELECT key, value FROM data ORDER BY key",
|
Sqlite::ReadStatement<2> selectViewsStatement{"SELECT key, value FROM data ORDER BY key",
|
||||||
database};
|
database};
|
||||||
|
|||||||
Reference in New Issue
Block a user