summaryrefslogtreecommitdiff
path: root/src/dal/sqlitedataprovider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dal/sqlitedataprovider.cpp')
-rw-r--r--src/dal/sqlitedataprovider.cpp179
1 files changed, 175 insertions, 4 deletions
diff --git a/src/dal/sqlitedataprovider.cpp b/src/dal/sqlitedataprovider.cpp
index b126c19a..fb539ece 100644
--- a/src/dal/sqlitedataprovider.cpp
+++ b/src/dal/sqlitedataprovider.cpp
@@ -32,6 +32,10 @@ namespace dal
{
+const std::string SqLiteDataProvider::CFGPARAM_SQLITE_DB = "sqlite_database";
+const std::string SqLiteDataProvider::CFGPARAM_SQLITE_DB_DEF = "tmw.db";
+
+
/**
* Constructor.
*/
@@ -78,10 +82,15 @@ SqLiteDataProvider::getDbBackend(void) const
* Create a connection to the database.
*/
void
-SqLiteDataProvider::connect(const std::string& dbName,
- const std::string& userName,
- const std::string& password)
+SqLiteDataProvider::connect()
{
+ // get configuration parameter for sqlite
+ const std::string dbName
+ = Configuration::getValue(CFGPARAM_SQLITE_DB, CFGPARAM_SQLITE_DB_DEF);
+
+ LOG_INFO("Trying to connect with SQLite database file '"
+ << dbName << "'");
+
// sqlite3_open creates the database file if it does not exist
// as a side-effect.
if (sqlite3_open(dbName.c_str(), &mDb) != SQLITE_OK) {
@@ -104,6 +113,7 @@ SqLiteDataProvider::connect(const std::string& dbName,
mDbName = dbName;
mIsConnected = true;
+ LOG_INFO("Connection to database sucessfull.");
}
@@ -118,7 +128,7 @@ SqLiteDataProvider::execSql(const std::string& sql,
throw std::runtime_error("not connected to database");
}
- LOG_DEBUG("Performing SQL querry: "<<sql);
+ LOG_DEBUG("Performing SQL query: "<<sql);
// do something only if the query is different from the previous
// or if the cache must be refreshed
@@ -198,5 +208,166 @@ SqLiteDataProvider::disconnect(void)
mIsConnected = false;
}
+void
+SqLiteDataProvider::beginTransaction(void)
+ throw (std::runtime_error)
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "Trying to begin a transaction while not "
+ "connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ if (inTransaction())
+ {
+ const std::string error = "Trying to begin a transaction while anoter "
+ "one is still open!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ // trying to open a transaction
+ try
+ {
+ execSql("BEGIN TRANSACTION;");
+ LOG_DEBUG("SQL: started transaction");
+ }
+ catch (const DbSqlQueryExecFailure &e)
+ {
+ std::ostringstream error;
+ error << "SQL ERROR while trying to start a transaction: " << e.what();
+ LOG_ERROR(error);
+ throw std::runtime_error(error.str());
+ }
+}
+
+void
+SqLiteDataProvider::commitTransaction(void)
+ throw (std::runtime_error)
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "Trying to commit a transaction while not "
+ "connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ if (!inTransaction())
+ {
+ const std::string error = "Trying to commit a transaction while no "
+ "one is open!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ // trying to commit a transaction
+ try
+ {
+ execSql("COMMIT TRANSACTION;");
+ LOG_DEBUG("SQL: commited transaction");
+ }
+ catch (const DbSqlQueryExecFailure &e)
+ {
+ std::ostringstream error;
+ error << "SQL ERROR while trying to commit a transaction: " << e.what();
+ LOG_ERROR(error);
+ throw std::runtime_error(error.str());
+ }
+}
+
+void
+SqLiteDataProvider::rollbackTransaction(void)
+ throw (std::runtime_error)
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "Trying to rollback a transaction while not "
+ "connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ if (!inTransaction())
+ {
+ const std::string error = "Trying to rollback a transaction while no "
+ "one is open!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ // trying to rollback a transaction
+ try
+ {
+ execSql("ROLLBACK TRANSACTION;");
+ LOG_DEBUG("SQL: transaction rolled back");
+ }
+ catch (const DbSqlQueryExecFailure &e)
+ {
+ std::ostringstream error;
+ error << "SQL ERROR while trying to rollback a transaction: " << e.what();
+ LOG_ERROR(error);
+ throw std::runtime_error(error.str());
+ }
+}
+
+const unsigned int
+SqLiteDataProvider::getModifiedRows(void) const
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "Trying to getModifiedRows while not "
+ "connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ return (unsigned int)sqlite3_changes(mDb);
+}
+
+const bool
+SqLiteDataProvider::inTransaction(void) const
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "not connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ // The sqlite3_get_autocommit() interface returns non-zero or zero if the
+ // given database connection is or is not in autocommit mode, respectively.
+ // Autocommit mode is on by default. Autocommit mode is disabled by a BEGIN
+ // statement. Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+ const int ret = sqlite3_get_autocommit(mDb);
+ if (ret == 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+const unsigned int
+SqLiteDataProvider::getLastId(void) const
+{
+ if (!mIsConnected)
+ {
+ const std::string error = "not connected to the database!";
+ LOG_ERROR(error);
+ throw std::runtime_error(error);
+ }
+
+ // FIXME: not sure if this is correct to bring 64bit int into int?
+ const sqlite3_int64 lastId = sqlite3_last_insert_rowid(mDb);
+ if (lastId > UINT_MAX)
+ throw std::runtime_error("SqLiteDataProvider::getLastId exceeded INT_MAX");
+
+ return (unsigned int)lastId;
+}
} // namespace dal