]> git.ipfire.org Git - pakfire.git/commitdiff
package: Store groups in ID arrays
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 11:22:47 +0000 (11:22 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 11:22:47 +0000 (11:22 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/db.c
src/libpakfire/include/pakfire/package.h
src/libpakfire/include/pakfire/util.h
src/libpakfire/package.c

index 393c106fd43e0d8fd97f977c2f8a4d483ef6f9ef..703120144c1dbd1444ced22334131ad4fd97d276 100644 (file)
@@ -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
index 127880d15fdb128d542ceb753b4cf60bac701e93..6fce87970be70e588afc07fd496f4fcaef6cbe5f 100644 (file)
@@ -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);
index 9cca0834b78dfc9a8189c075ff7fa33f9c0e4ed1..c92b33b1df61813287b181b067f30dd4d32084c6 100644 (file)
@@ -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);
index 2fd34107170338a5e43588c342a73ebcaa546500..8129f480b2778baf5613c2273b70c53fc7ae2039 100644 (file)
@@ -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) {