}
static PyObject* Package_get_groups(PackageObject* self) {
- const char* s = pakfire_package_get_string(self->package, PAKFIRE_PKG_GROUPS);
+ char** groups = pakfire_package_get_strings(self->package, PAKFIRE_PKG_GROUPS);
- return PyUnicode_FromString(s);
+ PyObject* ret = PyUnicodeList_FromStringArray(groups);
+
+ // Cleanup
+ if (groups) {
+ for (char** group = groups; *group; group++)
+ free(*group);
+
+ free(groups);
+ }
+
+ return ret;
}
static int Package_set_groups(PackageObject* self, PyObject* value) {
}
static PyObject* Package_get_build_arches(PackageObject* self) {
- PyObject* ret = NULL;
-
// Fetch all supported arches
char** build_arches = pakfire_package_get_strings(self->package, PAKFIRE_PKG_BUILD_ARCHES);
- if (!build_arches) {
- ret = PyList_New(0);
- goto END;
- }
// Make a new list
- ret = PyUnicodeList_FromStringArray(build_arches);
+ PyObject* ret = PyUnicodeList_FromStringArray(build_arches);
// Cleanup
for (char** build_arch = build_arches; *build_arch; build_arch++) {
}
free(build_arches);
-END:
return ret;
}
}
// Groups
- const char* groups = pakfire_archive_metadata_get(archive, "groups", NULL);
- if (groups) {
- r = pakfire_package_set_string(pkg, PAKFIRE_PKG_GROUPS, groups);
- if (r)
- goto ERROR;
+ struct json_object* groups = pakfire_archive_metadata_get_object(archive, "groups", NULL);
+ if (groups && json_object_is_type(groups, json_type_array)) {
+ const size_t length = json_object_array_length(groups);
+
+ for (unsigned int i = 0; i < length; i++) {
+ struct json_object* item = json_object_array_get_idx(groups, i);
+ if (!item)
+ continue;
+
+ const char* group = json_object_get_string(item);
+ if (!group)
+ continue;
+
+ r = pakfire_package_add_string(pkg, PAKFIRE_PKG_GROUPS, group);
+ if (r)
+ goto ERROR;
+ }
}
// Distribution
// Build arches
struct json_object* build_arches = pakfire_archive_metadata_get_object(archive, "build", "arches");
- if (build_arches) {
+ if (build_arches && json_object_is_type(build_arches, json_type_array)) {
const size_t length = json_object_array_length(build_arches);
for (unsigned int i = 0; i < length; i++) {
sqlite3_stmt* stmt = NULL;
int r;
+ char** groups = NULL;
+ char* __groups = NULL;
+
// Begin a new transaction
r = pakfire_db_begin_transaction(db);
if (r)
}
// Bind groups
- const char* groups = pakfire_package_get_string(pkg, PAKFIRE_PKG_GROUPS);
-
+ groups = pakfire_package_get_strings(pkg, PAKFIRE_PKG_GROUPS);
if (groups) {
- r = sqlite3_bind_text(stmt, 4, groups, -1, NULL);
+ // Join everything together as SQLite doesn't support arrays
+ __groups = pakfire_string_join(groups, " ");
+ if (!__groups) {
+ r = 1;
+ goto ERROR;
+ }
+
+ r = sqlite3_bind_text(stmt, 4, __groups, -1, NULL);
if (r) {
ERROR(db->pakfire, "Could not bind groups: %s\n", sqlite3_errmsg(db->handle));
goto ERROR;
goto ERROR;
ERROR:
+ if (groups)
+ pakfire_strings_free(groups);
+ if (__groups)
+ free(groups);
if (stmt)
sqlite3_finalize(stmt);
Solvable* s = get_solvable(pkg);
switch (key) {
+ case PAKFIRE_PKG_GROUPS:
+ id = SOLVABLE_GROUP;
+ break;
+
case PAKFIRE_PKG_BUILD_ARCHES:
id = SOLVABLE_BUILDFLAVOR;
break;
ret = solvable_lookup_str(s, SOLVABLE_URL);
break;
- case PAKFIRE_PKG_GROUPS:
- ret = solvable_lookup_str(s, SOLVABLE_GROUP);
- break;
-
case PAKFIRE_PKG_VENDOR:
ret = solvable_lookup_str(s, SOLVABLE_VENDOR);
break;
id = SOLVABLE_URL;
break;
- case PAKFIRE_PKG_GROUPS:
- id = SOLVABLE_GROUP;
- break;
-
case PAKFIRE_PKG_VENDOR:
id = SOLVABLE_VENDOR;
break;
// Compat which splits a string and stores it as an array
case PAKFIRE_PKG_BUILD_ARCHES:
+ case PAKFIRE_PKG_GROUPS:
return pakfire_package_set_strings_from_string(pkg, key, value);
default:
Solvable* s = get_solvable(pkg);
switch (key) {
+ case PAKFIRE_PKG_GROUPS:
+ key_id = SOLVABLE_GROUP;
+ break;
+
case PAKFIRE_PKG_BUILD_ARCHES:
key_id = SOLVABLE_BUILDFLAVOR;
- value_id = pool_str2id(pool, value, 1);
break;
default:
return 1;
}
+ // Convert value
+ value_id = pool_str2id(pool, value, 1);
+
// Append the string to the ID array
solvable_add_idarray(s, key_id, value_id);
asprintf(str, "%s%-15s: %s\n", *str, key ? key : "", val);
}
-static void pakfire_package_dump_add_lines(char** str, const char* key, const char* val) {
+static void pakfire_package_dump_add_lines(char** str, const char* key, char** lines) {
+ for (; *lines; lines++) {
+ pakfire_package_dump_add_line(str, key, *lines);
+
+ // Reset the key after the first line
+ key = NULL;
+ }
+}
+
+static void pakfire_package_dump_add_long_line(char** str, const char* key, const char* val) {
char** lines = pakfire_string_split(val, '\n');
if (!lines)
return;
- while (*lines) {
- pakfire_package_dump_add_line(str, key, *lines);
- lines++;
- }
+ pakfire_package_dump_add_lines(str, key, lines);
+ pakfire_strings_free(lines);
}
static void pakfire_package_dump_add_line_date(char** str, const char* key, time_t date) {
// Description
const char* description = pakfire_package_get_string(pkg, PAKFIRE_PKG_DESCRIPTION);
if (description)
- pakfire_package_dump_add_lines(&string, _("Description"), description);
+ pakfire_package_dump_add_long_line(&string, _("Description"), description);
// Groups
- const char* groups = pakfire_package_get_string(pkg, PAKFIRE_PKG_GROUPS);
- if (groups)
+ char** groups = pakfire_package_get_strings(pkg, PAKFIRE_PKG_GROUPS);
+ if (groups) {
pakfire_package_dump_add_lines(&string, _("Groups"), groups);
+ pakfire_strings_free(groups);
+ }
// URL
const char* url = pakfire_package_get_string(pkg, PAKFIRE_PKG_URL);
// Build Arches
char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
if (build_arches) {
- for (char** build_arch = build_arches; *build_arch; build_arch++)
- pakfire_package_dump_add_line(&string, _("Build Arch"), *build_arch);
-
+ pakfire_package_dump_add_lines(&string, _("Build Arch"), build_arches);
pakfire_strings_free(build_arches);
}
}
// Groups
- const char* groups = pakfire_package_get_string(pkg, PAKFIRE_PKG_GROUPS);
+ char** groups = pakfire_package_get_strings(pkg, PAKFIRE_PKG_GROUPS);
if (groups) {
- r = pakfire_json_add_string(pkg->pakfire, md, "groups", groups);
+ r = pakfire_json_add_string_array(pkg->pakfire, md, "groups", groups);
+
+ // Cleanup
+ pakfire_strings_free(groups);
+
if (r)
goto ERROR;
}