Added support for SQLite transaction types using Session property (#3018)

This commit is contained in:
Maksim Kita
2022-05-30 05:06:48 +02:00
committed by GitHub
parent 2b7b9531f1
commit 5c29df0860
5 changed files with 81 additions and 7 deletions

View File

@@ -38,8 +38,10 @@ namespace Poco {
namespace Data {
namespace SQLite {
const std::string TRANSACTION_TYPE_PROPERTY_KEY = "transactionType";
const std::string SessionImpl::DEFERRED_BEGIN_TRANSACTION("BEGIN DEFERRED");
const std::string SessionImpl::EXCLUSIVE_BEGIN_TRANSACTION("BEGIN EXCLUSIVE");
const std::string SessionImpl::IMMEDIATE_BEGIN_TRANSACTION("BEGIN IMMEDIATE");
const std::string SessionImpl::COMMIT_TRANSACTION("COMMIT");
const std::string SessionImpl::ABORT_TRANSACTION("ROLLBACK");
@@ -49,7 +51,8 @@ SessionImpl::SessionImpl(const std::string& fileName, std::size_t loginTimeout):
_connector(Connector::KEY),
_pDB(0),
_connected(false),
_isTransaction(false)
_isTransaction(false),
_transactionType(TransactionType::deferred)
{
open();
setConnectionTimeout(loginTimeout);
@@ -58,6 +61,7 @@ SessionImpl::SessionImpl(const std::string& fileName, std::size_t loginTimeout):
&SessionImpl::autoCommit,
&SessionImpl::isAutoCommit);
addProperty("connectionTimeout", &SessionImpl::setConnectionTimeout, &SessionImpl::getConnectionTimeout);
addProperty(TRANSACTION_TYPE_PROPERTY_KEY, &SessionImpl::setTransactionType, &SessionImpl::getTransactionType);
}
@@ -85,7 +89,18 @@ void SessionImpl::begin()
{
Poco::Mutex::ScopedLock l(_mutex);
SQLiteStatementImpl tmp(*this, _pDB);
tmp.add(DEFERRED_BEGIN_TRANSACTION);
switch (_transactionType)
{
case TransactionType::deferred:
tmp.add(DEFERRED_BEGIN_TRANSACTION);
break;
case TransactionType::exclusive:
tmp.add(EXCLUSIVE_BEGIN_TRANSACTION);
break;
case TransactionType::immediate:
tmp.add(IMMEDIATE_BEGIN_TRANSACTION);
break;
}
tmp.execute();
_isTransaction = true;
}
@@ -223,6 +238,20 @@ Poco::Any SessionImpl::getConnectionTimeout(const std::string& prop) const
return Poco::Any(_timeout/1000);
}
void SessionImpl::setTransactionType(TransactionType transactionType)
{
_transactionType = transactionType;
}
void SessionImpl::setTransactionType(const std::string &prop, const Poco::Any& value)
{
setTransactionType(Poco::RefAnyCast<TransactionType>(value));
}
Poco::Any SessionImpl::getTransactionType(const std::string& prop) const
{
return Poco::Any(_transactionType);
}
void SessionImpl::autoCommit(const std::string&, bool)
{