Add Database APIs to provide device service info during init
authorAbhay Agarwal <ay.agarwal@samsung.com>
Wed, 2 Oct 2019 11:49:04 +0000 (20:49 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Fri, 4 Oct 2019 11:21:13 +0000 (20:21 +0900)
Change-Id: Icc1e80615aafdde423c53ec9e3d4e64372d0d323
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
ua-daemon/include/ua-manager-database.h
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-device-service-db.c

index 51d7afe..6dcdeb2 100644 (file)
@@ -167,6 +167,13 @@ int _uam_db_update_service_cycle(const char *service_name, int cycle);
 
 /* DEVICE_SERVICE QUERIES */
 
+typedef struct {
+       char device_id[UAM_DEVICE_ID_MAX_STRING_LEN];
+       uam_tech_type_e type;
+       char svc[UAM_SERVICE_MAX_STRING_LEN];
+       int discriminant;
+} db_svc_dev_info_t;
+
 /* db init/deinit */
 int _ua_device_service_db_initialize(void);
 int _ua_device_service_db_deinitialize(void);
@@ -177,6 +184,7 @@ 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);
+GSList *_uam_db_get_service_devices_info();
 
 /* delete operations */
 int _ua_device_service_db_clear(void);
index 1f8d677..7b68ded 100644 (file)
@@ -1643,15 +1643,6 @@ int _uam_core_service_add_device(const char *svc_name, const char *device_id, in
        retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER);
        service = l->data;
 
-/*
-       if (NULL == l) {
-               service = g_new0(uam_db_service_info_t, 1);
-               service->name = g_strdup(svc_name);
-               service->cycle = UAM_DETECTION_CYCLE_DEFAULT;
-               services = g_slist_append(services, service);
-       } else
-               service = l->data;
-*/
        __add_service_to_dev_tech_mapping(tech_info, service);
 
        mac = __get_mac_addr(tech_info);
@@ -2224,10 +2215,23 @@ int _uam_core_init(void)
                }
        }
 
+       /* Fetch svc dev list */
+       db_svc_dev_list = _uam_db_get_service_devices_info();
+       if (!db_svc_dev_list) {
+               UAM_INFO_C("No service devices in database");
+       } else {
+               for (l = db_svc_dev_list; NULL != l; l = g_slist_next(l)) {
+                       db_svc_dev_info_t *db_svc = l->data;
+                       _uam_core_update_svc_dev_info((char *)&(db_svc->device_id), db_svc->type,
+                               (char *)&(db_svc->svc), db_svc->discriminant);
+               }
+       }
+
        g_slist_free_full(db_devices, g_free);
        g_slist_free_full(db_users, g_free);
        g_slist_free_full(db_svc_list, g_free);
        g_slist_free_full(db_adv_list, g_free);
+       g_slist_free_full(db_svc_dev_list, g_free);
 
        /* Set/update registered device list to plugins */
        if (UAM_ERROR_NONE != _uam_pm_set_registered_devices(devices))
@@ -2283,6 +2287,20 @@ void _uam_core_deinit(void)
        g_slist_free(services);
        services = NULL;
 
+       /* Release allocated memory for service devices */
+       for (l = svc_devs; NULL != l; l = g_slist_next(l)) {
+               uam_svc_dev_info_t *svc_dev = l->data;
+
+               if (!svc_dev)
+                       continue;
+
+               g_free(svc_dev->device_id);
+               g_free(svc_dev->service);
+               g_free(svc_dev);
+       }
+       g_slist_free(svc_devs);
+       svc_devs = NULL;
+
        FUNC_EXIT;
 }
 
index 211da2c..e23589e 100644 (file)
 #define SELECT_DEVICE_SERVICES_COUNT "SELECT count(*) " \
        "FROM device_services where device_number = ?"
 
+#define SELECT_DEVICE_SERVICES "SELECT D.device_id, D.tech_type, S.service_name, P.discriminant " \
+       "FROM device_services as P JOIN services as S USING(service_number) JOIN devices as D " \
+       "USING(device_number)"
+
 #define INSERT_DEVICE_SERVICE "insert into device_services " \
        "(device_number, service_number, discriminant) values (?, ?, ?)"
 
@@ -57,6 +61,7 @@ static sqlite3_stmt *delete_device;
 /* SELECT statements */
 static sqlite3_stmt *select_service;
 static sqlite3_stmt *select_device_services_count;
+static sqlite3_stmt *select_device_services;
 
 /* INSERT statements */
 static sqlite3_stmt *insert_device_service;
@@ -84,6 +89,7 @@ static void __ua_device_service_finalize_select(void)
 
        FINALIZE(select_service);
        FINALIZE(select_device_services_count);
+       FINALIZE(select_device_services);
 
        FUNC_EXIT;
 }
@@ -146,6 +152,8 @@ static int __ua_device_service_prepare_select(sqlite3 *db)
                SELECT_SERVICE, __ua_device_service_finalize_select);
        PREPARE_QUERY(rc, db, select_device_services_count,
                SELECT_DEVICE_SERVICES_COUNT, __ua_device_service_finalize_select);
+       PREPARE_QUERY(rc, db, select_device_services,
+               SELECT_DEVICE_SERVICES, __ua_device_service_finalize_select);
 
        initialized = 1;
        FUNC_EXIT;
@@ -611,6 +619,7 @@ handle_error:
        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)
 {
@@ -654,3 +663,47 @@ handle_error:
        FUNC_EXIT;
        return error_code;
 }
+
+GSList *_uam_db_get_service_devices_info()
+{
+       FUNC_ENTRY;
+       int rc;
+       sqlite3_stmt *stmt = select_device_services;
+       GSList *svc_dev_list = NULL;
+       db_svc_dev_info_t *info = NULL;
+
+       do {
+               rc = sqlite3_step(stmt);
+
+               switch (rc) {
+               case SQLITE_DONE:
+                       break;
+               case SQLITE_ROW:
+                       UAM_DBG("Device services info found");
+                       info = g_new0(db_svc_dev_info_t, 1);
+                       g_strlcpy(info->device_id, (char *)sqlite3_column_text(stmt, 0),
+                               UAM_DEVICE_ID_MAX_STRING_LEN);
+                       info->type = sqlite3_column_int(stmt, 1);
+                       g_strlcpy(info->svc, (char *)sqlite3_column_text(stmt, 2),
+                               UAM_SERVICE_MAX_STRING_LEN);
+                       info->discriminant = sqlite3_column_int(stmt, 3);
+
+                       UAM_INFO("%s-%d-%s-%d",
+                               info->device_id,
+                               info->type,
+                               info->svc,
+                               info->discriminant);
+
+                       svc_dev_list = g_slist_append(svc_dev_list, info);
+                       break;
+               case SQLITE_ERROR:
+               default:
+                       UAM_ERR("Failed to enumerate device info: %s",
+                                       sqlite3_errmsg(__uam_db_recover_database()));
+               }
+       } while (rc == SQLITE_ROW);
+
+       sqlite3_reset(stmt);
+       FUNC_EXIT;
+       return svc_dev_list;
+}