The current loader code enumerates files, processing them as it finds them. This changes it into a two stage process, first enumerating all files and then loading all files. This will facilitate later changes to way we enumerate files across multiple directories. Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- osinfo/osinfo_loader.c | 152 +++++++++++++++++--------------------- test/Makefile.am | 2 +- test/dbdata/oses/test-os-data.xml | 28 +++++++ test/test-os.c | 2 +- test/test-os.xml | 31 -------- 5 files changed, 99 insertions(+), 116 deletions(-) delete mode 100644 test/test-os.xml diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c index b9e47ed..c516c92 100644 --- a/osinfo/osinfo_loader.c +++ b/osinfo/osinfo_loader.c @@ -1,7 +1,7 @@ /* * libosinfo: * - * Copyright (C) 2009-2012, 2014 Red Hat, Inc. + * Copyright (C) 2009-2015 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1584,7 +1584,6 @@ static void osinfo_loader_process_xml(OsinfoLoader *loader, static void osinfo_loader_process_file_reg_ids(OsinfoLoader *loader, GFile *file, - GFileInfo *info, gboolean withSubsys, const char *baseURI, const char *busType, @@ -1710,12 +1709,10 @@ osinfo_loader_process_file_reg_ids(OsinfoLoader *loader, static void osinfo_loader_process_file_reg_usb(OsinfoLoader *loader, GFile *file, - GFileInfo *info, GError **err) { osinfo_loader_process_file_reg_ids(loader, file, - info, FALSE, "http://usb.org", "usb", @@ -1725,12 +1722,10 @@ osinfo_loader_process_file_reg_usb(OsinfoLoader *loader, static void osinfo_loader_process_file_reg_pci(OsinfoLoader *loader, GFile *file, - GFileInfo *info, GError **err) { osinfo_loader_process_file_reg_ids(loader, file, - info, TRUE, "http://pcisig.com", "pci", @@ -1738,15 +1733,8 @@ osinfo_loader_process_file_reg_pci(OsinfoLoader *loader, } static void -osinfo_loader_process_file(OsinfoLoader *loader, - GFile *file, - gboolean ignoreMissing, - GError **err); - -static void osinfo_loader_process_file_reg_xml(OsinfoLoader *loader, GFile *file, - GFileInfo *info, GError **err) { gchar *xml = NULL; @@ -1764,88 +1752,72 @@ osinfo_loader_process_file_reg_xml(OsinfoLoader *loader, g_free(xml); } -static void -osinfo_loader_process_file_dir(OsinfoLoader *loader, - GFile *file, - GFileInfo *info, - GError **err) -{ - GFileEnumerator *ents = g_file_enumerate_children(file, - "standard::*", - G_FILE_QUERY_INFO_NONE, - NULL, - err); - if (error_is_set(err)) - return; - - GFileInfo *child; - while ((child = g_file_enumerator_next_file(ents, NULL, err)) != NULL) { - const gchar *name = g_file_info_get_name(child); - GFile *ent = g_file_get_child(file, name); - - osinfo_loader_process_file(loader, ent, FALSE, err); - - g_object_unref(ent); - g_object_unref(child); - - if (error_is_set(err)) - break; - } - - g_object_unref(ents); -} static void osinfo_loader_process_file(OsinfoLoader *loader, GFile *file, - gboolean ignoreMissing, GError **err) { - GError *error = NULL; - GFileInfo *info = g_file_query_info(file, - "standard::*", - G_FILE_QUERY_INFO_NONE, - NULL, - &error); - const char *name; + const gchar *name = g_file_get_basename(file); + + if (g_str_has_suffix(name, ".xml")) + osinfo_loader_process_file_reg_xml(loader, file, err); + else if (strcmp(name, "usb.ids") == 0) + osinfo_loader_process_file_reg_usb(loader, file, err); + else if (strcmp(name, "pci.ids") == 0) + osinfo_loader_process_file_reg_pci(loader, file, err); +} + +static GList *osinfo_loader_find_files(OsinfoLoader *loader, + GFile *file, + GError **err) +{ + GError *error = NULL; + GFileInfo *child; + GList *files = NULL; + GFileEnumerator *ents = g_file_enumerate_children(file, + "standard::*", + G_FILE_QUERY_INFO_NONE, + NULL, + &error); if (error) { - if (ignoreMissing && - (error->code == G_IO_ERROR_NOT_FOUND)) { + if (error->code == G_IO_ERROR_NOT_FOUND) { g_error_free(error); - return; + return NULL; } g_propagate_error(err, error); - return; + return NULL; } - name = g_file_info_get_name(info); - - GFileType type = g_file_info_get_attribute_uint32(info, - G_FILE_ATTRIBUTE_STANDARD_TYPE); - - switch (type) { - case G_FILE_TYPE_REGULAR: - if (g_str_has_suffix(name, ".xml")) - osinfo_loader_process_file_reg_xml(loader, file, info, &error); - else if (strcmp(name, "usb.ids") == 0) - osinfo_loader_process_file_reg_usb(loader, file, info, &error); - else if (strcmp(name, "pci.ids") == 0) - osinfo_loader_process_file_reg_pci(loader, file, info, &error); - break; - - case G_FILE_TYPE_DIRECTORY: - osinfo_loader_process_file_dir(loader, file, info, &error); - break; + while ((child = g_file_enumerator_next_file(ents, NULL, err)) != NULL) { + const gchar *name = g_file_info_get_name(child); + GFile *ent = g_file_get_child(file, name); + GFileType type = g_file_info_get_attribute_uint32(child, + G_FILE_ATTRIBUTE_STANDARD_TYPE); + if (type == G_FILE_TYPE_REGULAR) { + if (g_str_has_suffix(name, ".xml") || + g_str_equal(name, "usb.ids") || + g_str_equal(name, "pci.ids")) + files = g_list_append(files, g_object_ref(ent)); + } else if (type == G_FILE_TYPE_DIRECTORY) { + GList *subfiles = osinfo_loader_find_files(loader, ent, &error); + if (subfiles) { + files = g_list_concat(files, subfiles); + } + } + g_object_unref(ent); + g_object_unref(child); - default: - break; + if (error) { + g_list_foreach(files, (GFunc)g_object_unref, NULL); + g_list_free(files); + return NULL; + } } - g_object_unref(info); - - if (error) - g_propagate_error(err, error); + g_object_unref(ents); + return files; } @@ -1858,15 +1830,29 @@ static void osinfo_loader_process_list(OsinfoLoader *loader, gpointer key, value; while (dirs && *dirs) { - osinfo_loader_process_file(loader, - *dirs, - TRUE, - &lerr); + GList *files = osinfo_loader_find_files(loader, *dirs, &lerr); + GList *tmp; if (lerr) { g_propagate_error(err, lerr); return; } + tmp = files; + while (tmp) { + osinfo_loader_process_file(loader, tmp->data, &lerr); + if (lerr) { + g_propagate_error(err, lerr); + break; + } + tmp = tmp->next; + } + g_list_foreach(files, (GFunc)g_object_unref, NULL); + g_list_free(files); + + if (lerr) { + break; + } + dirs++; } diff --git a/test/Makefile.am b/test/Makefile.am index 7c76861..5c05162 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,5 @@ -EXTRA_DIST = isodata dbdata test-os.xml +EXTRA_DIST = isodata dbdata check_PROGRAMS = \ test-entity \ diff --git a/test/dbdata/oses/test-os-data.xml b/test/dbdata/oses/test-os-data.xml index 88ef431..1e6494e 100644 --- a/test/dbdata/oses/test-os-data.xml +++ b/test/dbdata/oses/test-os-data.xml @@ -20,4 +20,32 @@ <initrd>isolinux/initrd.img</initrd> </media> </os> + + <os id="http://libosinfo.org/test/os/test1"> + <short-id>test1</short-id> + <name>Test 1</name> + <version>unknown</version> + <vendor>libosinfo.org</vendor> + <family>test</family> + <release-status>prerelease</release-status> + </os> + + <os id="http://libosinfo.org/test/os/test2"> + <short-id>test2</short-id> + <release-status>released</release-status> + </os> + + <os id="http://libosinfo.org/test/os/test3"> + <short-id>test3</short-id> + </os> + + <os id="http://libosinfo.org/test/os/test4"> + <short-id>test4</short-id> + <release-status>snapshot</release-status> + </os> + + <os id="http://libosinfo.org/test/os/test5"> + <short-id>test5</short-id> + <release-status>invalid-value</release-status> + </os> </libosinfo> diff --git a/test/test-os.c b/test/test-os.c index 48ad8ac..8ee2403 100644 --- a/test/test-os.c +++ b/test/test-os.c @@ -72,7 +72,7 @@ START_TEST(test_loader) const char *str; loader = osinfo_loader_new(); - osinfo_loader_process_path(loader, SRCDIR "/test/test-os.xml", &error); + osinfo_loader_process_path(loader, SRCDIR "/test/dbdata", &error); fail_unless(error == NULL, error ? error->message:"none"); db = osinfo_loader_get_db(loader); diff --git a/test/test-os.xml b/test/test-os.xml deleted file mode 100644 index 883fe58..0000000 --- a/test/test-os.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<libosinfo version="0.0.1"> - - <os id="http://libosinfo.org/test/os/test1"> - <short-id>test1</short-id> - <name>Test 1</name> - <version>unknown</version> - <vendor>libosinfo.org</vendor> - <family>test</family> - <release-status>prerelease</release-status> - </os> - - <os id="http://libosinfo.org/test/os/test2"> - <short-id>test2</short-id> - <release-status>released</release-status> - </os> - - <os id="http://libosinfo.org/test/os/test3"> - <short-id>test3</short-id> - </os> - - <os id="http://libosinfo.org/test/os/test4"> - <short-id>test4</short-id> - <release-status>snapshot</release-status> - </os> - - <os id="http://libosinfo.org/test/os/test5"> - <short-id>test5</short-id> - <release-status>invalid-value</release-status> - </os> -</libosinfo> -- 2.4.3 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo