[Libosinfo] [PATCH v3 55/60] loader: re-arrange code for loading list of directories

Daniel P. Berrange berrange at redhat.com
Mon Oct 12 17:11:16 UTC 2015


Re-arrange the loading code so that there is a single helper
method that takes an array of GFile * to load. This will
facilitate future code for handling overrides between
directories.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 osinfo/osinfo_loader.c | 128 ++++++++++++++++++++++++++++---------------------
 1 file changed, 73 insertions(+), 55 deletions(-)

diff --git a/osinfo/osinfo_loader.c b/osinfo/osinfo_loader.c
index 1c35a3c..b9e47ed 100644
--- a/osinfo/osinfo_loader.c
+++ b/osinfo/osinfo_loader.c
@@ -1848,6 +1848,36 @@ osinfo_loader_process_file(OsinfoLoader *loader,
         g_propagate_error(err, error);
 }
 
+
+static void osinfo_loader_process_list(OsinfoLoader *loader,
+                                       GFile **dirs,
+                                       GError **err)
+{
+    GError *lerr = NULL;
+    GHashTableIter iter;
+    gpointer key, value;
+
+    while (dirs && *dirs) {
+        osinfo_loader_process_file(loader,
+                                   *dirs,
+                                   TRUE,
+                                   &lerr);
+        if (lerr) {
+            g_propagate_error(err, lerr);
+            return;
+        }
+
+        dirs++;
+    }
+
+    g_hash_table_iter_init(&iter, loader->priv->entity_refs);
+    while (g_hash_table_iter_next(&iter, &key, &value)) {
+        g_warning("Entity %s referenced but not defined", (const char *)key);
+    }
+    g_hash_table_remove_all(loader->priv->entity_refs);
+}
+
+
 /**
  * osinfo_loader_get_db:
  * @loader: the loader object
@@ -1878,12 +1908,12 @@ void osinfo_loader_process_path(OsinfoLoader *loader,
                                 const gchar *path,
                                 GError **err)
 {
-    GFile *file = g_file_new_for_path(path);
-    osinfo_loader_process_file(loader,
-                               file,
-                               FALSE,
-                               err);
-    g_object_unref(file);
+    GFile *dirs[] = {
+        g_file_new_for_path(path),
+        NULL,
+    };
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
 }
 
 /**
@@ -1901,12 +1931,12 @@ void osinfo_loader_process_uri(OsinfoLoader *loader,
                                const gchar *uri,
                                GError **err)
 {
-    GFile *file = g_file_new_for_uri(uri);
-    osinfo_loader_process_file(loader,
-                               file,
-                               FALSE,
-                               err);
-    g_object_unref(file);
+    GFile *dirs[] = {
+        g_file_new_for_uri(uri),
+        NULL,
+    };
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
 }
 
 
@@ -1943,32 +1973,17 @@ static GFile *osinfo_loader_get_user_path(void)
 
 void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err)
 {
-    GError *error = NULL;
-
-    osinfo_loader_process_system_path(loader, &error);
-    if (error)
-        goto error;
-
-    osinfo_loader_process_local_path(loader, &error);
-    if (error)
-        goto error;
-
-    osinfo_loader_process_user_path(loader, &error);
-    if (error)
-        goto error;
-
-    GHashTableIter iter;
-    gpointer key, value;
-    g_hash_table_iter_init(&iter, loader->priv->entity_refs);
-    while (g_hash_table_iter_next(&iter, &key, &value)) {
-        g_warning("Entity %s referenced but not defined", (const char *)key);
-    }
-    g_hash_table_remove_all(loader->priv->entity_refs);
-    return;
+    GFile *dirs[] = {
+        osinfo_loader_get_system_path(),
+        osinfo_loader_get_local_path(),
+        osinfo_loader_get_user_path(),
+        NULL,
+    };
 
- error:
-    g_propagate_error(err, error);
-    return;
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
+    g_object_unref(dirs[1]);
+    g_object_unref(dirs[2]);
 }
 
 /**
@@ -1981,32 +1996,35 @@ void osinfo_loader_process_default_path(OsinfoLoader *loader, GError **err)
 void osinfo_loader_process_system_path(OsinfoLoader *loader,
                                        GError **err)
 {
-    GFile *file = osinfo_loader_get_system_path();
-    osinfo_loader_process_file(loader,
-                               file,
-                               FALSE,
-                               err);
-    g_object_unref(file);
+    GFile *dirs[] = {
+        osinfo_loader_get_system_path(),
+        NULL,
+    };
+
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
 }
 
 void osinfo_loader_process_local_path(OsinfoLoader *loader, GError **err)
 {
-    GFile *file = osinfo_loader_get_local_path();
-    osinfo_loader_process_file(loader,
-                               file,
-                               TRUE,
-                               err);
-    g_object_unref(file);
+    GFile *dirs[] = {
+        osinfo_loader_get_local_path(),
+        NULL,
+    };
+
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
 }
 
 void osinfo_loader_process_user_path(OsinfoLoader *loader, GError **err)
 {
-    GFile *file = osinfo_loader_get_user_path();
-    osinfo_loader_process_file(loader,
-                               file,
-                               TRUE,
-                               err);
-    g_object_unref(file);
+    GFile *dirs[] = {
+        osinfo_loader_get_user_path(),
+        NULL,
+    };
+
+    osinfo_loader_process_list(loader, dirs, err);
+    g_object_unref(dirs[0]);
 }
 
 /*
-- 
2.4.3




More information about the Libosinfo mailing list