pakfire_package_set_buildtime(pkg, build_time);
}
+ // Files
+ const char* files = (const char*)sqlite3_column_text(stmt, 17);
+ if (files) {
+ DEBUG(db->pakfire, "FILES = %s\n", files);
+ r = pakfire_package_set_filelist_from_string(pkg, files);
+ if (r)
+ goto ERROR;
+ }
+
// Success
r = 0;
const char* sql =
"SELECT "
"name, epoch, version, release, arch, groups, filename, size, inst_size, "
- "hash1, license, summary, description, uuid, vendor, build_host, build_time "
+ "hash1, license, summary, description, uuid, vendor, build_host, build_time, "
+ "("
+ "SELECT group_concat(name, '\n') FROM files WHERE files.pkg = packages.id"
+ ") AS files "
"FROM "
"packages"
";";
return filelist;
}
-PAKFIRE_EXPORT int pakfire_package_set_filelist(PakfirePackage pkg, PakfireFilelist filelist) {
+static int pakfire_package_append_file(PakfirePackage pkg, const char* path) {
// Fetch repodata
PakfireRepo repo = pakfire_package_get_repo(pkg);
Repodata* repodata = pakfire_repo_get_repodata(repo);
Id handle = pakfire_package_get_handle(pkg);
+ char* basename = pakfire_basename(path);
+ char* dirname = pakfire_dirname(path);
+
+ // Convert directory into ID
+ Id did = repodata_str2dir(repodata, dirname, 1);
+ if (!did)
+ did = repodata_str2dir(repodata, "/", 1);
+
+ // Add data to list
+ repodata_add_dirstr(repodata, handle,
+ SOLVABLE_FILELIST, did, basename);
+
+ free(basename);
+ free(dirname);
+
+ return 0;
+}
+
+PAKFIRE_EXPORT int pakfire_package_set_filelist(PakfirePackage pkg, PakfireFilelist filelist) {
+ int r;
+
for (unsigned int i = 0; i < pakfire_filelist_size(filelist); i++) {
PakfireFile file = pakfire_filelist_get(filelist, i);
- char* basename = pakfire_file_get_basename(file);
- char* dirname = pakfire_file_get_dirname(file);
+ const char* name = pakfire_file_get_name(file);
+ if (name) {
+ r = pakfire_package_append_file(pkg, name);
+ if (r) {
+ pakfire_file_unref(file);
+ return r;
+ }
+ }
+
+ pakfire_file_unref(file);
+
+ }
+
+ return 0;
+}
- // Convert directory into ID
- Id did = repodata_str2dir(repodata, dirname, 1);
- if (!did)
- did = repodata_str2dir(repodata, "/", 1);
+int pakfire_package_set_filelist_from_string(PakfirePackage pkg, const char* files) {
+ // Total length of the input string
+ size_t size = strlen(files);
- // Add data to list
- repodata_add_dirstr(repodata, handle,
- SOLVABLE_FILELIST, did, basename);
+ // Copy files to the stack to be able to modify it
+ char* buffer = alloca(size + 1);
- pakfire_file_unref(file);
- free(basename);
- free(dirname);
+ // Copy the content
+ memcpy(buffer, files, size);
+
+ // Replace all line breaks with NUL
+ for (unsigned int i = 0; i < size; i++) {
+ if (buffer[i] == '\n')
+ buffer[i] = '\0';
+ }
+
+ size_t p = 0;
+ while (p < size) {
+ const char* name = &buffer[p];
+
+ int r = pakfire_package_append_file(pkg, name);
+ if (r)
+ return r;
+
+ p += strlen(name) + 1;
}
return 0;