summaryrefslogtreecommitdiff
path: root/utils/MsgUtilStorage.cpp
diff options
context:
space:
mode:
authorKyeonghun Lee <kh9090.lee@samsung.com>2017-04-27 17:04:52 +0900
committerKyeonghun Lee <kh9090.lee@samsung.com>2017-05-16 18:49:59 +0900
commitfcb6ef20954db28f58d27c243fd628c13e96e22b (patch)
tree43bf9463b14907dda8d3aa6a08d21370dd8eedcb /utils/MsgUtilStorage.cpp
parent927853f9bfb07989658691da0feb8d51b1d187fd (diff)
downloadmsg-service-fcb6ef20954db28f58d27c243fd628c13e96e22b.tar.gz
msg-service-fcb6ef20954db28f58d27c243fd628c13e96e22b.tar.bz2
msg-service-fcb6ef20954db28f58d27c243fd628c13e96e22b.zip
[MPR-967] add new api for thread list with condition
Change-Id: I848dcff36f7866f48fec5048a1f0d2bd64a0e33a Signed-off-by: Kyeonghun Lee <kh9090.lee@samsung.com>
Diffstat (limited to 'utils/MsgUtilStorage.cpp')
-rwxr-xr-xutils/MsgUtilStorage.cpp175
1 files changed, 175 insertions, 0 deletions
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];