2 * Copyright (c) 2018 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.
24 #include "ua-manager-common.h"
25 #include "ua-manager-database.h"
27 #define SELECT_SERVICE "SELECT S.service_number, S.service_name, S.cycle " \
28 "FROM device_services as D JOIN services as S USING(service_number) " \
29 "where D.device_number = ?"
31 #define SELECT_DEVICE_SERVICES_COUNT "SELECT count(*) " \
32 "FROM device_services where device_number = ?"
34 #define SELECT_DEVICE_SERVICES \
35 "SELECT D.device_id, D.tech_type, S.service_name, P.discriminant, P.last_seen " \
36 "FROM device_services as P JOIN services as S USING(service_number) JOIN devices as D " \
37 "USING(device_number)"
39 #define INSERT_DEVICE_SERVICE "insert into device_services " \
40 "(device_number, service_number, discriminant, last_seen) values (?, ?, ?, ?)"
42 #define DELETE_ALL_DEVICE_SERVICES "delete from device_services "
44 #define DELETE_DEVICE_SERVICE "delete from device_services " \
45 "WHERE device_number = ? and service_number = ?"
47 #define DELETE_DEVICE "delete from device_services " \
48 "WHERE device_number = ?"
50 #define DELETE_SERVICE "delete from device_services " \
51 "WHERE service_number = ?"
53 #define UPDATE_DEVICE_SERVICE_DISCRIMINANT "UPDATE device_services " \
54 "SET discriminant = ? WHERE device_number = ? AND service_number = ?"
56 #define UPDATE_DEVICE_SERVICE_LAST_SEEN "UPDATE device_services " \
57 "SET last_seen = ? WHERE device_number = ? AND service_number = ?"
59 #define UPDATE_DEVICE_SERVICE_PAYLOAD "UPDATE device_services " \
60 "SET payload_number = ? WHERE device_number = ? AND service_number = ?"
62 /* DELETE statements */
63 static sqlite3_stmt *delete_all_device_services;
64 static sqlite3_stmt *delete_service;
65 static sqlite3_stmt *delete_device_service;
66 static sqlite3_stmt *delete_device;
68 /* SELECT statements */
69 static sqlite3_stmt *select_service;
70 static sqlite3_stmt *select_device_services_count;
71 static sqlite3_stmt *select_device_services;
73 /* INSERT statements */
74 static sqlite3_stmt *insert_device_service;
76 /* UPDATE statements */
77 static sqlite3_stmt *update_device_service_discriminant;
78 static sqlite3_stmt *update_device_service_last_seen;
79 static sqlite3_stmt *update_device_service_payload;
81 extern sqlite3 *database_handle;
83 static void __uam_device_service_finalize_delete(void)
87 FINALIZE(delete_all_device_services);
88 FINALIZE(delete_service);
89 FINALIZE(delete_device_service);
90 FINALIZE(delete_device);
95 static void __uam_device_service_finalize_select(void)
99 FINALIZE(select_service);
100 FINALIZE(select_device_services_count);
101 FINALIZE(select_device_services);
106 static void __uam_device_service_finalize_insert(void)
110 FINALIZE(insert_device_service);
115 static void __uam_device_service_finalize_update(void)
119 FINALIZE(update_device_service_discriminant);
120 FINALIZE(update_device_service_last_seen);
121 FINALIZE(update_device_service_payload);
126 static int __uam_device_service_prepare_delete(sqlite3 *db)
130 static int initialized;
137 PREPARE_QUERY(rc, db, delete_all_device_services,
138 DELETE_ALL_DEVICE_SERVICES, __uam_device_service_finalize_delete);
139 PREPARE_QUERY(rc, db, delete_service,
140 DELETE_SERVICE, __uam_device_service_finalize_delete);
141 PREPARE_QUERY(rc, db, delete_device_service,
142 DELETE_DEVICE_SERVICE, __uam_device_service_finalize_delete);
143 PREPARE_QUERY(rc, db, delete_device,
144 DELETE_DEVICE, __uam_device_service_finalize_delete);
151 static int __uam_device_service_prepare_select(sqlite3 *db)
155 static int initialized;
162 PREPARE_QUERY(rc, db, select_service,
163 SELECT_SERVICE, __uam_device_service_finalize_select);
164 PREPARE_QUERY(rc, db, select_device_services_count,
165 SELECT_DEVICE_SERVICES_COUNT, __uam_device_service_finalize_select);
166 PREPARE_QUERY(rc, db, select_device_services,
167 SELECT_DEVICE_SERVICES, __uam_device_service_finalize_select);
174 static int __uam_device_service_prepare_update(sqlite3 *db)
178 static int initialized;
185 PREPARE_QUERY(rc, db, update_device_service_discriminant,
186 UPDATE_DEVICE_SERVICE_DISCRIMINANT, __uam_device_service_finalize_update);
187 PREPARE_QUERY(rc, db, update_device_service_last_seen,
188 UPDATE_DEVICE_SERVICE_LAST_SEEN, __uam_device_service_finalize_update);
189 PREPARE_QUERY(rc, db, update_device_service_payload,
190 UPDATE_DEVICE_SERVICE_PAYLOAD, __uam_device_service_finalize_update);
197 static int __uam_device_service_prepare_insert(sqlite3 *db)
201 static int initialized;
208 PREPARE_QUERY(rc, db, insert_device_service,
209 INSERT_DEVICE_SERVICE, __uam_device_service_finalize_insert);
216 static int __uam_device_service_table_deviceservicesinfo_prepare(
221 int error_code = UAM_ERROR_NONE;
225 return UAM_ERROR_DB_FAILED;
228 DB_ACTION(__uam_device_service_prepare_delete(db), error_code, handle_error);
229 DB_ACTION(__uam_device_service_prepare_select(db), error_code, handle_error);
230 DB_ACTION(__uam_device_service_prepare_update(db), error_code, handle_error);
231 DB_ACTION(__uam_device_service_prepare_insert(db), error_code, handle_error);
238 static void __uam_device_service_table_devicesinfo_finalize(void)
241 __uam_device_service_finalize_delete();
242 __uam_device_service_finalize_select();
243 __uam_device_service_finalize_insert();
244 __uam_device_service_finalize_update();
248 int _uam_device_service_db_deinitialize(void)
252 retv_if(NULL == database_handle, UAM_ERROR_NONE);
254 __uam_device_service_table_devicesinfo_finalize();
255 sqlite3_close(database_handle);
258 return UAM_ERROR_NONE;
261 int _uam_device_service_db_initialize(void)
265 EXEC(UAM_ERROR_NONE, __uam_device_service_table_deviceservicesinfo_prepare(
266 database_handle), handle_error);
269 return UAM_ERROR_NONE;
272 _uam_device_service_db_deinitialize();
274 return UAM_ERROR_DB_FAILED;
277 int _uam_db_insert_service(int device_number, int service_number,
278 gboolean discriminant, unsigned long long last_seen)
281 int error_code = UAM_ERROR_NONE;
282 sqlite3_stmt *stmt = insert_device_service;
283 int sql_ret = SQLITE_OK;
285 UAM_INFO("%d-%d", device_number, service_number);
287 DB_ACTION(sqlite3_bind_int(stmt, 1, device_number), error_code, handle_error);
288 DB_ACTION(sqlite3_bind_int(stmt, 2, service_number), error_code, handle_error);
289 DB_ACTION(sqlite3_bind_int(stmt, 3, discriminant), error_code, handle_error);
290 DB_ACTION(sqlite3_bind_int64(stmt, 4, last_seen), error_code, handle_error);
292 sql_ret = sqlite3_step(stmt);
293 if (sql_ret != SQLITE_DONE) {
294 UAM_ERR("Failed to insert device-service info [%d:%s]",
295 sql_ret, sqlite3_errmsg(database_handle));
296 error_code = UAM_ERROR_DB_FAILED;
300 UAM_DBG("Device-service info inserted [%d] [%d] [%d] [%llu]", device_number,
301 service_number, discriminant, last_seen);
309 int _uam_db_insert_device_service_info(const char *device_id, int tech_type,
310 const char *address, const char *service_name, int cycle, gboolean discriminant,
311 unsigned long long last_seen)
314 int ret = UAM_ERROR_NONE;
315 db_service_info_t info;
316 int service_number = 0;
318 UAM_INFO("%s-%d-%s-%s-%d", device_id, tech_type, address, service_name, cycle);
320 int device_number = 0;
321 ret = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
322 if (UAM_ERROR_NONE != ret)
325 ret = _uam_db_get_service_info(service_name, &info);
326 if (UAM_ERROR_NONE != ret)
329 service_number = info.service_number;
331 UAM_INFO("%d-%d", device_number, service_number);
333 ret = _uam_db_insert_service(device_number, service_number, discriminant, last_seen);
334 if (UAM_ERROR_NONE != ret)
337 UAM_DBG("Device-service info inserted [%d] [%d] [%d] [%llu]", device_number,
338 service_number, discriminant, last_seen);
345 static int __uam_db_update_discriminant(int device_number,
346 int service_number, gboolean discriminant)
349 int error_code = UAM_ERROR_NONE;
350 sqlite3_stmt *stmt = update_device_service_discriminant;
351 int sql_ret = SQLITE_OK;
353 UAM_INFO("%d-%d", device_number, service_number);
355 DB_ACTION(sqlite3_bind_int(stmt, 1, discriminant), error_code, handle_error);
356 DB_ACTION(sqlite3_bind_int(stmt, 2, device_number),
357 error_code, handle_error);
358 DB_ACTION(sqlite3_bind_int(stmt, 3, service_number),
359 error_code, handle_error);
361 sql_ret = sqlite3_step(stmt);
362 if (sql_ret != SQLITE_DONE) {
363 UAM_ERR("Failed to update device-service [%d:%s]",
364 sql_ret, sqlite3_errmsg(database_handle));
365 error_code = UAM_ERROR_DB_FAILED;
369 UAM_DBG("Device-service info updated [%d] [%d] [%d] ",
370 device_number, service_number, discriminant);
378 static int __uam_db_update_last_seen(int device_number,
379 int service_number, unsigned long long last_seen)
382 int error_code = UAM_ERROR_NONE;
383 sqlite3_stmt *stmt = update_device_service_last_seen;
384 int sql_ret = SQLITE_OK;
386 UAM_INFO("%d-%d", device_number, service_number);
388 DB_ACTION(sqlite3_bind_int(stmt, 1, last_seen), error_code, handle_error);
389 DB_ACTION(sqlite3_bind_int(stmt, 2, device_number),
390 error_code, handle_error);
391 DB_ACTION(sqlite3_bind_int(stmt, 3, service_number),
392 error_code, handle_error);
394 sql_ret = sqlite3_step(stmt);
395 if (sql_ret != SQLITE_DONE) {
396 UAM_ERR("Failed to update device-service [%d:%s]",
397 sql_ret, sqlite3_errmsg(database_handle));
398 error_code = UAM_ERROR_DB_FAILED;
402 UAM_DBG("Device-service info updated [%d] [%d] [%llu]",
403 device_number, service_number, last_seen);
411 int _uam_db_update_device_service_discriminant(const char *device_id,
412 int tech_type, const char *address, const char *service_name,
413 gboolean discriminant)
416 int ret = UAM_ERROR_NONE;
417 db_service_info_t info;
418 int service_number = 0;
420 UAM_INFO("%s-%d-%s-%s-%d", device_id, tech_type, address, service_name, discriminant);
422 int device_number = 0;
423 ret = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
424 if (UAM_ERROR_NONE != ret)
427 ret = _uam_db_get_service_info(service_name, &info);
428 if (UAM_ERROR_NONE == ret)
429 service_number = info.service_number;
433 ret = __uam_db_update_discriminant(device_number, service_number, discriminant);
434 if (UAM_ERROR_NONE != ret)
437 UAM_DBG("Device-service info updated [%d] [%d]", device_number, service_number);
444 int _uam_db_update_device_service_last_seen(const char *device_id,
445 int tech_type, const char *address, const char *service_name,
446 unsigned long long last_seen)
449 int ret = UAM_ERROR_NONE;
450 db_service_info_t info;
451 int service_number = 0;
453 UAM_INFO("%s-%d-%s-%s-%llu", device_id, tech_type, address, service_name,
456 int device_number = 0;
457 ret = _uam_db_get_device_number(device_id, tech_type, address,
459 if (UAM_ERROR_NONE != ret)
462 ret = _uam_db_get_service_info(service_name, &info);
463 if (UAM_ERROR_NONE == ret)
464 service_number = info.service_number;
468 ret = __uam_db_update_last_seen(device_number, service_number, last_seen);
469 if (UAM_ERROR_NONE != ret)
472 UAM_DBG("Device-service last_seen updated [%d] [%d]", device_number,
481 int _uam_device_service_db_clear(void)
483 int error_code = UAM_ERROR_NONE;
484 sqlite3_stmt *stmt = delete_all_device_services;
485 int sql_ret = SQLITE_OK;
487 sql_ret = sqlite3_step(stmt);
488 if (sql_ret != SQLITE_DONE) {
489 UAM_ERR("Failed to delete device data [%d:%s]",
490 sql_ret, sqlite3_errmsg(database_handle));
491 error_code = UAM_ERROR_DB_FAILED;
495 UAM_DBG("User data deleted ");
503 int _uam_db_delete_service_number(int service_number)
506 int error_code = UAM_ERROR_NONE;
507 sqlite3_stmt *stmt = delete_service;
508 int sql_ret = SQLITE_OK;
510 UAM_INFO("Service Number: %d", service_number);
512 DB_ACTION(sqlite3_bind_int(stmt, 1, service_number), error_code, handle_error);
514 sql_ret = sqlite3_step(stmt);
515 if (sql_ret != SQLITE_DONE) {
516 UAM_ERR("Failed to delete device-service info [%d:%s]",
517 sql_ret, sqlite3_errmsg(database_handle));
518 error_code = UAM_ERROR_DB_FAILED;
520 UAM_DBG("Device-service info deleted");
528 int _uam_db_delete_device_service_number(int device_number,
532 int error_code = UAM_ERROR_NONE;
533 sqlite3_stmt *stmt = delete_device_service;
534 int sql_ret = SQLITE_OK;
536 UAM_INFO("Device Number: %d Service Number: %d", device_number, service_number);
538 DB_ACTION(sqlite3_bind_int(stmt, 1, device_number), error_code, handle_error);
539 DB_ACTION(sqlite3_bind_int(stmt, 2, service_number), error_code, handle_error);
541 sql_ret = sqlite3_step(stmt);
542 if (sql_ret != SQLITE_DONE) {
543 UAM_ERR("Failed to delete device-service info [%d:%s]",
544 sql_ret, sqlite3_errmsg(database_handle));
545 error_code = UAM_ERROR_DB_FAILED;
547 UAM_DBG("Device-service info deleted");
555 int _uam_db_delete_device_number(int device_number)
558 int error_code = UAM_ERROR_NONE;
559 sqlite3_stmt *stmt = delete_device;
560 int sql_ret = SQLITE_OK;
562 UAM_INFO("Device Number: %d", device_number);
564 DB_ACTION(sqlite3_bind_int(stmt, 1, device_number), error_code, handle_error);
566 sql_ret = sqlite3_step(stmt);
567 if (sql_ret != SQLITE_DONE) {
568 UAM_ERR("Failed to delete device info [%d:%s]",
569 sql_ret, sqlite3_errmsg(database_handle));
570 error_code = UAM_ERROR_DB_FAILED;
572 UAM_DBG("Device info deleted");
580 int _uam_db_delete_device_service(const char *service_name)
583 db_service_info_t info;
584 int ret = UAM_ERROR_NONE;
585 int service_number = 0;
586 int error_code = UAM_ERROR_NONE;
587 UAM_INFO("%s", service_name);
589 ret = _uam_db_get_service_info(service_name, &info);
590 if (UAM_ERROR_NONE != ret)
592 service_number = info.service_number;
594 UAM_INFO("%d", service_number);
596 ret = _uam_db_delete_service_number(service_number);
597 if (UAM_ERROR_NONE != ret)
600 UAM_DBG("Service info deleted [%d]", service_number);
607 int _uam_db_delete_device_service_info(const char *device_id, int tech_type,
608 const char *address, const char *service_name)
611 db_service_info_t info;
612 int ret = UAM_ERROR_NONE;
613 int service_number = 0;
614 int device_number = 0;
615 int error_code = UAM_ERROR_NONE;
617 UAM_INFO("%s-%d-%s-%s", device_id, tech_type, address, service_name);
619 ret = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
620 if (UAM_ERROR_NONE != ret)
623 ret = _uam_db_get_service_info(service_name, &info);
624 if (UAM_ERROR_NONE != ret)
626 service_number = info.service_number;
628 UAM_INFO("%d-%d", device_number, service_number);
630 ret = _uam_db_delete_device_service_number(device_number, service_number);
631 if (UAM_ERROR_NONE != ret)
634 UAM_DBG("Device-service info deleted [%d] [%d]", device_number, service_number);
641 int _uam_db_delete_device_service_mapping(const char *device_id,
642 int tech_type, const char *address)
645 int ret = UAM_ERROR_NONE;
646 int device_number = 0;
647 int error_code = UAM_ERROR_NONE;
649 UAM_INFO("%s-%d-%s", device_id, tech_type, address);
651 ret = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
652 if (UAM_ERROR_NONE != ret)
655 UAM_INFO("%d", device_number);
657 ret = _uam_db_delete_device_number(device_number);
658 if (UAM_ERROR_NONE != ret)
661 UAM_DBG("Device info deleted [%d]", device_number);
668 GSList *_uam_db_get_service(int device_number)
671 sqlite3_stmt *stmt = select_service;
672 GSList *service_list = NULL;
673 db_service_info_t *info = NULL;
674 int sql_ret = SQLITE_OK;
676 if (sqlite3_bind_int(stmt, 1, device_number) != SQLITE_OK)
680 sql_ret = sqlite3_step(stmt);
685 info = g_new0(db_service_info_t, 1);
686 info->service_number = sqlite3_column_int(stmt, 0);
687 g_strlcpy(info->service_name, (char *)sqlite3_column_text(stmt, 1),
688 UAM_SERVICE_MAX_STRING_LEN);
689 info->cycle = sqlite3_column_int(stmt, 2);
691 UAM_INFO("%d-%s-%d", info->service_number, info->service_name, info->cycle);
692 service_list = g_slist_append(service_list, info);
696 UAM_ERR("Failed to enumerate device info [%d:%s]",
697 sql_ret, sqlite3_errmsg(database_handle));
699 } while (sql_ret == SQLITE_ROW);
707 GSList *_uam_db_get_device_services(const char *device_id, int tech_type,
711 int ret = UAM_ERROR_NONE;
712 int device_number = 0;
713 UAM_INFO("%s-%d-%s", device_id, tech_type, address);
715 GSList *service_list = NULL;
716 ret = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
717 if (UAM_ERROR_NONE != ret)
720 service_list = _uam_db_get_service(device_number);
727 int _uam_db_get_device_services_count(const char *device_id, int tech_type,
728 const char *address, int *svc_count)
731 int error_code = UAM_ERROR_NONE;
732 sqlite3_stmt *stmt = select_device_services_count;
733 int device_number = 0;
734 int sql_ret = SQLITE_OK;
736 retv_if(NULL == device_id, UAM_ERROR_INVALID_PARAMETER);
737 retv_if(NULL == address, UAM_ERROR_INVALID_PARAMETER);
738 UAM_INFO("%s-%d-%s", device_id, tech_type, address);
740 error_code = _uam_db_get_device_number(device_id, tech_type, address, &device_number);
741 if (UAM_ERROR_NONE != error_code)
744 DB_ACTION(sqlite3_bind_int(stmt, 1, device_number),
745 error_code, handle_error);
748 sql_ret = sqlite3_step(stmt);
754 UAM_DBG("Device services count info found");
755 *svc_count = sqlite3_column_int(stmt, 0);
756 UAM_INFO("device services count %d", *svc_count);
760 UAM_ERR("Failed to enumerate device info [%d:%s]",
761 sql_ret, sqlite3_errmsg(database_handle));
763 } while (sql_ret == SQLITE_ROW);
771 GSList *_uam_db_get_service_devices_info()
774 sqlite3_stmt *stmt = select_device_services;
775 GSList *svc_dev_list = NULL;
776 db_svc_dev_info_t *info = NULL;
777 int sql_ret = SQLITE_OK;
780 sql_ret = sqlite3_step(stmt);
786 UAM_DBG("Device services info found");
787 info = g_new0(db_svc_dev_info_t, 1);
788 g_strlcpy(info->device_id, (char *)sqlite3_column_text(stmt, 0),
789 UAM_DEVICE_ID_MAX_STRING_LEN);
790 info->type = sqlite3_column_int(stmt, 1);
791 g_strlcpy(info->svc, (char *)sqlite3_column_text(stmt, 2),
792 UAM_SERVICE_MAX_STRING_LEN);
793 info->discriminant = sqlite3_column_int(stmt, 3);
794 info->last_seen = sqlite3_column_int64(stmt, 4);
796 UAM_INFO("%s-%d-%s-%d-%llu",
803 svc_dev_list = g_slist_append(svc_dev_list, info);
807 UAM_ERR("Failed to enumerate device info [%d:%s]",
808 sql_ret, sqlite3_errmsg(database_handle));
810 } while (sql_ret == SQLITE_ROW);
817 static int __uam_db_update_dev_svc_payload(int device_number,
818 int service_number, int payload_number)
821 int error_code = UAM_ERROR_NONE;
822 sqlite3_stmt *stmt = update_device_service_payload;
823 int sql_ret = SQLITE_OK;
825 UAM_INFO("service: %d device: %d payload: %d",
826 device_number, service_number, payload_number);
828 DB_ACTION(sqlite3_bind_int(stmt, 1, payload_number), error_code, handle_error);
829 DB_ACTION(sqlite3_bind_int(stmt, 2, device_number), error_code, handle_error);
830 DB_ACTION(sqlite3_bind_int(stmt, 3, service_number), error_code, handle_error);
832 sql_ret = sqlite3_step(stmt);
833 if (sql_ret != SQLITE_DONE) {
834 UAM_ERR("Failed to update device-service payload [%d:%s]",
835 sql_ret, sqlite3_errmsg(database_handle));
836 error_code = UAM_ERROR_DB_FAILED;
840 UAM_DBG("Device-service payload info updated [%d] [%d] [%d] ",
841 device_number, service_number, payload_number);
849 int _uam_db_update_device_service_payload_info(
850 uam_ble_payload_s *payload, char *service_name)
853 int ret = UAM_ERROR_NONE;
854 db_service_info_t info;
855 int service_number = 0;
856 int device_number = 0;
857 int payload_number = 0;
859 retv_if(NULL == payload, UAM_ERROR_INVALID_PARAMETER);
860 retv_if(NULL == service_name, UAM_ERROR_INVALID_PARAMETER);
862 ret = _uam_db_get_service_info(service_name, &info);
863 if (UAM_ERROR_NONE != ret)
865 service_number = info.service_number;
867 ret = _uam_db_get_payload_device_number(payload, &device_number);
868 if (UAM_ERROR_NONE != ret)
871 ret = _uam_db_get_payload_number(payload, &payload_number);
872 if (UAM_ERROR_NONE != ret)
875 UAM_INFO("service: %d-%s device: %d payload: %d",
876 service_number, service_name,
877 device_number, payload_number);
879 ret = __uam_db_update_dev_svc_payload(device_number,
880 service_number, payload_number);
881 if (UAM_ERROR_NONE != ret)
884 UAM_DBG("payload-service info inserted [%d] [%d]", device_number,