*/
#include <unistd.h>
-#include <stdlib.h>
#include <string.h>
-#include <grp.h>
-#include <pwd.h>
#include <stdio.h>
-#include <tzplatform_config.h>
#include "media_controller_private.h"
#include "media_controller_db.h"
MC_SERVER_FIELD_REPEAT_MODE,
} server_table_field_e;
-static int __mc_db_busy_handler(void *pData, int count)
-{
- MC_MILLISEC_SLEEP(50);
-
- mc_debug("mc_db_busy_handler called : %d", count);
-
- return 100 - count;
-}
-
static int __mc_db_update_db(mc_priv_type_e priv_type, const char *sql_str)
{
return mc_ipc_send_message_to_server(MC_MSG_DB_UPDATE, priv_type, sql_str);
return MEDIA_CONTROLLER_ERROR_NONE;
}
-static char* __mc_get_db_name(uid_t uid)
-{
- char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, };
- char *result_psswd_rtn = NULL;
- char * dir = NULL;
-
- memset(result_psswd, 0, sizeof(result_psswd));
-
- struct passwd pwd;
- struct passwd *pwd_result = NULL;
- char buf_pw[MC_FILE_PATH_LEN_MAX];
-
- int ret = getpwuid_r(uid, &pwd, buf_pw, MC_FILE_PATH_LEN_MAX, &pwd_result);
- mc_retvm_if((ret != 0 || pwd_result == NULL), NULL, "getpwuid_r(%d) returns NULL !", uid);
-
- struct group grp;
- struct group *grp_result = NULL;
- char buf_gr[MC_FILE_PATH_LEN_MAX];
-
- ret = getgrnam_r("users", &grp, buf_gr, MC_FILE_PATH_LEN_MAX, &grp_result);
- mc_retvm_if((ret != 0 || grp_result == NULL), NULL, "getgrnam_r(users) returns NULL!");
-
- /* Compare git_t type and not group name */
- if (grp_result->gr_gid != pwd_result->pw_gid) {
- mc_error("UID [%d] does not belong to 'users' group!", uid);
- return NULL;
- }
- snprintf(result_psswd, sizeof(result_psswd), "%s/.applications/dbspace/%s", pwd_result->pw_dir, MC_DB_NAME);
-
- dir = strrchr(result_psswd, '/');
- if (!dir)
- return strdup(result_psswd);
-
- result_psswd_rtn = strdup(result_psswd);
-
- return result_psswd_rtn;
-}
-
-int mc_db_connect(void **handle)
-{
- int ret = MEDIA_CONTROLLER_ERROR_NONE;
- sqlite3 *db_handle = NULL;
-
- mc_debug_fenter();
-
- mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
-
- /*Connect DB*/
- char * db_name = NULL;
- db_name = __mc_get_db_name(getuid());
- mc_retvm_if(db_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error __mc_get_db_name");
-
- ret = sqlite3_open_v2(db_name, &db_handle, SQLITE_OPEN_READONLY, NULL);
- if (SQLITE_OK != ret) {
- mc_error("error when db open [%s]", db_name);
- *handle = NULL;
- MC_SAFE_FREE(db_name);
-
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
- }
-
- MC_SAFE_FREE(db_name);
-
- mc_retvm_if(db_handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "db_handle is NULL");
-
- /*Register busy handler*/
- ret = sqlite3_busy_handler(db_handle, __mc_db_busy_handler, NULL);
- if (SQLITE_OK != ret) {
- mc_error("error when register busy handler %s", sqlite3_errmsg(db_handle));
- sqlite3_close_v2(db_handle);
- *handle = NULL;
-
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
- }
-
- *handle = db_handle;
-
- return MEDIA_CONTROLLER_ERROR_NONE;
-}
-
static int __mc_db_get_count(void *handle, const char *sql_str)
{
int ret = MEDIA_CONTROLLER_ERROR_NONE;
return ret;
}
-int mc_db_disconnect(void *handle)
-{
- int ret = MEDIA_CONTROLLER_ERROR_NONE;
- sqlite3 *db_handle = (sqlite3 *)handle;
-
- mc_retvm_if(db_handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
-
- ret = sqlite3_close_v2(db_handle);
- if (SQLITE_OK != ret) {
- mc_error("error when db close");
- mc_error("Error : %s", sqlite3_errmsg(db_handle));
- db_handle = NULL;
-
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
- }
-
- return MEDIA_CONTROLLER_ERROR_NONE;
-}
-
int mc_db_create_server_table(const char *server_name)
{
int ret = MEDIA_CONTROLLER_ERROR_NONE;
*/
#include <unistd.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <grp.h>
-#include <pwd.h>
#include <sqlite3.h>
#include <tzplatform_config.h>
#include <gio/gio.h>
#define DB_UPDATE_STATE_PLAYBACK "UPDATE '%q' SET server_state=%d, playback_state=%d;"
#define DB_DROP_TABLE "DROP TABLE IF EXISTS '%q';"
-static int __mc_db_util_busy_handler(void *pData, int count)
+#define MC_DB_NAME ".media_controller.db"
+#define REGULAR_USER 5000
+static GMutex tzplatform_mutex;
+
+static char *__mc_db_get_user_path(uid_t uid)
+{
+ int ret = 0;
+ struct tzplatform_context *ctx = NULL;
+ char *path = NULL;
+
+ mc_retvm_if(uid < REGULAR_USER, NULL, "Invalid uid");
+
+ g_mutex_lock(&tzplatform_mutex);
+
+ ret = tzplatform_context_create(&ctx);
+ if (ret != 0) {
+ mc_secure_error("Fail tzplatform_context_create");
+ goto ERROR;
+ }
+
+ ret = tzplatform_context_set_user(ctx, uid);
+ if (ret != 0) {
+ mc_secure_error("Fail tzplatform_context_set_user");
+ goto ERROR;
+ }
+
+ path = g_strdup(tzplatform_context_mkpath(ctx, TZ_USER_DB, MC_DB_NAME));
+ if (!MC_STRING_VALID(path))
+ mc_secure_error("Fail to get the path");
+
+ERROR:
+ if (ctx != NULL)
+ tzplatform_context_destroy(ctx);
+
+ g_mutex_unlock(&tzplatform_mutex);
+
+ return path;
+}
+
+static int __mc_db_busy_handler(void *pData, int count)
{
MC_MILLISEC_SLEEP(50);
- mc_debug("mc_db_busy_handler called : %d", count);
+ mc_debug("__mc_db_busy_handler called : %d", count);
return 100 - count;
}
+static int __mc_db_disable_journal_mode(sqlite3 *handle)
+{
+ int ret = SQLITE_OK;
+ char *sql = NULL;
+
+ mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+ sql = sqlite3_mprintf("%s", "PRAGMA journal_mode = OFF");
+ mc_retvm_if(!MC_STRING_VALID(sql), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
+
+ ret = sqlite3_exec(handle, sql, NULL, NULL, NULL);
+ SQLITE3_SAFE_FREE(sql);
+ mc_retvm_if(SQLITE_OK != ret, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL Error[%s] when change the journal mode", sqlite3_errmsg(handle));
+
+ return MEDIA_CONTROLLER_ERROR_NONE;
+}
+
static int __mc_foreach_table_list(void *handle, GList **list)
{
int ret = MEDIA_CONTROLLER_ERROR_NONE;
return ret;
}
-static char* __mc_get_db_name(uid_t uid)
-{
- char result_psswd[MC_FILE_PATH_LEN_MAX] = {0, };
- char *result_psswd_rtn = NULL;
- struct group *grpinfo = NULL;
- char * dir = NULL;
-
- memset(result_psswd, 0, sizeof(result_psswd));
- if (uid == getuid()) {
- MC_SAFE_STRLCPY(result_psswd, MC_DB_NAME, sizeof(result_psswd));
- grpinfo = getgrnam("users");
- if (grpinfo == NULL) {
- mc_error("getgrnam(users) returns NULL !");
- return NULL;
- }
- } else {
- struct passwd *userinfo = getpwuid(uid);
- if (userinfo == NULL) {
- mc_error("getpwuid(%d) returns NULL !", uid);
- return NULL;
- }
- grpinfo = getgrnam("users");
- if (grpinfo == NULL) {
- mc_error("getgrnam(users) returns NULL !");
- return NULL;
- }
- /* Compare git_t type and not group name */
- if (grpinfo->gr_gid != userinfo->pw_gid) {
- mc_error("UID [%d] does not belong to 'users' group!", uid);
- return NULL;
- }
- snprintf(result_psswd, sizeof(result_psswd), "%s/.applications/dbspace/%s", userinfo->pw_dir, MC_DB_NAME);
- }
-
- dir = strrchr(result_psswd, '/');
- if (!dir)
- return strdup(result_psswd);
-
- result_psswd_rtn = strdup(result_psswd);
-
- return result_psswd_rtn;
-}
-
int mc_safe_strtoi(const char *buffer, int *value)
{
char *end = NULL;
return MEDIA_CONTROLLER_ERROR_NONE;
}
-int mc_db_util_connect(void **handle, uid_t uid)
+char *mc_db_get_db_path(uid_t uid)
{
- int ret = MEDIA_CONTROLLER_ERROR_NONE;
+ char *db_path = NULL;
+
+ if (uid == getuid())
+ db_path = g_strdup(tzplatform_mkpath(TZ_USER_DB, MC_DB_NAME));
+ else
+ db_path = __mc_db_get_user_path(uid);
+
+ //mc_secure_debug("DB path [%s]", db_path);
+
+ return db_path;
+}
+
+int mc_db_connect(void **handle, uid_t uid, gboolean needwrite)
+{
+ int ret = SQLITE_OK;
sqlite3 *db_handle = NULL;
- char * db_name = NULL;
+ char * db_path = NULL;
mc_retvm_if(handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
*handle = NULL;
- db_name = __mc_get_db_name(uid);
- mc_retvm_if(db_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when get db path");
+ db_path = mc_db_get_db_path(uid);
+ mc_retvm_if(db_path == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when get db path");
/*Connect DB*/
- ret = sqlite3_open_v2(db_name, &db_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
-
- MC_SAFE_FREE(db_name);
+ if (needwrite)
+ ret = sqlite3_open_v2(db_path, &db_handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
+ else
+ ret = sqlite3_open_v2(db_path, &db_handle, SQLITE_OPEN_READONLY, NULL);
+ MC_SAFE_G_FREE(db_path);
mc_retvm_if(SQLITE_OK != ret, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when db open");
mc_retvm_if(db_handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "db_handle is NULL");
/*Register busy handler*/
- ret = sqlite3_busy_handler(db_handle, __mc_db_util_busy_handler, NULL);
+ ret = sqlite3_busy_handler(db_handle, __mc_db_busy_handler, NULL);
if (SQLITE_OK != ret) {
- mc_error("error when register busy handler %s", sqlite3_errmsg(db_handle));
+ mc_error("SQL Error[%s] when register busy handler", sqlite3_errmsg(db_handle));
sqlite3_close_v2(db_handle);
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
*handle = db_handle;
- char *sql = NULL;
- sql = sqlite3_mprintf("%s", "PRAGMA journal_mode = OFF");
- mc_retvm_if(!MC_STRING_VALID(sql), MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL string is null");
- ret = sqlite3_exec(*handle, sql, NULL, NULL, NULL);
- sqlite3_free(sql);
- if (SQLITE_OK != ret) {
-
- if (*handle)
- mc_error("[error when change the journal mode] %s", sqlite3_errmsg(*handle));
-
+ ret = __mc_db_disable_journal_mode(*handle);
+ if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
sqlite3_close_v2(*handle);
*handle = NULL;
-
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
return MEDIA_CONTROLLER_ERROR_NONE;
}
-int mc_db_util_disconnect(void *handle)
+int mc_db_disconnect(void *handle)
{
- int ret = MEDIA_CONTROLLER_ERROR_NONE;
+ int ret = SQLITE_OK;
sqlite3 *db_handle = (sqlite3 *)handle;
mc_retvm_if(db_handle == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
ret = sqlite3_close_v2(db_handle);
- if (SQLITE_OK != ret) {
- mc_error("error when db close");
- mc_error("Error : %s", sqlite3_errmsg(db_handle));
- db_handle = NULL;
-
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
- }
-
- return MEDIA_CONTROLLER_ERROR_NONE;
-}
-
-int mc_db_util_get_db_name(uid_t uid, char **db_name)
-{
- *db_name = __mc_get_db_name(uid);
-
- mc_retvm_if(*db_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when get db path");
+ mc_retvm_if(SQLITE_OK != ret, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "SQL Error[%s] when db open", sqlite3_errmsg(db_handle));
return MEDIA_CONTROLLER_ERROR_NONE;
}
int mc_db_util_remove_db(uid_t uid)
{
int ret = MEDIA_CONTROLLER_ERROR_NONE;
- char * db_name = NULL;
+ char * db_path = NULL;
GFile *db_file = NULL;
gboolean result = FALSE;
GError *g_error = NULL;
mc_warning("The db is abnormal. So it will be removed.");
- db_name = __mc_get_db_name(uid);
- mc_retvm_if(db_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when get db path");
+ db_path = mc_db_get_db_path(uid);
+ mc_retvm_if(db_path == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "error when get db path");
- db_file = g_file_new_for_path(db_name);
- if (db_file == NULL) {
- mc_error("could not open file");
- MC_SAFE_FREE(db_name);
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
- }
- MC_SAFE_FREE(db_name);
+ db_file = g_file_new_for_path(db_path);
+ MC_SAFE_G_FREE(db_path);
+ mc_retvm_if(db_file == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "could not open file");
result = g_file_delete(db_file, NULL, &g_error);
if (!result) {
ERROR:
if (sql_str != NULL) {
- ret = mc_db_util_connect(&_db_handle, uid);
+ ret = mc_db_connect(&_db_handle, uid, TRUE);
if (ret != MEDIA_CONTROLLER_ERROR_NONE)
- mc_error("mc_db_util_connect error : %d", ret);
+ mc_error("mc_db_connect error : %d", ret);
ret = mc_db_util_update_db(_db_handle, sql_str);
if (ret != MEDIA_CONTROLLER_ERROR_NONE)
mc_error("media_db_update_db error : %d", ret);
- mc_db_util_disconnect(_db_handle);
+ mc_db_disconnect(_db_handle);
if (!is_query_from_client)
SQLITE3_SAFE_FREE(sql_str);
mc_retvm_if(app_id == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "app_id is NULL");
- ret = mc_db_util_connect(&db_handle, uid);
- mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_util_connect error : %d", ret);
+ ret = mc_db_connect(&db_handle, uid, TRUE);
+ mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "mc_db_connect error : %d", ret);
/* Delete application from server/client list */
if (priv_type == MC_PRIV_TYPE_SERVER)
mc_secure_error("__mc_drop_server_table error : %d", ret);
}
- mc_db_util_disconnect(db_handle);
+ mc_db_disconnect(db_handle);
return ret;
}
{
int res = MEDIA_CONTROLLER_ERROR_NONE;
void *db_handle = NULL;
- char *db_name = NULL;
+ char *db_path = NULL;
struct stat buf;
- res = mc_db_util_get_db_name(uid, &db_name);
- mc_retvm_if(res != MEDIA_CONTROLLER_ERROR_NONE, res, "Failed to get the db_name");
+ db_path = mc_db_get_db_path(uid);
+ mc_retvm_if(db_path == NULL, res, "Failed to get the db_path");
/* Check the database exists */
- if (!g_file_test(db_name, G_FILE_TEST_EXISTS)) {
+ if (!g_file_test(db_path, G_FILE_TEST_EXISTS)) {
mc_error("[NO-ERROR] DB is not created yet, do not need to check DB");
- MC_SAFE_FREE(db_name);
+ MC_SAFE_G_FREE(db_path);
return MEDIA_CONTROLLER_ERROR_NONE;
}
/* Check the size of database */
- if (stat(db_name, &buf) == 0) {
+ if (stat(db_path, &buf) == 0) {
if (buf.st_size == 0) {
mc_warning("The size of database is error");
- MC_SAFE_FREE(db_name);
+ MC_SAFE_G_FREE(db_path);
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
} else {
mc_stderror("stat failed");
- MC_SAFE_FREE(db_name);
+ MC_SAFE_G_FREE(db_path);
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
- MC_SAFE_FREE(db_name);
+ MC_SAFE_G_FREE(db_path);
/* Connect media controller DB*/
- res = mc_db_util_connect(&db_handle, uid);
+ res = mc_db_connect(&db_handle, uid, TRUE);
if (res != MEDIA_CONTROLLER_ERROR_NONE) {
mc_error("Failed to connect DB");
return res;
res = mc_db_util_check_integrity(db_handle);
if (res != MEDIA_CONTROLLER_ERROR_NONE) {
mc_error("check interity failed");
- mc_db_util_disconnect(db_handle);
+ mc_db_disconnect(db_handle);
return res;
}
/* Disconnect media controller DB*/
- res = mc_db_util_disconnect(db_handle);
+ res = mc_db_disconnect(db_handle);
if (res != MEDIA_CONTROLLER_ERROR_NONE)
mc_error("Failed to disconnect DB");
void *db_handle = NULL;
/* Connect media controller DB*/
- res = mc_db_util_connect(&db_handle, uid);
+ res = mc_db_connect(&db_handle, uid, TRUE);
mc_retvm_if(res != MEDIA_CONTROLLER_ERROR_NONE, res, "Failed to connect DB");
/* Destroy tables */
mc_error("mc_db_util_init_latest_server_table failed [%d]", res);
/* Disconnect media controller DB*/
- res = mc_db_util_disconnect(db_handle);
+ res = mc_db_disconnect(db_handle);
if (res != MEDIA_CONTROLLER_ERROR_NONE)
mc_error("Failed to disconnect DB");