2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * MessageQueryGenerator.cpp
19 * Created on: 2011. 10. 28.
23 #include "MessageQueryGenerator.h"
24 #include "API/Messaging/MessageFilterValidatorFactory.h"
25 #include "API/Messaging/ConversationFilterValidatorFactory.h"
27 #include <API/Messaging/IMessagingTypes.h>
28 #include <API/Messaging/log.h>
29 #include <Commons/Exception.h>
31 #include <email-types.h>
32 #include <msg_storage_types.h>
36 #include <dpl/log/log.h>
39 using namespace TizenApis::Api::Tizen;
46 const std::string MessageQueryGenerator::STRING_MATCH_EXACTLY = "EXACTLY";
47 const std::string MessageQueryGenerator::STRING_MATCH_CONTAINS = "CONTAINS";
48 const std::string MessageQueryGenerator::STRING_MATCH_STARTSWITH = "STARTSWITH";
49 const std::string MessageQueryGenerator::STRING_MATCH_ENDSWITH = "ENDSWITH";
50 // const std::string MessageQueryGenerator::STRING_MATCH_CASESENSITIVE = "CASESENSITIVE";
52 const std::string MessageQueryGenerator::STRING_WHERE = "WHERE ";
53 const std::string MessageQueryGenerator::STRING_SUFFIX = "";
54 const std::string MessageQueryGenerator::STRING_DIRECTION = "A.MSG_DIRECTION";
56 const int MessageQueryGenerator::MESSAGE_TYPE_NOT_INITIALIZED = -1;
58 MessageQueryGenerator::MessageQueryGenerator():m_messageType(MESSAGE_TYPE_NOT_INITIALIZED) {
59 m_query.append(getQueryPrefix());
68 MessageQueryGenerator::MessageQueryGenerator(const Api::Tizen::SortModePtr& sortMode, const long limit, const long offset):
69 m_messageType(MESSAGE_TYPE_NOT_INITIALIZED){
70 LogDebug("<<< limit:" << limit << ", offset:" << offset);
72 m_query.append(getQueryPrefix());
74 //TODO check sort mode validation
75 m_sortMode = sortMode;
84 MessageQueryGenerator::MessageQueryGenerator(const Api::Tizen::SortModePtr& sortMode, const long limit, const long offset, const int type):
85 m_messageType(MESSAGE_TYPE_NOT_INITIALIZED){
86 LogDebug("<<< limit:" << limit << ", offset:" << offset);
87 m_query.append(getQueryPrefix());
89 //TODO check sort mode validation
90 m_sortMode = sortMode;
96 if(type == Api::Messaging::SMS)
100 else if(type == Api::Messaging::MMS)
113 MessageQueryGenerator::~MessageQueryGenerator() {
116 void MessageQueryGenerator::reset(QueryGeneratorMode mode){
118 m_queryVector.clear();
124 m_query.append(getQueryPrefix());
129 void MessageQueryGenerator::setEmailAttributeMap(){
130 attributeMap.clear();
133 std::pair<std::string, std::string>(
134 MessageFilterValidatorFactory::ATTRIBUTE_ID, "mail_id"));
136 std::pair<std::string, std::string>(
137 MessageFilterValidatorFactory::ATTRIBUTE_SERVICE_ID, "account_id"));
139 std::pair<std::string, std::string>(
140 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "mailbox_id"));
142 std::pair<std::string, std::string>(
143 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "date_time"));
145 std::pair<std::string, std::string>(
146 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "full_address_from"));
148 std::pair<std::string, std::string>(
149 MessageFilterValidatorFactory::ATTRIBUTE_TO, "full_address_to"));
151 std::pair<std::string, std::string>(
152 MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
154 std::pair<std::string, std::string>(
155 MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
157 std::pair<std::string, std::string>(
158 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "preview_text")); //TODO check
160 std::pair<std::string, std::string>(
161 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "mail_status")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
163 std::pair<std::string, std::string>(
164 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "isHighPriority"));
166 std::pair<std::string, std::string>(
167 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "subject"));
169 std::pair<std::string, std::string>(
170 MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT, "attachment_count"));
172 std::pair<std::string, std::string>(
173 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "type"));
176 std::pair<std::string, std::string>(
177 ConversationFilterValidatorFactory::ATTRIBUTE_MESSAGE_COUNT, "thread_item_count"));
180 void MessageQueryGenerator::setSmsMmsAttributeMap(){
182 attributeMap.clear();
185 std::pair<std::string, std::string>(
186 MessageFilterValidatorFactory::ATTRIBUTE_ID, "A.MSG_ID"));
188 std::pair<std::string, std::string>(
189 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "A.FOLDER_ID"));
191 std::pair<std::string, std::string>(
192 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "A.DISPLAY_TIME"));
193 //TODO check sms mms attribute frome, to, cc, bcc
195 std::pair<std::string, std::string>(
196 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "B.ADDRESS_VAL"));
198 std::pair<std::string, std::string>(
199 MessageFilterValidatorFactory::ATTRIBUTE_TO, "B.ADDRESS_VAL"));
200 // attributeMap.insert(
201 // std::pair<std::string, std::string>(
202 // MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
203 // attributeMap.insert(
204 // std::pair<std::string, std::string>(
205 // MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
207 std::pair<std::string, std::string>(
208 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "A.MSG_TEXT"));
210 std::pair<std::string, std::string>(
211 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "A.READ_STATUS")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
213 std::pair<std::string, std::string>(
214 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "A.PRIORITY"));
216 std::pair<std::string, std::string>(
217 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "A.SUBJECT"));
219 std::pair<std::string, std::string>(
220 MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT, "A.ATTACHMENT_COUNT"));
222 std::pair<std::string, std::string>(
223 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "A.MAIN_TYPE"));
228 void MessageQueryGenerator::initAttributeMap(){
231 LogDebug("MODE_EMAIL");
232 setEmailAttributeMap();
236 LogDebug("MODE_SMS or MODE_MMS");
237 setSmsMmsAttributeMap();
239 default: //TODO throw exception
244 void MessageQueryGenerator::visitPreComposite(Api::Tizen::FilterType& type, int depth){
246 m_queryVector.push_back("(");
247 LogDebug("getServiceType = " << getServiceType());
251 void MessageQueryGenerator::visitInComposite(Api::Tizen::FilterType& type, int depth){
254 if(m_typeProcessing == 1){
255 m_typeProcessing = 0;
257 if(type != INTERSECTION_FILTER){
258 LogError("[ERROR] >>> invalid Filter type:" << type);
259 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
263 if(m_mode == MODE_EMAIL)
269 if(type == INTERSECTION_FILTER){
270 m_queryVector.push_back("AND");
272 // else if(type == UNION_FILTER){
273 // m_queryVector.push_back("OR");
276 LogError("[ERROR] invalid Filter type:" << type);
277 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
283 void MessageQueryGenerator::visitPostComposite(Api::Tizen::FilterType& type, int depth){
285 if(m_typeProcessing == 1){
286 m_typeProcessing = 0;
287 if(m_mode == MODE_EMAIL)
289 m_queryVector.erase(m_queryVector.end());
294 m_queryVector.push_back(")");
298 std::string MessageQueryGenerator::convertToEmfAttrName(std::string attrName){
299 LogDebug("<<< attrName:[" << attrName << "]");
301 std::string retString;
303 std::map<std::string, std::string>::iterator it = attributeMap.find(attrName);
304 if(it == attributeMap.end()){
305 MsgLogWanning("[WANNING] attribute not found : ["<< attrName << "]");
307 retString = static_cast<std::string>(attributeMap.find(attrName)->second);
310 LogDebug(">> retString:[" << retString << "]");
314 std::string MessageQueryGenerator::createTimeString(std::string& timeString)
316 LogDebug("<<< timeString:[" << timeString << "]");
318 size_t pos = timeString.find("-",0);
319 while(pos!= std::string::npos){
320 timeString.erase(pos,1);
321 pos = timeString.find('-',0);
324 LogDebug(">>> timeString:[" << timeString << "]");
328 std::string MessageQueryGenerator::createFolderType(std::string& value)
330 LogDebug("<<< value:[" << value << "]");
331 std::string retFolderType;
332 std::ostringstream outstream;
334 if(value.compare("1") == 0){
335 LogDebug("<<< value:[INBOX]");
336 outstream << MSG_INBOX_ID;
337 }else if(value.compare("2") == 0){
338 LogDebug("<<< value:[OUTBOX]");
339 outstream << MSG_OUTBOX_ID;
340 }else if(value.compare("3") == 0){
341 LogDebug("<<< value:[DRAFTBOX]");
342 outstream << MSG_DRAFT_ID;
343 }else if(value.compare("4") == 0){
344 LogDebug("<<< value:[SENTBOX]");
345 outstream << MSG_SENTBOX_ID;
347 LogDebug("[ERROR] unsupported type:["<< value << "]");
348 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid folder id");
351 retFolderType = outstream.str();
353 LogDebug(">>> retFolderType:[" << retFolderType << "]");
354 return retFolderType;
357 std::string MessageQueryGenerator::createPriorityTypeForEmail(std::string& value)
359 LogDebug("<<< value:[" << value << "]");
360 std::string retPriorityType;
362 if(value.compare("true")==0){
363 retPriorityType = "1";
365 retPriorityType = "3 OR priority=5";
368 return retPriorityType;
371 std::string MessageQueryGenerator::createPriorityTypeForSmsMms(std::string& value){
372 LogDebug("<<< value:[" << value << "]");
373 std::string retPriorityType;
375 if(value.compare("true")==0){
376 retPriorityType = "1";
377 }else if(value.compare("false")==0){
378 retPriorityType = "0";
380 LogError(">>> invalid value:[" << value << "]");
381 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "unsupported value");
384 return retPriorityType;
388 std::string MessageQueryGenerator::convertToTimeFormat(const std::string& timeString){
389 LogDebug("<<< timeString:[" << timeString << "]");
391 std::string retString;
392 retString.append("'");
396 retString.append(timeString.substr(0, yearLength));
397 retString.append("-");
398 nextStart = nextStart + yearLength;
401 retString.append(timeString.substr(nextStart, monthLength));
402 retString.append("-");
403 nextStart = nextStart + monthLength;
406 retString.append(timeString.substr(nextStart, dateLength));
407 retString.append(" ");
408 nextStart = nextStart + dateLength;
411 retString.append(timeString.substr(nextStart, hourLength));
412 retString.append(":");
413 nextStart = nextStart + hourLength;
415 int minuteLength = 2;
416 retString.append(timeString.substr(nextStart, minuteLength));
417 retString.append(":");
418 nextStart = nextStart + minuteLength;
420 int secondLength = 2;
421 retString.append(timeString.substr(nextStart, secondLength));
422 retString.append("'");
424 LogDebug(">>> retString:[" << retString << "]");
428 //convert from '20111115000000' to 2011-11-15 00:00:00
429 std::string MessageQueryGenerator::createDateTimeTypeForSmsMms(Api::Tizen::AnyPtr& value){
430 std::string initialValueStr;
431 LogDebug("<<< value:[" << value->toString() << "]");
433 if (!value->isNullOrUndefined()) {
434 if( TizenApis::Api::Tizen::PrimitiveType_Time==value->getType() ) {
435 LogDebug("<<<initialValue->getType()[" << value->getType() <<"]");
436 tm date = value->getDateTm();
437 initialValueStr = toDateDbStr(date);
438 LogDebug("<<<valueStr[" << initialValueStr <<"]");
441 LogError("initialValue->getType() : [" << value->getType() << "]");
442 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid value Type");
446 std::string tmpValueString = initialValueStr;
447 std::string secondsSinceType;
448 secondsSinceType.append("strftime('%s', "); //SQL time format function
449 if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
450 tmpValueString = convertToTimeFormat(tmpValueString);
453 secondsSinceType.append(tmpValueString);
454 secondsSinceType.append(")");
456 LogDebug(">>> retPriorityType:[" << secondsSinceType << "]");
457 return secondsSinceType;
460 std::string MessageQueryGenerator::createDateTimeTypeForSmsMms(std::string& timeString){
461 LogDebug("<<< value:[" << timeString << "]");
463 std::string tmpValueString;
464 std::string secondsSinceType;
465 secondsSinceType.append("strftime('%s', "); //SQL time format function
466 if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
467 tmpValueString = convertToTimeFormat(timeString);
470 secondsSinceType.append(tmpValueString);
471 secondsSinceType.append(")");
473 LogDebug(">>> retPriorityType:[" << secondsSinceType << "]");
474 return secondsSinceType;
477 std::string MessageQueryGenerator::createDateTimeTypeForEmail(Api::Tizen::AnyPtr& value)
479 std::string initialValueStr;
480 LogDebug("<<< value:[" << value->toString() << "]");
482 if(value->getType() != PrimitiveType_Time){
483 LogError("[ERROR]>> invalid type");
487 if (!value->isNullOrUndefined()) {
488 if( TizenApis::Api::Tizen::PrimitiveType_Time==value->getType() ) {
489 LogDebug("<<<initialValue->getType()[" << value->getType() <<"]");
490 tm date = value->getDateTm();
491 initialValueStr = toDateDbStr(date);
492 LogDebug("<<<valueStr[" << initialValueStr <<"]");
495 LogError("initialValue->getType() : [" << value->getType() << "]");
496 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid value Type");
499 return initialValueStr;
502 std::string MessageQueryGenerator::toDateDbStr(const tm &date) const
505 ss << setfill('0') << setiosflags(ios::right) << setw(4) << (date.tm_year + 1900);
506 ss << setfill('0') << setiosflags(ios::right) << setw(2) << (date.tm_mon + 1);
507 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_mday;
508 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_hour;
509 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_min;
510 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_sec;
514 std::string MessageQueryGenerator::convertBooleanStringToIntegerString(std::string& booleanString){
515 std::string retString;
517 if(booleanString.compare("true") == 0){
519 }else if(booleanString.compare("false") == 0){
522 LogError("invalid booleanString:[" << booleanString << "]");
523 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid booleanString :[" + booleanString + "]");
528 std::string MessageQueryGenerator::getMatchExactlyClause(std::string& attrName, Api::Tizen::AnyPtr& value)
530 std::string retClause;
531 std::string valueString = value->toString();
532 std::string emfAttributeName = convertToEmfAttrName(attrName);
535 if(m_mode == MODE_EMAIL){
536 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
537 retClause = emfAttributeName + " LIKE '%%<" + valueString +">'";
539 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
540 retClause = emfAttributeName + "=" + createDateTimeTypeForEmail(value);
542 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
543 retClause = emfAttributeName + "=" + createPriorityTypeForEmail(valueString);
545 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_SERVICE_ID)==0){
546 retClause = emfAttributeName + "=" + valueString;
548 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FOLDER)==0) {
549 retClause = emfAttributeName + "=" + valueString;
552 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
553 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
554 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=1)";
556 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
557 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=0)";
559 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
560 retClause = emfAttributeName + "=" + createDateTimeTypeForSmsMms(value); //TODO need to check
562 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
563 retClause = emfAttributeName + "=" + createPriorityTypeForSmsMms(valueString);
565 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FOLDER)==0) {
566 retClause = emfAttributeName + "=" + createFolderType(valueString);
568 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TYPE)==0) {
569 retClause = emfAttributeName + "=" + convertMessageTypeToString(valueString);
575 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_IS_READ)==0) {
576 retClause = emfAttributeName + "=" + convertBooleanStringToIntegerString(valueString);
577 } else if (attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT) == 0 ) {
578 if(valueString.compare("true") == 0){
579 retClause = emfAttributeName + " > 0" ;
581 retClause = emfAttributeName + " = 0" ;
584 retClause = emfAttributeName + " = '" + value->toString() + "'"; //TODO need to check
591 std::string MessageQueryGenerator::getMatchStartsWithClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
592 std::string retClause;
593 std::string valueString = value->toString();
594 std::string emfAttributeName = convertToEmfAttrName(attrName);
597 if(m_mode == MODE_EMAIL){
598 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
599 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
600 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
601 "%%' AND " + getMessageDirectionString() + "=1) ");
603 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
604 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
605 "%%' AND " + getMessageDirectionString() +"=0) ");
610 retClause.append(emfAttributeName + " LIKE '" + value->toString() +"%%'");
616 std::string MessageQueryGenerator::getMessageDirectionString(){
617 return MessageQueryGenerator::STRING_DIRECTION;
620 std::string MessageQueryGenerator::getMatchEndsWithClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
621 std::string retClause;
622 std::string valueString = value->toString();
623 std::string emfAttributeName = convertToEmfAttrName(attrName);
626 if(m_mode == MODE_EMAIL){
627 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
628 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
629 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
630 "' AND "+ getMessageDirectionString() + "=1) ");
632 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
633 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
634 "' AND " + getMessageDirectionString() + "=0) ");
639 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"'");
645 std::string MessageQueryGenerator::getMatchContainsClause(std::string& attrName, TizenApis::Api::Tizen::AnyPtr& value){
646 std::string retClause;
647 std::string valueString = value->toString();
648 std::string emfAttributeName = convertToEmfAttrName(attrName);
651 if(m_mode == MODE_EMAIL){
652 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
653 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
654 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
655 "%%' AND " + getMessageDirectionString() + "=1) ");
657 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
658 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
659 "%%' AND " + getMessageDirectionString() + "=0) ");
664 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"%%'");
670 void MessageQueryGenerator::visitAttribute(std::string& attrName, Api::Tizen::MatchFlag& matchFlag,
671 Api::Tizen::AnyPtr& matchValue, int depth){
672 LogDebug("<<< attrName:[" << attrName << "], matchFlag:[" << matchFlag << "]");
674 if(matchValue == NULL)
677 LogDebug("matchValue:" << matchValue->toString());
679 visitAttributeEach(attrName, matchFlag, matchValue, depth);
684 int MessageQueryGenerator::convertMessageType(std::string& stringType){
685 LogDebug("<<< stringType:[" << stringType << "]");
687 int retMessageType = -1;
689 if(stringType.compare("messaging.sms") ==0){
690 retMessageType = Api::Messaging::SMS;
691 }else if(stringType.compare("messaging.mms") ==0){
692 retMessageType = Api::Messaging::MMS;
693 }else if(stringType.compare("messaging.email") ==0){
694 retMessageType = Api::Messaging::EMAIL;
696 MsgLogError("invalid type:[" << stringType << "]");
700 LogDebug(">>> retMessageType:" << retMessageType);
701 return retMessageType;
705 std::string MessageQueryGenerator::convertMessageTypeToString(std::string& stringType){
706 LogDebug("<<< value:[" << stringType << "]");
707 std::string retMessageType;
708 std::ostringstream outstream;
710 if(stringType.compare("messaging.sms") ==0){
711 outstream << Api::Messaging::SMS;
712 }else if(stringType.compare("messaging.mms") ==0){
713 outstream << Api::Messaging::MMS;
714 }else if(stringType.compare("messaging.email") ==0){
715 outstream << Api::Messaging::EMAIL;
717 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid msg type");
720 retMessageType = outstream.str();
722 return retMessageType;
725 void MessageQueryGenerator::visitAttributeEach(std::string& attrName, Api::Tizen::MatchFlag& matchFlag, Api::Tizen::AnyPtr& value, int depth){
726 LogDebug("<<< attrName:[" << attrName << "], value:[" << value->toString() << "]");
728 if(attrName.compare("type")==0){
729 m_typeProcessing = 1;
730 m_currentType = value->toString();
732 m_messageType = convertMessageType(m_currentType);
733 if(m_messageType == Api::Messaging::EMAIL)
735 LogDebug(">>> skip type");
740 std::string emfAttributeName = convertToEmfAttrName(attrName);
742 // if(emfAttributeName == NULL){
743 // LogDebug(">>> emfAttributeName is NULL");
746 std::string tmpStringBuffer;
748 if(matchFlag == Api::Tizen::MATCH_EXACTLY){
749 LogDebug("STRING_MATCH_EXACTLY");
750 tmpStringBuffer.append(getMatchExactlyClause(attrName, value));
751 }else if(matchFlag == Api::Tizen::MATCH_CONTAINS){
752 LogDebug("STRING_MATCH_CONTAINS");
753 tmpStringBuffer.append(getMatchContainsClause(attrName, value));
754 }else if(matchFlag == Api::Tizen::MATCH_STARTSWITH){
755 LogDebug("STRING_MATCH_STARTSWITH");
756 tmpStringBuffer.append(getMatchStartsWithClause(attrName, value));
757 }else if(matchFlag == Api::Tizen::MATCH_ENDSWITH){
758 LogDebug("STRING_MATCH_ENDSWITH");
759 tmpStringBuffer.append(getMatchEndsWithClause(attrName, value));
761 LogDebug("[ERROR]invalid match flag[" << matchFlag << "]");
762 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid match flag:[" << matchFlag << "]");
764 // else if(iter->find(MATCH_CASESENSITIVE)){ //TODO check case sensitive
766 m_queryVector.push_back(tmpStringBuffer);
770 void MessageQueryGenerator::visitAttributeRange(std::string& attrName, Api::Tizen::AnyPtr& initialValue, Api::Tizen::AnyPtr& endValue, int depth) {
771 LogDebug("<<< sttrName:[" << attrName <<"]");
773 string initialValueStr;
776 if(initialValue == NULL || endValue == NULL)
779 std::string tmpStringBuffer;
781 std::string emfAttributeName = convertToEmfAttrName(attrName);
782 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
784 if (!initialValue->isNullOrUndefined()) {
785 if( TizenApis::Api::Tizen::PrimitiveType_Time==initialValue->getType() ) {
786 LogDebug("<<<initialValue->getType()[" << initialValue->getType() <<"]");
787 tm date = initialValue->getDateTm();
788 initialValueStr = toDateDbStr(date);
789 LogDebug("<<<valueStr[" << initialValueStr <<"]");
792 LogError("initialValue->getType() : [" << initialValue->getType() << "]");
793 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid initialValue Type");
797 if (!endValue->isNullOrUndefined()) {
798 if( TizenApis::Api::Tizen::PrimitiveType_Time==endValue->getType() ) {
799 LogDebug("<<<initialValue->getType()[" << endValue->getType() <<"]");
800 tm date = endValue->getDateTm();
801 endValueStr = toDateDbStr(date);
803 LogError("endValue->getType() : [" << endValue->getType() << "]");
804 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid endValue Type");
809 if(m_mode == MODE_EMAIL){
810 tmpStringBuffer.append(emfAttributeName + " BETWEEN " + initialValueStr + " AND " + endValueStr);
811 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
812 tmpStringBuffer.append(emfAttributeName + " BETWEEN " +
813 createDateTimeTypeForSmsMms(initialValueStr) + " AND " +
814 createDateTimeTypeForSmsMms(endValueStr));
818 m_queryVector.push_back(tmpStringBuffer);
822 std::string MessageQueryGenerator::getQueryFromVector()
824 std::string retString;
826 std::vector<string>::const_iterator it = m_queryVector.begin();
827 while(it != m_queryVector.end()){
828 retString.append(*it);
829 retString.append(" ");
833 LogDebug(">>> retString:" << retString);
837 std::string MessageQueryGenerator::getQuery(){
838 std::stringstream buffer;
840 m_query.append(getQueryFromVector());
842 if(m_query.compare(getQueryPrefix())==0){
845 if(m_sortMode != NULL){
846 std::string platformAttrName = convertToEmfAttrName(m_sortMode->getAttributeName());
847 std::string sortModeString;
848 if(m_sortMode->getOrder() == ASCENDING_SORT_ORDER){
849 sortModeString = "ASC";
851 sortModeString = "DESC";
854 buffer << " ORDER BY " << platformAttrName << " " << sortModeString;
856 buffer << " LIMIT " << m_offset << "," << m_limit;
860 m_query.append(getQuerySuffix());
861 // m_query.append(buffer.str());
862 m_orderLimit.append(buffer.str());
867 std::string MessageQueryGenerator::getOrderLimit(){
871 std::string MessageQueryGenerator::getQueryPrefix(){
872 return MessageQueryGenerator::STRING_WHERE;
875 std::string MessageQueryGenerator::getQuerySuffix(){
876 return MessageQueryGenerator::STRING_SUFFIX;
882 } //namespace Platform
883 } //namespace WrtPlugins