2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #include "MessageQueryGenerator.h"
19 #include "MessageFilterValidatorFactory.h"
20 #include "ConversationFilterValidatorFactory.h"
22 #include "IMessagingTypes.h"
24 #include <Commons/Exception.h>
26 #include <email-types.h>
27 #include <msg_storage_types.h>
34 using namespace DeviceAPI::Tizen;
39 const std::string MessageQueryGenerator::STRING_MATCH_EXACTLY = "EXACTLY";
40 const std::string MessageQueryGenerator::STRING_MATCH_CONTAINS = "CONTAINS";
41 const std::string MessageQueryGenerator::STRING_MATCH_STARTSWITH = "STARTSWITH";
42 const std::string MessageQueryGenerator::STRING_MATCH_ENDSWITH = "ENDSWITH";
43 // const std::string MessageQueryGenerator::STRING_MATCH_CASESENSITIVE = "CASESENSITIVE";
45 const std::string MessageQueryGenerator::STRING_WHERE = "WHERE ";
46 const std::string MessageQueryGenerator::STRING_SUFFIX = "";
47 const std::string MessageQueryGenerator::STRING_DIRECTION = "A.MSG_DIRECTION";
49 const int MessageQueryGenerator::MESSAGE_TYPE_NOT_INITIALIZED = -1;
51 MessageQueryGenerator::MessageQueryGenerator():m_messageType(MESSAGE_TYPE_NOT_INITIALIZED) {
52 m_query.append(getQueryPrefix());
61 MessageQueryGenerator::MessageQueryGenerator(const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset):
62 m_messageType(MESSAGE_TYPE_NOT_INITIALIZED){
63 LoggerD("<<< limit:" << limit << ", offset:" << offset);
65 m_query.append(getQueryPrefix());
67 //TODO check sort mode validation
68 m_sortMode = sortMode;
77 MessageQueryGenerator::MessageQueryGenerator(const DeviceAPI::Tizen::SortModePtr& sortMode, const long limit, const long offset, const int type):
78 m_messageType(MESSAGE_TYPE_NOT_INITIALIZED){
79 LoggerD("<<< limit:" << limit << ", offset:" << offset);
80 m_query.append(getQueryPrefix());
82 //TODO check sort mode validation
83 m_sortMode = sortMode;
106 MessageQueryGenerator::~MessageQueryGenerator() {
109 void MessageQueryGenerator::reset(QueryGeneratorMode mode){
111 m_queryVector.clear();
117 m_query.append(getQueryPrefix());
122 void MessageQueryGenerator::setEmailAttributeMap(){
123 attributeMap.clear();
126 std::pair<std::string, std::string>(
127 MessageFilterValidatorFactory::ATTRIBUTE_ID, "mail_id"));
129 std::pair<std::string, std::string>(
130 MessageFilterValidatorFactory::ATTRIBUTE_SERVICE_ID, "account_id"));
132 std::pair<std::string, std::string>(
133 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "mailbox_id"));
135 std::pair<std::string, std::string>(
136 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "date_time"));
138 std::pair<std::string, std::string>(
139 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "full_address_from"));
141 std::pair<std::string, std::string>(
142 MessageFilterValidatorFactory::ATTRIBUTE_TO, "full_address_to"));
144 std::pair<std::string, std::string>(
145 MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
147 std::pair<std::string, std::string>(
148 MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
150 std::pair<std::string, std::string>(
151 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "preview_text")); //TODO check
153 std::pair<std::string, std::string>(
154 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "flags_seen_field")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
156 std::pair<std::string, std::string>(
157 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "priority"));
159 std::pair<std::string, std::string>(
160 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "subject"));
162 std::pair<std::string, std::string>(
163 MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT, "attachment_count"));
165 std::pair<std::string, std::string>(
166 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "type"));
169 std::pair<std::string, std::string>(
170 ConversationFilterValidatorFactory::ATTRIBUTE_MESSAGE_COUNT, "thread_item_count"));
173 void MessageQueryGenerator::setSmsMmsAttributeMap(){
175 attributeMap.clear();
178 std::pair<std::string, std::string>(
179 MessageFilterValidatorFactory::ATTRIBUTE_ID, "A.MSG_ID"));
181 std::pair<std::string, std::string>(
182 MessageFilterValidatorFactory::ATTRIBUTE_FOLDER, "A.FOLDER_ID"));
184 std::pair<std::string, std::string>(
185 MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP, "A.DISPLAY_TIME"));
186 //TODO check sms mms attribute frome, to, cc, bcc
188 std::pair<std::string, std::string>(
189 MessageFilterValidatorFactory::ATTRIBUTE_FROM, "B.ADDRESS_VAL"));
191 std::pair<std::string, std::string>(
192 MessageFilterValidatorFactory::ATTRIBUTE_TO, "B.ADDRESS_VAL"));
193 // attributeMap.insert(
194 // std::pair<std::string, std::string>(
195 // MessageFilterValidatorFactory::ATTRIBUTE_CC, "full_address_cc"));
196 // attributeMap.insert(
197 // std::pair<std::string, std::string>(
198 // MessageFilterValidatorFactory::ATTRIBUTE_BCC, "full_address_bcc"));
200 std::pair<std::string, std::string>(
201 MessageFilterValidatorFactory::ATTRIBUTE_BODY, "A.MSG_TEXT"));
203 std::pair<std::string, std::string>(
204 MessageFilterValidatorFactory::ATTRIBUTE_IS_READ, "A.READ_STATUS")); //TODO 1:seen, 2:deleted, 4:flagged, 8:answered, 20:draft
206 std::pair<std::string, std::string>(
207 MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY, "A.PRIORITY"));
209 std::pair<std::string, std::string>(
210 MessageFilterValidatorFactory::ATTRIBUTE_SUBJECT, "A.SUBJECT"));
212 std::pair<std::string, std::string>(
213 MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT, "A.ATTACHMENT_COUNT"));
215 std::pair<std::string, std::string>(
216 MessageFilterValidatorFactory::ATTRIBUTE_TYPE, "A.MAIN_TYPE"));
221 void MessageQueryGenerator::initAttributeMap(){
224 LoggerD("MODE_EMAIL");
225 setEmailAttributeMap();
229 LoggerD("MODE_SMS or MODE_MMS");
230 setSmsMmsAttributeMap();
232 default: //TODO throw exception
237 void MessageQueryGenerator::visitPreComposite(DeviceAPI::Tizen::FilterType& type, int depth){
239 m_queryVector.push_back("(");
240 LoggerD("getServiceType = " << getServiceType());
244 void MessageQueryGenerator::visitInComposite(DeviceAPI::Tizen::FilterType& type, int depth){
247 if(m_typeProcessing == 1){
248 m_typeProcessing = 0;
250 if(type != INTERSECTION_FILTER){
251 LoggerE("[ERROR] >>> invalid Filter type:" << type);
252 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
256 if(m_mode == MODE_EMAIL)
262 if(type == INTERSECTION_FILTER){
263 m_queryVector.push_back("AND");
265 // else if(type == UNION_FILTER){
266 // m_queryVector.push_back("OR");
269 LoggerE("[ERROR] invalid Filter type:" << type);
270 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid Fiilter Type");
276 void MessageQueryGenerator::visitPostComposite(DeviceAPI::Tizen::FilterType& type, int depth){
278 if(m_typeProcessing == 1){
279 m_typeProcessing = 0;
280 if(m_mode == MODE_EMAIL)
282 m_queryVector.erase(m_queryVector.end());
287 m_queryVector.push_back(")");
291 std::string MessageQueryGenerator::convertToEmfAttrName(std::string attrName){
292 LoggerD("<<< attrName:[" << attrName << "]");
294 std::string retString;
296 std::map<std::string, std::string>::iterator it = attributeMap.find(attrName);
297 if(it == attributeMap.end()){
298 MsgLogWanning("[WANNING] attribute not found : ["<< attrName << "]");
300 retString = static_cast<std::string>(attributeMap.find(attrName)->second);
303 LoggerD(">> retString:[" << retString << "]");
307 std::string MessageQueryGenerator::createTimeString(std::string& timeString)
309 LoggerD("<<< timeString:[" << timeString << "]");
311 size_t pos = timeString.find("-",0);
312 while(pos!= std::string::npos){
313 timeString.erase(pos,1);
314 pos = timeString.find('-',0);
317 LoggerD(">>> timeString:[" << timeString << "]");
321 std::string MessageQueryGenerator::createFolderType(std::string& value)
323 LoggerD("<<< value:[" << value << "]");
324 std::string retFolderType;
325 std::ostringstream outstream;
327 if(value.compare("1") == 0){
328 LoggerD("<<< value:[INBOX]");
329 outstream << MSG_INBOX_ID;
330 }else if(value.compare("2") == 0){
331 LoggerD("<<< value:[OUTBOX]");
332 outstream << MSG_OUTBOX_ID;
333 }else if(value.compare("3") == 0){
334 LoggerD("<<< value:[DRAFTBOX]");
335 outstream << MSG_DRAFT_ID;
336 }else if(value.compare("4") == 0){
337 LoggerD("<<< value:[SENTBOX]");
338 outstream << MSG_SENTBOX_ID;
340 LoggerD("[ERROR] unsupported type:["<< value << "]");
341 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid folder id");
344 retFolderType = outstream.str();
346 LoggerD(">>> retFolderType:[" << retFolderType << "]");
347 return retFolderType;
350 std::string MessageQueryGenerator::createPriorityTypeForEmail(std::string& value)
352 LoggerD("<<< value:[" << value << "]");
353 std::string retPriorityType;
355 if(value.compare("true")==0){
356 retPriorityType = "1";
358 retPriorityType = "3 OR priority=5";
361 return retPriorityType;
364 std::string MessageQueryGenerator::createPriorityTypeForSmsMms(std::string& value){
365 LoggerD("<<< value:[" << value << "]");
366 std::string retPriorityType;
368 if(value.compare("true")==0){
369 retPriorityType = "1";
370 }else if(value.compare("false")==0){
371 retPriorityType = "0";
373 LoggerE(">>> invalid value:[" << value << "]");
374 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "unsupported value");
377 return retPriorityType;
381 std::string MessageQueryGenerator::convertToTimeFormat(const std::string& timeString){
382 LoggerD("<<< timeString:[" << timeString << "]");
384 std::string retString;
385 retString.append("'");
389 retString.append(timeString.substr(0, yearLength));
390 retString.append("-");
391 nextStart = nextStart + yearLength;
394 retString.append(timeString.substr(nextStart, monthLength));
395 retString.append("-");
396 nextStart = nextStart + monthLength;
399 retString.append(timeString.substr(nextStart, dateLength));
400 retString.append(" ");
401 nextStart = nextStart + dateLength;
404 retString.append(timeString.substr(nextStart, hourLength));
405 retString.append(":");
406 nextStart = nextStart + hourLength;
408 int minuteLength = 2;
409 retString.append(timeString.substr(nextStart, minuteLength));
410 retString.append(":");
411 nextStart = nextStart + minuteLength;
413 int secondLength = 2;
414 retString.append(timeString.substr(nextStart, secondLength));
415 retString.append("'");
417 LoggerD(">>> retString:[" << retString << "]");
421 //convert from '20111115000000' to 2011-11-15 00:00:00
422 std::string MessageQueryGenerator::createDateTimeTypeForSmsMms(DeviceAPI::Tizen::AnyPtr& value){
423 std::string initialValueStr;
424 LoggerD("<<< value:[" << value->toString() << "]");
426 if (!value->isNullOrUndefined()) {
427 if( value->isType(DeviceAPI::Tizen::PrimitiveType_Time) ) {
428 LoggerD("<<<initialValue->getType()[PrimitiveType_Time]");
429 tm date = *value->getDateTm();
430 initialValueStr = toDateDbStr(date);
431 LoggerD("<<<valueStr[" << initialValueStr <<"]");
434 LoggerE("initialValue->getType()");
435 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid value Type");
439 std::string tmpValueString = initialValueStr;
440 std::string secondsSinceType;
441 secondsSinceType.append("strftime('%s', "); //SQL time format function
442 if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
443 tmpValueString = convertToTimeFormat(tmpValueString);
446 secondsSinceType.append(tmpValueString);
447 secondsSinceType.append(")");
449 LoggerD(">>> retPriorityType:[" << secondsSinceType << "]");
450 return secondsSinceType;
453 std::string MessageQueryGenerator::createDateTimeTypeForSmsMms(std::string& timeString){
454 LoggerD("<<< value:[" << timeString << "]");
456 std::string tmpValueString;
457 std::string secondsSinceType;
458 secondsSinceType.append("strftime('%s', "); //SQL time format function
459 if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
460 tmpValueString = convertToTimeFormat(timeString);
463 secondsSinceType.append(tmpValueString);
464 secondsSinceType.append(")");
466 LoggerD(">>> retPriorityType:[" << secondsSinceType << "]");
467 return secondsSinceType;
470 std::string MessageQueryGenerator::createDateTimeTypeForEmail(DeviceAPI::Tizen::AnyPtr& value)
472 std::string initialValueStr;
473 LoggerD("<<< value:[" << value->toString() << "]");
475 if(!value->isType(PrimitiveType_Time)){
476 LoggerE("[ERROR]>> invalid type");
480 if (!value->isNullOrUndefined()) {
481 if( value->isType(DeviceAPI::Tizen::PrimitiveType_Time) ) {
482 LoggerD("<<<initialValue->getType()[PrimitiveType_Time]");
483 tm date = *value->getDateTm();
484 initialValueStr = toDateDbStr(date);
485 LoggerD("<<<valueStr[" << initialValueStr <<"]");
488 LoggerE("initialValue->getType()");
489 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid value Type");
492 return initialValueStr;
495 std::string MessageQueryGenerator::toDateDbStr(const tm &date) const
498 ss << setfill('0') << setiosflags(ios::right) << setw(4) << (date.tm_year + 1900);
499 ss << setfill('0') << setiosflags(ios::right) << setw(2) << (date.tm_mon + 1);
500 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_mday;
501 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_hour;
502 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_min;
503 ss << setfill('0') << setiosflags(ios::right) << setw(2) << date.tm_sec;
507 std::string MessageQueryGenerator::convertBooleanStringToIntegerString(std::string& booleanString){
508 std::string retString;
510 if(booleanString.compare("true") == 0){
512 }else if(booleanString.compare("false") == 0){
515 LoggerE("invalid booleanString:[" << booleanString << "]");
516 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid booleanString :[" + booleanString + "]");
521 std::string MessageQueryGenerator::getMatchExactlyClause(std::string& attrName, DeviceAPI::Tizen::AnyPtr& value)
523 std::string retClause;
524 std::string valueString = value->toString();
525 std::string emfAttributeName = convertToEmfAttrName(attrName);
528 if(m_mode == MODE_EMAIL){
529 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
530 retClause = emfAttributeName + " LIKE '%%<" + valueString +">'";
532 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
533 retClause = emfAttributeName + "=" + createDateTimeTypeForEmail(value);
535 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
536 retClause = emfAttributeName + "=" + createPriorityTypeForEmail(valueString);
538 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_SERVICE_ID)==0){
539 retClause = emfAttributeName + "=" + valueString;
541 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FOLDER)==0) {
542 retClause = emfAttributeName + "=" + valueString;
544 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_BODY)==0) {
545 retClause = emfAttributeName + " ='" + valueString + "'";
547 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0) {
548 retClause = emfAttributeName + " ='<" + valueString + ">'";
550 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_CC)==0) {
551 retClause = emfAttributeName + " ='<" + valueString + ">'";
553 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_BCC)==0) {
554 retClause = emfAttributeName + " ='<" + valueString + ">'";
557 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS ){
558 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
559 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=1)";
561 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
562 retClause = "("+emfAttributeName + " ='"+ valueString + "' AND " + getMessageDirectionString() + "=0)";
564 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
565 retClause = emfAttributeName + "=" + createDateTimeTypeForSmsMms(value); //TODO need to check
567 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_PRIORITY)==0){
568 retClause = emfAttributeName + "=" + createPriorityTypeForSmsMms(valueString);
570 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FOLDER)==0) {
571 retClause = emfAttributeName + "=" + createFolderType(valueString);
573 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TYPE)==0) {
574 retClause = emfAttributeName + "=" + convertMessageTypeToString(valueString);
576 } else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_BODY)==0) {
577 retClause = emfAttributeName + " ='" + valueString + "'";
583 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_IS_READ)==0) {
584 retClause = emfAttributeName + "=" + convertBooleanStringToIntegerString(valueString);
585 } else if (attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_ATTACHMENT) == 0 ) {
586 if(valueString.compare("true") == 0){
587 retClause = emfAttributeName + " > 0" ;
589 retClause = emfAttributeName + " = 0" ;
592 retClause = emfAttributeName + " = '" + value->toString() + "'"; //TODO need to check
599 std::string MessageQueryGenerator::getMatchStartsWithClause(std::string& attrName, DeviceAPI::Tizen::AnyPtr& value){
600 std::string retClause;
601 std::string valueString = value->toString();
602 std::string emfAttributeName = convertToEmfAttrName(attrName);
605 if(m_mode == MODE_EMAIL){
606 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
607 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
608 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
609 "%%' AND " + getMessageDirectionString() + "=1) ");
611 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
612 retClause.append("(" + emfAttributeName + " LIKE '" + value->toString() +
613 "%%' AND " + getMessageDirectionString() +"=0) ");
618 retClause.append(emfAttributeName + " LIKE '" + value->toString() +"%%'");
624 std::string MessageQueryGenerator::getMessageDirectionString(){
625 return MessageQueryGenerator::STRING_DIRECTION;
628 std::string MessageQueryGenerator::getMatchEndsWithClause(std::string& attrName, DeviceAPI::Tizen::AnyPtr& value){
629 std::string retClause;
630 std::string valueString = value->toString();
631 std::string emfAttributeName = convertToEmfAttrName(attrName);
634 if(m_mode == MODE_EMAIL){
635 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
636 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
637 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
638 "' AND "+ getMessageDirectionString() + "=1) ");
640 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
641 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
642 "' AND " + getMessageDirectionString() + "=0) ");
647 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"'");
653 std::string MessageQueryGenerator::getMatchContainsClause(std::string& attrName, DeviceAPI::Tizen::AnyPtr& value){
654 std::string retClause;
655 std::string valueString = value->toString();
656 std::string emfAttributeName = convertToEmfAttrName(attrName);
659 if(m_mode == MODE_EMAIL){
660 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
661 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_FROM)==0){
662 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
663 "%%' AND " + getMessageDirectionString() + "=1) ");
665 }else if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TO)==0){
666 retClause.append("(" + emfAttributeName + " LIKE '%%" + value->toString() +
667 "%%' AND " + getMessageDirectionString() + "=0) ");
672 retClause.append(emfAttributeName + " LIKE '%%" + value->toString() +"%%'");
678 void MessageQueryGenerator::visitAttribute(std::string& attrName, DeviceAPI::Tizen::MatchFlag& matchFlag,
679 DeviceAPI::Tizen::AnyPtr& matchValue, int depth){
680 LoggerD("<<< attrName:[" << attrName << "], matchFlag:[" << matchFlag << "]");
682 if(matchValue == NULL)
685 LoggerD("matchValue:" << matchValue->toString());
687 visitAttributeEach(attrName, matchFlag, matchValue, depth);
692 int MessageQueryGenerator::convertMessageType(std::string& stringType){
693 LoggerD("<<< stringType:[" << stringType << "]");
695 int retMessageType = -1;
697 if(stringType.compare("messaging.sms") ==0){
698 retMessageType = SMS;
699 }else if(stringType.compare("messaging.mms") ==0){
700 retMessageType = MMS;
701 }else if(stringType.compare("messaging.email") ==0){
702 retMessageType = EMAIL;
704 MsgLoggerE("invalid type:[" << stringType << "]");
708 LoggerD(">>> retMessageType:" << retMessageType);
709 return retMessageType;
713 std::string MessageQueryGenerator::convertMessageTypeToString(std::string& stringType){
714 LoggerD("<<< value:[" << stringType << "]");
715 std::string retMessageType;
716 std::ostringstream outstream;
718 if(stringType.compare("messaging.sms") ==0){
720 }else if(stringType.compare("messaging.mms") ==0){
722 }else if(stringType.compare("messaging.email") ==0){
725 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid msg type");
728 retMessageType = outstream.str();
730 return retMessageType;
733 void MessageQueryGenerator::visitAttributeEach(std::string& attrName, DeviceAPI::Tizen::MatchFlag& matchFlag, DeviceAPI::Tizen::AnyPtr& value, int depth){
734 LoggerD("<<< attrName:[" << attrName << "], value:[" << value->toString() << "]");
736 if(attrName.compare("type")==0){
737 m_typeProcessing = 1;
738 m_currentType = value->toString();
740 m_messageType = convertMessageType(m_currentType);
741 if(m_messageType == EMAIL)
743 LoggerD(">>> skip type");
748 std::string emfAttributeName = convertToEmfAttrName(attrName);
750 // if(emfAttributeName == NULL){
751 // LoggerD(">>> emfAttributeName is NULL");
754 std::string tmpStringBuffer;
756 if(matchFlag == DeviceAPI::Tizen::MATCH_EXACTLY){
757 LoggerD("STRING_MATCH_EXACTLY");
758 tmpStringBuffer.append(getMatchExactlyClause(attrName, value));
759 }else if(matchFlag == DeviceAPI::Tizen::MATCH_CONTAINS){
760 LoggerD("STRING_MATCH_CONTAINS");
761 tmpStringBuffer.append(getMatchContainsClause(attrName, value));
762 }else if(matchFlag == DeviceAPI::Tizen::MATCH_STARTSWITH){
763 LoggerD("STRING_MATCH_STARTSWITH");
764 tmpStringBuffer.append(getMatchStartsWithClause(attrName, value));
765 }else if(matchFlag == DeviceAPI::Tizen::MATCH_ENDSWITH){
766 LoggerD("STRING_MATCH_ENDSWITH");
767 tmpStringBuffer.append(getMatchEndsWithClause(attrName, value));
769 LoggerD("[ERROR]invalid match flag[" << matchFlag << "]");
770 ThrowMsg(WrtDeviceApis::Commons::PlatformException, "invalid match flag:[" << matchFlag << "]");
772 // else if(iter->find(MATCH_CASESENSITIVE)){ //TODO check case sensitive
774 m_queryVector.push_back(tmpStringBuffer);
778 void MessageQueryGenerator::visitAttributeRange(std::string& attrName, DeviceAPI::Tizen::AnyPtr& initialValue, DeviceAPI::Tizen::AnyPtr& endValue, int depth) {
779 LoggerD("<<< sttrName:[" << attrName <<"]");
781 string initialValueStr;
784 if(initialValue == NULL || endValue == NULL)
787 std::string tmpStringBuffer;
789 std::string emfAttributeName = convertToEmfAttrName(attrName);
790 if(attrName.compare(MessageFilterValidatorFactory::ATTRIBUTE_TIMESTAMP)==0){
792 if (!initialValue->isNullOrUndefined()) {
793 if( initialValue->isType(DeviceAPI::Tizen::PrimitiveType_Time) ) {
794 LoggerD("<<<initialValue->getType()[PrimitiveType_Time]");
795 tm date = *initialValue->getDateTm();
796 initialValueStr = toDateDbStr(date);
797 LoggerD("<<<valueStr[" << initialValueStr <<"]");
800 LoggerE("initialValue->getType()");
801 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid initialValue Type");
805 if (!endValue->isNullOrUndefined()) {
806 if( endValue->isType(DeviceAPI::Tizen::PrimitiveType_Time) ) {
807 LoggerD("<<<initialValue->getType()[PrimitiveType_Time]");
808 tm date = *endValue->getDateTm();
809 endValueStr = toDateDbStr(date);
811 LoggerE("endValue->getType()");
812 ThrowMsg(WrtDeviceApis::Commons::InvalidArgumentException, "invalid endValue Type");
817 if(m_mode == MODE_EMAIL){
818 tmpStringBuffer.append(emfAttributeName + " BETWEEN " + initialValueStr + " AND " + endValueStr);
819 }else if(m_mode == MODE_SMS || m_mode == MODE_MMS){
820 tmpStringBuffer.append(emfAttributeName + " BETWEEN " +
821 createDateTimeTypeForSmsMms(initialValueStr) + " AND " +
822 createDateTimeTypeForSmsMms(endValueStr));
826 m_queryVector.push_back(tmpStringBuffer);
830 std::string MessageQueryGenerator::getQueryFromVector()
832 std::string retString;
834 std::vector<string>::const_iterator it = m_queryVector.begin();
835 while(it != m_queryVector.end()){
836 retString.append(*it);
837 retString.append(" ");
841 LoggerD(">>> retString:" << retString);
845 std::string MessageQueryGenerator::getQuery(){
846 std::stringstream buffer;
848 m_query.append(getQueryFromVector());
850 LoggerD("m_limit : " << m_limit << " m_offset : " << m_offset);
852 if(m_sortMode != NULL)
854 std::string platformAttrName = convertToEmfAttrName(m_sortMode->getAttributeName());
855 std::string sortModeString;
856 if(m_sortMode->getOrder() == ASCENDING_SORT_ORDER){
857 sortModeString = "ASC";
859 sortModeString = "DESC";
861 buffer << " ORDER BY " << platformAttrName << " " << sortModeString;
865 buffer << " LIMIT " << m_offset << "," << m_limit;
868 m_orderLimit.append(buffer.str());
870 if(m_query.compare(getQueryPrefix())==0){
871 LoggerD("m_query null");
874 m_query.append(getQuerySuffix());
875 LoggerD("m_query not null");
880 std::string MessageQueryGenerator::getOrderLimit(){
884 std::string MessageQueryGenerator::getQueryPrefix(){
885 return MessageQueryGenerator::STRING_WHERE;
888 std::string MessageQueryGenerator::getQuerySuffix(){
889 return MessageQueryGenerator::STRING_SUFFIX;