diff --git a/include/linphone/utils/enum-mask.h b/include/linphone/utils/enum-mask.h index a385401f3..53eac2c5f 100644 --- a/include/linphone/utils/enum-mask.h +++ b/include/linphone/utils/enum-mask.h @@ -138,10 +138,10 @@ private: return (mMask & value) == value && (value || mMask == 0); } -// On CentOs 7 GCC 4.8.5 have issue with array-bounds +// On CentOs 7 GCC 4.8.5 have issue with array-bounds. #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && __GNUC_PATCHLEVEL__ == 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Warray-bounds" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" #endif static constexpr StorageType init ( @@ -152,7 +152,7 @@ private: } #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && __GNUC_PATCHLEVEL__ == 5 -#pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif StorageType mMask; diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 900c6a927..866159d0c 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -24,22 +24,48 @@ LINPHONE_BEGIN_NAMESPACE namespace Statements { + using Backend = AbstractDb::Backend; + + struct Statement { + template + constexpr Statement (Backend _backend, const char (&_sql)[N]) : backend(_backend), sql(_sql) {} + + Backend backend; + const char *sql; + }; + + struct AbstractStatement { + public: + template + constexpr AbstractStatement (const char (&_sql)[N]) : mSql{ _sql, nullptr } {} + + constexpr AbstractStatement (const Statement &a, const Statement &b) : mSql{ a.sql, b.sql } {} + + const char *getSql (Backend backend) const { + return backend == Backend::Mysql && mSql[1] ? mSql[1] : mSql[0]; + } + + private: + const char *mSql[2]; + }; + // --------------------------------------------------------------------------- // Create statements. // --------------------------------------------------------------------------- - constexpr const char *create[CreateCount] = { - [CreateConferenceEventView] = R"( - CREATE TEMP VIEW 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 - )" + 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 + )" }; // --------------------------------------------------------------------------- @@ -64,7 +90,7 @@ namespace Statements { const char *get (Create createStmt, AbstractDb::Backend backend) { (void)backend; - return createStmt >= Create::CreateCount ? nullptr : create[createStmt]; + return createStmt >= Create::CreateCount ? nullptr : create[createStmt].getSql(backend); } const char *get (Select selectStmt, AbstractDb::Backend backend) { diff --git a/tester/db/linphone.db b/tester/db/linphone.db index ae7fe37ab..d41b202f1 100644 Binary files a/tester/db/linphone.db and b/tester/db/linphone.db differ