#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;
}
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)
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));
_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;
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;
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;
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");
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;
}
#include <dcm_svc_debug.h>
#include <dcm_svc_detect_face.h>
-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;
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) {
/* 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);
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);