load_metadata: cr_Metadata -> cr_Metadata *
authorTomas Mlcoch <tmlcoch@redhat.com>
Tue, 2 Jul 2013 11:17:39 +0000 (13:17 +0200)
committerTomas Mlcoch <tmlcoch@redhat.com>
Tue, 2 Jul 2013 11:17:39 +0000 (13:17 +0200)
src/createrepo_c.c
src/load_metadata.c
src/load_metadata.h
src/mergerepo_c.c
src/python/load_metadata-py.c
tests/test_load_metadata.c

index bea977e82a8da6bed510eeb523e139aa7543037e..fe49cb042eb20f8c348cfa453d868a6c21548a67 100644 (file)
@@ -66,7 +66,7 @@ struct UserData {
 
     // Update stuff
     gboolean skip_stat;             // Skip stat() while updating
-    cr_Metadata old_metadata;       // Loaded metadata
+    cr_Metadata *old_metadata;      // Loaded metadata
 
     // Thread serialization
     GMutex *mutex_pri;              // Mutex for primary metadata
@@ -227,8 +227,9 @@ dumper_thread(gpointer data, gpointer user_data)
     // Update stuff
     if (udata->old_metadata) {
         // We have old metadata
-        md = (cr_Package *) g_hash_table_lookup(udata->old_metadata->ht,
-                                                task->filename);
+        md = (cr_Package *) g_hash_table_lookup(
+                                cr_metadata_hashtable(udata->old_metadata),
+                                task->filename);
 
         if (md) {
             g_debug("CACHE HIT %s", task->filename);
@@ -731,7 +732,7 @@ main(int argc, char **argv)
 
     // Load old metadata if --update
 
-    cr_Metadata old_metadata = NULL;
+    cr_Metadata *old_metadata = NULL;
     struct cr_MetadataLocation *old_metadata_location = NULL;
 
     if (!package_count)
@@ -767,7 +768,7 @@ main(int argc, char **argv)
         }
 
         g_message("Loaded information about %d packages",
-                  g_hash_table_size(old_metadata->ht));
+                  g_hash_table_size(cr_metadata_hashtable(old_metadata)));
     }
 
     g_slist_free(current_pkglist);
index e86217d10ac24fc2eab3c2c84af0e5bd95218bfe..e9bb4baf4b0b10b47a2227c0666b289d38501832 100644 (file)
 
 #define STRINGCHUNK_SIZE        16384
 
+/** Structure for loaded metadata
+ */
+struct _cr_Metadata {
+    cr_HashTableKey key;    /*!< key used in hashtable */
+    GHashTable *ht;         /*!< hashtable with packages */
+    GStringChunk *chunk;    /*!< NULL or string chunk with strings from htn */
+    GHashTable *pkglist_ht; /*!< list of allowed package basenames to load */
+};
+
+cr_HashTableKey
+cr_metadata_key(cr_Metadata *md)
+{
+    assert(md);
+    return md->key;
+}
+
+GHashTable *
+cr_metadata_hashtable(cr_Metadata *md)
+{
+    assert(md);
+    return md->ht;
+}
+
 void
 cr_free_values(gpointer data)
 {
@@ -59,10 +82,10 @@ cr_destroy_metadata_hashtable(GHashTable *hashtable)
         g_hash_table_destroy (hashtable);
 }
 
-cr_Metadata
+cr_Metadata *
 cr_metadata_new(cr_HashTableKey key, int use_single_chunk, GSList *pkglist)
 {
-    cr_Metadata md;
+    cr_Metadata *md;
 
     assert(key < CR_HT_KEY_SENTINEL);
 
@@ -94,7 +117,7 @@ cr_metadata_new(cr_HashTableKey key, int use_single_chunk, GSList *pkglist)
 }
 
 void
-cr_metadata_free(cr_Metadata md)
+cr_metadata_free(cr_Metadata *md)
 {
     if (!md)
         return;
@@ -242,7 +265,7 @@ cr_load_xml_files(GHashTable *hashtable,
 }
 
 int
-cr_metadata_load_xml(cr_Metadata md,
+cr_metadata_load_xml(cr_Metadata *md,
                      struct cr_MetadataLocation *ml,
                      GError **err)
 {
@@ -331,7 +354,7 @@ cr_metadata_load_xml(cr_Metadata md,
 }
 
 int
-cr_metadata_locate_and_load_xml(cr_Metadata md,
+cr_metadata_locate_and_load_xml(cr_Metadata *md,
                                 const char *repopath,
                                 GError **err)
 {
index 1b520ef99fbbc0b83c8264910d2f8be34a0f3942..976d036ee0c4674c6a1c698aff6abfdd0fcb55d5 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
  *
  * \code
  * int ret;
- * cr_Metadata oldmetadata;
+ * cr_Metadata *oldmetadata;
  * GHashTable hashtable;
  *
  * // Create new metadata object
@@ -65,25 +65,25 @@ typedef enum {
     CR_HT_KEY_SENTINEL,                 /*!< last element, terminator, .. */
 } cr_HashTableKey;
 
-/** Return cr_HashTableKey from a cr_Metadata */
-#define cr_metadata_key(X)          ((X)->key)
-/** Return hashtable from a cr_Metadata */
-#define cr_metadata_hashtable(X)    ((X)->ht)
-/** Return GStringChunk from a cr_Metadata */
-#define cr_metadata_chunk(X)        ((X)->chunk)
+/** Metadata object
+ */
+typedef struct _cr_Metadata cr_Metadata;
 
-/** Structure for loaded metadata
+/** Return cr_HashTableKey from a cr_Metadata
+ * @param md        cr_Metadata object.
+ * @return          Key type
  */
-struct _cr_Metadata {
-    cr_HashTableKey key;    /*!< key used in hashtable */
-    GHashTable *ht;         /*!< hashtable with packages */
-    GStringChunk *chunk;    /*!< NULL or string chunk with strings from htn */
-    GHashTable *pkglist_ht; /*!< list of allowed package basenames to load */
-};
-
-/** Pointer to structure with loaded metadata
+cr_HashTableKey cr_metadata_key(cr_Metadata *md);
+
+/** Return hashtable from a cr_Metadata
+ * @param md        cr_Metadata object.
+ * @return          Pointer to internal GHashTable.
  */
-typedef struct _cr_Metadata *cr_Metadata;
+GHashTable *cr_metadata_hashtable(cr_Metadata *md);
+
+// XXX TODO Remove
+/** Return GStringChunk from a cr_Metadata */
+//#define cr_metadata_chunk(X)        ((X)->chunk)
 
 /** Create new (empty) metadata hashtable.
  * It is NOT thread safe to load data into single cr_Metadata
@@ -99,14 +99,14 @@ typedef struct _cr_Metadata *cr_Metadata;
  *                          list. If param is NULL all packages are loaded.
  * @return                  empty cr_Metadata object
  */
-cr_Metadata cr_metadata_new(cr_HashTableKey key,
-                            int use_single_chunk,
-                            GSList *pkglist);
+cr_Metadata *cr_metadata_new(cr_HashTableKey key,
+                             int use_single_chunk,
+                             GSList *pkglist);
 
 /** Destroy metadata.
  * @param md            cr_Metadata object
  */
-void cr_metadata_free(cr_Metadata md);
+void cr_metadata_free(cr_Metadata *md);
 
 /** Load metadata from the specified location.
  * @param md            metadata object
@@ -114,7 +114,7 @@ void cr_metadata_free(cr_Metadata md);
  * @param err           GError **
  * @return              cr_Error code
  */
-int cr_metadata_load_xml(cr_Metadata md,
+int cr_metadata_load_xml(cr_Metadata *md,
                          struct cr_MetadataLocation *ml,
                          GError **err);
 
@@ -124,7 +124,7 @@ int cr_metadata_load_xml(cr_Metadata md,
  * @param err           GError **
  * @return              cr_Error code
  */
-int cr_metadata_locate_and_load_xml(cr_Metadata md,
+int cr_metadata_locate_and_load_xml(cr_Metadata *md,
                                     const char *repopath,
                                     GError **err);
 
index 20e27195c6824a72bc7c5bac3ebb73dd18277830..47afbebc074bee6f421f94bb02cb9d4f62012191 100644 (file)
@@ -564,7 +564,7 @@ koji_stuff_prepare(struct KojiMergedReposStuff **koji_stuff_ptr,
     repoid = 0;
     for (element = repos; element; element = g_slist_next(element)) {
         struct cr_MetadataLocation *ml;
-        cr_Metadata metadata;
+        cr_Metadata *metadata;
         GHashTableIter iter;
         gpointer key, void_pkg;
 
@@ -881,7 +881,7 @@ merge_repos(GHashTable *merged,
     GSList *element = NULL;
     for (element = repo_list; element; element = g_slist_next(element)) {
         gchar *repopath;                    // base url of current repodata
-        cr_Metadata metadata;               // current repodata
+        cr_Metadata *metadata;              // current repodata
         struct cr_MetadataLocation *ml;     // location of current repodata
 
         ml = (struct cr_MetadataLocation *) element->data;
@@ -1583,8 +1583,8 @@ main(int argc, char **argv)
 
     // Load noarch repo
 
-    cr_Metadata noarch_metadata = NULL;
-    // noarch_metadata->ht:
+    cr_Metadata *noarch_metadata = NULL;
+    // cr_metadata_hashtable(noarch_metadata):
     //   Key: CR_HT_KEY_FILENAME aka pkg->location_href
     //   Value: package
 
index 9341d6251b53fa0f85a10189bc7b9b084fd5ff7e..e2a5a6bb8bc9e189e5378a0bc4cdf51808737f5e 100644 (file)
@@ -34,7 +34,7 @@
 
 typedef struct {
     PyObject_HEAD
-    cr_Metadata md;
+    cr_Metadata *md;
 } _MetadataObject;
 
 static int
@@ -115,24 +115,12 @@ get_key(_MetadataObject *self, void *nothing)
     CR_UNUSED(nothing);
     if (check_MetadataStatus(self))
         return NULL;
-    cr_HashTableKey val = self->md->key;
+    cr_HashTableKey val = cr_metadata_key(self->md);
     return PyLong_FromLong((long) val);
 }
 
-/*
-static PyObject *
-get_ht(_MetadataObject *self, void *nothing)
-{
-    CR_UNUSED(nothing);
-    if (check_MetadataStatus(self))
-        return NULL;
-    return Object_FromGHashtable((PyObject *) self, self->md->ht);
-}
-*/
-
 static PyGetSetDef metadata_getsetters[] = {
     {"key", (getter)get_key, NULL, NULL, NULL},
-//    {"ht",  (getter)get_ht, NULL, NULL, NULL},
     {NULL, NULL, NULL, NULL, NULL} /* sentinel */
 };
 
@@ -188,8 +176,9 @@ ht_len(_MetadataObject *self, PyObject *noarg)
     unsigned long len = 0;
     if (check_MetadataStatus(self))
         return NULL;
-    if (self->md->ht)
-        len = (unsigned long) g_hash_table_size(self->md->ht);
+    GHashTable *ht = cr_metadata_hashtable(self->md);
+    if (ht)
+        len = (unsigned long) g_hash_table_size(ht);
     return PyLong_FromUnsignedLong(len);
 }
 
@@ -227,7 +216,7 @@ ht_has_key(_MetadataObject *self, PyObject *args)
     if (check_MetadataStatus(self))
         return NULL;
 
-    if (g_hash_table_lookup(self->md->ht, key))
+    if (g_hash_table_lookup(cr_metadata_hashtable(self->md), key))
         Py_RETURN_TRUE;
     Py_RETURN_FALSE;
 }
@@ -240,7 +229,7 @@ ht_keys(_MetadataObject *self, PyObject *args)
     if (check_MetadataStatus(self))
         return NULL;
 
-    GList *keys = g_hash_table_get_keys(self->md->ht);
+    GList *keys = g_hash_table_get_keys(cr_metadata_hashtable(self->md));
     PyObject *list = PyList_New(0);
 
     for (GList *elem = keys; elem; elem = g_list_next(elem)) {
@@ -268,7 +257,7 @@ ht_remove(_MetadataObject *self, PyObject *args)
     if (check_MetadataStatus(self))
         return NULL;
 
-    if (g_hash_table_remove(self->md->ht, key))
+    if (g_hash_table_remove(cr_metadata_hashtable(self->md), key))
         Py_RETURN_TRUE;
     Py_RETURN_FALSE;
 }
@@ -283,7 +272,7 @@ ht_get(_MetadataObject *self, PyObject *args)
     if (check_MetadataStatus(self))
         return NULL;
 
-    cr_Package *pkg = g_hash_table_lookup(self->md->ht, key);
+    cr_Package *pkg = g_hash_table_lookup(cr_metadata_hashtable(self->md), key);
     if (!pkg)
         Py_RETURN_NONE;
     return (Object_FromPackage_WithParent(pkg, 0, (PyObject *) self));
index 36b6fbec14f47812c229c4a1d6dcc6430744dc62..45a517dd18c308a6e89921bbd13d2348117b5d7c 100644 (file)
@@ -49,14 +49,14 @@ static const char *REPO_FILENAME_KEYS_02[] = {"super_kernel-6.0.1-2.x86_64.rpm",
 static void test_cr_metadata_new(void)
 {
     guint len;
-    cr_Metadata metadata = NULL;
+    cr_Metadata *metadata = NULL;
 
     // Get new metadata object
     metadata = cr_metadata_new(CR_HT_KEY_DEFAULT, 0, NULL);
     g_assert(metadata);
 
     // Check if it is empty
-    len = g_hash_table_size(metadata->ht);
+    len = g_hash_table_size(cr_metadata_hashtable(metadata));
     g_assert_cmpint(len, ==, 0);
 
     cr_metadata_free(metadata);
@@ -69,17 +69,18 @@ void test_helper_check_keys(const char *repopath, cr_HashTableKey key, guint rep
     guint i;
     guint size;
     gpointer value;
-    cr_Metadata metadata;
+    cr_Metadata *metadata;
 
     metadata = cr_metadata_new(key, 0, NULL);
     g_assert(metadata);
-    g_assert(metadata->ht);
+    g_assert(cr_metadata_hashtable(metadata));
     ret = cr_metadata_locate_and_load_xml(metadata, repopath, NULL);
     g_assert_cmpint(ret, ==, CRE_OK);
-    size = g_hash_table_size(metadata->ht);
+    size = g_hash_table_size(cr_metadata_hashtable(metadata));
     g_assert_cmpuint(size, ==, repo_size);
     for (i=0; i < repo_size; i++) {
-        value = g_hash_table_lookup(metadata->ht, (gconstpointer) keys[i]);
+        value = g_hash_table_lookup(cr_metadata_hashtable(metadata),
+                                    (gconstpointer) keys[i]);
         if (!value)
             g_critical("Key \"%s\" not present!", keys[i]);
     }
@@ -108,15 +109,16 @@ static void test_cr_metadata_locate_and_load_xml_detailed(void)
     int ret;
     guint size;
     cr_Package *pkg;
-    cr_Metadata metadata;
+    cr_Metadata *metadata;
 
     metadata = cr_metadata_new(CR_HT_KEY_NAME, 0, NULL);
     g_assert(metadata);
     ret = cr_metadata_locate_and_load_xml(metadata, TEST_REPO_01, NULL);
     g_assert_cmpint(ret, ==, CRE_OK);
-    size = g_hash_table_size(metadata->ht);
+    size = g_hash_table_size(cr_metadata_hashtable(metadata));
     g_assert_cmpuint(size, ==, REPO_SIZE_01);
-    pkg = (cr_Package *) g_hash_table_lookup(metadata->ht, "super_kernel");
+    pkg = (cr_Package *) g_hash_table_lookup(cr_metadata_hashtable(metadata),
+                                             "super_kernel");
     g_assert(pkg);
 
     g_assert_cmpstr(pkg->pkgId, ==, "152824bff2aa6d54f429d43e87a3ff3a0286505c6d93ec87692b5e3a9e3b97bf");