diff options
Diffstat (limited to 'src/common/media-svc-db-utils.c')
-rwxr-xr-x | src/common/media-svc-db-utils.c | 90 |
1 files changed, 83 insertions, 7 deletions
diff --git a/src/common/media-svc-db-utils.c b/src/common/media-svc-db-utils.c index adde488..f90825f 100755 --- a/src/common/media-svc-db-utils.c +++ b/src/common/media-svc-db-utils.c @@ -32,6 +32,7 @@ static int __media_svc_db_upgrade(sqlite3 *db_handle, int cur_version, uid_t uid); static int __media_svc_rebuild_view_query(sqlite3 *db_handle, uid_t uid); +static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid); static GHashTable *table; @@ -1546,11 +1547,18 @@ ERROR: int _media_svc_sql_query(const char *sql_str, uid_t uid) { - int ret = MS_MEDIA_ERR_NONE; + return media_db_request_update_db(sql_str, uid); +} - media_svc_sec_debug("[SQL query] : %s", sql_str); +int _media_svc_sql_query_direct(const char *sql_str, uid_t uid) +{ + int ret = MS_MEDIA_ERR_NONE; + sqlite3 *handle = NULL; - ret = media_db_request_update_db(sql_str, uid); + ret = media_db_connect(&handle, uid, true); + media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed"); + ret = __media_svc_query_direct(handle, sql_str, uid); + media_db_disconnect(handle); return ret; } @@ -1585,7 +1593,7 @@ int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3 return MS_MEDIA_ERR_INVALID_PARAMETER; } - media_svc_sec_debug("[SQL query] : %s", sql_str); + media_svc_sec_debug("Query[%s]", sql_str); err = sqlite3_prepare_v2(handle, sql_str, -1, stmt, NULL); sqlite3_free((char *)sql_str); @@ -1602,7 +1610,7 @@ int _media_svc_sql_prepare_to_step(sqlite3 *handle, const char *sql_str, sqlite3 err = sqlite3_step(*stmt); if (err != SQLITE_ROW) { - media_svc_error("[No-Error] Item not found. end of row [%s]", sqlite3_errmsg(handle)); + media_svc_debug("No record"); SQLITE3_FINALIZE(*stmt); return MS_MEDIA_ERR_DB_NO_RECORD; } @@ -1616,7 +1624,7 @@ int _media_svc_sql_prepare_to_step_simple(sqlite3 *handle, const char *sql_str, media_svc_retvm_if(handle == NULL, MS_MEDIA_ERR_INVALID_PARAMETER, "handle is NULL"); - media_svc_sec_debug("[SQL query] : %s", sql_str); + media_svc_sec_debug("Query[%s]", sql_str); if (!STRING_VALID(sql_str)) { media_svc_error("invalid query"); @@ -1723,6 +1731,75 @@ int _media_svc_sql_query_list(GList **query_list, uid_t uid) } +#define MAX_RETRY 9 +#define SLEEP_TIME 1000 * 1000 +static int __media_svc_query_direct(sqlite3 *handle, const char *query, uid_t uid) +{ + int ret = MS_MEDIA_ERR_NONE; + char *zErrMsg = NULL; + int retry_count = 0; + +EXEC_RETRY: + ret = sqlite3_exec(handle, query, NULL, NULL, &zErrMsg); + if (SQLITE_OK != ret) { + media_svc_sec_error("Error[%s],Query[%s]", zErrMsg, query); + SQLITE3_SAFE_FREE(zErrMsg); + if (ret == SQLITE_BUSY) { + ret = MS_MEDIA_ERR_DB_BUSY_FAIL; + } else if (ret == SQLITE_CONSTRAINT) { + ret = MS_MEDIA_ERR_DB_CONSTRAINT_FAIL; + } else if (ret == SQLITE_FULL) { + ret = MS_MEDIA_ERR_DB_FULL_FAIL; + } else if (ret == SQLITE_LOCKED) { + if (retry_count < MAX_RETRY) { + media_svc_error("Locked retry[%d]", retry_count); + retry_count++; + usleep(SLEEP_TIME); + goto EXEC_RETRY; + } + ret = MS_MEDIA_ERR_DB_UPDATE_FAIL; + } else { + ret = MS_MEDIA_ERR_DB_UPDATE_FAIL; + } + } + + return ret; +} + +int _media_svc_sql_query_list_direct(GList **query_list, uid_t uid) +{ + int ret = MS_MEDIA_ERR_NONE; + int idx = 0; + int length = g_list_length(*query_list); + char *sql = NULL; + sqlite3 *handle = NULL; + + media_svc_debug("query list length[%d]", length); + if (length == 0) + goto ZERO_LEN; + + ret = media_db_connect(&handle, uid, true); + media_svc_retvm_if(ret != MS_MEDIA_ERR_NONE, ret, "DB connection failed"); + + for (idx = 0; idx < length; idx++) { + sql = (char *)g_list_nth_data(*query_list, idx); + if (STRING_VALID(sql)) { + ret = __media_svc_query_direct(handle, sql, uid); + if (ret != MS_MEDIA_ERR_NONE) + media_svc_debug("_media_svc_query_direct failed[%s]", sql); + + SQLITE3_SAFE_FREE(sql); + } + } + + media_db_disconnect(handle); + +ZERO_LEN: + _media_svc_sql_query_release(query_list); + + return MS_MEDIA_ERR_NONE; +} + void _media_svc_sql_query_add(GList **query_list, char **query) { *query_list = g_list_append(*query_list, *query); @@ -1731,7 +1808,6 @@ void _media_svc_sql_query_add(GList **query_list, char **query) void _media_svc_sql_query_release(GList **query_list) { if (*query_list) { - media_svc_debug("_svc_sql_query_release"); g_list_free(*query_list); *query_list = NULL; } |