GSList *_uam_db_get_service(int device_number);
GSList *_uam_db_get_device_services(
const char *device_id, int tech_type, const char *address);
+int _uam_db_get_device_services_count(const char *device_id, int tech_type,
+ const char *address, int *count);
/* delete operations */
int _ua_device_service_db_clear(void);
static void __uam_core_copy_addr(uam_device_info_s *device, uam_db_address_info_t *addr)
{
switch (addr->addr_type) {
- case UAM_ADDR_TYPE_BLE:
- case UAM_ADDR_TYPE_BT:
- case UAM_ADDR_TYPE_P2P:
- case UAM_ADDR_TYPE_WIFI:
- g_strlcpy(device->mac, addr->address,
- UAM_MAC_ADDRESS_STRING_LEN);
- break;
- case UAM_ADDR_TYPE_IPv4:
- g_strlcpy(device->ipv4_addr,
- addr->address,
- UAM_IP_ADDRESS_MAX_STRING_LEN);
- break;
- default:
- UAM_WARN("Unknown address type %d", addr->addr_type);
+ case UAM_ADDR_TYPE_BLE:
+ case UAM_ADDR_TYPE_BT:
+ case UAM_ADDR_TYPE_P2P:
+ case UAM_ADDR_TYPE_WIFI:
+ g_strlcpy(device->mac, addr->address,
+ UAM_MAC_ADDRESS_STRING_LEN);
+ break;
+ case UAM_ADDR_TYPE_IPv4:
+ g_strlcpy(device->ipv4_addr,
+ addr->address,
+ UAM_IP_ADDRESS_MAX_STRING_LEN);
+ break;
+ default:
+ UAM_WARN("Unknown address type %d", addr->addr_type);
}
}
{
int ret;
GSList *l;
+ int count = 0;
+
+ ret = _uam_db_get_device_services_count(dev_info->device_id,
+ dev_info->type, dev_info->mac, &count);
+ if (UAM_ERROR_NONE != ret) {
+ UAM_ERR("_uam_db_get_device_services_count failed with %s",
+ _uam_manager_error_to_str(ret));
+ return ret;
+ }
+
+ if (0 != count) {
+ ret = UAM_ERROR_NOW_IN_PROGRESS;
+ UAM_ERR("__uam_remove_device failed with %s",
+ _uam_manager_error_to_str(ret));
+ return ret;
+ }
ret = _uam_pm_unregister_device(user_id, dev_info);
if (UAM_ERROR_NONE != ret) {
"FROM device_services as D JOIN services as S USING(service_number) " \
"where D.device_number = ?"
+#define SELECT_DEVICE_SERVICES_COUNT "SELECT count(*) " \
+ "FROM device_services where device_number = ?"
+
#define INSERT_DEVICE_SERVICE "insert into device_services " \
"(device_number, service_number) values (?, ?)"
/* SELECT statements */
static sqlite3_stmt *select_service;
+static sqlite3_stmt *select_device_services_count;
/* UPDATE statements */
//TO-DO
FUNC_ENTRY;
FINALIZE(select_service);
+ FINALIZE(select_device_services_count);
FUNC_EXIT;
}
PREPARE_QUERY(rc, db, select_service,
SELECT_SERVICE, __ua_device_service_finalize_select);
+ PREPARE_QUERY(rc, db, select_device_services_count,
+ SELECT_DEVICE_SERVICES_COUNT, __ua_device_service_finalize_select);
initialized = 1;
FUNC_EXIT;
FUNC_EXIT;
return service_list;
}
+int _uam_db_get_device_services_count(const char *device_id, int tech_type,
+ const char *address, int *svc_count)
+{
+ FUNC_ENTRY;
+ int rc;
+ int error_code = UAM_ERROR_NONE;
+ sqlite3_stmt *stmt = select_device_services_count;
+ int device_number = 0;
+
+ retv_if(NULL == device_id, UAM_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == address, UAM_ERROR_INVALID_PARAMETER);
+ UAM_INFO("%s-%d-%s", device_id, tech_type, address);
+
+ error_code = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
+ if (UAM_ERROR_NONE != error_code)
+ goto handle_error;
+
+ DB_ACTION(sqlite3_bind_int(stmt, 1, device_number),
+ error_code, handle_error);
+
+ do {
+ rc = sqlite3_step(stmt);
+
+ switch (rc) {
+ case SQLITE_DONE:
+ break;
+ case SQLITE_ROW:
+ UAM_DBG("Device services count info found");
+ *svc_count = sqlite3_column_int(stmt, 0);
+ UAM_INFO("device services count %d", *svc_count);
+ break;
+ case SQLITE_ERROR:
+ default:
+ UAM_ERR("Failed to enumerate device info: %s",
+ sqlite3_errmsg(__ua_device_service_db_get_database()));
+ }
+ } while (rc == SQLITE_ROW);
+
+handle_error:
+ sqlite3_reset(stmt);
+ FUNC_EXIT;
+ return error_code;
+}
UAM_INFO("Service name: %s", service_name);
+ error_code = _uam_db_delete_device_service(service_name);
+ if (UAM_ERROR_NONE != error_code) {
+ UAM_ERR("_uam_db_delete_device_service failed");
+ return error_code;
+ }
+
DB_ACTION(sqlite3_bind_text(stmt, 1, service_name, -1, SQLITE_STATIC),
error_code, handle_error);