Add busy handler when initializing pkg db 47/195247/1
authorJunghyun Yeon <jungh.yeon@samsung.com>
Wed, 12 Dec 2018 02:21:03 +0000 (11:21 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Wed, 12 Dec 2018 02:21:03 +0000 (11:21 +0900)
- Continuous db read query could cause db lock when initializing db
  such as db recovery, etc.

Change-Id: I9c4b375fe95339b1ae23f57a39ad08d8fcc67901
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
parser/src/pkgmgr_parser_db.c

index a7a1004..62ffed3 100644 (file)
@@ -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;