// Gen xml
- cr_repomd_set_record(repomd_obj, pri_xml_rec, CR_MD_PRIMARY_XML);
- cr_repomd_set_record(repomd_obj, fil_xml_rec, CR_MD_FILELISTS_XML);
- cr_repomd_set_record(repomd_obj, oth_xml_rec, CR_MD_OTHER_XML);
- cr_repomd_set_record(repomd_obj, pri_db_rec, CR_MD_PRIMARY_SQLITE);
- cr_repomd_set_record(repomd_obj, fil_db_rec, CR_MD_FILELISTS_SQLITE);
- cr_repomd_set_record(repomd_obj, oth_db_rec, CR_MD_OTHER_SQLITE);
- cr_repomd_set_record(repomd_obj, groupfile_rec, CR_MD_GROUPFILE);
- cr_repomd_set_record(repomd_obj, compressed_groupfile_rec,
- CR_MD_COMPRESSED_GROUPFILE);
- cr_repomd_set_record(repomd_obj, updateinfo_rec, CR_MD_UPDATEINFO);
+ cr_repomd_set_record(repomd_obj, pri_xml_rec, "primary");
+ cr_repomd_set_record(repomd_obj, fil_xml_rec, "filelists");
+ cr_repomd_set_record(repomd_obj, oth_xml_rec, "other");
+ cr_repomd_set_record(repomd_obj, pri_db_rec, "primary_db");
+ cr_repomd_set_record(repomd_obj, fil_db_rec, "filelists_db");
+ cr_repomd_set_record(repomd_obj, oth_db_rec, "other_db");
+ cr_repomd_set_record(repomd_obj, groupfile_rec, "group");
+ cr_repomd_set_record(repomd_obj, compressed_groupfile_rec, "group_gz");
+ cr_repomd_set_record(repomd_obj, updateinfo_rec, "updateinfo");
int i = 0;
while (cmd_options->repo_tags && cmd_options->repo_tags[i])
// Gen repomd.xml content
cr_Repomd repomd_obj = cr_new_repomd();
- cr_repomd_set_record(repomd_obj, pri_xml_rec, CR_MD_PRIMARY_XML);
- cr_repomd_set_record(repomd_obj, fil_xml_rec, CR_MD_FILELISTS_XML);
- cr_repomd_set_record(repomd_obj, oth_xml_rec, CR_MD_OTHER_XML);
- cr_repomd_set_record(repomd_obj, pri_db_rec, CR_MD_PRIMARY_SQLITE);
- cr_repomd_set_record(repomd_obj, fil_db_rec, CR_MD_FILELISTS_SQLITE);
- cr_repomd_set_record(repomd_obj, oth_db_rec, CR_MD_OTHER_SQLITE);
- cr_repomd_set_record(repomd_obj, groupfile_rec, CR_MD_GROUPFILE);
- cr_repomd_set_record(repomd_obj, compressed_groupfile_rec,
- CR_MD_COMPRESSED_GROUPFILE);
- cr_repomd_set_record(repomd_obj, update_info_rec, CR_MD_UPDATEINFO);
- cr_repomd_set_record(repomd_obj, pkgorigins_rec, CR_MD_PKGORIGINS);
+ cr_repomd_set_record(repomd_obj, pri_xml_rec, "primary");
+ cr_repomd_set_record(repomd_obj, fil_xml_rec, "filelists");
+ cr_repomd_set_record(repomd_obj, oth_xml_rec, "other");
+ cr_repomd_set_record(repomd_obj, pri_db_rec, "primary_db");
+ cr_repomd_set_record(repomd_obj, fil_db_rec, "filelists_db");
+ cr_repomd_set_record(repomd_obj, oth_db_rec, "other_db");
+ cr_repomd_set_record(repomd_obj, groupfile_rec, "group");
+ cr_repomd_set_record(repomd_obj, compressed_groupfile_rec, "group_gz");
+ cr_repomd_set_record(repomd_obj, update_info_rec,"updateinfo");
+ cr_repomd_set_record(repomd_obj, pkgorigins_rec, "origin");
char *repomd_xml = cr_generate_repomd_xml(repomd_obj);
{
xmlDocPtr doc;
xmlNodePtr root;
+ GList *keys, *element;
// Start of XML document
}
}
- dump_data_items(root, repomd->pri_xml, (const xmlChar *) "primary");
- dump_data_items(root, repomd->fil_xml, (const xmlChar *) "filelists");
- dump_data_items(root, repomd->oth_xml, (const xmlChar *) "other");
- dump_data_items(root, repomd->pri_sql, (const xmlChar *) "primary_db");
- dump_data_items(root, repomd->fil_sql, (const xmlChar *) "filelists_db");
- dump_data_items(root, repomd->oth_sql, (const xmlChar *) "other_db");
- dump_data_items(root, repomd->groupfile, (const xmlChar *) "group");
- dump_data_items(root, repomd->cgroupfile, (const xmlChar *) "group_gz");
- dump_data_items(root, repomd->updateinfo, (const xmlChar *) "updateinfo");
- dump_data_items(root, repomd->pkgorigins, (const xmlChar *) "origin");
+ // Records
+ keys = g_hash_table_get_keys(repomd->records);
+ keys = g_list_sort(keys, (GCompareFunc) g_strcmp0);
+
+ for (element = keys; element; element = g_list_next(element)) {
+ char *type = element->data;
+ cr_RepomdRecord rec = g_hash_table_lookup(repomd->records, type);
+ dump_data_items(root, rec, (const xmlChar *) type);
+ }
+
+ g_list_free(keys);
// Dump IT!
// During update with --keep-all-metadata some files (groupfile,
// updateinfo, ..) could already have checksum in filenames
if (g_str_has_prefix(location_filename, md->checksum)) {
- // The filename constains checksum and it is current
+ // The filename constains valid checksum
g_free(location_prefix);
return;
}
cr_Repomd
cr_new_repomd()
{
- return (cr_Repomd) g_malloc0(sizeof(struct _cr_Repomd));
+ cr_Repomd repomd = g_malloc0(sizeof(struct _cr_Repomd));
+ repomd->records = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ g_free,
+ (GDestroyNotify) cr_free_repomdrecord);
+ return repomd;
}
cr_free_repomd(cr_Repomd repomd)
{
if (!repomd) return;
- cr_free_repomdrecord(repomd->pri_xml);
- cr_free_repomdrecord(repomd->fil_xml);
- cr_free_repomdrecord(repomd->oth_xml);
- cr_free_repomdrecord(repomd->pri_sql);
- cr_free_repomdrecord(repomd->fil_sql);
- cr_free_repomdrecord(repomd->oth_sql);
- cr_free_repomdrecord(repomd->groupfile);
- cr_free_repomdrecord(repomd->cgroupfile);
- cr_free_repomdrecord(repomd->updateinfo);
- cr_free_repomdrecord(repomd->pkgorigins);
+ g_hash_table_destroy(repomd->records);
cr_slist_free_full(repomd->repo_tags, g_free);
cr_slist_free_full(repomd->distro_tags, (GDestroyNotify) cr_free_distro);
cr_slist_free_full(repomd->content_tags, g_free);
void
cr_repomd_set_record(cr_Repomd repomd,
cr_RepomdRecord record,
- cr_RepomdRecordType type)
+ const char *type)
{
- cr_RepomdRecord *rec;
-
if (!repomd || !record) return;
-
- switch (type) {
- case CR_MD_PRIMARY_XML: rec = &(repomd->pri_xml); break;
- case CR_MD_FILELISTS_XML: rec = &(repomd->fil_xml); break;
- case CR_MD_OTHER_XML: rec = &(repomd->oth_xml); break;
- case CR_MD_PRIMARY_SQLITE: rec = &(repomd->pri_sql); break;
- case CR_MD_FILELISTS_SQLITE: rec = &(repomd->fil_sql); break;
- case CR_MD_OTHER_SQLITE: rec = &(repomd->oth_sql); break;
- case CR_MD_GROUPFILE: rec = &(repomd->groupfile); break;
- case CR_MD_COMPRESSED_GROUPFILE: rec = &(repomd->cgroupfile); break;
- case CR_MD_UPDATEINFO: rec = &(repomd->updateinfo); break;
- case CR_MD_PKGORIGINS: rec = &(repomd->pkgorigins); break;
- default: return;
- }
-
- if (*rec) // A record already exists
- cr_free_repomdrecord(*rec);
-
- *rec = record;
+ g_hash_table_replace(repomd->records, g_strdup(type), record);
}
* Internal representation of cr_Repomd object
*/
struct _cr_Repomd {
- cr_RepomdRecord pri_xml;
- cr_RepomdRecord fil_xml;
- cr_RepomdRecord oth_xml;
- cr_RepomdRecord pri_sql;
- cr_RepomdRecord fil_sql;
- cr_RepomdRecord oth_sql;
- cr_RepomdRecord groupfile;
- cr_RepomdRecord cgroupfile;
- cr_RepomdRecord updateinfo;
- cr_RepomdRecord pkgorigins;
+ GHashTable *records;
GSList *repo_tags;
GSList *distro_tags;
GSList *content_tags;
};
/** \ingroup repomd
- * Enum of repomd record types
- */
-typedef enum {
- CR_MD_PRIMARY_XML,
- CR_MD_FILELISTS_XML,
- CR_MD_OTHER_XML,
- CR_MD_PRIMARY_SQLITE,
- CR_MD_FILELISTS_SQLITE,
- CR_MD_OTHER_SQLITE,
- CR_MD_GROUPFILE,
- CR_MD_COMPRESSED_GROUPFILE,
- CR_MD_UPDATEINFO,
- CR_MD_PKGORIGINS
-} cr_RepomdRecordType;
-
-/** \ingroup repomd
* Creates (alloc) new cr_RepomdRecord object
* @param path path to the compressed file
*/
* Set cr_Repomd record into cr_Repomd object.
* @param repomd cr_Repomd object
* @param record cr_RepomdRecord object
- * @param type type of cr_RepomdRecord object
+ * @param type type of record ("primary, "groupfile", ...)
*/
void cr_repomd_set_record(cr_Repomd repomd,
cr_RepomdRecord record,
- cr_RepomdRecordType type);
+ const char *type);
/** \ingroup repomd
* Set custom revision string of repomd.