Remove compile warning messages
[platform/core/appfw/pkgmgr-info.git] / src / pkgmgrinfo_certinfo.c
index cb7e9dc..367a428 100644 (file)
@@ -124,7 +124,8 @@ API int pkgmgrinfo_pkginfo_compare_usr_pkg_cert_info(const char *lhs_package_id,
                return PMINFO_R_EINVAL;
        }
 
-       dbpath = getUserPkgCertDBPathUID(uid);
+       /* open unified global cert db */
+       dbpath = getUserPkgCertDBPathUID(GLOBAL_USER);
        if (dbpath == NULL)
                return PMINFO_R_ERROR;
 
@@ -188,7 +189,7 @@ static int _pkginfo_get_pkgid_from_appid(uid_t uid, const char *appid,
 
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
-               _save_column_str(stmt, 0, (const char **)pkgid);
+               _save_column_str(stmt, 0, pkgid);
                ret = PMINFO_R_OK;
        } else if (ret == SQLITE_DONE) {
                _LOGE("cannot find pkgid of app %s", appid);
@@ -287,7 +288,7 @@ static int _pkginfo_get_cert(sqlite3 *db, int cert_id[],
                        return PMINFO_R_ERROR;
                }
 
-               _save_column_str(stmt, 0, (const char **)&cert_info[i]);
+               _save_column_str(stmt, 0, &cert_info[i]);
                sqlite3_reset(stmt);
                sqlite3_clear_bindings(stmt);
        }
@@ -351,14 +352,14 @@ static int _pkginfo_get_certid(sqlite3 *db, const char *pkgid, int cert_id[])
        return PMINFO_R_OK;
 }
 
-static int _pkginfo_get_certinfo(const char *pkgid, uid_t uid,
-               pkgmgr_certinfo_x *info)
+static int _pkginfo_get_certinfo(const char *pkgid, pkgmgr_certinfo_x *info)
 {
        int ret;
        sqlite3 *db;
        const char *dbpath;
 
-       dbpath = getUserPkgCertDBPathUID(uid);
+       /* open unified global cert db */
+       dbpath = getUserPkgCertDBPathUID(GLOBAL_USER);
        if (dbpath == NULL)
                return PMINFO_R_ERROR;
 
@@ -393,12 +394,9 @@ API int pkgmgrinfo_pkginfo_load_certinfo(const char *pkgid, pkgmgrinfo_certinfo_
                return PMINFO_R_EINVAL;
        }
 
-       ret = _pkginfo_get_certinfo(pkgid, uid, info);
-       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
-               ret = _pkginfo_get_certinfo(pkgid, GLOBAL_USER, info);
-
+       ret = _pkginfo_get_certinfo(pkgid, info);
        if (ret != PMINFO_R_OK)
-               _LOGE("failed to get certinfo of %s for user %d", pkgid, uid);
+               _LOGE("failed to get certinfo of %s ", pkgid);
 
        return ret;
 }
@@ -465,63 +463,67 @@ API int pkgmgrinfo_set_cert_value(pkgmgrinfo_instcertinfo_h handle, pkgmgrinfo_i
 static int _pkginfo_save_cert_info(sqlite3 *db, const char *pkgid,
                char *cert_info[])
 {
-       static const char query[] =
-               "INSERT OR REPLACE INTO package_cert_info (package,"
+       static const char query_insert[] =
+               "INSERT INTO package_cert_info (package,"
                " author_root_cert, author_im_cert, author_signer_cert,"
                " dist_root_cert, dist_im_cert, dist_signer_cert,"
                " dist2_root_cert, dist2_im_cert, dist2_signer_cert) "
                "VALUES(?, "
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT author_root_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT author_im_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT author_signer_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist_root_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist_im_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist_signer_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist2_root_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist2_im_cert FROM package_cert_info"
-               "    WHERE package=?))),"
-               " (COALESCE( "
-               "   (SELECT cert_id FROM package_cert_index_info"
-               "    WHERE cert_info=?),"
-               "   (SELECT dist2_signer_cert FROM package_cert_info"
-               "    WHERE package=?))))";
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?),"
+               " (SELECT cert_id FROM package_cert_index_info"
+               "  WHERE cert_info=?))";
+       static const char query_update[] =
+               "UPDATE package_cert_info SET "
+               " author_root_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " author_im_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " author_signer_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " dist_root_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " dist_im_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " dist_signer_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               " dist2_root_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               "dist2_im_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?),"
+               "dist2_signer_cert= "
+               "  (SELECT cert_id FROM package_cert_index_info"
+               "   WHERE cert_info=?) "
+               "WHERE package=?";
        int ret;
        sqlite3_stmt *stmt;
        int i;
        int idx;
 
-       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       ret = sqlite3_prepare_v2(db, query_insert, strlen(query_insert),
+                       &stmt, NULL);
        if (ret != SQLITE_OK) {
                _LOGE("prepare error: %s", sqlite3_errmsg(db));
                return PMINFO_R_ERROR;
@@ -530,23 +532,37 @@ static int _pkginfo_save_cert_info(sqlite3 *db, const char *pkgid,
        idx = 1;
        sqlite3_bind_text(stmt, idx++, pkgid, -1, SQLITE_STATIC);
        for (i = 0; i < MAX_CERT_TYPE; i++) {
-               ret = sqlite3_bind_text(stmt, idx++, cert_info[i], -1,
-                               SQLITE_STATIC);
-               if (ret != SQLITE_OK) {
+               if (sqlite3_bind_text(stmt, idx++, cert_info[i], -1,
+                               SQLITE_STATIC)) {
                        _LOGE("bind error: %s", sqlite3_errmsg(db));
                        sqlite3_finalize(stmt);
                        return PMINFO_R_ERROR;
                }
-               ret = sqlite3_bind_text(stmt, idx++, pkgid, -1,
-                               SQLITE_STATIC);
+       }
+
+       ret = sqlite3_step(stmt);
+       sqlite3_finalize(stmt);
+       if (ret == SQLITE_CONSTRAINT) {
+               ret = sqlite3_prepare_v2(db, query_update, strlen(query_update),
+                               &stmt, NULL);
                if (ret != SQLITE_OK) {
-                       _LOGE("bind error: %s", sqlite3_errmsg(db));
-                       sqlite3_finalize(stmt);
+                       _LOGE("prepare error: %s", sqlite3_errmsg(db));
                        return PMINFO_R_ERROR;
                }
+               idx = 1;
+               for (i = 0; i < MAX_CERT_TYPE; i++) {
+                       if (sqlite3_bind_text(stmt, idx++, cert_info[i], -1,
+                                       SQLITE_STATIC)) {
+                               _LOGE("bind error: %s", sqlite3_errmsg(db));
+                               sqlite3_finalize(stmt);
+                               return PMINFO_R_ERROR;
+                       }
+               }
+               sqlite3_bind_text(stmt, idx++, pkgid, -1, SQLITE_STATIC);
+               ret = sqlite3_step(stmt);
+               sqlite3_finalize(stmt);
        }
-       ret = sqlite3_step(stmt);
-       sqlite3_finalize(stmt);
+
        if (ret != SQLITE_DONE) {
                _LOGE("step error: %s", sqlite3_errmsg(db));
                return PMINFO_R_ERROR;
@@ -614,7 +630,8 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha
                return PMINFO_R_EINVAL;
        }
 
-       dbpath = getUserPkgCertDBPathUID(uid);
+       /* open unified global cert db */
+       dbpath = getUserPkgCertDBPathUID(GLOBAL_USER);
        if (dbpath == NULL)
                return PMINFO_R_ERROR;
 
@@ -634,12 +651,14 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha
        _check_create_cert_db(db);
 
        if (_pkginfo_save_cert_index_info(db, info->cert_info)) {
-               _LOGE("failed to save cert index info");
+               _LOGE("failed to save cert index info, rollback now");
+               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
        if (_pkginfo_save_cert_info(db, pkgid, info->cert_info)) {
-               _LOGE("failed to save cert info");
+               _LOGE("failed to save cert info, rollback now");
+               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
@@ -719,7 +738,8 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid)
                return PMINFO_R_EINVAL;
        }
 
-       dbpath = getUserPkgCertDBPathUID(uid);
+       /* open unified global cert db */
+       dbpath = getUserPkgCertDBPathUID(GLOBAL_USER);
        if (dbpath == NULL)
                return PMINFO_R_ERROR;
 
@@ -736,8 +756,12 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid)
                return PMINFO_R_ERROR;
        }
 
-       if (_pkginfo_delete_certinfo(db, pkgid))
-               _LOGE("failed to delete certinfo of %s", pkgid);
+       if (_pkginfo_delete_certinfo(db, pkgid)) {
+               _LOGE("failed to delete certinfo of %s, rollback now", pkgid);
+               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
+               sqlite3_close_v2(db);
+               return PMINFO_R_ERROR;
+       }
 
        ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
        if (ret != SQLITE_OK) {