Commit cbb14ad1 authored by Ronan's avatar Ronan

feat(MainDb): attach resolveId to DbSession

parent c8648d0f
...@@ -42,12 +42,6 @@ public: ...@@ -42,12 +42,6 @@ public:
mutable std::unordered_map<long long, std::weak_ptr<ChatMessage>> storageIdToChatMessage; mutable std::unordered_map<long long, std::weak_ptr<ChatMessage>> storageIdToChatMessage;
private: private:
// ---------------------------------------------------------------------------
// SOCI helpers.
// ---------------------------------------------------------------------------
long long resolveId (const soci::row &row, int col) const;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Low level API. // Low level API.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
......
...@@ -258,17 +258,6 @@ static constexpr string &blobToString (string &in) { ...@@ -258,17 +258,6 @@ static constexpr string &blobToString (string &in) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
long long MainDbPrivate::resolveId (const soci::row &row, int col) const {
L_Q();
// See: http://soci.sourceforge.net/doc/master/backends/
// `row id` is not supported by soci on Sqlite3. It's necessary to cast id to int...
return q->getBackend() == AbstractDb::Sqlite3
? static_cast<long long>(row.get<int>(0))
: static_cast<long long>(row.get<unsigned long long>(0));
}
// -----------------------------------------------------------------------------
long long MainDbPrivate::insertSipAddress (const string &sipAddress) { long long MainDbPrivate::insertSipAddress (const string &sipAddress) {
soci::session *session = dbSession.getBackendSession(); soci::session *session = dbSession.getBackendSession();
...@@ -698,7 +687,7 @@ shared_ptr<EventLog> MainDbPrivate::selectConferenceChatMessageEvent ( ...@@ -698,7 +687,7 @@ shared_ptr<EventLog> MainDbPrivate::selectConferenceChatMessageEvent (
soci::rowset<soci::row> rows = (session->prepare << query, soci::use(eventId)); soci::rowset<soci::row> rows = (session->prepare << query, soci::use(eventId));
for (const auto &row : rows) { for (const auto &row : rows) {
ContentType contentType(row.get<string>(2)); ContentType contentType(row.get<string>(2));
const long long &contentId = resolveId(row, 0); const long long &contentId = dbSession.resolveId(row, 0);
Content *content; Content *content;
if (contentType == ContentType::FileTransfer) { if (contentType == ContentType::FileTransfer) {
...@@ -1121,7 +1110,7 @@ void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long ...@@ -1121,7 +1110,7 @@ void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long
soci::session *session = dbSession.getBackendSession(); soci::session *session = dbSession.getBackendSession();
soci::rowset<soci::row> rows = (session->prepare << query, soci::use(chatRoomId)); soci::rowset<soci::row> rows = (session->prepare << query, soci::use(chatRoomId));
for (const auto &row : rows) { for (const auto &row : rows) {
long long eventId = resolveId(row, 0); long long eventId = dbSession.resolveId(row, 0);
shared_ptr<EventLog> eventLog = getEventFromCache(eventId); shared_ptr<EventLog> eventLog = getEventFromCache(eventId);
if (eventLog) { if (eventLog) {
const EventLogPrivate *dEventLog = eventLog->getPrivate(); const EventLogPrivate *dEventLog = eventLog->getPrivate();
...@@ -2015,7 +2004,7 @@ list<shared_ptr<EventLog>> MainDb::getConferenceNotifiedEvents ( ...@@ -2015,7 +2004,7 @@ list<shared_ptr<EventLog>> MainDb::getConferenceNotifiedEvents (
list<shared_ptr<EventLog>> events; list<shared_ptr<EventLog>> events;
soci::rowset<soci::row> rows = (session->prepare << query, soci::use(dbChatRoomId), soci::use(lastNotifyId)); soci::rowset<soci::row> rows = (session->prepare << query, soci::use(dbChatRoomId), soci::use(lastNotifyId));
for (const auto &row : rows) { for (const auto &row : rows) {
long long eventId = d->resolveId(row, 0); long long eventId = d->dbSession.resolveId(row, 0);
shared_ptr<EventLog> eventLog = d->getEventFromCache(eventId); shared_ptr<EventLog> eventLog = d->getEventFromCache(eventId);
events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent( events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent(
...@@ -2161,7 +2150,7 @@ list<shared_ptr<ChatMessage>> MainDb::getUnreadChatMessages (const ChatRoomId &c ...@@ -2161,7 +2150,7 @@ list<shared_ptr<ChatMessage>> MainDb::getUnreadChatMessages (const ChatRoomId &c
: (session->prepare << query); : (session->prepare << query);
for (const auto &row : rows) { for (const auto &row : rows) {
long long eventId = d->resolveId(row, 0); long long eventId = d->dbSession.resolveId(row, 0);
shared_ptr<EventLog> event = d->getEventFromCache(eventId); shared_ptr<EventLog> event = d->getEventFromCache(eventId);
if (!event) if (!event)
...@@ -2215,7 +2204,7 @@ list<shared_ptr<ChatMessage>> MainDb::findChatMessages ( ...@@ -2215,7 +2204,7 @@ list<shared_ptr<ChatMessage>> MainDb::findChatMessages (
const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId);
soci::rowset<soci::row> rows = (session->prepare << query, soci::use(imdnMessageId), soci::use(dbChatRoomId)); soci::rowset<soci::row> rows = (session->prepare << query, soci::use(imdnMessageId), soci::use(dbChatRoomId));
for (const auto &row : rows) { for (const auto &row : rows) {
long long eventId = d->resolveId(row, 0); long long eventId = d->dbSession.resolveId(row, 0);
shared_ptr<EventLog> event = d->getEventFromCache(eventId); shared_ptr<EventLog> event = d->getEventFromCache(eventId);
if (!event) if (!event)
...@@ -2290,7 +2279,7 @@ list<shared_ptr<EventLog>> MainDb::getHistoryRange ( ...@@ -2290,7 +2279,7 @@ list<shared_ptr<EventLog>> MainDb::getHistoryRange (
const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId);
soci::rowset<soci::row> rows = (session->prepare << query, soci::use(dbChatRoomId)); soci::rowset<soci::row> rows = (session->prepare << query, soci::use(dbChatRoomId));
for (const auto &row : rows) { for (const auto &row : rows) {
long long eventId = d->resolveId(row, 0); long long eventId = d->dbSession.resolveId(row, 0);
shared_ptr<EventLog> event = d->getEventFromCache(eventId); shared_ptr<EventLog> event = d->getEventFromCache(eventId);
if (!event) if (!event)
...@@ -2405,7 +2394,7 @@ list<shared_ptr<AbstractChatRoom>> MainDb::getChatRooms () const { ...@@ -2405,7 +2394,7 @@ list<shared_ptr<AbstractChatRoom>> MainDb::getChatRooms () const {
} else if (capabilities & ChatRoom::CapabilitiesMask(ChatRoom::Capabilities::Conference)) { } else if (capabilities & ChatRoom::CapabilitiesMask(ChatRoom::Capabilities::Conference)) {
list<shared_ptr<Participant>> participants; list<shared_ptr<Participant>> participants;
const long long &dbChatRoomId = d->resolveId(row, 0); const long long &dbChatRoomId = d->dbSession.resolveId(row, 0);
static const string query = "SELECT chat_room_participant.id, sip_address.value, is_admin" static const string query = "SELECT chat_room_participant.id, sip_address.value, is_admin"
" FROM sip_address, chat_room, chat_room_participant" " FROM sip_address, chat_room, chat_room_participant"
" WHERE chat_room.id = :chatRoomId" " WHERE chat_room.id = :chatRoomId"
...@@ -2422,7 +2411,7 @@ list<shared_ptr<AbstractChatRoom>> MainDb::getChatRooms () const { ...@@ -2422,7 +2411,7 @@ list<shared_ptr<AbstractChatRoom>> MainDb::getChatRooms () const {
// Fetch devices. // Fetch devices.
{ {
const long long &participantId = d->resolveId(row, 0); const long long &participantId = d->dbSession.resolveId(row, 0);
static const string query = "SELECT sip_address.value, state FROM chat_room_participant_device, sip_address" static const string query = "SELECT sip_address.value, state FROM chat_room_participant_device, sip_address"
" WHERE chat_room_participant_id = :participantId" " WHERE chat_room_participant_id = :participantId"
" AND participant_device_sip_address_id = sip_address.id"; " AND participant_device_sip_address_id = sip_address.id";
......
...@@ -136,7 +136,10 @@ public: ...@@ -136,7 +136,10 @@ public:
) const; ) const;
void insertOneToOneConferenceChatRoom (const std::shared_ptr<AbstractChatRoom> &chatRoom); void insertOneToOneConferenceChatRoom (const std::shared_ptr<AbstractChatRoom> &chatRoom);
void updateChatRoomParticipantDevice (const std::shared_ptr<AbstractChatRoom> &chatRoom, const std::shared_ptr<ParticipantDevice> &device); void updateChatRoomParticipantDevice (
const std::shared_ptr<AbstractChatRoom> &chatRoom,
const std::shared_ptr<ParticipantDevice> &device
);
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Other. // Other.
......
...@@ -51,12 +51,14 @@ DbSession::operator bool () const { ...@@ -51,12 +51,14 @@ DbSession::operator bool () const {
L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(DbSession); L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(DbSession);
#ifdef SOCI_ENABLED soci::session *DbSession::getBackendSession () const {
soci::session *DbSession::getBackendSession () const { #ifdef SOCI_ENABLED
L_D(); L_D();
return d->backendSession.get(); return d->backendSession.get();
} #else
#endif // ifdef SOCI_ENABLED return nullptr;
#endif // ifdef SOCI_ENABLED
}
string DbSession::primaryKeyStr (const string &type) const { string DbSession::primaryKeyStr (const string &type) const {
L_D(); L_D();
...@@ -195,10 +197,31 @@ bool DbSession::checkTableExists (const string &table) const { ...@@ -195,10 +197,31 @@ bool DbSession::checkTableExists (const string &table) const {
return false; return false;
} }
L_ASSERT(false); L_ASSERT(false);
#else
(void)table;
#endif // ifdef SOCI_ENABLED #endif // ifdef SOCI_ENABLED
(void)table;
return false; return false;
} }
long long DbSession::resolveId (const soci::row &row, int col) const {
#ifdef SOCI_ENABLED
L_D();
switch (d->backend) {
case DbSessionPrivate::Backend::Mysql:
return static_cast<long long>(row.get<unsigned long long>(0));
case DbSessionPrivate::Backend::Sqlite3:
return static_cast<long long>(row.get<int>(0));
case DbSessionPrivate::Backend::None:
return 0;
}
L_ASSERT(false);
#else
(void)row;
(void)col;
#endif // ifdef SOCI_ENABLED
return 0;
}
LINPHONE_END_NAMESPACE LINPHONE_END_NAMESPACE
...@@ -28,6 +28,13 @@ ...@@ -28,6 +28,13 @@
// ============================================================================= // =============================================================================
#ifndef SOCI_ENABLED
namespace soci {
class row;
class session;
}
#endif // ifndef SOCI_ENABLED
LINPHONE_BEGIN_NAMESPACE LINPHONE_BEGIN_NAMESPACE
class DbSessionPrivate; class DbSessionPrivate;
...@@ -44,9 +51,7 @@ public: ...@@ -44,9 +51,7 @@ public:
operator bool () const; operator bool () const;
#ifdef SOCI_ENABLED soci::session *getBackendSession () const;
soci::session *getBackendSession () const;
#endif // ifdef SOCI_ENABLED
std::string primaryKeyStr (const std::string &type = "INT") const; std::string primaryKeyStr (const std::string &type = "INT") const;
std::string primaryKeyRefStr (const std::string &type = "INT") const; std::string primaryKeyRefStr (const std::string &type = "INT") const;
...@@ -62,6 +67,8 @@ public: ...@@ -62,6 +67,8 @@ public:
bool checkTableExists (const std::string &table) const; bool checkTableExists (const std::string &table) const;
long long resolveId (const soci::row &row, int col) const;
private: private:
L_DECLARE_PRIVATE(DbSession); L_DECLARE_PRIVATE(DbSession);
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment