From: Tomas Mlcoch Date: Wed, 18 Jan 2012 15:40:43 +0000 (+0100) Subject: Add load_metadata module. X-Git-Tag: upstream/0.2.1~580 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=95f6be3a3a8bcb14983adafcc35318388c330d60;p=services%2Fcreaterepo_c.git Add load_metadata module. --- diff --git a/Makefile b/Makefile index 01137f9..f463950 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,22 @@ SWIG=/usr/bin/swig CFLAGS=-O -fPIC -DDEBUG -I/usr/include/python2.7/ `pkg-config --cflags glib-2.0` `xml2-config --cflags` LINKFLAGS=`pkg-config --libs glib-2.0` `xml2-config --libs` -lrpm -lrpmio +LC=-lc -all: package.so xml_dump.so parsehdr.so parsepkg.so +# Profiling +CFLAGS=-pg -O -fPIC -DDEBUG -I/usr/include/python2.7/ `pkg-config --cflags glib-2.0` `xml2-config --cflags` +#LINKFLAGS=/lib/gcrt0.o `pkg-config --libs glib-2.0` `xml2-config --libs` -lrpm -lrpmio +LC=-lc -ctests: parsepkg_test_01 xml_dump_primary_test_01 xml_dump_filelists_test_01 xml_dump_other_test_01 + +all: package.so xml_dump.so parsehdr.so parsepkg.so load_metadata.so + +ctests: parsepkg_test_01 parsehdr_test_01 parsehdr_test_02 xml_dump_primary_test_01 \ + xml_dump_filelists_test_01 xml_dump_other_test_01 load_metadata_test_01 test: main + # Object files + Swit object files package.o package_wrap.o: package.i package.c package.h @@ -30,6 +39,11 @@ parsepkg.o parsepkg_wrap.o: parsepkg.c parsepkg.h constants.h $(SWIG) -python -Wall parsepkg.i gcc $(CFLAGS) -c parsepkg.c parsepkg_wrap.c +load_metadata.o load_metadata_wrap.o: load_metadata.c load_metadata.h constants.h + $(SWIG) -python -Wall load_metadata.i + gcc $(CFLAGS) -c load_metadata.c load_metadata_wrap.c + + # Object files misc.o: misc.c misc.h @@ -45,22 +59,32 @@ xml_dump_other.o: xml_dump_other.c xml_dump.h gcc $(CFLAGS) -c xml_dump_other.c package.so: package_wrap.o package.o - ld $(LINKFLAGS) -shared package.o package_wrap.o -o _package.so -lc + ld $(LINKFLAGS) -shared package.o package_wrap.o -o _package.so $(LC) xml_dump.so: package.o xml_dump_wrap.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o - ld $(LINKFLAGS) -shared package.o xml_dump_wrap.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o -o _xml_dump.so -lc + ld $(LINKFLAGS) -shared package.o xml_dump_wrap.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o -o _xml_dump.so $(LC) parsehdr.so: parsehdr_wrap.o parsehdr.o package.o xml_dump.o misc.o - ld $(LINKFLAGS) -shared misc.o parsehdr_wrap.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o -o _parsehdr.so -lc + ld $(LINKFLAGS) -shared misc.o parsehdr_wrap.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o -o _parsehdr.so $(LC) parsepkg.so: parsepkg_wrap.o parsepkg.o parsehdr.o package.o xml_dump.o misc.o - ld $(LINKFLAGS) -shared misc.o parsepkg_wrap.o parsepkg.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o -o _parsepkg.so -lc + ld $(LINKFLAGS) -shared misc.o parsepkg_wrap.o parsepkg.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o -o _parsepkg.so $(LC) + +load_metadata.so: load_metadata_wrap.o load_metadata.o + ld $(LINKFLAGS) -shared load_metadata_wrap.o load_metadata.o -o _load_metadata.so $(LC) + # Tests parsepkg_test_01: parsepkg.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o gcc $(LINKFLAGS) $(CFLAGS) parsepkg.o parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o ctests/parsepkg_test_01.c -o ctests/parsepkg_test_01 +parsehdr_test_01: parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o + gcc $(LINKFLAGS) $(CFLAGS) parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o ctests/parsehdr_test_01.c -o ctests/parsehdr_test_01 + +parsehdr_test_02: parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o + gcc $(LINKFLAGS) $(CFLAGS) parsehdr.o package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o ctests/parsehdr_test_02.c -o ctests/parsehdr_test_02 + xml_dump_primary_test_01: package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o gcc $(LINKFLAGS) $(CFLAGS) package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o ctests/xml_dump_primary_test_01.c -o ctests/xml_dump_primary_test_01 @@ -70,6 +94,9 @@ xml_dump_filelists_test_01: package.o xml_dump.o xml_dump_primary.o xml_dump_fil xml_dump_other_test_01: package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o gcc $(LINKFLAGS) $(CFLAGS) package.o xml_dump.o xml_dump_primary.o xml_dump_filelists.o xml_dump_other.o misc.o ctests/xml_dump_other_test_01.c -o ctests/xml_dump_other_test_01 +load_metadata_test_01: load_metadata.o + gcc $(LINKFLAGS) $(CFLAGS) load_metadata.o ctests/load_metadata_test_01.c -o ctests/load_metadata_test_01 + clean: rm -f *.o *.so *_wrap.* main *.pyc diff --git a/load_metadata.c b/load_metadata.c new file mode 100644 index 0000000..fde9337 --- /dev/null +++ b/load_metadata.c @@ -0,0 +1,125 @@ +#include +#include +#include "load_metadata.h" + + +void free_values(gpointer data) +{ + struct package_metadata *md = (struct package_metadata *) data; + g_free(md->checksum_type); + g_free(md->primary_xml); + g_free(md->filelists_xml); + g_free(md->other_xml); + g_free(md); +} + + +GHashTable *load_metadata(const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path) +{ + 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; + } + + GHashTable *metadata = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, free_values); + + // Map file into memmory + char *pri_cont, *fil_cont, *oth_cont; + int pri_len, fil_len, oth_len; + + g_file_get_contents(primary_xml_path, &pri_cont, &pri_len, NULL); + g_file_get_contents(filelists_xml_path, &fil_cont, &fil_len, NULL); + g_file_get_contents(other_xml_path, &oth_cont, &oth_len, NULL); + + GRegexCompileFlags c_flags = G_REGEX_DOTALL | G_REGEX_OPTIMIZE; + GRegexMatchFlags m_flags = 0; + + GRegex *package_re = g_regex_new("", c_flags, m_flags, NULL); + GRegex *filename_re = g_regex_new("time_file = filetime; + pkg_md->size_package = size; + pkg_md->checksum_type = checksum_type; + pkg_md->primary_xml = pkg_pri; + pkg_md->filelists_xml = pkg_fil; + pkg_md->other_xml = pkg_oth; + g_hash_table_insert(metadata, location, pkg_md); + + // Clean up + g_free(filetime_str); + g_free(size_str); + + g_match_info_free(mi_location); + g_match_info_free(mi_checksum); + g_match_info_free(mi_filetime); + g_match_info_free(mi_size); + + // Get next item + g_match_info_next (pri_pkg_match_info, NULL); + g_match_info_next (fil_pkg_match_info, NULL); + g_match_info_next (oth_pkg_match_info, NULL); + } + + g_match_info_free(pri_pkg_match_info); + g_match_info_free(fil_pkg_match_info); + g_match_info_free(oth_pkg_match_info); + + g_regex_unref(package_re); + g_regex_unref(filename_re); + g_regex_unref(checksum_type_re); + g_regex_unref(filetime_re); + g_regex_unref(size_re); + + g_free(pri_cont); + g_free(fil_cont); + g_free(oth_cont); + + return metadata; +} diff --git a/load_metadata.h b/load_metadata.h new file mode 100644 index 0000000..2554a50 --- /dev/null +++ b/load_metadata.h @@ -0,0 +1,20 @@ +#ifndef __LOAD_METADATA__ +#define __LOAD_METADATA__ + +#include +#include "constants.h" + +struct package_metadata { + gint64 time_file; + gint64 size_package; + char *checksum_type; + char *primary_xml; + char *filelists_xml; + char *other_xml; +// GStringChunk *chunk; +}; + + +GHashTable *load_metadata(const char *primary_xml_path, const char *filelists_xml_path, const char *other_xml_path); + +#endif /* __LOAD_METADATA__ */ diff --git a/load_metadata.i b/load_metadata.i new file mode 100644 index 0000000..c32a594 --- /dev/null +++ b/load_metadata.i @@ -0,0 +1,9 @@ +%module load_metadata + +%include + +%{ +#include "load_metadata.h" +%} + +%include "load_metadata.h" diff --git a/typemaps.i b/typemaps.i index 03a1287..43a24ec 100644 --- a/typemaps.i +++ b/typemaps.i @@ -69,6 +69,32 @@ } } +%typemap(out) GHashTable *load_metadata { + PyObject *dict = PyDict_New(); + + GHashTable *hash_table = $1; + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, hash_table); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + struct package_metadata *md = (struct package_metadata *) value; + PyObject *py_value = PyTuple_New(6); + PyTuple_SetItem(py_value, 0, PyLong_FromLong(md->time_file)); + PyTuple_SetItem(py_value, 1, PyLong_FromLong(md->size_package)); + PyTuple_SetItem(py_value, 2, PyString_FromString(md->checksum_type)); + PyTuple_SetItem(py_value, 3, PyString_FromString(md->primary_xml)); + PyTuple_SetItem(py_value, 4, PyString_FromString(md->filelists_xml)); + PyTuple_SetItem(py_value, 5, PyString_FromString(md->other_xml)); + PyDict_SetItemString(dict, key, py_value); + } + g_hash_table_destroy (hash_table); + + $result = dict; +} + +/* %typemap(out) GSList *changelogs { PyObject *list = PyList_New(0); GSList *element = NULL; @@ -91,6 +117,7 @@ list = g_slist_reverse(list); $1 = list; } +*/ %typemap(in) Package * { char *str = NULL;