From 8fc953734e3d789ddee0fba8db9a35979ccbd5cb Mon Sep 17 00:00:00 2001 From: Rafal Krypa Date: Mon, 30 Jun 2014 13:34:43 +0200 Subject: [PATCH] In PrivilegeDb use function instead of macro for common exception handling Reuse concept appearing in client-common.h to write repeated exception handling code only once. It is based on C++11 lamba function feature, which is superior to legacy macro in terms of type safety and debuggability. Change-Id: If8f11246b97e7f10aa173d35018f5384527b16ee Signed-off-by: Rafal Krypa --- src/server/db/privilege_db.cpp | 66 ++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/server/db/privilege_db.cpp b/src/server/db/privilege_db.cpp index 0f50460..d843c27 100644 --- a/src/server/db/privilege_db.cpp +++ b/src/server/db/privilege_db.cpp @@ -37,19 +37,26 @@ #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 +T try_catch(const std::function &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 { @@ -71,28 +78,28 @@ PrivilegeDb::~PrivilegeDb() void PrivilegeDb::BeginTransaction(void) { - try { + try_catch([&] { mSqlConnection->BeginTransaction(); - }CATCH_STANDARD_EXCEPTIONS; + }); } void PrivilegeDb::CommitTransaction(void) { - try { + try_catch([&] { mSqlConnection->CommitTransaction(); - }CATCH_STANDARD_EXCEPTIONS; + }); } void PrivilegeDb::RollbackTransaction(void) { - try { + try_catch([&] { mSqlConnection->RollbackTransaction(); - }CATCH_STANDARD_EXCEPTIONS; + }); } bool PrivilegeDb::PkgIdExists(const std::string &pkgId) { - try { + return try_catch([&] { DB::SqlConnection::DataCommandAutoPtr command = mSqlConnection->PrepareDataCommand( Queries.at(QueryType::EPkgIdExists)); @@ -103,9 +110,8 @@ bool PrivilegeDb::PkgIdExists(const std::string &pkgId) return true; }; - }CATCH_STANDARD_EXCEPTIONS; - - return false; + return false; + }); } void PrivilegeDb::AddApplication(const std::string &appId, @@ -113,7 +119,7 @@ void PrivilegeDb::AddApplication(const std::string &appId, { pkgIdIsNew = !(this->PkgIdExists(pkgId)); - try { + try_catch([&] { DB::SqlConnection::DataCommandAutoPtr command = mSqlConnection->PrepareDataCommand( Queries.at(QueryType::EAddApplication)); @@ -128,14 +134,13 @@ void PrivilegeDb::AddApplication(const std::string &appId, 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([&] { DB::SqlConnection::DataCommandAutoPtr command = mSqlConnection->PrepareDataCommand( Queries.at(QueryType::ERemoveApplication)); @@ -152,14 +157,13 @@ void PrivilegeDb::RemoveApplication(const std::string &appId, 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([&] { DB::SqlConnection::DataCommandAutoPtr command = mSqlConnection->PrepareDataCommand( Queries.at(QueryType::EGetPkgPermissions)); @@ -170,8 +174,7 @@ void PrivilegeDb::GetPkgPermissions(const std::string &pkgId, LogPedantic ("Got permission: "<< permission); currentPermissions.push_back(permission); }; - - }CATCH_STANDARD_EXCEPTIONS; + }); } void PrivilegeDb::UpdatePermissions(const std::string &appId, @@ -179,7 +182,7 @@ void PrivilegeDb::UpdatePermissions(const std::string &appId, TPermissionsList &addedPermissions, TPermissionsList &removedPermissions) { - try { + try_catch([&] { DB::SqlConnection::DataCommandAutoPtr command; TPermissionsList curPermissions = TPermissionsList(); GetPkgPermissions(pkgId, curPermissions); @@ -239,7 +242,6 @@ void PrivilegeDb::UpdatePermissions(const std::string &appId, LogPedantic( "Removed appId: " << appId << ", pkgId: " << pkgId << ", permission: " << removedPermission); } - - }CATCH_STANDARD_EXCEPTIONS; + }); } } //namespace SecurityManager -- 2.7.4