}
// 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
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);
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);
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);
}
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) {