From 2c77b608ee6f36031ba8dde5139b5b4362bf601f Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Tue, 26 Jul 2016 17:48:34 +0200 Subject: [PATCH] Add last message to chat objects. --- src/mrchat.cpp | 10 +++++++--- src/mrchat.h | 5 ++++- src/mrsqlite3.cpp | 33 +++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/mrchat.cpp b/src/mrchat.cpp index bac660b9..5c344e7f 100644 --- a/src/mrchat.cpp +++ b/src/mrchat.cpp @@ -33,15 +33,19 @@ MrChat::MrChat(MrMailbox* mailbox) { - m_mailbox = mailbox; - m_type = MR_CHAT_UNDEFINED; - m_name = NULL; + m_mailbox = mailbox; + m_type = MR_CHAT_UNDEFINED; + m_name = NULL; + m_last_timestamp = 0; + m_last_msg_type = MR_MSG_UNDEFINED; + m_last_msg = NULL; } MrChat::~MrChat() { free(m_name); + free(m_last_msg); } diff --git a/src/mrchat.h b/src/mrchat.h index 43fb7b0e..e31f7bcc 100644 --- a/src/mrchat.h +++ b/src/mrchat.h @@ -31,6 +31,7 @@ #define __MRCHAT_H__ +#include "mrmsg.h" class MrMailbox; @@ -54,7 +55,9 @@ public: int m_id; MrChatType m_type; char* m_name; - time_t m_timestamp; + time_t m_last_timestamp; + MrMsgType m_last_msg_type; + char* m_last_msg; // send a message void SendMsg (const char* text); diff --git a/src/mrsqlite3.cpp b/src/mrsqlite3.cpp index cf04101d..2d5874dd 100644 --- a/src/mrsqlite3.cpp +++ b/src/mrsqlite3.cpp @@ -589,6 +589,7 @@ uint32_t MrSqlite3::FindOutChatId(carray* contact_ids_from, carray* contact_ids_ MrChatList* MrSqlite3::GetChatList() { + #define GET_CHATS_PREFIX "SELECT c.id, c.type, c.name, m.timestamp, m.type, m.msg FROM chats c LEFT JOIN msg m ON (c.id=m.chat_id AND m.timestamp=(SELECT MIN(timestamp) FROM msg WHERE chat_id=c.id)) " MrChatList* chatlist = NULL; MrChat* chat; bool success = false; @@ -599,15 +600,21 @@ MrChatList* MrSqlite3::GetChatList() goto GetChatList_Cleanup; } - q = sqlite3_mprintf("SELECT id, type, name FROM chats ORDER BY name;"); + // select example with left join and minimum: http://stackoverflow.com/questions/7588142/mysql-left-join-min + q = sqlite3_mprintf(GET_CHATS_PREFIX " ORDER BY timestamp;"); stmt = sqlite3_prepare_v2_(q); while( sqlite3_step(stmt) == SQLITE_ROW ) { chat = new MrChat(m_mailbox); - chat->m_id = sqlite3_column_int(stmt, 0); - chat->m_type = (MrChatType)sqlite3_column_int(stmt, 1); - chat->m_name = save_strdup((char*)sqlite3_column_text(stmt, 2)); - carray_add(chatlist->m_chats, (void*)chat, NULL); + chat->m_id = sqlite3_column_int (stmt, 0); + chat->m_type = (MrChatType) sqlite3_column_int (stmt, 1); + chat->m_name = save_strdup((char*)sqlite3_column_text (stmt, 2)); + chat->m_last_timestamp = sqlite3_column_int64(stmt, 3); + chat->m_last_msg_type = (MrMsgType) sqlite3_column_int (stmt, 4); + chat->m_last_msg = save_strdup((char*)sqlite3_column_text (stmt, 5)); + if( chat->m_name && chat->m_last_msg ) { + carray_add(chatlist->m_chats, (void*)chat, NULL); + } } // success @@ -645,10 +652,10 @@ MrChat* MrSqlite3::GetSingleChat(const char* name, uint32_t id) } if( name ) { - q = sqlite3_mprintf("SELECT id, type, name FROM chats WHERE name=%Q;", name); + q = sqlite3_mprintf(GET_CHATS_PREFIX " WHERE name=%Q;", name); } else { - q = sqlite3_mprintf("SELECT id, type, name FROM chats WHERE id=%i;", id); + q = sqlite3_mprintf(GET_CHATS_PREFIX " WHERE id=%i;", id); } stmt = sqlite3_prepare_v2_(q); @@ -657,9 +664,15 @@ MrChat* MrSqlite3::GetSingleChat(const char* name, uint32_t id) goto GetSingleChat_Cleanup; } - chat->m_id = sqlite3_column_int(stmt, 0); - chat->m_type = (MrChatType)sqlite3_column_int(stmt, 1); - chat->m_name = save_strdup((char*)sqlite3_column_text(stmt, 2)); + chat->m_id = sqlite3_column_int (stmt, 0); + chat->m_type = (MrChatType) sqlite3_column_int (stmt, 1); + chat->m_name = save_strdup((char*)sqlite3_column_text (stmt, 2)); + chat->m_last_timestamp = sqlite3_column_int64(stmt, 3); + chat->m_last_msg_type = (MrMsgType) sqlite3_column_int (stmt, 4); + chat->m_last_msg = save_strdup((char*)sqlite3_column_text (stmt, 5)); + if( chat->m_name==NULL || chat->m_last_msg==NULL ) { + goto GetSingleChat_Cleanup; + } // success success = true;