From a322fb9a4273aa1ae2f9a4afff70adcc13b6bbf6 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 23 Aug 2017 18:06:07 +0200 Subject: [PATCH] feat(EventsDb): impl `getEventsCount` --- src/db/events-db.cpp | 216 ++++++++++++++++++++++++++++++------------- src/db/events-db.h | 10 +- src/logger/logger.h | 6 ++ 3 files changed, 165 insertions(+), 67 deletions(-) diff --git a/src/db/events-db.cpp b/src/db/events-db.cpp index 82431fa0a..e8d0fa857 100644 --- a/src/db/events-db.cpp +++ b/src/db/events-db.cpp @@ -24,6 +24,7 @@ #include "event/call-event.h" #include "event/event.h" #include "event/message-event.h" +#include "logger/logger.h" #include "events-db.h" @@ -39,8 +40,50 @@ class EventsDbPrivate : public AbstractDbPrivate {}; EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} -void EventsDb::init () { - #ifdef SOCI_ENABLED +// ----------------------------------------------------------------------------- +// Helpers. +// ----------------------------------------------------------------------------- + +inline string mapFilterToSqlEvent (EventsDb::Filter filter) { + switch (filter) { + case EventsDb::NoFilter: + break; + case EventsDb::MessageFilter: + return "0"; + case EventsDb::CallFilter: + return "1"; + case EventsDb::ConferenceFilter: + return "2"; + } + + return ""; +} + +static string buildSqlEventFilter (const list &filters, EventsDb::FilterMask mask) { + bool isStart = true; + string sql; + for (const auto &filter : filters) { + if (!(mask & filter)) + continue; + + if (isStart) { + isStart = false; + sql += " WHERE "; + } else + sql += " OR "; + sql += " type = " + mapFilterToSqlEvent(filter); + } + + return sql; +} + +// ----------------------------------------------------------------------------- +// Soci backend. +// ----------------------------------------------------------------------------- + +#ifdef SOCI_ENABLED + + void EventsDb::init () { L_D(EventsDb); soci::session *session = d->dbSession.getBackendSession(); @@ -102,75 +145,124 @@ void EventsDb::init () { " REFERENCES message_direction(id)" " ON DELETE CASCADE" ")"; - - #endif // ifdef SOCI_ENABLED -} - -// ----------------------------------------------------------------------------- - -bool EventsDb::addEvent (const Event &event) { - // TODO. - switch (event.getType()) { - case Event::None: - return false; - case Event::MessageEvent: - case Event::CallStartEvent: - case Event::CallEndEvent: - break; } - return true; -} + bool EventsDb::addEvent (const Event &event) { + // TODO. + switch (event.getType()) { + case Event::None: + return false; + case Event::MessageEvent: + case Event::CallStartEvent: + case Event::CallEndEvent: + break; + } -bool EventsDb::deleteEvent (const Event &event) { - // TODO. - (void)event; - return true; -} + return true; + } -void EventsDb::cleanEvents (FilterMask mask) { - // TODO. - (void)mask; -} + bool EventsDb::deleteEvent (const Event &event) { + // TODO. + (void)event; + return true; + } -int EventsDb::getEventsCount (FilterMask mask) { - // TODO. - (void)mask; - return 0; -} + void EventsDb::cleanEvents (FilterMask mask) { + // TODO. + (void)mask; + } -int EventsDb::getMessagesCount (const string &remoteAddress) { - // TODO. - (void)remoteAddress; - return 0; -} + int EventsDb::getEventsCount (FilterMask mask) const { + L_D(const EventsDb); -int EventsDb::getUnreadMessagesCount (const string &remoteAddress) { - // TODO. - (void)remoteAddress; - return 0; -} + string query = "SELECT COUNT(*) FROM event" + + buildSqlEventFilter({ MessageFilter, CallFilter, ConferenceFilter }, mask); + int count = 0; -list EventsDb::getHistory (const string &remoteAddress, int nLast, FilterMask mask) { - // TODO. - (void)remoteAddress; - (void)nLast; - (void)mask; - return list(); -} + L_BEGIN_LOG_EXCEPTION -list EventsDb::getHistory (const string &remoteAddress, int begin, int end, FilterMask mask) { - // TODO. - (void)remoteAddress; - (void)begin; - (void)end; - (void)mask; - return list(); -} + soci::session *session = d->dbSession.getBackendSession(); + *session << query, soci::into(count); -void EventsDb::cleanHistory (const string &remoteAddress) { - // TODO. - (void)remoteAddress; -} + L_END_LOG_EXCEPTION + + return count; + } + + int EventsDb::getMessagesCount (const string &remoteAddress) const { + // TODO. + (void)remoteAddress; + return 0; + } + + int EventsDb::getUnreadMessagesCount (const string &remoteAddress) const { + // TODO. + (void)remoteAddress; + return 0; + } + + list EventsDb::getHistory (const string &remoteAddress, int nLast, FilterMask mask) const { + // TODO. + (void)remoteAddress; + (void)nLast; + (void)mask; + return list(); + } + + list EventsDb::getHistory (const string &remoteAddress, int begin, int end, FilterMask mask) const { + // TODO. + (void)remoteAddress; + (void)begin; + (void)end; + (void)mask; + return list(); + } + + void EventsDb::cleanHistory (const string &remoteAddress) { + // TODO. + (void)remoteAddress; + } + +// ----------------------------------------------------------------------------- +// No backend. +// ----------------------------------------------------------------------------- + +#else + + void EventsDb::init () {} + + bool EventsDb::addEvent (const Event &) { + return false; + } + + bool EventsDb::deleteEvent (const Event &) { + return false; + } + + void EventsDb::cleanEvents (FilterMask) {} + + int EventsDb::getEventsCount (FilterMask) const { + return 0; + } + + int EventsDb::getMessagesCount (const string &) const { + return 0; + } + + int EventsDb::getUnreadMessagesCount (const string &) const { + return 0; + } + + list EventsDb::getHistory (const string &, int, FilterMask) const { + return list(); + } + + list EventsDb::getHistory (const string &, int, int, FilterMask) const { + return list(); + } + + void EventsDb::cleanHistory (const string &) {} + +#endif // ifdef SOCI_ENABLED LINPHONE_END_NAMESPACE diff --git a/src/db/events-db.h b/src/db/events-db.h index 1c77af3a9..5a1b1bfb3 100644 --- a/src/db/events-db.h +++ b/src/db/events-db.h @@ -47,13 +47,13 @@ public: bool addEvent (const Event &event); bool deleteEvent (const Event &event); void cleanEvents (FilterMask mask = NoFilter); - int getEventsCount (FilterMask mask = NoFilter); + int getEventsCount (FilterMask mask = NoFilter) const; // Messages, calls and conferences. - int getMessagesCount (const std::string &remoteAddress); - int getUnreadMessagesCount (const std::string &remoteAddress); - std::list getHistory (const std::string &remoteAddress, int nLast, FilterMask mask = NoFilter); - std::list getHistory (const std::string &remoteAddress, int begin, int end, FilterMask mask = NoFilter); + int getMessagesCount (const std::string &remoteAddress) const; + int getUnreadMessagesCount (const std::string &remoteAddress) const; + std::list getHistory (const std::string &remoteAddress, int nLast, FilterMask mask = NoFilter) const; + std::list getHistory (const std::string &remoteAddress, int begin, int end, FilterMask mask = NoFilter) const; void cleanHistory (const std::string &remoteAddress); protected: diff --git a/src/logger/logger.h b/src/logger/logger.h index c3c209c1e..2314a9ea9 100644 --- a/src/logger/logger.h +++ b/src/logger/logger.h @@ -57,4 +57,10 @@ LINPHONE_END_NAMESPACE #define lError() LINPHONE_NAMESPACE::Logger(Logger::Error).getOutput() #define lFatal() LINPHONE_NAMESPACE::Logger(Logger::Fatal).getOutput() +#define L_BEGIN_LOG_EXCEPTION try { + #define L_END_LOG_EXCEPTION \ +} catch (const exception &e) { \ + lWarning() << "Error: " << e.what(); \ +} + #endif // ifndef _LOGGER_H_