From 963811044bcf6159f81f17d5cf2be754bbdeb258 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 21 Feb 2018 16:42:15 +0100 Subject: [PATCH] feat(MainDb): use prepared statements for some functions --- src/db/internal/statements.cpp | 50 +++++++++++++++++------- src/db/internal/statements.h | 4 ++ src/db/main-db-p.h | 6 +-- src/db/main-db.cpp | 68 ++++++++++++++++----------------- tester/db/linphone.db | Bin 4382720 -> 4382720 bytes 5 files changed, 78 insertions(+), 50 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 866159d0c..a8c11937c 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -54,18 +54,17 @@ namespace Statements { // --------------------------------------------------------------------------- constexpr AbstractStatement create[CreateCount] = { - [CreateConferenceEventView] = - R"( - CREATE VIEW IF NOT EXISTS conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" + [CreateConferenceEventView] = R"( + CREATE VIEW IF NOT EXISTS conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" }; // --------------------------------------------------------------------------- @@ -73,6 +72,31 @@ namespace Statements { // --------------------------------------------------------------------------- constexpr const char *select[SelectCount] = { + [SelectSipAddressId] = R"( + SELECT id + FROM sip_address + WHERE value = :1 + )", + + [SelectChatRoomId] = R"( + SELECT id + FROM chat_room + WHERE peer_sip_address_id = :1 AND local_sip_address_id = :2 + )", + + [SelectChatRoomParticipantId] = R"( + SELECT id + FROM chat_room_participant + WHERE chat_room_id = :1 AND participant_sip_address_id = :2 + )", + + [SelectOneToOneChatRoomId] = R"( + SELECT chat_room_id + FROM one_to_one_chat_room + WHERE participant_a_sip_address_id IN (:1, :2) + AND participant_b_sip_address_id IN (:3, :4) + )", + [SelectConferenceEvents] = R"( SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject FROM conference_event_view @@ -80,7 +104,7 @@ namespace Statements { LEFT JOIN sip_address AS to_sip_address ON to_sip_address.id = to_sip_address_id LEFT JOIN sip_address AS device_sip_address ON device_sip_address.id = device_sip_address_id LEFT JOIN sip_address AS participant_sip_address ON participant_sip_address.id = participant_sip_address_id - WHERE chat_room_id = :chatRoomId + WHERE chat_room_id = :1 )" }; diff --git a/src/db/internal/statements.h b/src/db/internal/statements.h index e76a4eeea..ca7e3dbd7 100644 --- a/src/db/internal/statements.h +++ b/src/db/internal/statements.h @@ -33,6 +33,10 @@ namespace Statements { }; enum Select { + SelectSipAddressId, + SelectChatRoomId, + SelectChatRoomParticipantId, + SelectOneToOneChatRoomId, SelectConferenceEvents, SelectCount }; diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 08067eb73..bb6d7abe5 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -34,15 +34,15 @@ class Content; class MainDbPrivate : public AbstractDbPrivate { public: - struct Statements; + struct PreparedStatements; mutable std::unordered_map> storageIdToEvent; mutable std::unordered_map> storageIdToChatMessage; private: - std::unique_ptr statements; + std::unique_ptr preparedStatements; - void initStatements (); + void initPreparedStatements (); // --------------------------------------------------------------------------- // Low level API. diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 7ee859596..87e3f5047 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -189,8 +189,8 @@ public: } template - void bind (const T &var, const char *name) { - mStmt.exchange(soci::use(var, name)); + void bind (const T &var) { + mStmt.exchange(soci::use(var)); } template @@ -211,22 +211,21 @@ static inline unique_ptr makeStatement (soci::session &session, return makeUnique(session.prepare << stmt); } -struct MainDbPrivate::Statements { +struct MainDbPrivate::PreparedStatements { typedef unique_ptr Statement; - Statement selectSipAddressId; - Statement selectChatRoomId; + Statement select[Statements::SelectCount]; }; -void MainDbPrivate::initStatements () { - soci::session *session = dbSession.getBackendSession(); - statements = makeUnique(); +void MainDbPrivate::initPreparedStatements () { + L_Q(); - statements->selectSipAddressId = makeStatement(*session, "SELECT id FROM sip_address WHERE value = :sipAddress"); - statements->selectChatRoomId = makeStatement( - *session, - "SELECT id FROM chat_room WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId" - ); + soci::session *session = dbSession.getBackendSession(); + AbstractDb::Backend backend = q->getBackend(); + + preparedStatements = makeUnique(); + for (int i = 0; i < int(Statements::SelectCount); ++i) + preparedStatements->select[i] = makeStatement(*session, Statements::get(Statements::Select(i), backend)); } // ----------------------------------------------------------------------------- @@ -424,8 +423,8 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long id; - StatementBind stmt(*statements->selectSipAddressId); - stmt.bind(sipAddress, "sipAddress"); + StatementBind stmt(*preparedStatements->select[Statements::SelectSipAddressId]); + stmt.bind(sipAddress); stmt.bindResult(id); return stmt.exec() ? id : -1; @@ -434,9 +433,9 @@ long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { long long id; - StatementBind stmt(*statements->selectChatRoomId); - stmt.bind(peerSipAddressId, "peerSipAddressId"); - stmt.bind(localSipAddressId, "localSipAddressId"); + StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomId]); + stmt.bind(peerSipAddressId); + stmt.bind(localSipAddressId); stmt.bindResult(id); return stmt.exec() ? id : -1; @@ -456,23 +455,26 @@ long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { long long MainDbPrivate::selectChatRoomParticipantId (long long chatRoomId, long long participantSipAddressId) const { long long id; - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT id from chat_room_participant" - " WHERE chat_room_id = :chatRoomId AND participant_sip_address_id = :participantSipAddressId", - soci::into(id), soci::use(chatRoomId), soci::use(participantSipAddressId); - return session->got_data() ? id : -1; + + StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomParticipantId]); + stmt.bind(chatRoomId); + stmt.bind(participantSipAddressId); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long long sipAddressIdB) const { long long id; - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT chat_room_id" - " FROM one_to_one_chat_room" - " WHERE participant_a_sip_address_id IN (:sipAddressIdA, :sipAddressIdB)" - " AND participant_b_sip_address_id IN (:sipAddressIdABis, :sipAddressIdBBis)", - soci::into(id), - soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::use(sipAddressIdA), soci::use(sipAddressIdB); - return session->got_data() ? id : -1; + + StatementBind stmt(*preparedStatements->select[Statements::SelectOneToOneChatRoomId]); + stmt.bind(sipAddressIdA); + stmt.bind(sipAddressIdB); + stmt.bind(sipAddressIdA); + stmt.bind(sipAddressIdB); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } // ----------------------------------------------------------------------------- @@ -1414,7 +1416,6 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; - if (linphone_core_conference_server_enabled(getCore()->getCCore())) { *session << "CREATE TABLE IF NOT EXISTS one_to_one_chat_room (" " chat_room_id" + primaryKeyStr("BIGINT UNSIGNED") + "," @@ -1432,7 +1433,6 @@ void MainDb::init () { " REFERENCES sip_address(id)" " ON DELETE CASCADE" ") " + charset; - } *session << "CREATE TABLE IF NOT EXISTS chat_room_participant (" @@ -1710,7 +1710,7 @@ void MainDb::init () { d->updateModuleVersion("events", ModuleVersionEvents); d->updateModuleVersion("friends", ModuleVersionFriends); - d->initStatements(); + d->initPreparedStatements(); } bool MainDb::addEvent (const shared_ptr &eventLog) { diff --git a/tester/db/linphone.db b/tester/db/linphone.db index d41b202f16b13cd7a991988a27276463babeabf3..a3be0fcebdb22794f17bded8a13b167fdfcb4a87 100644 GIT binary patch delta 495 zcmZw9J5L)?6a?UVcL_GmE|~BNF^>hu1j6#hNqA!%7m=tCO3BU|Az_Kw7TSU)k|T7d zp@D{5LIpnnAr~nEC5q@MsFOcHPYUb?5sBhxq)#)abg^fYDz_hNbcLuH7DD_M!uVUs z*nvAC-5*ep3WkEIP^0idp;jTJ5LT#Dh$y@~hjn@+|LE|s)oYj+W%t;+^}1}iBf@5Q zt?tlDSY_+pzN$BCuS35g|ID1+IlC-=m7BZyM5ry9H26L6vs)X5{Dv14ylSj(`hmAy zD13X)#7%l7lUmI35vRAD&LxcBftRw}aezuIT3j&(}R8GX5WBt2C^B^rrWL=(|W zv=FUC8}XWGC*BY-qJ!upx`=L~vh5*yi8%3=NDzI*JEET$Al?&$gi8z&!^8+NN{kWX i!~`)(B#95iN8%GPMNAVj#4IsK%o7X5B9S`5Qt1KV$D@$| delta 314 zcmYktxiUjx07vmJ_eOFPHzIaP5FxfiEV1u&UV_u6%Ogbb{TmHqMoOu80Ap^6(ik%- z6iPF^1%;G~^E>sYbEn?!B9kf_6D}KLUX5|S+fQGXDxu;TmXO7Y1VhE#&f-s*tK8q1OF%S(&a|pqL1-kw|f6vJ9dMr zn`o4RT+9DV{`aa?LnK6(NQ!Qe5J7QPtiG6V(4sSWC{{iqM BYA*l)