From: Junghyun Yeon Date: Wed, 12 Dec 2018 02:21:03 +0000 (+0900) Subject: Add busy handler when initializing pkg db X-Git-Tag: accepted/tizen/unified/20190117.151829~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git;a=commitdiff_plain;h=61581b4ea4f750a2f4e793654b07794917325de9 Add busy handler when initializing pkg db - Continuous db read query could cause db lock when initializing db such as db recovery, etc. Change-Id: I9c4b375fe95339b1ae23f57a39ad08d8fcc67901 Signed-off-by: Junghyun Yeon --- diff --git a/parser/src/pkgmgr_parser_db.c b/parser/src/pkgmgr_parser_db.c index a7a1004..62ffed3 100644 --- a/parser/src/pkgmgr_parser_db.c +++ b/parser/src/pkgmgr_parser_db.c @@ -374,93 +374,6 @@ static int __initialize_db(sqlite3 *db, const char *dbpath, uid_t uid) return 0; } -API int pkgmgr_parser_initialize_parser_db(uid_t uid) -{ - int ret; - const char *dbpath; - sqlite3 *db; - - dbpath = __get_parser_db_path(uid); - if (access(dbpath, F_OK) != -1) { - _LOGE("Manifest db for user %d is already exists", uid); - return PM_PARSER_R_ERROR; - } - - ret = sqlite3_open_v2(dbpath, &db, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); - if (ret != SQLITE_OK) { - _LOGE("open db failed: %d", ret); - return PM_PARSER_R_ERROR; - } - - if (__initialize_db(db, dbpath, uid)) { - sqlite3_close_v2(db); - return PM_PARSER_R_ERROR; - } - sqlite3_close_v2(db); - - return PM_PARSER_R_OK; -} - -API int pkgmgr_parser_initialize_cert_db(void) -{ - int ret; - const char *dbpath; - sqlite3 *db; - - dbpath = __get_cert_db_path(); - if (access(dbpath, F_OK) != -1) { - _LOGE("Cert db is already exists"); - return PM_PARSER_R_ERROR; - } - - ret = sqlite3_open_v2(dbpath, &db, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); - if (ret != SQLITE_OK) { - _LOGE("open db failed: %d", ret); - return PM_PARSER_R_ERROR; - } - - if (__initialize_db(db, dbpath, GLOBAL_USER)) { - sqlite3_close_v2(db); - return PM_PARSER_R_ERROR; - } - sqlite3_close_v2(db); - - return PM_PARSER_R_OK; -} - -API int pkgmgr_parser_create_and_initialize_db(uid_t uid) -{ - int ret; - struct passwd pwd; - struct passwd *result; - char buf[BUFSIZE]; - - ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); - if (result == NULL) { - if (ret == 0) - _LOGE("no such user: %s", APPFW_USER); - else - _LOGE("getpwnam_r failed: %d", errno); - return PM_PARSER_R_ERROR; - } - - if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) { - _LOGE("Only root or app_fw user is allowed"); - return PM_PARSER_R_EINVAL; - } - - if (pkgmgr_parser_initialize_parser_db(uid)) - return PM_PARSER_R_ERROR; - - if (uid == OWNER_ROOT || uid == GLOBAL_USER) - if (pkgmgr_parser_initialize_cert_db()) - return PM_PARSER_R_ERROR; - - return PM_PARSER_R_OK; -} - #define RESOURCED_BUS_NAME "org.tizen.resourced" #define RESOURCED_PROC_PATH "/Org/Tizen/ResourceD/Process" #define RESOURCED_PROC_INTERFACE "org.tizen.resourced.process" @@ -577,6 +490,109 @@ static int __db_busy_handler(void *data, int count) } } +API int pkgmgr_parser_initialize_parser_db(uid_t uid) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + dbpath = __get_parser_db_path(uid); + if (access(dbpath, F_OK) != -1) { + _LOGE("Manifest db for user %d is already exists", uid); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_open_v2(dbpath, &db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_busy_handler(db, __db_busy_handler, NULL); + if (ret != SQLITE_OK) { + _LOGE("failed to register busy handler: %s", + sqlite3_errmsg(db)); + sqlite3_close_v2(db); + return ret; + } + + if (__initialize_db(db, dbpath, uid)) { + sqlite3_close_v2(db); + return PM_PARSER_R_ERROR; + } + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_initialize_cert_db(void) +{ + int ret; + const char *dbpath; + sqlite3 *db; + + dbpath = __get_cert_db_path(); + if (access(dbpath, F_OK) != -1) { + _LOGE("Cert db is already exists"); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_open_v2(dbpath, &db, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + if (ret != SQLITE_OK) { + _LOGE("open db failed: %d", ret); + return PM_PARSER_R_ERROR; + } + + ret = sqlite3_busy_handler(db, __db_busy_handler, NULL); + if (ret != SQLITE_OK) { + _LOGE("failed to register busy handler: %s", + sqlite3_errmsg(db)); + sqlite3_close_v2(db); + return ret; + } + + if (__initialize_db(db, dbpath, GLOBAL_USER)) { + sqlite3_close_v2(db); + return PM_PARSER_R_ERROR; + } + sqlite3_close_v2(db); + + return PM_PARSER_R_OK; +} + +API int pkgmgr_parser_create_and_initialize_db(uid_t uid) +{ + int ret; + struct passwd pwd; + struct passwd *result; + char buf[BUFSIZE]; + + ret = getpwnam_r(APPFW_USER, &pwd, buf, sizeof(buf), &result); + if (result == NULL) { + if (ret == 0) + _LOGE("no such user: %s", APPFW_USER); + else + _LOGE("getpwnam_r failed: %d", errno); + return PM_PARSER_R_ERROR; + } + + if (getuid() != OWNER_ROOT && getuid() != pwd.pw_uid) { + _LOGE("Only root or app_fw user is allowed"); + return PM_PARSER_R_EINVAL; + } + + if (pkgmgr_parser_initialize_parser_db(uid)) + return PM_PARSER_R_ERROR; + + if (uid == OWNER_ROOT || uid == GLOBAL_USER) + if (pkgmgr_parser_initialize_cert_db()) + return PM_PARSER_R_ERROR; + + return PM_PARSER_R_OK; +} + static int __open_db(uid_t uid, const char *path, sqlite3 **db, int flags) { int ret;