From: Minje Ahn Date: Mon, 14 Oct 2019 04:28:58 +0000 (+0900) Subject: Improve db operation in dcm daemon X-Git-Tag: submit/tizen/20191113.015717~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08bfaab78b74466c0c72c255b0e8bf7a4c1ee27d;p=platform%2Fcore%2Fmultimedia%2Fdcm-service.git Improve db operation in dcm daemon 1. Change to connect db on demand 2. Move scan type from code to query Change-Id: I85584aee83499a1c5f7813b1b77190f63feb8287 Signed-off-by: Minje Ahn --- diff --git a/include/dcm_svc_db.h b/include/dcm_svc_db.h index 1ff83bd..3174158 100755 --- a/include/dcm_svc_db.h +++ b/include/dcm_svc_db.h @@ -30,14 +30,12 @@ typedef enum { FACE_SCAN_STATUS_NONE = 4, } dcm_face_scan_status_e; -int dcm_svc_db_connect(uid_t uid); -void dcm_svc_db_disconnect(); -int dcm_svc_db_get_scan_image_info_by_path(const char *file_path, dcm_svc_item_s **scan_item); -int dcm_svc_db_insert_face_to_db(const char *media_uuid, unsigned int x, unsigned int y, unsigned int w, unsigned int h, int orientation); -int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item); -int dcm_svc_db_delete_face_from_db(const char *media_uuid); -int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, time_t modified_time, dcm_face_scan_status_e *scan_status); -int dcm_svc_db_get_face_cnt_from_db(const char* media_uuid, int *face_cnt); +int dcm_svc_db_get_scan_image_info_by_path(const char *file_path, uid_t uid, dcm_svc_item_s **scan_item); +int dcm_svc_db_insert_face_to_db(const char *media_uuid, unsigned int x, unsigned int y, unsigned int w, unsigned int h, int orientation, uid_t uid); +int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item, uid_t uid); +int dcm_svc_db_delete_face_from_db(const char *media_uuid, uid_t uid); +int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, uid_t uid, dcm_face_scan_status_e *scan_status); +int dcm_svc_db_get_face_cnt_from_db(const char* media_uuid, uid_t uid, int *face_cnt); #endif /*_DCM_DB_UTILS_H_*/ diff --git a/include/dcm_svc_detect_face.h b/include/dcm_svc_detect_face.h index a16302c..10ee7c3 100755 --- a/include/dcm_svc_detect_face.h +++ b/include/dcm_svc_detect_face.h @@ -23,7 +23,7 @@ int dcm_face_detect_initialize(); int dcm_face_detect_finalize(); -int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e scan_status, dcm_image_info_s *image_info); +int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e scan_status, uid_t uid, dcm_image_info_s *image_info); #endif /*_DCM_SVC_FACE_H_*/ diff --git a/src/dcm_svc_db.c b/src/dcm_svc_db.c index c8e9909..2fdfb19 100755 --- a/src/dcm_svc_db.c +++ b/src/dcm_svc_db.c @@ -29,13 +29,11 @@ #define FACE_ITEM "media_id, face_rect_x , face_rect_y, face_rect_w , face_rect_h, face_orientation" #define SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB "SELECT media_id, media_width, media_height, media_orientation, media_mime_type, media_modified_time FROM "DB_VIEW_MEDIA" WHERE media_path = '%q';" -#define SELECT_SCAN_INFO_BY_MEDIA_ID "SELECT modified_time FROM "DB_TABLE_FACE_SCAN_LIST" WHERE media_id = '%q';" +#define SELECT_SCAN_TYPE "SELECT CASE WHEN "DB_VIEW_MEDIA".media_modified_time="DB_TABLE_FACE_SCAN_LIST".modified_time THEN 1 WHEN "DB_TABLE_FACE_SCAN_LIST".modified_time=0 THEN 3 ELSE 2 END result\ + FROM "DB_TABLE_FACE_SCAN_LIST" INNER JOIN "DB_VIEW_MEDIA" ON "DB_TABLE_FACE_SCAN_LIST".media_id="DB_VIEW_MEDIA".media_id WHERE "DB_TABLE_FACE_SCAN_LIST".media_id='%q';" #define INSERT_FACE_ITEM_TO_DB "INSERT OR IGNORE INTO " DB_TABLE_FACE" (" FACE_ITEM") VALUES ('%q', %d, %d, %d, %d, %d);" #define SELECT_FACE_COUNT_BY_MEDIA_ID "SELECT COUNT(*) FROM " DB_TABLE_FACE" WHERE media_id = '%q';" -static sqlite3 *db_handle; -static uid_t dcm_uid; - static int __dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3_stmt** stmt) { int ret = MS_MEDIA_ERR_NONE; @@ -48,8 +46,6 @@ static int __dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, s } ret = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL); - sqlite3_free((char *)sql_str); - if (ret != SQLITE_OK) { dcm_error("prepare error %d[%s]", ret, sqlite3_errmsg(handle)); if (ret == SQLITE_CORRUPT) @@ -61,66 +57,40 @@ static int __dcm_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, s ret = sqlite3_step(*stmt); if (ret != SQLITE_ROW) { dcm_warn("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle)); - DCM_SQLITE3_FINALIZE(*stmt); return MS_MEDIA_ERR_DB_NO_RECORD; } return MS_MEDIA_ERR_NONE; } -int dcm_svc_db_connect(uid_t uid) -{ - int ret = MS_MEDIA_ERR_NONE; - - dcm_debug("_dcm_svc_db_connect uid: %d", uid); - dcm_uid = uid; - - ret = media_db_connect(&db_handle, dcm_uid, FALSE); - if (ret != MS_MEDIA_ERR_NONE) { - dcm_error("media_db_connect failed: %d", ret); - db_handle = NULL; - return ret; - } - - dcm_warn("media db handle: %p", db_handle); - - return MS_MEDIA_ERR_NONE; -} - -void dcm_svc_db_disconnect(void) -{ - dcm_warn("media db handle: %p", db_handle); - - if (db_handle) - media_db_disconnect(db_handle); - - db_handle = NULL; -} - -int dcm_svc_db_get_scan_image_info_by_path(const char *file_path, dcm_svc_item_s **scan_item) +int dcm_svc_db_get_scan_image_info_by_path(const char *file_path, uid_t uid, dcm_svc_item_s **scan_item) { int ret = MS_MEDIA_ERR_NONE; char *query_string = NULL; sqlite3_stmt *sql_stmt = NULL; dcm_svc_item_s *_item = NULL; + sqlite3 *handle = NULL; dcm_debug_fenter(); - - dcm_retvm_if(db_handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid db_handle"); dcm_retvm_if(!DCM_STRING_VALID(file_path), MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid file_path"); /* Make query */ query_string = sqlite3_mprintf(SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB, file_path); dcm_retvm_if(query_string == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY, "Invalid query_string"); - ret = __dcm_svc_sql_prepare_to_step((sqlite3 *)db_handle, query_string, &sql_stmt); - dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Fail __dcm_svc_sql_prepare_to_step [%d]", ret); + ret = media_db_connect(&handle, uid, false); + if (ret != MS_MEDIA_ERR_NONE) + goto ERROR; + + ret = __dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); + if (ret != MS_MEDIA_ERR_NONE) + goto ERROR; - _item = (dcm_svc_item_s *) g_malloc0(sizeof(dcm_svc_item_s)); - if (_item == NULL) { - dcm_error("Failed to allocate memory for _item!"); - DCM_SQLITE3_FINALIZE(sql_stmt); - return MS_MEDIA_ERR_OUT_OF_MEMORY; + _item = (dcm_svc_item_s *) calloc(1, sizeof(dcm_svc_item_s)); + if (!_item) { + dcm_error("Allocation failed"); + ret = MS_MEDIA_ERR_OUT_OF_MEMORY; + goto ERROR; } _item->media_uuid = g_strdup((const char *)sqlite3_column_text(sql_stmt, 0)); @@ -131,36 +101,20 @@ int dcm_svc_db_get_scan_image_info_by_path(const char *file_path, dcm_svc_item_s _item->mime_type = g_strdup((const char *)sqlite3_column_text(sql_stmt, 4)); _item->modified_time = sqlite3_column_int(sql_stmt, 5); - DCM_SQLITE3_FINALIZE(sql_stmt); - dcm_sec_debug("media uuid: [%s] file path: [%s]", _item->media_uuid, _item->file_path); *scan_item = _item; - dcm_debug_fleave(); - return ret; -} - -static int __request_update_db(const char* query_string) -{ - int ret = MS_MEDIA_ERR_NONE; - - dcm_retvm_if(!db_handle, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid db_handle"); - dcm_retvm_if(!query_string, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid query_string"); - - dcm_sec_debug("query[%s]", query_string); - - ret = media_db_request_update_db(query_string, dcm_uid); - if (ret != MS_MEDIA_ERR_NONE) - dcm_error("fail to media_db_request_update_db[%d] [%s]", ret, sqlite3_errmsg((sqlite3 *)db_handle)); - - dcm_debug_fleave(); +ERROR: + DCM_SQLITE3_FREE(query_string); + DCM_SQLITE3_FINALIZE(sql_stmt); + media_db_disconnect(handle); return ret; } -int dcm_svc_db_insert_face_to_db(const char *media_uuid, unsigned int x, unsigned int y, unsigned int w, unsigned int h, int orientation) +int dcm_svc_db_insert_face_to_db(const char *media_uuid, unsigned int x, unsigned int y, unsigned int w, unsigned int h, int orientation, uid_t uid) { int ret = MS_MEDIA_ERR_NONE; char* query_string = NULL; @@ -169,13 +123,15 @@ int dcm_svc_db_insert_face_to_db(const char *media_uuid, unsigned int x, unsigne query_string = sqlite3_mprintf(INSERT_FACE_ITEM_TO_DB, media_uuid, x, y, w, h, orientation); - ret = __request_update_db(query_string); + ret = media_db_request_update_db(query_string, uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("fail to media_db_request_update_db[%d]", ret); DCM_SQLITE3_FREE(query_string); return ret; } -int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item) +int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item, uid_t uid) { int ret = MS_MEDIA_ERR_NONE; char* query_string = NULL; @@ -185,13 +141,15 @@ int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item) query_string = sqlite3_mprintf("INSERT OR REPLACE INTO %s (media_id, modified_time) values('%q', %d)", DB_TABLE_FACE_SCAN_LIST, scan_item->media_uuid, scan_item->modified_time); - ret = __request_update_db(query_string); + ret = media_db_request_update_db(query_string, uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("fail to media_db_request_update_db[%d]", ret); DCM_SQLITE3_FREE(query_string); return ret; } -int dcm_svc_db_delete_face_from_db(const char *media_uuid) +int dcm_svc_db_delete_face_from_db(const char *media_uuid, uid_t uid) { int ret = MS_MEDIA_ERR_NONE; char* query_string = NULL; @@ -200,63 +158,58 @@ int dcm_svc_db_delete_face_from_db(const char *media_uuid) query_string = sqlite3_mprintf("DELETE FROM %s WHERE media_id='%q'", DB_TABLE_FACE, media_uuid); - ret = __request_update_db(query_string); + ret = media_db_request_update_db(query_string, uid); + if (ret != MS_MEDIA_ERR_NONE) + dcm_error("fail to media_db_request_update_db[%d]", ret); DCM_SQLITE3_FREE(query_string); return ret; } -int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, time_t modified_time, dcm_face_scan_status_e *scan_status) +int dcm_svc_db_check_scanned_by_media_uuid(const char *media_uuid, uid_t uid, dcm_face_scan_status_e *scan_status) { int ret = MS_MEDIA_ERR_NONE; char *query_string = NULL; sqlite3_stmt *sql_stmt = NULL; - time_t org_modified_time = 0; + sqlite3 *handle = NULL; dcm_debug_fenter(); + dcm_retvm_if(!media_uuid, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid media_uuid"); - dcm_retvm_if(db_handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid db_handle"); - dcm_retvm_if(media_uuid == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid media_uuid"); + query_string = sqlite3_mprintf(SELECT_SCAN_TYPE, media_uuid); + dcm_retvm_if(!query_string, MS_MEDIA_ERR_OUT_OF_MEMORY, "Invalid query_string"); - query_string = sqlite3_mprintf(SELECT_SCAN_INFO_BY_MEDIA_ID, media_uuid); - dcm_retvm_if(query_string == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY, "Invalid query_string"); + ret = media_db_connect(&handle, uid, false); + if (ret != MS_MEDIA_ERR_NONE) + goto ERROR; - ret = __dcm_svc_sql_prepare_to_step((sqlite3 *)db_handle, query_string, &sql_stmt); + ret = __dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); if (ret == MS_MEDIA_ERR_DB_NO_RECORD) { dcm_info("Scanning needed"); *scan_status = FACE_SCAN_NEEDED; + ret = MS_MEDIA_ERR_NONE; } else if (ret == MS_MEDIA_ERR_NONE) { - org_modified_time = sqlite3_column_int(sql_stmt, 0); - if (org_modified_time == modified_time) { - dcm_info("Already scanned item"); - *scan_status = FACE_SCAN_NO_NEEDED; - } else if (org_modified_time == 0) { - /*In case of the some objects removed by user */ - dcm_info("Some objects have been deleted"); - *scan_status = FACE_SCAN_RESCAN; - } else { - dcm_info("Scanned but item is modified"); - *scan_status = FACE_SCAN_REFRESH_NEEDED; - } - - DCM_SQLITE3_FINALIZE(sql_stmt); + *scan_status = sqlite3_column_int(sql_stmt, 0); } else { dcm_error("error when __dcm_svc_sql_prepare_to_step. ret = [%d]", ret); - return ret; } dcm_debug_fleave(); +ERROR: + DCM_SQLITE3_FREE(query_string); + DCM_SQLITE3_FINALIZE(sql_stmt); + media_db_disconnect(handle); - return MS_MEDIA_ERR_NONE; + return ret; } -int dcm_svc_db_get_face_cnt_from_db(const char* media_uuid, int *face_cnt) +int dcm_svc_db_get_face_cnt_from_db(const char* media_uuid, uid_t uid, int *face_cnt) { int ret = MS_MEDIA_ERR_NONE; char *query_string = NULL; sqlite3_stmt *sql_stmt = NULL; + sqlite3 *handle = NULL; - dcm_retvm_if(db_handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid db_handle"); dcm_retvm_if(!DCM_STRING_VALID(media_uuid), MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid media_uuid"); dcm_retvm_if(face_cnt == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid face_cnt"); @@ -264,13 +217,21 @@ int dcm_svc_db_get_face_cnt_from_db(const char* media_uuid, int *face_cnt) query_string = sqlite3_mprintf(SELECT_FACE_COUNT_BY_MEDIA_ID, media_uuid); dcm_retvm_if(query_string == NULL, MS_MEDIA_ERR_OUT_OF_MEMORY, "Invalid query_string"); - ret = __dcm_svc_sql_prepare_to_step((sqlite3 *)db_handle, query_string, &sql_stmt); - dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Fail __dcm_svc_sql_prepare_to_step [%d]", ret); + ret = media_db_connect(&handle, uid, false); + if (ret != MS_MEDIA_ERR_NONE) + goto ERROR; + + ret = __dcm_svc_sql_prepare_to_step(handle, query_string, &sql_stmt); + if (ret != MS_MEDIA_ERR_NONE) + goto ERROR; *face_cnt = (int)sqlite3_column_int(sql_stmt, 0); +ERROR: + DCM_SQLITE3_FREE(query_string); DCM_SQLITE3_FINALIZE(sql_stmt); + media_db_disconnect(handle); - return MS_MEDIA_ERR_NONE; + return ret; } diff --git a/src/dcm_svc_detect_face.c b/src/dcm_svc_detect_face.c index 3b7386d..ec6345a 100755 --- a/src/dcm_svc_detect_face.c +++ b/src/dcm_svc_detect_face.c @@ -73,7 +73,7 @@ int dcm_face_detect_finalize() return ret; } -int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e scan_status, dcm_image_info_s *image_info) +int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e scan_status, uid_t uid, dcm_image_info_s *image_info) { int face_area = 0; int i = 0; @@ -103,7 +103,7 @@ int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e sc goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; } - face_info = (face_info_s *)g_malloc0(sizeof(face_info_s)); + face_info = (face_info_s *)calloc(1, sizeof(face_info_s)); if (face_info == NULL) { dcm_error("Failed to allocate face info"); ret = MS_MEDIA_ERR_OUT_OF_MEMORY; @@ -144,7 +144,7 @@ int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e sc dcm_debug("[#%d] face rect: X [%d] Y [%d] W [%d] H [%d] Orientation [%d]", i, face_rect_x, face_rect_y, face_rect_w, face_rect_h, face_orientation); /* Insert face rectangle into database */ - ret = dcm_svc_db_insert_face_to_db(scan_item->media_uuid, face_rect_x, face_rect_y, face_rect_w, face_rect_h, face_orientation); + ret = dcm_svc_db_insert_face_to_db(scan_item->media_uuid, face_rect_x, face_rect_y, face_rect_w, face_rect_h, face_orientation, uid); if (ret != MS_MEDIA_ERR_NONE) { dcm_error("Failed to insert face item into db! ret: %d", ret); goto DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED; @@ -154,7 +154,7 @@ int dcm_face_detect_process(dcm_svc_item_s *scan_item, dcm_face_scan_status_e sc DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED: - err = dcm_svc_db_insert_face_to_face_scan_list(scan_item); + err = dcm_svc_db_insert_face_to_face_scan_list(scan_item, uid); if (err != MS_MEDIA_ERR_NONE) dcm_error("Failed to insert face item into face_scan_list! err: %d", err); diff --git a/src/dcm_svc_internal.c b/src/dcm_svc_internal.c index c2685ee..2cc649c 100755 --- a/src/dcm_svc_internal.c +++ b/src/dcm_svc_internal.c @@ -22,7 +22,7 @@ #include #include -static int __dcm_scan_process(dcm_svc_item_s *scan_item) +static int __dcm_scan_process(dcm_svc_item_s *scan_item, uid_t uid) { dcm_face_scan_status_e scan_status = FACE_SCAN_STATUS_NONE; int ret = MS_MEDIA_ERR_NONE; @@ -37,7 +37,7 @@ static int __dcm_scan_process(dcm_svc_item_s *scan_item) image_info.decode_type = DCM_IMAGE_FORMAT_I420; if (g_file_test(scan_item->file_path, G_FILE_TEST_IS_REGULAR)) { - ret = dcm_svc_db_check_scanned_by_media_uuid(scan_item->media_uuid, scan_item->modified_time, &scan_status); + ret = dcm_svc_db_check_scanned_by_media_uuid(scan_item->media_uuid, uid, &scan_status); dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Failed to get scan item info from db(%d)", ret); if (scan_status == FACE_SCAN_NO_NEEDED) { @@ -71,13 +71,13 @@ static int __dcm_scan_process(dcm_svc_item_s *scan_item) /* If status is refresh, remove all faces and re-insert */ if (scan_status == FACE_SCAN_REFRESH_NEEDED) { - ret = dcm_svc_db_delete_face_from_db(scan_item->media_uuid); + ret = dcm_svc_db_delete_face_from_db(scan_item->media_uuid, uid); if (ret != MS_MEDIA_ERR_NONE) dcm_error("Failed to dcm_svc_db_delete_face_from_db err: %d", ret); } /* Process face scan */ - ret = dcm_face_detect_process(scan_item, scan_status, &image_info); + ret = dcm_face_detect_process(scan_item, scan_status, uid, &image_info); if (ret != MS_MEDIA_ERR_NONE) dcm_error("Failed to process face detection! err: %d", ret); @@ -103,23 +103,17 @@ int dcm_scan_single(const char *file_path, uid_t uid, int *face_count) DCM_CHECK_VAL(file_path, MS_MEDIA_ERR_INVALID_PARAMETER); DCM_CHECK_VAL(face_count, MS_MEDIA_ERR_INVALID_PARAMETER); - ret = dcm_svc_db_connect(uid); - dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Fail dcm_svc_db_connect"); - - ret = dcm_svc_db_get_scan_image_info_by_path(file_path, &scan_item); + ret = dcm_svc_db_get_scan_image_info_by_path(file_path, uid, &scan_item); if (ret != MS_MEDIA_ERR_NONE || scan_item == NULL) { dcm_error("Failed to dcm_svc_db_get_scan_image_info_by_path err: %d", ret); - dcm_svc_db_disconnect(); return ret; } - ret = __dcm_scan_process(scan_item); + ret = __dcm_scan_process(scan_item, uid); if (ret != MS_MEDIA_ERR_NONE) dcm_error("Failed to process scan job! err: %d", ret); - dcm_svc_db_get_face_cnt_from_db(scan_item->media_uuid, face_count); - - dcm_svc_db_disconnect(); + dcm_svc_db_get_face_cnt_from_db(scan_item->media_uuid, uid, face_count); DCM_SAFE_FREE(scan_item->media_uuid); DCM_SAFE_FREE(scan_item->file_path);