Add face scan status for distinguish between file changes and re-scans.
- file modified time > face detected time : file is changed
- face detected time == 0 : some detected faces are removed by user
Change logic to re-scan:
- Do not delete, add missing. Delete is performed only when the file is modified.
- Delete unnecessary fields (user_marked)
Change-Id: I1782e330698612c719c4842c6d9d9b1e990b9e2c
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
#define DB_TABLE_FACE "face"
#define DB_TABLE_FACE_SCAN_LIST "face_scan_list"
#define DB_TABLE_MEDIA "media"
+
#define FACE_ITEM "media_uuid, face_rect_x , face_rect_y, face_rect_w , face_rect_h, orientation"
-#define SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB "SELECT media_uuid, width, height, orientation, mime_type, modified_time FROM media WHERE path = '%q';"
+#define SELECT_MEDIA_INFO_BY_FILE_PATH_FROM_DB "SELECT media_uuid, width, height, orientation, mime_type, modified_time FROM "DB_TABLE_MEDIA" WHERE path = '%q';"
#define SELECT_SCAN_INFO_BY_MEDIA_ID "SELECT modified_time FROM "DB_TABLE_FACE_SCAN_LIST" WHERE media_uuid = '%q';"
#define INSERT_FACE_ITEM_TO_DB "INSERT OR IGNORE INTO " DB_TABLE_FACE" (" FACE_ITEM") VALUES ('%q', %d, %d, %d, %d, %d);"
FACE_SCAN_NEEDED = 0,
FACE_SCAN_NO_NEEDED = 1,
FACE_SCAN_REFRESH_NEEDED = 2,
- FACE_SCAN_STATUS_NONE = 3,
+ FACE_SCAN_RESCAN = 3,
+ FACE_SCAN_STATUS_NONE = 4,
} dcm_face_scan_status_e;
int dcm_svc_db_connect(uid_t uid);
int dcm_svc_db_insert_face_to_db(dcm_face_item_s *face);
int dcm_svc_db_update_color_to_db(const dcm_color_item_s color);
int dcm_svc_db_insert_face_to_face_scan_list(dcm_svc_item_s *scan_item);
-int dcm_svc_db_update_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);
dcm_retvm_if(scan_item == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid scan_item");
dcm_retvm_if(scan_item->media_uuid == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid media_uuid");
- query_string = sqlite3_mprintf("INSERT OR IGNORE INTO %s (media_uuid, modified_time) values('%q', %d)", DB_TABLE_FACE_SCAN_LIST, scan_item->media_uuid, scan_item->modified_time);
- dcm_debug("query[%s]", query_string);
-
- g_mutex_trylock(&gMutexLock);
- ret = media_db_request_update_db(query_string, dcm_uid);
- if (ret != MS_MEDIA_ERR_NONE)
- dcm_error("media_db_request_update_db is failed: %d, %s", ret, sqlite3_errmsg((sqlite3 *)db_handle));
-
- g_mutex_unlock(&gMutexLock);
-
- DCM_SQLITE3_FREE(query_string);
-
- dcm_debug_fleave();
-
- return ret;
-}
-
-int dcm_svc_db_update_face_to_face_scan_list(dcm_svc_item_s *scan_item)
-{
- int ret = MS_MEDIA_ERR_NONE;
- char* query_string = NULL;
-
- dcm_debug_fenter();
-
- dcm_retvm_if(db_handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid db_handle");
- dcm_retvm_if(scan_item == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid scan_item");
- dcm_retvm_if(scan_item->media_uuid == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "Invalid media_uuid");
-
- query_string = sqlite3_mprintf("UPDATE %s SET modified_time = %d WHERE media_uuid='%q'", DB_TABLE_FACE_SCAN_LIST, scan_item->modified_time, scan_item->media_uuid);
+ query_string = sqlite3_mprintf("INSERT OR REPLACE INTO %s (media_uuid, modified_time) values('%q', %d)", DB_TABLE_FACE_SCAN_LIST, scan_item->media_uuid, scan_item->modified_time);
dcm_debug("query[%s]", query_string);
g_mutex_trylock(&gMutexLock);
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("DELETE FROM %s WHERE media_uuid='%q' AND user_marked = 0", DB_TABLE_FACE, media_uuid);
+ query_string = sqlite3_mprintf("DELETE FROM %s WHERE media_uuid='%q'", DB_TABLE_FACE, media_uuid);
dcm_sec_debug("query[%s]", query_string);
g_mutex_trylock(&gMutexLock);
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 updated. Scanning needed");
+ dcm_info("Scanned but item is modified");
*scan_status = FACE_SCAN_REFRESH_NEEDED;
}
DCM_SVC_FACE_RECOGNIZE_BUFFER_FAILED:
- if (scan_status == FACE_SCAN_REFRESH_NEEDED) {
- err = dcm_svc_db_update_face_to_face_scan_list(scan_item);
- if (err != MS_MEDIA_ERR_NONE)
- dcm_error("Failed to update face item into face_scan_list! err: %d", err);
- } else {
- err = dcm_svc_db_insert_face_to_face_scan_list(scan_item);
- if (err != MS_MEDIA_ERR_NONE)
- dcm_error("Failed to insert face item into face_scan_list! err: %d", err);
- }
+ err = dcm_svc_db_insert_face_to_face_scan_list(scan_item);
+ if (err != MS_MEDIA_ERR_NONE)
+ dcm_error("Failed to insert face item into face_scan_list! err: %d", err);
dcm_face_destroy_face_info(face_info);
if (scan_status == FACE_SCAN_NO_NEEDED) {
dcm_warn("This media is scanned already! Skip...");
- DCM_SAFE_FREE(image_info.pixel);
return MS_MEDIA_ERROR_ALREADY_SCANNED;
} else {
dcm_debug("Need to Scan");
dcm_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "Failed dcm_decode_image(%d)", ret);
dcm_info("Image info W[%d] H[%d] Orient[%d] buf_w[%d] buf_h[%d]",
- image_info.original_width, image_info.original_height, scan_item->image_orientation, image_info.buffer_width, image_info.buffer_height);
+ image_info.original_width, image_info.original_height, image_info.orientation, image_info.buffer_width, image_info.buffer_height);
+ /* 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);
if (ret != MS_MEDIA_ERR_NONE)