}
+GHashTable *new_old_metadata_hashtable()
+{
+ GHashTable *hashtable = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free_values);
+ return hashtable;
+}
+
+
+void *destroy_old_metadata_hashtable(GHashTable *hashtable)
+{
+ if (hashtable) {
+ g_hash_table_destroy (hashtable);
+ }
+}
+
+
int xmlInputReadCallback_plaintext (void * context, char * buffer, int len)
{
int readed = fread(buffer, 1, len, (FILE *) context);
key++;
}
+ // Check if key already exists
+ if (g_hash_table_lookup(metadata, key)) {
+ printf("Warning: Key \"%s\" already exists\n", key);
+ g_free(pri_pkg_xml);
+ g_free(fil_pkg_xml);
+ g_free(oth_pkg_xml);
+ xmlFree(location_href);
+ if (location_base) {
+ xmlFree(location_base);
+ }
+ xmlFree(checksum_type);
+ return;
+ }
+
+ // Insert record into hashtable
struct package_metadata *pkg_md = g_malloc(sizeof(struct package_metadata));
pkg_md->time_file = time_file;
pkg_md->size_package = size;
-GHashTable *parse_xml_metadata(xmlTextReaderPtr pri_reader, xmlTextReaderPtr fil_reader, xmlTextReaderPtr oth_reader)
+int parse_xml_metadata(GHashTable *hashtable, xmlTextReaderPtr pri_reader, xmlTextReaderPtr fil_reader, xmlTextReaderPtr oth_reader)
{
- if (!pri_reader || !fil_reader || !oth_reader) {
- return NULL;
+ if (!hashtable || !pri_reader || !fil_reader || !oth_reader) {
+ return 0;
}
// Go to a package level in xmls
name = xmlTextReaderName(pri_reader);
if (strcmp(name, "metadata")) {
xmlFree(name);
- return NULL;
+ return 0;
}
xmlFree(name);
name = xmlTextReaderName(fil_reader);
if (strcmp(name, "filelists")) {
xmlFree(name);
- return NULL;
+ return 0;
}
xmlFree(name);
name = xmlTextReaderName(oth_reader);
if (strcmp(name, "otherdata")) {
xmlFree(name);
- return NULL;
+ return 0;
}
xmlFree(name);
if (strcmp(name, "package")) {
puts("bad xml");
xmlFree(name);
- return;
+ return 0;
}
xmlFree(name);
if (strcmp(name, "package")) {
puts("bad xml");
xmlFree(name);
- return;
+ return 0;
}
xmlFree(name);
if (strcmp(name, "package")) {
puts("bad xml");
xmlFree(name);
- return;
+ return 0;
}
xmlFree(name);
- GHashTable *metadata = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, free_values);
-
while (pri_ret && fil_ret && oth_ret) {
- processNode(metadata, pri_reader, fil_reader, oth_reader);
+ processNode(hashtable, pri_reader, fil_reader, oth_reader);
pri_ret = xmlTextReaderNext(pri_reader);
fil_ret = xmlTextReaderNext(fil_reader);
oth_ret = xmlTextReaderNext(oth_reader);
}
- return metadata;
+ return 1;
}
#define GZ_BUFFER_SIZE 131072 // 1024*128
-GHashTable *load_gz_compressed_xml_metadata_2(const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path)
+int load_gz_compressed_xml_metadata_2(GHashTable *hashtable, const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path)
{
+ if (!hashtable) {
+ return 0;
+ }
+
GFileTest flags = G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR;
if (!g_file_test(primary_xml_path, flags) ||
!g_file_test(filelists_xml_path, flags) ||
!g_file_test(other_xml_path, flags))
{
- return NULL;
+ return 0;
}
// Open files and get file descriptors
close(pri_xml_fd);
close(fil_xml_fd);
close(oth_xml_fd);
- return NULL;
+ return 0;
}
// Open gziped file
if (!(pri_xml_gzfile = gzdopen(pri_xml_fd, "rb"))) {
// if (!(pri_xml_gzfile = gzopen(primary_xml_path, "rb"))) {
- return NULL;
+ return 0;
}
if (!(fil_xml_gzfile = gzdopen(fil_xml_fd, "rb"))) {
// if (!(fil_xml_gzfile = gzopen(filelists_xml_path, "rb"))) {
gzclose(pri_xml_gzfile);
- return NULL;
+ return 0;
}
if (!(oth_xml_gzfile = gzdopen(oth_xml_fd, "rb"))) {
// if (!(oth_xml_gzfile = gzopen(other_xml_path, "rb"))) {
gzclose(pri_xml_gzfile);
gzclose(fil_xml_gzfile);
- return NULL;
+ return 0;
}
// Set buffers
gzclose(pri_xml_gzfile);
gzclose(fil_xml_gzfile);
gzclose(oth_xml_gzfile);
- return NULL;
+ return 0;
}
fil_reader = xmlReaderForIO(xmlInputReadCallback_gz_compressed,
gzclose(fil_xml_gzfile);
gzclose(oth_xml_gzfile);
puts("Fil Reader fail");
- return NULL;
+ return 0;
}
oth_reader = xmlReaderForIO(xmlInputReadCallback_gz_compressed,
xmlFreeTextReader(fil_reader);
gzclose(oth_xml_gzfile);
puts("Oth Reader fail");
- return NULL;
+ return 0;
}
- GHashTable *result = parse_xml_metadata(pri_reader, fil_reader, oth_reader);
+ int result = parse_xml_metadata(hashtable, pri_reader, fil_reader, oth_reader);
xmlFreeTextReader(pri_reader);
xmlFreeTextReader(fil_reader);
}
-GHashTable *load_xml_metadata_2(const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path)
+int load_xml_metadata_2(GHashTable *hashtable, const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path)
{
+ if (!hashtable) {
+ return 0;
+ }
+
GFileTest flags = G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR;
if (!g_file_test(primary_xml_path, flags) ||
!g_file_test(filelists_xml_path, flags) ||
!g_file_test(other_xml_path, flags))
{
puts("file fail");
- return NULL;
+ return 0;
}
FILE *pri_xml_file = fopen(primary_xml_path, "rb");
fclose(fil_xml_file);
fclose(oth_xml_file);
puts("pri Reader fail");
- return NULL;
+ return 0;
}
fil_reader = xmlReaderForIO(xmlInputReadCallback_plaintext,
fclose(fil_xml_file);
fclose(oth_xml_file);
puts("Fil Reader fail");
- return NULL;
+ return 0;
}
oth_reader = xmlReaderForIO(xmlInputReadCallback_plaintext,
xmlFreeTextReader(fil_reader);
fclose(oth_xml_file);
puts("Oth Reader fail");
- return NULL;
+ return 0;
}
- GHashTable *result = parse_xml_metadata(pri_reader, fil_reader, oth_reader);
+ int result = parse_xml_metadata(hashtable, pri_reader, fil_reader, oth_reader);
xmlFreeTextReader(pri_reader);
xmlFreeTextReader(fil_reader);
}
-GHashTable *locate_and_load_xml_metadata_2(const char *repopath)
+int locate_and_load_xml_metadata_2(GHashTable *hashtable, const char *repopath)
{
// TODO: First try get info from repomd.xml
- if (!repopath || !g_file_test(repopath, G_FILE_TEST_EXISTS|G_FILE_TEST_IS_DIR)) {
- return NULL;
+ if (!hashtable || !repopath || !g_file_test(repopath, G_FILE_TEST_EXISTS|G_FILE_TEST_IS_DIR)) {
+ return 0;
}
gchar *pri_gz_xml = NULL;
GDir *repodir = g_dir_open(repopath, 0, NULL);
if (!repodir) {
- return NULL;
+ return 0;
}
gchar *file;
g_dir_close(repodir);
- GHashTable *result = NULL;
+ int result = 0;
// xmlInitParser();
if (pri_gz_xml && fil_gz_xml && oth_gz_xml) {
- result = load_gz_compressed_xml_metadata_2(pri_gz_xml, fil_gz_xml, oth_gz_xml);
+ result = load_gz_compressed_xml_metadata_2(hashtable, pri_gz_xml, fil_gz_xml, oth_gz_xml);
} else if (pri_xml && fil_xml && oth_xml) {
- result = load_xml_metadata_2(pri_xml, fil_xml, oth_xml);
+ result = load_xml_metadata_2(hashtable, pri_xml, fil_xml, oth_xml);
}
// Cleanup memory allocated by libxml2