#include "privilege_db.h"
#define SET_CONTAINS(set,value) set.find(value)!=set.end()
-#define CATCH_STANDARD_EXCEPTIONS \
- catch (DB::SqlConnection::Exception::SyntaxError &e) { \
- LogDebug("Syntax error in command: " << e.DumpToString()); \
- ThrowMsg(PrivilegeDb::Exception::InternalError, \
- "Syntax error in command: " << e.DumpToString()); \
- } catch (DB::SqlConnection::Exception::InternalError &e) { \
- LogDebug("Mysterious internal error in SqlConnection class" << e.DumpToString()); \
- ThrowMsg(PrivilegeDb::Exception::InternalError, \
- "Mysterious internal error in SqlConnection class: " << e.DumpToString()); \
- }
namespace SecurityManager {
+/* Common code for handling SqlConnection exceptions */
+template <typename T>
+T try_catch(const std::function<T()> &func)
+{
+ try {
+ return func();
+ } catch (DB::SqlConnection::Exception::SyntaxError &e) {
+ LogError("Syntax error in command: " << e.DumpToString());
+ ThrowMsg(PrivilegeDb::Exception::InternalError,
+ "Syntax error in command: " << e.DumpToString());
+ } catch (DB::SqlConnection::Exception::InternalError &e) {
+ LogError("Mysterious internal error in SqlConnection class" << e.DumpToString());
+ ThrowMsg(PrivilegeDb::Exception::InternalError,
+ "Mysterious internal error in SqlConnection class: " << e.DumpToString());
+ }
+}
+
PrivilegeDb::PrivilegeDb(const std::string &path)
{
try {
void PrivilegeDb::BeginTransaction(void)
{
- try {
+ try_catch<void>([&] {
mSqlConnection->BeginTransaction();
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
void PrivilegeDb::CommitTransaction(void)
{
- try {
+ try_catch<void>([&] {
mSqlConnection->CommitTransaction();
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
void PrivilegeDb::RollbackTransaction(void)
{
- try {
+ try_catch<void>([&] {
mSqlConnection->RollbackTransaction();
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
bool PrivilegeDb::PkgIdExists(const std::string &pkgId)
{
- try {
+ return try_catch<bool>([&] {
DB::SqlConnection::DataCommandAutoPtr command =
mSqlConnection->PrepareDataCommand(
Queries.at(QueryType::EPkgIdExists));
return true;
};
- }CATCH_STANDARD_EXCEPTIONS;
-
- return false;
+ return false;
+ });
}
void PrivilegeDb::AddApplication(const std::string &appId,
{
pkgIdIsNew = !(this->PkgIdExists(pkgId));
- try {
+ try_catch<void>([&] {
DB::SqlConnection::DataCommandAutoPtr command =
mSqlConnection->PrepareDataCommand(
Queries.at(QueryType::EAddApplication));
command->Reset();
LogPedantic( "Added appId: " << appId << ", pkgId: " << pkgId);
-
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
void PrivilegeDb::RemoveApplication(const std::string &appId,
const std::string &pkgId, bool &pkgIdIsNoMore)
{
- try {
+ try_catch<void>([&] {
DB::SqlConnection::DataCommandAutoPtr command =
mSqlConnection->PrepareDataCommand(
Queries.at(QueryType::ERemoveApplication));
LogPedantic( "Removed appId: " << appId << ", pkgId: " << pkgId);
pkgIdIsNoMore = !(this->PkgIdExists(pkgId));
-
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
void PrivilegeDb::GetPkgPermissions(const std::string &pkgId,
TPermissionsList ¤tPermissions)
{
- try {
+ try_catch<void>([&] {
DB::SqlConnection::DataCommandAutoPtr command =
mSqlConnection->PrepareDataCommand(
Queries.at(QueryType::EGetPkgPermissions));
LogPedantic ("Got permission: "<< permission);
currentPermissions.push_back(permission);
};
-
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
void PrivilegeDb::UpdatePermissions(const std::string &appId,
TPermissionsList &addedPermissions,
TPermissionsList &removedPermissions)
{
- try {
+ try_catch<void>([&] {
DB::SqlConnection::DataCommandAutoPtr command;
TPermissionsList curPermissions = TPermissionsList();
GetPkgPermissions(pkgId, curPermissions);
LogPedantic(
"Removed appId: " << appId << ", pkgId: " << pkgId << ", permission: " << removedPermission);
}
-
- }CATCH_STANDARD_EXCEPTIONS;
+ });
}
} //namespace SecurityManager