From fcb6ef20954db28f58d27c243fd628c13e96e22b Mon Sep 17 00:00:00 2001 From: Kyeonghun Lee Date: Thu, 27 Apr 2017 17:04:52 +0900 Subject: [MPR-967] add new api for thread list with condition Change-Id: I848dcff36f7866f48fec5048a1f0d2bd64a0e33a Signed-off-by: Kyeonghun Lee --- utils/MsgUtilStorage.cpp | 175 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) (limited to 'utils/MsgUtilStorage.cpp') diff --git a/utils/MsgUtilStorage.cpp b/utils/MsgUtilStorage.cpp index 9305c8c..8da7f11 100755 --- a/utils/MsgUtilStorage.cpp +++ b/utils/MsgUtilStorage.cpp @@ -1800,6 +1800,181 @@ msg_error_t MsgStoGetThreadViewList(const MSG_SORT_RULE_S *pSortRule, msg_struct } +msg_error_t MsgStoGetThreadViewListWithCondition(const MSG_SORT_RULE_S *pSortRule, const MSG_LIST_CONDITION_S *pListCond, msg_struct_list_s *pThreadViewList) +{ + msg_error_t err = MSG_SUCCESS; + + if (!pListCond) { + err = MsgStoGetThreadViewList(pSortRule, pThreadViewList); + if (err != MSG_SUCCESS) { + MSG_ERR("MsgStoGetThreadViewList() Error!!"); + } + + return err; + } + + MsgDbHandler *dbHandle = getDbHandle(); + dbHandle->connectReadOnly(); + + pThreadViewList->nCount = 0; + pThreadViewList->msg_struct_info = NULL; + + int rowCnt = 0, index = 0; + + char sqlQuery[MAX_QUERY_LEN+1]; + char sqlQuerySubset[MAX_QUERY_LEN+1]; + char conditionQuery[MAX_QUERY_LEN+1] = {0}; + + if (pListCond->bProtected == true) { + memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "PROTECTED = 1 AND "); + strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery)); + } + + if (pListCond->folderId > MSG_ALLBOX_ID) { + memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID = %d ", pListCond->folderId); + strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery)); + } else { + memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "FOLDER_ID > %d AND FOLDER_ID < %d ", MSG_ALLBOX_ID, MSG_SPAMBOX_ID); + strncat(conditionQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(conditionQuery)); + } + + memset(sqlQuery, 0x00, sizeof(sqlQuery)); + snprintf(sqlQuery, sizeof(sqlQuery), "SELECT DISTINCT(CONV_ID) FROM %s WHERE ", MSGFW_MESSAGE_TABLE_NAME); + + strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery)); + + memset(sqlQuerySubset, 0x00, sizeof(sqlQuerySubset)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC;"); + strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery)); + + + err = dbHandle->getTable(sqlQuery, &rowCnt, NULL); + if (err == MSG_ERR_DB_NORECORD) { + return MSG_SUCCESS; + } else if (err != MSG_SUCCESS) { + MSG_ERR("Fail to getTable(). [%d]", err); + dbHandle->freeTable(); + return err; + } + + msg_thread_id_t conv_ids[rowCnt]; + for (int i = 1; i <= rowCnt; i++) { + conv_ids[i - 1] = dbHandle->getColumnToInt(i); + } + + dbHandle->freeTable(); + + pThreadViewList->nCount = rowCnt; + MSG_DEBUG("pThreadViewList->nCount [%d]", pThreadViewList->nCount); + + pThreadViewList->msg_struct_info = (msg_struct_t *)calloc(rowCnt, sizeof(msg_struct_t)); + if (pThreadViewList->msg_struct_info == NULL) { + MSG_ERR("calloc failed"); + return MSG_ERR_MEMORY_ERROR; + } + + MSG_THREAD_VIEW_S *pTmp = NULL; + msg_struct_s *thread_t = NULL; + + for (int i = 0; i < pThreadViewList->nCount; i++) { + thread_t = (msg_struct_s *)new msg_struct_s; + pThreadViewList->msg_struct_info[i] = (msg_struct_t)thread_t; + thread_t->type = MSG_STRUCT_THREAD_INFO; + thread_t->data = new MSG_THREAD_VIEW_S; + + pTmp = (MSG_THREAD_VIEW_S *)thread_t->data; + memset(pTmp, 0x00, sizeof(MSG_THREAD_VIEW_S)); + + pTmp->threadId = conv_ids[i]; + + memset(sqlQuery, 0x00, sizeof(sqlQuery)); + snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT DISPLAY_NAME FROM %s WHERE CONV_ID = %d;", + MSGFW_CONVERSATION_TABLE_NAME, conv_ids[i]); + + err = dbHandle->getTable(sqlQuery, &rowCnt, &index); + if (err != MSG_SUCCESS) { + MSG_ERR("Fail to getTable(). [%d]", err); + dbHandle->freeTable(); + return err; + } + + dbHandle->getColumnToString(index++, MAX_THREAD_NAME_LEN, pTmp->threadName); + + dbHandle->freeTable(); + + memset(sqlQuery, 0x00, sizeof(sqlQuery)); + snprintf(sqlQuery, MAX_QUERY_LEN, "SELECT " + "(COUNT(DISTINCT(CASE WHEN READ_STATUS = 0 THEN MSG_ID END))) AS UNREAD_CNT, " + "(COUNT(DISTINCT(CASE WHEN MAIN_TYPE = %d THEN MSG_ID END))) AS SMS_CNT, " + "(COUNT(DISTINCT(CASE WHEN MAIN_TYPE = %d THEN MSG_ID END))) AS MMS_CNT " + "FROM %s WHERE CONV_ID = %d AND ", + MSG_SMS_TYPE, + MSG_MMS_TYPE, + MSGFW_MESSAGE_TABLE_NAME, conv_ids[i]); + + strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), ";"); + strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery)); + + err = dbHandle->getTable(sqlQuery, &rowCnt, &index); + if (err != MSG_SUCCESS) { + MSG_ERR("Fail to getTable(). [%d]", err); + dbHandle->freeTable(); + return err; + } + + pTmp->unreadCnt = dbHandle->getColumnToInt(index++); + pTmp->smsCnt = dbHandle->getColumnToInt(index++); + pTmp->mmsCnt = dbHandle->getColumnToInt(index++); + + dbHandle->freeTable(); + + memset(sqlQuery, 0x00, MAX_QUERY_LEN); + snprintf(sqlQuery, sizeof(sqlQuery), + "SELECT MAIN_TYPE, SUB_TYPE, MSG_DIRECTION, DISPLAY_TIME, DPM_RESTRICTED, (CASE WHEN LENGTH(SUBJECT) > 0 THEN SUBJECT ELSE MSG_TEXT END) " + "FROM %s WHERE CONV_ID = %d AND ", + MSGFW_MESSAGE_TABLE_NAME, conv_ids[i]); + + strncat(sqlQuery, conditionQuery, MAX_QUERY_LEN-strlen(sqlQuery)); + snprintf(sqlQuerySubset, sizeof(sqlQuerySubset), "ORDER BY DISPLAY_TIME DESC LIMIT 1;"); + strncat(sqlQuery, sqlQuerySubset, MAX_QUERY_LEN-strlen(sqlQuery)); + + err = dbHandle->getTable(sqlQuery, &rowCnt, &index); + if (err != MSG_SUCCESS) { + MSG_ERR("Fail to getTable(). [%d]", err); + dbHandle->freeTable(); + return err; + } + + pTmp->mainType = (MSG_MAIN_TYPE_T)dbHandle->getColumnToInt(index++); + pTmp->subType = (MSG_SUB_TYPE_T)dbHandle->getColumnToInt(index++); + pTmp->direction = (msg_direction_type_t)dbHandle->getColumnToInt(index++); + pTmp->threadTime = (time_t)dbHandle->getColumnToInt(index++); + bool dpm_restricted = dbHandle->getColumnToInt(index++); + char tmpData[MAX_THREAD_DATA_LEN + 1] = {0}; + if (!dpm_restricted) { + dbHandle->getColumnToString(index++, MAX_THREAD_DATA_LEN, tmpData); + } else { + snprintf(tmpData, sizeof(tmpData), "restricted message"); + } + + char *end = NULL; + if (g_utf8_validate(tmpData, -1, (const gchar **)&end) == true) { + g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, -1)); + } else { + g_utf8_strncpy(pTmp->threadData, tmpData, g_utf8_strlen(tmpData, end - tmpData)); + } + + dbHandle->freeTable(); + } + + return MSG_SUCCESS; +} + + msg_error_t MsgStoGetConversationPreview(MsgDbHandler *pDbHandle, MSG_CONVERSATION_VIEW_S *pConv) { char sqlQuery[MAX_QUERY_LEN + 1]; -- cgit v1.2.3