More generic repomd module.
authorTomas Mlcoch <tmlcoch@redhat.com>
Thu, 21 Feb 2013 15:34:44 +0000 (16:34 +0100)
committerTomas Mlcoch <tmlcoch@redhat.com>
Thu, 21 Feb 2013 15:34:44 +0000 (16:34 +0100)
src/createrepo_c.c
src/mergerepo_c.c
src/repomd.c
src/repomd.h

index 826fb9a..94b28f9 100644 (file)
@@ -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])
index fafdc55..764978c 100644 (file)
@@ -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);
 
index 3867909..99119f2 100644 (file)
@@ -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);
 }
 
 
index d3b22b1..be4630e 100644 (file)
@@ -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.