[Libosinfo] [PATCH v3 56/60] loader: rewrite loader to separate file enumeration from loading
Christophe Fergeau
cfergeau at redhat.com
Fri Oct 16 11:03:32 UTC 2015
On Mon, Oct 12, 2015 at 06:11:17PM +0100, Daniel P. Berrange wrote:
> 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
"to the way we enumerate" ? Current wording looks odd to me.
Seems fine otherwise.
Christophe
> multiple directories.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> 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 at redhat.com
> https://www.redhat.com/mailman/listinfo/libosinfo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libosinfo/attachments/20151016/f4cd5f69/attachment.sig>
More information about the Libosinfo
mailing list