summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHerasym Oleh <oolleehh@gmail.com>2016-03-25 16:21:56 +0200
committerHerasym Oleh <oolleehh@gmail.com>2016-04-13 11:31:31 +0300
commit29c964ac33c41ff315639a1a194d45bf3626b3f7 (patch)
tree6d76be4bd95d86cf75b5a62840307a420c29e86c /src
parent47e02bf586513eccb2ba00656a17b237efb1442c (diff)
downloadsdl_core-29c964ac33c41ff315639a1a194d45bf3626b3f7.tar.gz
Change resumption SubscribedForWaypoints
Conflicts: src/components/application_manager/src/resumption/resumption_data_db.cc Add implementation SubscribeWayPoints&UnsubsribeWayPoints Add mobile request/response SubscribeWayPoints Add mobile request/response UnSubscribeWayPoints Add HMI request/response SubscribeWayPoints Add HMI request/response UnsubscribeWayPoints Add SendUnsubscribeWayPoints method in MessageHelper Add save subscribe app status to resumption DB & json Add Sending UnsubscribeWayPoints in case unexpected disconnect Related: APPLINK-21629 Related: APPLINK-21631
Diffstat (limited to 'src')
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h2
-rw-r--r--src/components/application_manager/include/application_manager/commands/hmi/navi_subscribe_way_points_request.h4
-rw-r--r--src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_request.h4
-rw-r--r--src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_response.h1
-rw-r--r--src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_request.h2
-rw-r--r--src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_response.h2
-rw-r--r--src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_request.h2
-rw-r--r--src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_response.h2
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resume_ctrl.h8
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc62
-rw-r--r--src/components/application_manager/src/commands/hmi/navi_subscribe_way_points_response.cc1
-rw-r--r--src/components/application_manager/src/resumption/resume_ctrl.cc15
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_db.cc39
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_json.cc21
-rw-r--r--src/components/application_manager/src/resumption/resumption_sql_queries.cc7
15 files changed, 115 insertions, 57 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h
index d0e8c99fae..01f137a2fd 100644
--- a/src/components/application_manager/include/application_manager/application_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/application_manager_impl.h
@@ -286,7 +286,7 @@ class ApplicationManagerImpl
* @return true if Application is subscribed for way points
* otherwise false
*/
- bool IsAppSubscribedForWayPoints(const uint32_t app);
+ bool IsAppSubscribedForWayPoints(const uint32_t app_id) const;
/**
* @brief Subscribe Application for way points
diff --git a/src/components/application_manager/include/application_manager/commands/hmi/navi_subscribe_way_points_request.h b/src/components/application_manager/include/application_manager/commands/hmi/navi_subscribe_way_points_request.h
index 2e9465b1e3..6d6a80a29d 100644
--- a/src/components/application_manager/include/application_manager/commands/hmi/navi_subscribe_way_points_request.h
+++ b/src/components/application_manager/include/application_manager/commands/hmi/navi_subscribe_way_points_request.h
@@ -18,7 +18,7 @@ public:
*
* @param message Incoming SmartObject message
**/
- explicit NaviSubscribeWayPointsRequest(const MessageSharedPtr &);
+ explicit NaviSubscribeWayPointsRequest(const MessageSharedPtr& message);
/**
* @brief NaviSubscribeWayPointsRequest class destructor
**/
@@ -26,7 +26,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(NaviSubscribeWayPointsRequest);
diff --git a/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_request.h b/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_request.h
index 58d0fc266f..dc5d06fa91 100644
--- a/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_request.h
+++ b/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_request.h
@@ -18,7 +18,7 @@ public:
*
* @param message Incoming SmartObject message
**/
- explicit NaviUnSubscribeWayPointsRequest(const MessageSharedPtr &);
+ explicit NaviUnSubscribeWayPointsRequest(const MessageSharedPtr& message);
/**
* @brief NaviUnSubscribeWayPointsRequest class destructor
**/
@@ -26,7 +26,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(NaviUnSubscribeWayPointsRequest);
diff --git a/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_response.h b/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_response.h
index e8a524f78d..eba9062e6b 100644
--- a/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_response.h
+++ b/src/components/application_manager/include/application_manager/commands/hmi/navi_unsubscribe_way_points_response.h
@@ -36,5 +36,4 @@ class NaviUnSubscribeWaypointsResponse
} // namespace commands
} // namespace application_manager
-
#endif // SRC_COMPONENTS_APPLICATION_MANAGER_INCLUDE_APPLICATION_MANAGER_COMMANDS_HMI_NAVI_UNSUBSCRIBE_WAY_POINTS_RESPONSE_H_
diff --git a/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_request.h b/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_request.h
index c665904067..3e1a7b2075 100644
--- a/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_request.h
+++ b/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_request.h
@@ -25,7 +25,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
/**
* @brief Interface method that is called whenever new event received
*
diff --git a/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_response.h b/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_response.h
index 6514a3e7aa..2a2ad9e014 100644
--- a/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_response.h
+++ b/src/components/application_manager/include/application_manager/commands/mobile/subscribe_way_points_response.h
@@ -26,7 +26,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(SubscribeWayPointsResponse);
};
diff --git a/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_request.h b/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_request.h
index 25637598e2..d90c2b70a8 100644
--- a/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_request.h
+++ b/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_request.h
@@ -22,7 +22,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
/**
* @brief Interface method that is called whenever new event received
*
diff --git a/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_response.h b/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_response.h
index 219cdb200f..d25649f845 100644
--- a/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_response.h
+++ b/src/components/application_manager/include/application_manager/commands/mobile/unsubscribe_way_points_response.h
@@ -26,7 +26,7 @@ public:
/**
* @brief Execute command
**/
- virtual void Run();
+ virtual void Run() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(UnSubscribeWayPointsResponse);
};
diff --git a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
index 5dda974ac0..7678c7971d 100644
--- a/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
+++ b/src/components/application_manager/include/application_manager/resumption/resume_ctrl.h
@@ -345,6 +345,14 @@ class ResumeCtrl: public app_mngr::event_engine::EventObserver {
void AddSubscriptions(app_mngr::ApplicationSharedPtr application,
const smart_objects::SmartObject& saved_app);
+ /**
+ * @brief AddSubscribedForWayPoints allows to restore subscription
+ * for WayPoints
+ * @param application application which will be resumed
+ * @param saved_app application specific section from backup file
+ */
+ void AddSubscribedForWayPoints(app_mngr::ApplicationSharedPtr application,
+ const smart_objects::SmartObject& saved_app);
bool CheckIgnCycleRestrictions(const smart_objects::SmartObject& saved_app);
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index a8aa4a2731..def90caa46 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -1262,11 +1262,6 @@ void ApplicationManagerImpl::OnServiceEndedCallback(
break;
}
}
- // SDL sends UnsubscribeWayPoints only for last application
- if (subscribed_way_points_apps_list_.size() == 1) {
- LOG4CXX_ERROR(logger_, "Send UnsubscribeWayPoints");
- MessageHelper::SendUnSubscribedWayPoints();
- }
UnregisterApplication(
session_key, reason, is_resuming, is_unexpected_disconnect);
return;
@@ -2506,6 +2501,12 @@ void ApplicationManagerImpl::UnregisterApplication(
<< "; is_unexpected_disconnect = "
<< is_unexpected_disconnect);
+ // SDL sends UnsubscribeWayPoints only for last application
+ if (subscribed_way_points_apps_list_.size() == 1) {
+ LOG4CXX_ERROR(logger_, "Send UnsubscribeWayPoints");
+ MessageHelper::SendUnSubscribedWayPoints();
+ }
+
NaviServiceStatusMap::iterator it = navi_service_status_.find(app_id);
if (navi_service_status_.end() != it) {
navi_service_status_.erase(it);
@@ -3462,14 +3463,14 @@ void ApplicationManagerImpl::ClearTTSGlobalPropertiesList() {
tts_global_properties_app_list_.clear();
}
-bool ApplicationManagerImpl::IsAppSubscribedForWayPoints(const uint32_t app) {
+bool ApplicationManagerImpl::IsAppSubscribedForWayPoints(
+ const uint32_t app_id) const {
LOG4CXX_AUTO_TRACE(logger_);
- if (subscribed_way_points_apps_list_.find(app) ==
+ if (subscribed_way_points_apps_list_.find(app_id) ==
subscribed_way_points_apps_list_.end()) {
return false;
- } else {
- return true;
}
+ return true;
}
void ApplicationManagerImpl::SubscribeAppForWayPoints(const uint32_t app) {
@@ -3486,9 +3487,48 @@ bool ApplicationManagerImpl::IsAnyAppSubscribedForWayPoints() const {
LOG4CXX_AUTO_TRACE(logger_);
if (subscribed_way_points_apps_list_.size() == 0) {
return false;
- } else {
- return true;
}
+ return true;
+}
+
+const std::set<int32_t>& ApplicationManagerImpl::GetSubscribedForWayPoints()
+ const {
+ LOG4CXX_AUTO_TRACE(logger_);
+ return subscribed_way_points_apps_list_;
+}
+
+void ApplicationManagerImpl::SetSubscribedForWayPoints(
+ const std::set<int32_t>& subscribed_way_points_apps) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ subscribed_way_points_apps_list_ = subscribed_way_points_apps;
+}
+
+bool ApplicationManagerImpl::IsAppSubscribedForWayPoints(
+ const uint32_t app_id) const {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (subscribed_way_points_apps_list_.find(app_id) ==
+ subscribed_way_points_apps_list_.end()) {
+ return false;
+ }
+ return true;
+}
+
+void ApplicationManagerImpl::SubscribeAppForWayPoints(const uint32_t app) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ subscribed_way_points_apps_list_.insert(app);
+}
+
+void ApplicationManagerImpl::UnSubscribeAppForWayPoints(const uint32_t app) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ subscribed_way_points_apps_list_.erase(app);
+}
+
+bool ApplicationManagerImpl::IsAnyAppSubscribedForWayPoints() const {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (subscribed_way_points_apps_list_.size() == 0) {
+ return false;
+ }
+ return true;
}
const std::set<int32_t>& ApplicationManagerImpl::GetSubscribedForWayPoints()
diff --git a/src/components/application_manager/src/commands/hmi/navi_subscribe_way_points_response.cc b/src/components/application_manager/src/commands/hmi/navi_subscribe_way_points_response.cc
index 0d7c544d22..cf21ec85f2 100644
--- a/src/components/application_manager/src/commands/hmi/navi_subscribe_way_points_response.cc
+++ b/src/components/application_manager/src/commands/hmi/navi_subscribe_way_points_response.cc
@@ -32,7 +32,6 @@
#include "application_manager/commands/hmi/navi_subscribe_way_points_response.h"
#include "application_manager/event_engine/event.h"
-#include "interfaces/MOBILE_API.h"
#include "interfaces/HMI_API.h"
namespace application_manager {
diff --git a/src/components/application_manager/src/resumption/resume_ctrl.cc b/src/components/application_manager/src/resumption/resume_ctrl.cc
index 0c98c89aba..93c1326b77 100644
--- a/src/components/application_manager/src/resumption/resume_ctrl.cc
+++ b/src/components/application_manager/src/resumption/resume_ctrl.cc
@@ -455,6 +455,7 @@ bool ResumeCtrl::RestoreApplicationData(ApplicationSharedPtr application) {
AddChoicesets(application, saved_app);
SetGlobalProperties(application, saved_app);
AddSubscriptions(application, saved_app);
+ AddSubscribedForWayPoints(application, saved_app);
result = true;
} else {
LOG4CXX_WARN(logger_,
@@ -565,6 +566,20 @@ void ResumeCtrl::SetGlobalProperties(
}
}
+void ResumeCtrl::AddSubscribedForWayPoints(app_mngr::ApplicationSharedPtr application,
+ const smart_objects::SmartObject& saved_app) {
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ if (saved_app.keyExists(strings::subscribed_for_way_points)) {
+ const smart_objects::SmartObject& subscribed_for_way_points_so =
+ saved_app[strings::subscribed_for_way_points];
+ if (true == subscribed_for_way_points_so.asBool()) {
+ application_manager::ApplicationManagerImpl::instance()->
+ SubscribeAppForWayPoints(application->app_id());
+ }
+ }
+}
+
void ResumeCtrl::AddSubscriptions(ApplicationSharedPtr application,
const smart_objects::SmartObject& saved_app) {
LOG4CXX_AUTO_TRACE(logger_);
diff --git a/src/components/application_manager/src/resumption/resumption_data_db.cc b/src/components/application_manager/src/resumption/resumption_data_db.cc
index 4252e86c4c..ab75e3b6d9 100644
--- a/src/components/application_manager/src/resumption/resumption_data_db.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_db.cc
@@ -1415,21 +1415,24 @@ bool ResumptionDataDB::SelectDataFromAppTable(
LOG4CXX_WARN(logger_, "Problem with execution kSelectAppTable query");
return false;
}
- /* Position of data in "query" :
- field "appID" from table "application" = 0
- field "connection_key" from table "application" = 1
- field "grammarID" from table "application" = 2
- field "hashID" from table "application" = 3
- field "hmiAppID" from table "application" = 4
- field "hmiLevel" from table "application" = 5
- field "ign_off_count" from table "application" = 6
- field "suspend_count" from table "application" = 7
- field "timeStamp" from table "application" = 7
- field "deviceID" from table "application" = 8
- field "isMediaApplication" from table "application" = 9
- */
+
+ // Position of data in "query" :
+ // field "appID" from table "application" = 0
+ // field "connection_key" from table "application" = 1
+ // field "grammarID" from table "application" = 2
+ // field "hashID" from table "application" = 3
+ // field "hmiAppID" from table "application" = 4
+ // field "hmiLevel" from table "application" = 5
+ // field "ign_off_count" from table "application" = 6
+ // field "suspend_count" from table "application" = 7
+ // field "timeStamp" from table "application" = 8
+ // field "deviceID" from table "application" = 9
+ // field "isMediaApplication" from table "application" = 10
+ // field "IsSubscribedForWayPoints" from table "application" = 11
+ uint32_t connection_key = query.GetUInteger(1);
+
saved_app[strings::app_id] = query.GetString(0);
- saved_app[strings::connection_key] = query.GetUInteger(1);
+ saved_app[strings::connection_key] = connection_key;
uint32_t grammarID = query.GetUInteger(2);
if (grammarID) {
saved_app[strings::grammar_id] = grammarID;
@@ -1442,6 +1445,7 @@ bool ResumptionDataDB::SelectDataFromAppTable(
saved_app[strings::time_stamp] = query.GetUInteger(8);
saved_app[strings::device_id] = query.GetString(9);
saved_app[strings::is_media_application] = query.GetBoolean(10);
+ saved_app[strings::subscribed_for_way_points] = query.GetBoolean(11);
LOG4CXX_INFO(logger_,
"Data from application table was restored successfully");
@@ -2621,6 +2625,9 @@ bool ResumptionDataDB::InsertApplicationData(
const int64_t hmi_app_id = application.m_hmi_app_id;
const mobile_apis::HMILevel::eType hmi_level = application.m_hmi_level;
bool is_media_application = application.m_is_media_application;
+ bool is_subscribed_for_way_points =
+ app_mngr::ApplicationManagerImpl::instance()->IsAppSubscribedForWayPoints(
+ connection_key);
if (!query.Prepare(kInsertApplication)) {
LOG4CXX_WARN(logger_,
@@ -2641,7 +2648,8 @@ bool ResumptionDataDB::InsertApplicationData(
field "idglobalProperties" from table "application" = 8
field "isMediaApplication" from table "application" = 9
field "appID" from table "application" = 10
- field "deviceID" from table "application" = 11*/
+ field "deviceID" from table "application" = 11
+ field "isSubscribedForWayPoints" from table "application" = 12*/
query.Bind(0, connection_key);
query.Bind(1, grammar_id);
query.Bind(2, hash);
@@ -2658,6 +2666,7 @@ bool ResumptionDataDB::InsertApplicationData(
query.Bind(9, is_media_application);
query.Bind(10, policy_app_id);
query.Bind(11, device_id);
+ query.Bind(12, is_subscribed_for_way_points);
if (!query.Exec()) {
LOG4CXX_WARN(logger_, "Problem with execution query");
diff --git a/src/components/application_manager/src/resumption/resumption_data_json.cc b/src/components/application_manager/src/resumption/resumption_data_json.cc
index 883d495c16..becc9c19ce 100644
--- a/src/components/application_manager/src/resumption/resumption_data_json.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_json.cc
@@ -63,8 +63,9 @@ void ResumptionDataJson::SaveApplication(
const uint32_t time_stamp = (uint32_t)time(NULL);
const std::string device_mac = application->mac_address();
const mobile_apis::HMILevel::eType hmi_level = application->hmi_level();
- const std::set<int32_t> subscribed_for_way_points =
- app_mngr::ApplicationManagerImpl::instance()->GetSubscribedForWayPoints();
+ const bool is_subscribed_for_way_points =
+ app_mngr::ApplicationManagerImpl::instance()->
+ IsAppSubscribedForWayPoints(application->app_id());
sync_primitives::AutoLock autolock(resumption_lock_);
Json::Value tmp;
@@ -99,9 +100,7 @@ void ResumptionDataJson::SaveApplication(
GetApplicationFiles(application), tmp);
json_app[strings::application_files] = tmp;
json_app[strings::time_stamp] = time_stamp;
- Formatters::CFormatterJsonBase::objToJsonValue(
- GetSubscribedForWayPoints(subscribed_for_way_points), tmp);
- json_app[strings::subscribed_for_way_points] = tmp;
+ json_app[strings::subscribed_for_way_points] = is_subscribed_for_way_points;
LOG4CXX_DEBUG(logger_, "SaveApplication : " << json_app.toStyledString());
}
@@ -272,18 +271,6 @@ bool ResumptionDataJson::GetSavedApplication(
const Json::Value& json_saved_app = GetSavedApplications()[idx];
Formatters::CFormatterJsonBase::jsonValueToObj(json_saved_app, saved_app);
- smart_objects::SmartArray app_id_list =
- *(saved_app[strings::subscribed_for_way_points].asArray());
-
- std::set<int32_t> subscribed_for_way_points;
-
- for (smart_objects::SmartArray::iterator i = app_id_list.begin();
- i != app_id_list.end(); ++i) {
- subscribed_for_way_points.insert((*i).asInt());
- }
-
- app_mngr::ApplicationManagerImpl::instance()->SetSubscribedForWayPoints(
- subscribed_for_way_points);
return true;
}
diff --git a/src/components/application_manager/src/resumption/resumption_sql_queries.cc b/src/components/application_manager/src/resumption/resumption_sql_queries.cc
index 1c1bcc3b35..5f318e6955 100644
--- a/src/components/application_manager/src/resumption/resumption_sql_queries.cc
+++ b/src/components/application_manager/src/resumption/resumption_sql_queries.cc
@@ -223,6 +223,7 @@ const std::string kCreateSchema =
" `deviceID` TEXT, "
" `idglobalProperties` INTEGER, "
" `isMediaApplication` BOOL, "
+ " `isSubscribedForWayPoints` BOOL, "
" CONSTRAINT `fk_globalProperties` "
" FOREIGN KEY(`idglobalProperties`) "
" REFERENCES `globalProperties`(`idglobalProperties`) "
@@ -790,9 +791,9 @@ const std::string kInsertApplication =
"(`connection_key`, `grammarID`, `hashID`, "
"`hmiAppID`, `hmiLevel`, `ign_off_count`, "
"`timeStamp`, `idglobalProperties`, "
- "`isMediaApplication`, `appID`, `deviceID`) "
+ "`isMediaApplication`, `appID`, `deviceID`, `isSubscribedForWayPoints`) "
"VALUES "
- "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
const std::string kSelectCountFiles =
"SELECT COUNT (`idfile`) "
@@ -945,7 +946,7 @@ const std::string kSelectTTSChunk =
const std::string kSelectAppTable =
"SELECT `appID`, `connection_key`, `grammarID`, `hashID`, `hmiAppID`, "
"`hmiLevel`, `ign_off_count`, "
- "`timeStamp`, `deviceID`, `isMediaApplication` "
+ "`timeStamp`, `deviceID`, `isMediaApplication`, `isSubscribedForWayPoints` "
"FROM `application` "
"WHERE `appID` = ? AND `deviceID` = ?;";