Fix some outdated sqlite query logic 86/143186/8
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 9 Aug 2017 03:09:26 +0000 (12:09 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Fri, 11 Aug 2017 02:31:41 +0000 (11:31 +0900)
Change-Id: I165099252ef082801a5d149cae8aad6de0bed535
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/pkgmgrinfo_appinfo.c
src/pkgmgrinfo_certinfo.c
src/pkgmgrinfo_db.c
src/pkgmgrinfo_private.h

index e56c602..c978a8e 100644 (file)
@@ -2172,43 +2172,117 @@ API int pkgmgrinfo_appinfo_get_installed_time(pkgmgrinfo_appinfo_h handle, int *
        return PMINFO_R_OK;
 }
 
-API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid,
-               const char *type, uid_t uid, char **appid, char **access)
+static int _appinfo_get_datacontrol_info(sqlite3 *db, const char *providerid,
+               const char *type, char **appid, char **access)
 {
-       retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
-       retvm_if(type == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
-       retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
-       retvm_if(access == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
-
-       int ret = PMINFO_R_OK;
-       char *query = NULL;
-       sqlite3_stmt *stmt = NULL;
+       static const char query[] =
+               "SELECT app_id, access FROM package_app_data_control "
+               "WHERE providerid=? AND type=?";
+       int ret;
+       sqlite3_stmt *stmt;
 
-       /*open db*/
-       ret = __open_manifest_db(uid, true);
-       retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
 
-       /*Start constructing query*/
-       query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q and type=%Q", providerid, type);
-       tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory");
+       ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*prepare query*/
-       ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL);
-       tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query);
+       ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*step query*/
        ret = sqlite3_step(stmt);
-       tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found");
+       if (ret != SQLITE_ROW) {
+               sqlite3_finalize(stmt);
+               if (ret == SQLITE_DONE) {
+                       return PMINFO_R_ENOENT;
+               } else {
+                       LOGE("step error: %s", sqlite3_errmsg(db));
+                       return PMINFO_R_ERROR;
+               }
+       }
 
        *appid = strdup((char *)sqlite3_column_text(stmt, 0));
-       *access = strdup((char *)sqlite3_column_text(stmt, 2));
-
-       ret = PMINFO_R_OK;
+       if (*appid == NULL) {
+               LOGE("out of memory");
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
+       *access = strdup((char *)sqlite3_column_text(stmt, 1));
+       if (*access == NULL) {
+               LOGE("out of memory");
+               free(*appid);
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-catch:
-       sqlite3_free(query);
        sqlite3_finalize(stmt);
-       __close_manifest_db();
+
+       return PMINFO_R_OK;
+}
+
+static int _pkgmgrinfo_appinfo_get_datacontrol_info(uid_t uid,
+               const char *providerid, const char *type,
+               char **appid, char **access)
+{
+       int ret;
+       char *dbpath;
+       sqlite3 *db;
+
+       dbpath = getUserPkgParserDBPathUID(GLOBAL_USER);
+       if (dbpath == NULL)
+               return PMINFO_R_ERROR;
+
+       ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
+       free(dbpath);
+       if (ret != SQLITE_OK) {
+               LOGE("open db failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       ret = _appinfo_get_datacontrol_info(db, providerid, type, appid,
+                       access);
+       sqlite3_close_v2(db);
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_usr_get_datacontrol_info(const char *providerid,
+               const char *type, uid_t uid, char **appid, char **access)
+{
+       int ret;
+
+       if (providerid == NULL || type == NULL || appid == NULL ||
+                       access == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       ret = _pkgmgrinfo_appinfo_get_datacontrol_info(GLOBAL_USER, providerid,
+                       type, appid, access);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _pkgmgrinfo_appinfo_get_datacontrol_info(uid, providerid,
+                               type, appid, access);
+
+       /* FIXME: It should return PMINFO_R_ENOENT but to keep previous
+        * implementation, return PMINFO_R_ERROR. This should be
+        * modified later...
+        */
+       if (ret == PMINFO_R_ENOENT) {
+               LOGE("no datacontrol info of %s", providerid);
+               ret = PMINFO_R_ERROR;
+       }
+
        return ret;
 }
 
@@ -2219,39 +2293,100 @@ API int pkgmgrinfo_appinfo_get_datacontrol_info(const char *providerid,
                        type, _getuid(), appid, access);
 }
 
-API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid, uid_t uid, char **appid)
+static int _appinfo_get_datacontrol_appid(sqlite3 *db, const char *providerid,
+               char **appid)
 {
-       retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
-       retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
-
-       int ret = PMINFO_R_OK;
-       char *query = NULL;
-       sqlite3_stmt *stmt = NULL;
-
-       /*open db*/
-       ret = __open_manifest_db(uid, true);
-       retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB);
+       static const char query[] =
+               "SELECT app_id FROM package_app_data_control "
+               "WHERE providerid=?";
+       int ret;
+       sqlite3_stmt *stmt;
 
-       /*Start constructing query*/
-       query = sqlite3_mprintf("select * from package_app_data_control where providerid=%Q", providerid);
-       tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory");
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
 
-       /*prepare query*/
-       ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL);
-       tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query);
+       ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*step query*/
        ret = sqlite3_step(stmt);
-       tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found");
+       if (ret != SQLITE_ROW) {
+               sqlite3_finalize(stmt);
+               if (ret == SQLITE_DONE) {
+                       return PMINFO_R_ENOENT;
+               } else {
+                       LOGE("step error: %s", sqlite3_errmsg(db));
+                       return PMINFO_R_ERROR;
+               }
+       }
 
        *appid = strdup((char *)sqlite3_column_text(stmt, 0));
 
-       ret = PMINFO_R_OK;
-
-catch:
-       sqlite3_free(query);
        sqlite3_finalize(stmt);
-       __close_manifest_db();
+
+       if (*appid == NULL) {
+               LOGE("out of memory");
+               return PMINFO_R_ERROR;
+       }
+
+       return PMINFO_R_OK;
+}
+
+static int _pkgmgrinfo_appinfo_get_datacontrol_appid(uid_t uid,
+               const char *providerid, char **appid)
+{
+       int ret;
+       char *dbpath;
+       sqlite3 *db;
+
+       dbpath = getUserPkgParserDBPathUID(GLOBAL_USER);
+       if (dbpath == NULL)
+               return PMINFO_R_ERROR;
+
+       ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
+       free(dbpath);
+       if (ret != SQLITE_OK) {
+               LOGE("open db failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       ret = _appinfo_get_datacontrol_appid(db, providerid, appid);
+       sqlite3_close_v2(db);
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_usr_get_datacontrol_appid(const char *providerid,
+               uid_t uid, char **appid)
+{
+       int ret;
+
+       if (providerid == NULL || appid == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(GLOBAL_USER, providerid,
+                       appid);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _pkgmgrinfo_appinfo_get_datacontrol_appid(uid, providerid,
+                               appid);
+
+       /* FIXME: It should return PMINFO_R_ENOENT but to keep previous
+        * implementation, return PMINFO_R_ERROR. This should be
+        * modified later...
+        */
+       if (ret == PMINFO_R_ENOENT) {
+               LOGE("no datacontrol appid of %s", providerid);
+               ret = PMINFO_R_ERROR;
+       }
+
        return ret;
 }
 
@@ -2260,41 +2395,113 @@ API int pkgmgrinfo_appinfo_get_datacontrol_appid(const char *providerid, char **
        return pkgmgrinfo_appinfo_usr_get_datacontrol_appid(providerid, _getuid(), appid);
 }
 
-API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info(const char *providerid,
-               const char *type, uid_t uid, char **appid, bool *is_trusted)
+static int _appinfo_get_datacontrol_trusted_info(sqlite3 *db,
+               const char *providerid, const char *type, char **appid,
+               bool *is_trusted)
 {
-       retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
-       retvm_if(appid == NULL, PMINFO_R_EINVAL, "Argument supplied to hold return value is NULL\n");
-
-       int ret = PMINFO_R_OK;
-       char *query = NULL;
-       sqlite3_stmt *stmt = NULL;
+       static const char query[] =
+               "SELECT app_id, trusted FROM package_app_data_control "
+               "WHERE providerid=? AND type=?";
+       int ret;
+       sqlite3_stmt *stmt;
 
-       /*open db*/
-       ret = __open_manifest_db(uid, true);
-       retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
 
-       /*Start constructing query*/
-       query = sqlite3_mprintf("SELECT app_id, trusted FROM package_app_data_control WHERE providerid=%Q AND type=%Q", providerid, type);
-       tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory");
+       ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*prepare query*/
-       ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL);
-       tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query);
+       ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*step query*/
        ret = sqlite3_step(stmt);
-       tryvm_if((ret != SQLITE_ROW) || (ret == SQLITE_DONE), ret = PMINFO_R_ERROR, "No records found");
+       if (ret != SQLITE_ROW) {
+               sqlite3_finalize(stmt);
+               if (ret == SQLITE_DONE) {
+                       return PMINFO_R_ENOENT;
+               } else {
+                       LOGE("step error: %s", sqlite3_errmsg(db));
+                       return PMINFO_R_ERROR;
+               }
+       }
 
-       _save_column_str(stmt, 0, appid);
+       *appid = strdup((char *)sqlite3_column_text(stmt, 0));
        *is_trusted = _get_bool_value((char *)sqlite3_column_text(stmt, 1));
 
-       ret = PMINFO_R_OK;
-
-catch:
-       sqlite3_free(query);
        sqlite3_finalize(stmt);
-       __close_manifest_db();
+
+       if (*appid == NULL) {
+               LOGE("out of memory");
+               return PMINFO_R_ERROR;
+       }
+
+       return PMINFO_R_OK;
+}
+
+static int _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid_t uid,
+               const char *providerid, const char *type, char **appid,
+               bool *is_trusted)
+{
+       int ret;
+       char *dbpath;
+       sqlite3 *db;
+
+       dbpath = getUserPkgParserDBPathUID(GLOBAL_USER);
+       if (dbpath == NULL)
+               return PMINFO_R_ERROR;
+
+       ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
+       free(dbpath);
+       if (ret != SQLITE_OK) {
+               LOGE("open db failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       ret = _appinfo_get_datacontrol_trusted_info(db, providerid, type, appid,
+                       is_trusted);
+       sqlite3_close_v2(db);
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_usr_get_datacontrol_trusted_info(
+               const char *providerid, const char *type, uid_t uid,
+               char **appid, bool *is_trusted)
+{
+       int ret;
+
+       if (providerid == NULL || type == NULL || appid == NULL ||
+                       is_trusted == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(GLOBAL_USER,
+                       providerid, type, appid, is_trusted);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _pkgmgrinfo_appinfo_get_datacontrol_trusted_info(uid,
+                               providerid, type, appid, is_trusted);
+
+       /* FIXME: It should return PMINFO_R_ENOENT but to keep previous
+        * implementation, return PMINFO_R_ERROR. This should be
+        * modified later...
+        */
+       if (ret == PMINFO_R_ENOENT) {
+               LOGE("no datacontrol trusted info of %s", providerid);
+               ret = PMINFO_R_ERROR;
+       }
+
        return ret;
 }
 
@@ -2305,51 +2512,107 @@ API int pkgmgrinfo_appinfo_get_datacontrol_trsuted_info(const char *providerid,
                        type, _getuid(), appid, is_trusted);
 }
 
-API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(const char *providerid, const char *type,
-               pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data, uid_t uid)
+static int _appinfo_foreach_datacontrol_privileges(sqlite3 *db,
+               const char *providerid, const char *type,
+               pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data)
 {
-       retvm_if(providerid == NULL, PMINFO_R_EINVAL, "Argument supplied is NULL\n");
-       retvm_if(privilege_func == NULL, PMINFO_R_EINVAL, "Callback function is NULL");
-
-       int ret = PMINFO_R_OK;
-       char *query = NULL;
-       sqlite3_stmt *stmt = NULL;
+       static const char query[] =
+               "SELECT privilege FROM package_app_data_control_privilege "
+               "WHERE providerid=? AND type=?";
+       int ret;
+       sqlite3_stmt *stmt;
+       int count = 0;
 
-       /*open db*/
-       ret = __open_manifest_db(uid, true);
-       retvm_if(ret != SQLITE_OK, ret = PMINFO_R_ERROR, "connect db [%s] failed!", MANIFEST_DB);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
 
-       /*Start constructing query*/
-       query = sqlite3_mprintf("SELECT privilege FROM package_app_data_control_privilege "
-                       "WHERE providerid=%Q AND type=%Q", providerid, type);
-       tryvm_if(query == NULL, ret = PMINFO_R_ERROR, "Out of memory");
+       ret = sqlite3_bind_text(stmt, 1, providerid, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
-       /*prepare query*/
-       ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query), &stmt, NULL);
-       tryvm_if(ret != PMINFO_R_OK, ret = PMINFO_R_ERROR, "sqlite3_prepare_v2 failed[%s]\n", query);
+       ret = sqlite3_bind_text(stmt, 2, type, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
+               return PMINFO_R_ERROR;
+       }
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
-               char *privilege;
-               privilege = (char *)sqlite3_column_text(stmt, 0);
-               ret = privilege_func(privilege, user_data);
+               count++;
+               ret = callback((const char *)sqlite3_column_text(stmt, 0),
+                               user_data);
                if (ret < 0)
                        break;
        }
 
-       ret = PMINFO_R_OK;
-
-catch:
-       sqlite3_free(query);
        sqlite3_finalize(stmt);
-       __close_manifest_db();
+
+       return count ? PMINFO_R_OK : PMINFO_R_ENOENT;
+}
+
+static int _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid_t uid,
+               const char *providerid, const char *type,
+               pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data)
+{
+       int ret;
+       char *dbpath;
+       sqlite3 *db;
+
+       dbpath = getUserPkgParserDBPathUID(GLOBAL_USER);
+       if (dbpath == NULL)
+               return PMINFO_R_ERROR;
+
+       ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
+       free(dbpath);
+       if (ret != SQLITE_OK) {
+               LOGE("open db failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       ret = _appinfo_foreach_datacontrol_privileges(db, providerid, type,
+                       callback, user_data);
+       sqlite3_close_v2(db);
+
        return ret;
 }
 
-API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(const char *providerid, const char *type,
-               pkgmgrinfo_pkg_privilege_list_cb privilege_func, void *user_data)
+API int pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(
+               const char *providerid, const char *type,
+               pkgmgrinfo_pkg_privilege_list_cb privilege_func,
+               void *user_data, uid_t uid)
 {
-       return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(providerid, type, privilege_func,
-                       user_data, _getuid());
+       int ret;
+
+       if (providerid == NULL || type == NULL || privilege_func == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(GLOBAL_USER,
+                       providerid, type, privilege_func, user_data);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _pkgmgrinfo_appinfo_foreach_datacontrol_privileges(uid,
+                               providerid, type, privilege_func, user_data);
+
+       if (ret == PMINFO_R_ENOENT)
+               ret = PMINFO_R_OK;
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_foreach_datacontrol_privileges(
+               const char *providerid, const char *type,
+               pkgmgrinfo_pkg_privilege_list_cb privilege_func,
+               void *user_data)
+{
+       return pkgmgrinfo_appinfo_usr_foreach_datacontrol_privileges(
+                       providerid, type, privilege_func, user_data, _getuid());
 }
 
 API int pkgmgrinfo_appinfo_get_support_mode(pkgmgrinfo_appinfo_h  handle, int *support_mode)
@@ -2416,61 +2679,102 @@ API int pkgmgrinfo_appinfo_foreach_metadata(pkgmgrinfo_appinfo_h handle,
        return PMINFO_R_OK;
 }
 
-API int pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(const char *appid,
-               const char *operation, const char *uri, const char *mime,
-               pkgmgrinfo_pkg_privilege_list_cb privilege_func,
-               void *user_data, uid_t uid)
+static int _appinfo_foreach_appcontrol_privileges(sqlite3 *db,
+               const char *appid, const char *app_control,
+               pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data)
 {
-       static const char query_raw[] =
+       static const char query[] =
                "SELECT privilege FROM package_app_app_control_privilege "
-               "WHERE app_id=%Q AND app_control=%Q";
+               "WHERE app_id=? AND app_control=?";
        int ret;
-       char *query;
        sqlite3_stmt *stmt;
-       char *privilege;
-       char app_control[BUFSIZE];
-
-       if (appid == NULL || operation == NULL || privilege_func == NULL) {
-               LOGE("invalid parameter");
-               return PMINFO_R_EINVAL;
-       }
+       int count = 0;
 
-       snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation,
-                       uri ? uri : "NULL", mime ? mime : "NULL");
-
-       ret = __open_manifest_db(uid, true);
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
        if (ret != SQLITE_OK) {
-               LOGE("open db failed");
+               LOGE("prepare failed: %s", sqlite3_errmsg(db));
                return PMINFO_R_ERROR;
        }
 
-       query = sqlite3_mprintf(query_raw, appid, app_control);
-       if (query == NULL) {
-               LOGE("out of memory");
-               __close_manifest_db();
+       ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
                return PMINFO_R_ERROR;
        }
 
-       ret = sqlite3_prepare_v2(GET_DB(manifest_db), query, strlen(query),
-                       &stmt, NULL);
-       sqlite3_free(query);
-       if (ret != PMINFO_R_OK) {
-               LOGE("prepare failed: %s", sqlite3_errmsg(GET_DB(manifest_db)));
-               __close_manifest_db();
+       ret = sqlite3_bind_text(stmt, 2, app_control, -1, SQLITE_STATIC);
+       if (ret != SQLITE_OK) {
+               LOGE("bind failed: %s", sqlite3_errmsg(db));
+               sqlite3_finalize(stmt);
                return PMINFO_R_ERROR;
        }
 
        while (sqlite3_step(stmt) == SQLITE_ROW) {
-               privilege = (char *)sqlite3_column_text(stmt, 0);
-               ret = privilege_func(privilege, user_data);
+               count++;
+               ret = callback((const char *)sqlite3_column_text(stmt, 0),
+                               user_data);
                if (ret < 0)
                        break;
        }
 
        sqlite3_finalize(stmt);
-       __close_manifest_db();
 
-       return PMINFO_R_OK;
+       return count ? PMINFO_R_OK : PMINFO_R_ENOENT;
+}
+
+static int _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid_t uid,
+               const char *appid, const char *app_control,
+               pkgmgrinfo_pkg_privilege_list_cb callback, void *user_data)
+{
+       int ret;
+       char *dbpath;
+       sqlite3 *db;
+
+       dbpath = getUserPkgParserDBPathUID(uid);
+       if (dbpath == NULL)
+               return PMINFO_R_ERROR;
+
+       ret = __open_db(dbpath, &db, SQLITE_OPEN_READONLY);
+       free(dbpath);
+       if (ret != SQLITE_OK) {
+               LOGE("open db failed: %s", sqlite3_errmsg(db));
+               return PMINFO_R_ERROR;
+       }
+
+       ret = _appinfo_foreach_appcontrol_privileges(db, appid, app_control,
+                       callback, user_data);
+       sqlite3_close_v2(db);
+
+       return ret;
+}
+
+API int pkgmgrinfo_appinfo_usr_foreach_appcontrol_privileges(const char *appid,
+               const char *operation, const char *uri, const char *mime,
+               pkgmgrinfo_pkg_privilege_list_cb privilege_func,
+               void *user_data, uid_t uid)
+{
+       int ret;
+       char app_control[BUFSIZE];
+
+       if (appid == NULL || operation == NULL || privilege_func == NULL) {
+               LOGE("invalid parameter");
+               return PMINFO_R_EINVAL;
+       }
+
+       snprintf(app_control, sizeof(app_control), "%s|%s|%s", operation,
+                       uri ? uri : "NULL", mime ? mime : "NULL");
+
+       ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(GLOBAL_USER,
+                       appid, app_control, privilege_func, user_data);
+       if (ret == PMINFO_R_ENOENT && uid != GLOBAL_USER)
+               ret = _pkgmgrinfo_appinfo_foreach_appcontrol_privileges(uid,
+                               appid, app_control, privilege_func, user_data);
+
+       if (ret == PMINFO_R_ENOENT)
+               ret = PMINFO_R_OK;
+
+       return ret;
 }
 
 API int pkgmgrinfo_appinfo_foreach_appcontrol_privileges(const char *appid,
index c626b51..d86be31 100644 (file)
@@ -627,14 +627,14 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha
 
        if (_pkginfo_save_cert_index_info(db, info->cert_info)) {
                _LOGE("failed to save cert index info, rollback now");
-               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
+               sqlite3_exec(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, rollback now");
-               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
+               sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
@@ -642,7 +642,7 @@ API int pkgmgrinfo_save_certinfo(const char *pkgid, pkgmgrinfo_instcertinfo_h ha
        ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
        if (ret != SQLITE_OK) {
                _LOGE("failed to commit transaction, rollback now");
-               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
+               sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
@@ -738,7 +738,7 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid)
 
        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_exec(db, "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
@@ -746,7 +746,7 @@ API int pkgmgrinfo_delete_usr_certinfo(const char *pkgid, uid_t uid)
        ret = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
        if (ret != SQLITE_OK) {
                _LOGE("failed to commit transaction, rollback now");
-               sqlite3_exec(GET_DB(cert_db), "ROLLBACK", NULL, NULL, NULL);
+               sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL);
                sqlite3_close_v2(db);
                return PMINFO_R_ERROR;
        }
index 37f2771..0075ff1 100644 (file)
@@ -21,9 +21,6 @@
 #include "pkgmgr_parser.h"
 #include "pkgmgr_parser_db.h"
 
-__thread db_handle manifest_db;
-__thread db_handle cert_db;
-
 typedef int (*sqlite_query_callback)(void *data, int ncols, char **coltxt, char **colname);
 
 static int _mkdir_for_user(const char* dir, uid_t uid, gid_t gid)
@@ -109,40 +106,6 @@ static char *_get_db_path(uid_t uid)
        return strdup(path);
 }
 
-static int __attach_and_create_view(sqlite3 *handle, const char *db, const char *tables[], uid_t uid)
-{
-       int i;
-       char *err = NULL;
-       char query[MAX_QUERY_LEN];
-
-       if (uid != GLOBAL_USER && uid != ROOT_UID) {
-               snprintf(query, sizeof(query), "ATTACH DATABASE '%s' AS Global", db);
-               if (SQLITE_OK != sqlite3_exec(handle, query, NULL, NULL, &err)) {
-                       _LOGD("Don't execute query = %s error message = %s\n", query, err);
-                       sqlite3_free(err);
-                       return SQLITE_ERROR;
-               }
-       }
-
-       for (i = 0; tables[i]; i++) {
-               if (uid != GLOBAL_USER && uid != ROOT_UID)
-                       snprintf(query, sizeof(query), "CREATE TEMP VIEW '%s' AS SELECT * \
-                                       FROM (SELECT *,0 AS for_all_users FROM main.'%s' UNION \
-                                       SELECT *,1 AS for_all_users FROM Global.'%s')",
-                                       tables[i], tables[i], tables[i]);
-               else
-                       snprintf(query, sizeof(query), "CREATE TEMP VIEW '%s' AS SELECT * \
-                                       FROM (SELECT *,1 AS for_all_users FROM main.'%s')",
-                                       tables[i], tables[i]);
-               if (SQLITE_OK != sqlite3_exec(handle, query, NULL, NULL, &err)) {
-                       _LOGD("Don't execute query = %s error message = %s\n", query, err);
-                       sqlite3_free(err);
-               }
-       }
-
-       return SQLITE_OK;
-}
-
 int _check_create_cert_db(void)
 {
        return pkgmgr_parser_initialize_cert_db();
@@ -281,143 +244,6 @@ API const char *getUserManifestPath(uid_t uid, bool readonly)
        return path;
 }
 
-int __close_manifest_db(void)
-{
-       if (manifest_db.ref) {
-               if (--manifest_db.ref == 0)
-                       sqlite3_close(GET_DB(manifest_db));
-               return 0;
-       }
-       return -1;
-}
-
-static const char *parserdb_tables[] = {
-       "package_app_app_category",
-       "package_app_info",
-       "package_app_app_control",
-       "package_app_localized_info",
-       "package_app_app_metadata",
-       "package_info",
-       "package_app_data_control",
-       "package_localized_info",
-       "package_privilege_info",
-       "package_appdefined_privilege_info",
-       "package_app_data_control_privilege",
-       NULL
-};
-
-int __open_manifest_db(uid_t uid, bool readonly)
-{
-       int ret;
-       char *user_pkg_parser;
-       int flags;
-
-       if (manifest_db.ref) {
-               manifest_db.ref++;
-               return 0;
-       }
-
-       user_pkg_parser = getUserPkgParserDBPathUID(uid);
-       if (user_pkg_parser == NULL) {
-               _LOGE("Failed to get pkg parser db path - %d", uid);
-               return -1;
-       }
-
-       if (access(user_pkg_parser, F_OK) != 0) {
-               _LOGE("Manifest DB does not exists !!");
-               free(user_pkg_parser);
-               return -1;
-       }
-
-       flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE;
-       ret = db_util_open_with_options(user_pkg_parser, &GET_DB(manifest_db),
-                       flags, NULL);
-       if (ret != SQLITE_OK) {
-               _LOGE("connect db [%s] failed!\n", user_pkg_parser);
-               free(user_pkg_parser);
-               return -1;
-       }
-
-       manifest_db.ref++;
-       if (readonly) {
-               ret = __attach_and_create_view(GET_DB(manifest_db), MANIFEST_DB,
-                               parserdb_tables, uid);
-               if (ret != SQLITE_OK) {
-                       _LOGE("attach db [%s] failed!\n", user_pkg_parser);
-                       free(user_pkg_parser);
-                       return -1;
-               }
-       }
-
-       free(user_pkg_parser);
-
-       return 0;
-}
-
-int __close_cert_db(void)
-{
-       if (cert_db.ref) {
-               if (--cert_db.ref == 0)
-                       sqlite3_close_v2(GET_DB(cert_db));
-               return 0;
-       }
-       _LOGE("Certificate DB is already closed !!\n");
-       return -1;
-}
-
-static const char *certdb_tables[] = {
-       "package_cert_index_info",
-       "package_cert_info",
-       NULL
-};
-
-int __open_cert_db(uid_t uid, bool readonly)
-{
-       int ret;
-       char *user_cert_parser;
-       int flags;
-
-       if (cert_db.ref) {
-               cert_db.ref++;
-               return 0;
-       }
-
-       user_cert_parser = getUserPkgCertDBPathUID(uid);
-       if (user_cert_parser == NULL) {
-               _LOGE("Failed to get pkg cert db path - %d", uid);
-               return -1;
-       }
-
-       if (access(user_cert_parser, F_OK) != 0) {
-               _LOGE("Cert DB does not exists !!");
-               free(user_cert_parser);
-               return -1;
-       }
-
-       flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE;
-       ret = db_util_open_with_options(user_cert_parser, &GET_DB(cert_db),
-                       flags, NULL);
-       if (ret != SQLITE_OK) {
-               _LOGE("connect db [%s] failed!", user_cert_parser);
-               free(user_cert_parser);
-               return -1;
-       }
-       cert_db.ref++;
-       if (readonly) {
-               ret = __attach_and_create_view(GET_DB(cert_db), CERT_DB,
-                               certdb_tables, uid);
-               if (ret != SQLITE_OK) {
-                       _LOGE("attach db [%s] failed!", user_cert_parser);
-                       free(user_cert_parser);
-                       return -1;
-               }
-       }
-
-       free(user_cert_parser);
-
-       return 0;
-}
-
 void _save_column_int(sqlite3_stmt *stmt, int idx, int *i)
 {
        *i = sqlite3_column_int(stmt, idx);
index 09e88e9..4ccc425 100644 (file)
@@ -74,8 +74,6 @@
 #define INTERFACE_NAME "org.tizen.system.deviced.Mmc"
 #define METHOD_NAME "RequestMountApp2ext"
 
-#define GET_DB(X)  (X).dbHandle
-
 /*String properties for filtering based on package info*/
 typedef enum _pkgmgrinfo_pkginfo_filter_prop_str {
        E_PMINFO_PKGINFO_PROP_PACKAGE_MIN_STR = 101,
@@ -289,9 +287,6 @@ typedef struct _pkg_plugin_set {
        get_pkg_detail_info_from_package;
 } pkg_plugin_set;
 
-extern __thread db_handle manifest_db;
-extern __thread db_handle cert_db;
-
 pkgmgrinfo_pkginfo_filter_prop_str _pminfo_pkginfo_convert_to_prop_str(const char *property);
 pkgmgrinfo_pkginfo_filter_prop_int _pminfo_pkginfo_convert_to_prop_int(const char *property);
 pkgmgrinfo_pkginfo_filter_prop_bool _pminfo_pkginfo_convert_to_prop_bool(const char *property);
@@ -303,10 +298,6 @@ pkgmgrinfo_appinfo_filter_prop_bool _pminfo_appinfo_convert_to_prop_bool(const c
 pkgmgrinfo_pkginfo_filter_prop_range _pminfo_pkginfo_convert_to_prop_range(const char *property);
 
 int _check_create_cert_db(void);
-int __close_manifest_db(void);
-int __open_manifest_db(uid_t uid, bool readonly);
-int __close_cert_db(void);
-int __open_cert_db(uid_t uid, bool readonly);
 void _save_column_int(sqlite3_stmt *stmt, int idx, int *i);
 void _save_column_str(sqlite3_stmt *stmt, int idx, char **str);
 char *_get_system_locale(void);