From: Tomas Mlcoch Date: Thu, 21 Feb 2013 15:34:44 +0000 (+0100) Subject: More generic repomd module. X-Git-Tag: upstream/0.2.1~268 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aaad433b32590ca15dd372ea49b8198642517712;p=services%2Fcreaterepo_c.git More generic repomd module. --- diff --git a/src/createrepo_c.c b/src/createrepo_c.c index 826fb9a..94b28f9 100644 --- a/src/createrepo_c.c +++ b/src/createrepo_c.c @@ -1114,16 +1114,15 @@ main(int argc, char **argv) // 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]) diff --git a/src/mergerepo_c.c b/src/mergerepo_c.c index fafdc55..764978c 100644 --- a/src/mergerepo_c.c +++ b/src/mergerepo_c.c @@ -1243,17 +1243,16 @@ dump_merged_metadata(GHashTable *merged_hashtable, // 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); diff --git a/src/repomd.c b/src/repomd.c index 3867909..99119f2 100644 --- a/src/repomd.c +++ b/src/repomd.c @@ -448,6 +448,7 @@ repomd_xml_dump(cr_Repomd repomd) { xmlDocPtr doc; xmlNodePtr root; + GList *keys, *element; // Start of XML document @@ -491,17 +492,18 @@ repomd_xml_dump(cr_Repomd repomd) } } - 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! @@ -549,7 +551,7 @@ cr_rename_repomdrecord_file(cr_RepomdRecord md) // 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; } @@ -616,7 +618,12 @@ cr_rename_repomdrecord_file(cr_RepomdRecord md) 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; } @@ -624,16 +631,7 @@ void 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); @@ -645,30 +643,10 @@ cr_free_repomd(cr_Repomd repomd) 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); } diff --git a/src/repomd.h b/src/repomd.h index d3b22b1..be4630e 100644 --- a/src/repomd.h +++ b/src/repomd.h @@ -62,16 +62,7 @@ struct _cr_RepomdRecord { * 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; @@ -79,22 +70,6 @@ struct _cr_Repomd { }; /** \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 */ @@ -149,11 +124,11 @@ cr_Repomd cr_new_repomd(); * 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.