From 367243d2240faef58e13632677a9b95b26c14173 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 13 Oct 2017 15:46:45 +0200 Subject: [PATCH] feat(MainDb): chatroom fetch in progress --- src/CMakeLists.txt | 4 +- src/chat/chat-message/chat-message-p.h | 2 - src/chat/chat-message/chat-message.cpp | 1 - src/db/{events-db.cpp => main-db.cpp} | 131 ++++++++++++++++--------- src/db/{events-db.h => main-db.h} | 24 +++-- src/event-log/event-log.h | 2 +- tester/events-db-tester.cpp | 2 +- 7 files changed, 104 insertions(+), 62 deletions(-) rename src/db/{events-db.cpp => main-db.cpp} (86%) rename src/db/{events-db.h => main-db.h} (84%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 545159bc4..1d8c0c1c1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,7 +82,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/core.h db/abstract/abstract-db-p.h db/abstract/abstract-db.h - db/events-db.h + db/main-db.h db/session/db-session-p.h db/session/db-session-provider.h db/session/db-session.h @@ -159,7 +159,7 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES content/content.cpp core/core.cpp db/abstract/abstract-db.cpp - db/events-db.cpp + db/main-db.cpp db/session/db-session-provider.cpp db/session/db-session.cpp event-log/call-event.cpp diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index cf827e2f7..accd87b3c 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -26,7 +26,6 @@ #include "chat/notification/imdn.h" #include "content/content.h" #include "content/content-type.h" -#include "db/events-db.h" #include "object/object-p.h" #include "sal/sal.h" @@ -137,7 +136,6 @@ private: std::list contents; Content internalContent; std::unordered_map customHeaders; - std::shared_ptr eventsDb; mutable LinphoneErrorInfo * errorInfo = NULL; belle_http_request_t *httpRequest = NULL; belle_http_request_listener_t *httpListener = NULL; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index d163223e8..ebcf0e8c8 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "db/events-db.h" #include "object/object-p.h" #include "linphone/core.h" diff --git a/src/db/events-db.cpp b/src/db/main-db.cpp similarity index 86% rename from src/db/events-db.cpp rename to src/db/main-db.cpp index e827d244e..5d7918755 100644 --- a/src/db/events-db.cpp +++ b/src/db/main-db.cpp @@ -1,5 +1,5 @@ /* - * events-db.cpp + * main-db.cpp * Copyright (C) 2010-2017 Belledonne Communications SARL * * This program is free software; you can redistribute it and/or @@ -38,7 +38,7 @@ #include "event-log/event-log-p.h" #include "logger/logger.h" -#include "events-db.h" +#include "main-db.h" // ============================================================================= @@ -55,7 +55,7 @@ struct MessageEventReferences { #endif }; -class EventsDbPrivate : public AbstractDbPrivate { +class MainDbPrivate : public AbstractDbPrivate { #ifdef SOCI_ENABLED public: long insertSipAddress (const string &sipAddress); @@ -80,12 +80,14 @@ public: #endif private: - L_DECLARE_PUBLIC(EventsDb); + unordered_map> chatRooms; + + L_DECLARE_PUBLIC(MainDb); }; // ----------------------------------------------------------------------------- -EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} +MainDb::MainDb () : AbstractDb(*new MainDbPrivate) {} #ifdef SOCI_ENABLED @@ -106,13 +108,13 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} ); } - static constexpr EnumToSql eventFilterToSql[] = { - { EventsDb::MessageFilter, "1" }, - { EventsDb::CallFilter, "2" }, - { EventsDb::ConferenceFilter, "3" } + static constexpr EnumToSql eventFilterToSql[] = { + { MainDb::MessageFilter, "1" }, + { MainDb::CallFilter, "2" }, + { MainDb::ConferenceFilter, "3" } }; - static constexpr const char *mapEventFilterToSql (EventsDb::Filter filter) { + static constexpr const char *mapEventFilterToSql (MainDb::Filter filter) { return mapEnumToSql( eventFilterToSql, sizeof eventFilterToSql / sizeof eventFilterToSql[0], filter ); @@ -120,14 +122,14 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} // ----------------------------------------------------------------------------- - static string buildSqlEventFilter (const list &filters, EventsDb::FilterMask mask) { + static string buildSqlEventFilter (const list &filters, MainDb::FilterMask mask) { L_ASSERT( - find_if(filters.cbegin(), filters.cend(), [](const EventsDb::Filter &filter) { - return filter == EventsDb::NoFilter; + find_if(filters.cbegin(), filters.cend(), [](const MainDb::Filter &filter) { + return filter == MainDb::NoFilter; }) == filters.cend() ); - if (mask == EventsDb::NoFilter) + if (mask == MainDb::NoFilter) return ""; bool isStart = true; @@ -150,7 +152,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} // ----------------------------------------------------------------------------- - long EventsDbPrivate::insertSipAddress (const string &sipAddress) { + long MainDbPrivate::insertSipAddress (const string &sipAddress) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -163,7 +165,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return q->getLastInsertId(); } - void EventsDbPrivate::insertContent (long messageEventId, const Content &content) { + void MainDbPrivate::insertContent (long messageEventId, const Content &content) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -180,7 +182,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} soci::use(messageContentId), soci::use(appData.first), soci::use(appData.second); } - long EventsDbPrivate::insertContentType (const string &contentType) { + long MainDbPrivate::insertContentType (const string &contentType) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -193,7 +195,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return q->getLastInsertId(); } - long EventsDbPrivate::insertEvent (EventLog::Type type, const tm &date) { + long MainDbPrivate::insertEvent (EventLog::Type type, const tm &date) { L_Q(); soci::session *session = dbSession.getBackendSession(); @@ -202,7 +204,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return q->getLastInsertId(); } - long EventsDbPrivate::insertChatRoom (long sipAddressId, int capabilities, const tm &date) { + long MainDbPrivate::insertChatRoom (long sipAddressId, int capabilities, const tm &date) { soci::session *session = dbSession.getBackendSession(); long id; @@ -219,7 +221,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return sipAddressId; } - void EventsDbPrivate::insertChatRoomParticipant (long chatRoomId, long sipAddressId, bool isAdmin) { + void MainDbPrivate::insertChatRoomParticipant (long chatRoomId, long sipAddressId, bool isAdmin) { soci::session *session = dbSession.getBackendSession(); soci::statement statement = ( session->prepare << "UPDATE chat_room_participant SET is_admin = :isAdmin" @@ -233,7 +235,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} soci::use(chatRoomId), soci::use(sipAddressId), soci::use(static_cast(isAdmin)); } - long EventsDbPrivate::insertMessageEvent ( + long MainDbPrivate::insertMessageEvent ( const MessageEventReferences &references, ChatMessage::State state, ChatMessage::Direction direction, @@ -262,7 +264,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return messageEventId; } - void EventsDbPrivate::insertMessageParticipant (long messageEventId, long sipAddressId, ChatMessage::State state) { + void MainDbPrivate::insertMessageParticipant (long messageEventId, long sipAddressId, ChatMessage::State state) { soci::session *session = dbSession.getBackendSession(); soci::statement statement = ( session->prepare << "UPDATE message_participant SET state = :state" @@ -304,7 +306,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return T(); } - void EventsDbPrivate::importLegacyMessages (const soci::rowset &messages) { + void MainDbPrivate::importLegacyMessages (const soci::rowset &messages) { soci::session *session = dbSession.getBackendSession(); soci::transaction tr(*session); @@ -395,7 +397,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} // ----------------------------------------------------------------------------- - void EventsDb::init () { + void MainDb::init () { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -561,7 +563,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} *session << participantMessageDeleter; } - bool EventsDb::addEvent (const EventLog &eventLog) { + bool MainDb::addEvent (const EventLog &eventLog) { if (!isConnected()) { lWarning() << "Unable to add event. Not connected."; return false; @@ -586,7 +588,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return true; } - bool EventsDb::deleteEvent (const EventLog &eventLog) { + bool MainDb::deleteEvent (const EventLog &eventLog) { L_D(); if (!isConnected()) { @@ -609,7 +611,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return id == -1; } - void EventsDb::cleanEvents (FilterMask mask) { + void MainDb::cleanEvents (FilterMask mask) { L_D(); if (!isConnected()) { @@ -628,7 +630,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} L_END_LOG_EXCEPTION } - int EventsDb::getEventsCount (FilterMask mask) const { + int MainDb::getEventsCount (FilterMask mask) const { L_D(); if (!isConnected()) { @@ -650,7 +652,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return count; } - int EventsDb::getMessagesCount (const string &peerAddress) const { + int MainDb::getMessagesCount (const string &peerAddress) const { L_D(); if (!isConnected()) { @@ -680,7 +682,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return count; } - int EventsDb::getUnreadMessagesCount (const string &peerAddress) const { + int MainDb::getUnreadMessagesCount (const string &peerAddress) const { L_D(); if (!isConnected()) { @@ -713,7 +715,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return count; } - list> EventsDb::getHistory (const string &peerAddress, int nLast, FilterMask mask) const { + list> MainDb::getHistory (const string &peerAddress, int nLast, FilterMask mask) const { if (!isConnected()) { lWarning() << "Unable to get history. Not connected."; return list>(); @@ -726,7 +728,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return list>(); } - list> EventsDb::getHistory ( + list> MainDb::getHistory ( const string &peerAddress, int begin, int end, @@ -745,7 +747,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} return list>(); } - void EventsDb::cleanHistory (const string &peerAddress, FilterMask mask) { + void MainDb::cleanHistory (const string &peerAddress, FilterMask mask) { L_D(); if (!isConnected()) { @@ -754,7 +756,7 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} } string query; - if (mask == EventsDb::NoFilter || mask & MessageFilter) + if (mask == MainDb::NoFilter || mask & MessageFilter) query += "SELECT event_id FROM message_event WHERE chat_room_id = (" " SELECT peer_sip_address_id FROM chat_room WHERE peer_sip_address_id = (" " SELECT id FROM sip_address WHERE value = :peerAddress" @@ -774,7 +776,42 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} // ----------------------------------------------------------------------------- - bool EventsDb::import (Backend, const string ¶meters) { +shared_ptr MainDb::findChatRoom (const string &peerAddress) const { + L_D(); + + const auto it = d->chatRooms.find(peerAddress); + if (it != d->chatRooms.cend()) { + try { + return it->second.lock(); + } catch (const exception &) { + lError() << "Cannot lock chat room: `" + peerAddress + "`"; + } + } else { + L_BEGIN_LOG_EXCEPTION + + soci::session *session = d->dbSession.getBackendSession(); + + tm creationDate; + tm lastUpdateDate; + int capabilities; + string subject; + + *session << "SELECT creation_date, last_update_date, capabilities, subject " + " FROM chat_room" + " WHERE peer_sip_address_id = (" + " SELECT id from sip_address WHERE value = :peerAddress" + " )", soci::use(peerAddress), soci::into(creationDate), soci::into(lastUpdateDate), + soci::use(capabilities), soci::use(subject); + + L_END_LOG_EXCEPTION + } + + return shared_ptr(); +} + +// ----------------------------------------------------------------------------- + + bool MainDb::import (Backend, const string ¶meters) { L_D(); if (!isConnected()) { @@ -817,41 +854,43 @@ EventsDb::EventsDb () : AbstractDb(*new EventsDbPrivate) {} #else - void EventsDb::init () {} + void MainDb::init () {} - bool EventsDb::addEvent (const EventLog &) { + bool MainDb::addEvent (const EventLog &) { return false; } - bool EventsDb::deleteEvent (const EventLog &) { + bool MainDb::deleteEvent (const EventLog &) { return false; } - void EventsDb::cleanEvents (FilterMask) {} + void MainDb::cleanEvents (FilterMask) {} - int EventsDb::getEventsCount (FilterMask) const { + int MainDb::getEventsCount (FilterMask) const { return 0; } - int EventsDb::getMessagesCount (const string &) const { + int MainDb::getMessagesCount (const string &) const { return 0; } - int EventsDb::getUnreadMessagesCount (const string &) const { + int MainDb::getUnreadMessagesCount (const string &) const { return 0; } - list> EventsDb::getHistory (const string &, int, FilterMask) const { + list> MainDb::getHistory (const string &, int, FilterMask) const { return list>(); } - list> EventsDb::getHistory (const string &, int, int, FilterMask) const { + list> MainDb::getHistory (const string &, int, int, FilterMask) const { return list>(); } - void EventsDb::cleanHistory (const string &, FilterMask) {} + void MainDb::cleanHistory (const string &, FilterMask) {} - bool EventsDb::import (Backend, const string &) { + shared_ptr MainDb::findChatRoom (const string &) const {} + + bool MainDb::import (Backend, const string &) { return false; } diff --git a/src/db/events-db.h b/src/db/main-db.h similarity index 84% rename from src/db/events-db.h rename to src/db/main-db.h index d582f5149..1cc262bc1 100644 --- a/src/db/events-db.h +++ b/src/db/main-db.h @@ -1,5 +1,5 @@ /* - * events-db.h + * main-db.h * Copyright (C) 2010-2017 Belledonne Communications SARL * * This program is free software; you can redistribute it and/or @@ -17,8 +17,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef _EVENTS_DB_H_ -#define _EVENTS_DB_H_ +#ifndef _MAIN_DB_H_ +#define _MAIN_DB_H_ #include @@ -28,10 +28,13 @@ LINPHONE_BEGIN_NAMESPACE +class ChatRoom; class EventLog; -class EventsDbPrivate; +class MainDbPrivate; + +class LINPHONE_PUBLIC MainDb : public AbstractDb { + friend class ChatRoomProvider; -class LINPHONE_PUBLIC EventsDb : public AbstractDb { public: enum Filter { NoFilter = 0x0, @@ -42,7 +45,7 @@ public: typedef int FilterMask; - EventsDb (); + MainDb (); // Generic. bool addEvent (const EventLog &eventLog); @@ -66,6 +69,9 @@ public: ) const; void cleanHistory (const std::string &peerAddress = "", FilterMask mask = NoFilter); + // ChatRooms. + std::shared_ptr findChatRoom (const std::string &peerAddress) const; + // Import legacy messages from old db. bool import (Backend backend, const std::string ¶meters) override; @@ -73,10 +79,10 @@ protected: void init () override; private: - L_DECLARE_PRIVATE(EventsDb); - L_DISABLE_COPY(EventsDb); + L_DECLARE_PRIVATE(MainDb); + L_DISABLE_COPY(MainDb); }; LINPHONE_END_NAMESPACE -#endif // ifndef _EVENTS_DB_H_ +#endif // ifndef _MAIN_DB_H_ diff --git a/src/event-log/event-log.h b/src/event-log/event-log.h index 357e88f80..256fd2d53 100644 --- a/src/event-log/event-log.h +++ b/src/event-log/event-log.h @@ -32,7 +32,7 @@ LINPHONE_BEGIN_NAMESPACE class EventLogPrivate; class LINPHONE_PUBLIC EventLog : public ClonableObject { - friend class EventsDb; + friend class MainDb; public: L_DECLARE_ENUM(Type, L_ENUM_VALUES_EVENT_LOG_TYPE); diff --git a/tester/events-db-tester.cpp b/tester/events-db-tester.cpp index bf110400f..6c79d449c 100644 --- a/tester/events-db-tester.cpp +++ b/tester/events-db-tester.cpp @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -#include "db/events-db.h" +#include "db/main-db.h" #include "liblinphone_tester.h"