From: Michael Tremer Date: Fri, 23 Apr 2021 11:22:47 +0000 (+0000) Subject: package: Store groups in ID arrays X-Git-Tag: 0.9.28~1285^2~257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1eb7f40b0d05a5c771d5083395733427bdf2540d;p=pakfire.git package: Store groups in ID arrays Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 393c106fd..703120144 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -1086,12 +1086,22 @@ PAKFIRE_EXPORT int pakfire_db_add_package(struct pakfire_db* db, } // Bind groups - const char* groups = pakfire_package_get_groups(pkg); + char* groups = pakfire_package_get_groups(pkg); + if (groups) { + r = sqlite3_bind_text(stmt, 6, groups, -1, NULL); + if (r) { + ERROR(db->pakfire, "Could not bind groups: %s\n", sqlite3_errmsg(db->handle)); + free(groups); + goto ROLLBACK; + } - r = sqlite3_bind_text(stmt, 6, groups, -1, NULL); - if (r) { - ERROR(db->pakfire, "Could not bind groups: %s\n", sqlite3_errmsg(db->handle)); - goto ROLLBACK; + free(groups); + + // No groups + } else { + r = sqlite3_bind_null(stmt, 6); + if (r) + goto ROLLBACK; } // Bind filename diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index 127880d15..6fce87970 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -67,7 +67,7 @@ const char* pakfire_package_get_license(PakfirePackage pkg); void pakfire_package_set_license(PakfirePackage pkg, const char* license); const char* pakfire_package_get_url(PakfirePackage pkg); void pakfire_package_set_url(PakfirePackage pkg, const char* url); -const char* pakfire_package_get_groups(PakfirePackage pkg); +char* pakfire_package_get_groups(PakfirePackage pkg); void pakfire_package_set_groups(PakfirePackage pkg, const char* groups); const char* pakfire_package_get_vendor(PakfirePackage pkg); void pakfire_package_set_vendor(PakfirePackage pkg, const char* vendor); diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 9cca0834b..c92b33b1d 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -39,6 +39,7 @@ char* pakfire_unquote_in_place(char* s); int pakfire_string_partition(const char* s, const char* delim, char** s1, char** s2); char* pakfire_string_replace(const char* s, const char* pattern, const char* repl); char** pakfire_split_string(const char* s, char delim); +char* pakfire_string_join(char** list, const char* delim); int pakfire_format_size(char* dst, size_t length, double value); int pakfire_format_speed(char* dst, size_t length, double value); diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 2fd341071..8129f480b 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -377,12 +377,41 @@ static void pakfire_package_set_string(PakfirePackage pkg, int key, const char* solvable_set_poolstr(s, key, value); } -static void pakfire_package_add_string_array(PakfirePackage pkg, int key, const char* value) { +static char** pakfire_package_get_string_array(PakfirePackage pkg, Id key) { + char** strings = NULL; + + Queue ids; + queue_init(&ids); + + Pool* pool = pakfire_package_get_solv_pool(pkg); Solvable* s = get_solvable(pkg); + solvable_lookup_idarray(s, key, &ids); + + if (ids.count > 0) { + strings = calloc(ids.count + 1, sizeof(*strings)); + if (!strings) { + queue_free(&ids); + return NULL; + } + + for (int i = 0; i < ids.count; i++) { + const char* value = pool_id2str(pool, ids.elements[i]); + strings[i] = strdup(value); + } + + strings[ids.count] = NULL; + } + + queue_free(&ids); + return strings; +} + +static void pakfire_package_add_string_array(PakfirePackage pkg, Id key, const char* value) { if (!value) return; + Solvable* s = get_solvable(pkg); solvable_add_poolstr_array(s, key, value); } @@ -434,17 +463,32 @@ PAKFIRE_EXPORT void pakfire_package_set_url(PakfirePackage pkg, const char* url) pakfire_package_set_string(pkg, SOLVABLE_URL, url); } -PAKFIRE_EXPORT const char* pakfire_package_get_groups(PakfirePackage pkg) { - return pakfire_package_get_string(pkg, SOLVABLE_GROUP); +PAKFIRE_EXPORT char* pakfire_package_get_groups(PakfirePackage pkg) { + char** groups = pakfire_package_get_string_array(pkg, SOLVABLE_GROUP); + if (!groups) + return NULL; + + char* string = pakfire_string_join(groups, " "); + + // Free array + for (char** group = groups; *group; group++) + free(*group); + free(groups); + + return string; } PAKFIRE_EXPORT void pakfire_package_set_groups(PakfirePackage pkg, const char* groups) { char** list = pakfire_split_string(groups, ' '); + if (!list) + return; - while (list && *list) { - pakfire_package_add_string_array(pkg, SOLVABLE_GROUP, *list); - list++; + for (char** group = list; *group; group++) { + pakfire_package_add_string_array(pkg, SOLVABLE_GROUP, *group); + free(*group); } + + free(list); } PAKFIRE_EXPORT const char* pakfire_package_get_vendor(PakfirePackage pkg) {