// 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
// 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);
// 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)
}
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);
#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)
{
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);
}
void
-cr_metadata_free(cr_Metadata md)
+cr_metadata_free(cr_Metadata *md)
{
if (!md)
return;
}
int
-cr_metadata_load_xml(cr_Metadata md,
+cr_metadata_load_xml(cr_Metadata *md,
struct cr_MetadataLocation *ml,
GError **err)
{
}
int
-cr_metadata_locate_and_load_xml(cr_Metadata md,
+cr_metadata_locate_and_load_xml(cr_Metadata *md,
const char *repopath,
GError **err)
{
*
* \code
* int ret;
- * cr_Metadata oldmetadata;
+ * cr_Metadata *oldmetadata;
* GHashTable hashtable;
*
* // Create new metadata object
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
* 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
* @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);
* @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);
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;
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;
// 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
typedef struct {
PyObject_HEAD
- cr_Metadata md;
+ cr_Metadata *md;
} _MetadataObject;
static int
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 */
};
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);
}
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;
}
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)) {
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;
}
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));
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);
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]);
}
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");