[gvfs] Allow MetaTree open to succeed with no file



commit 192d3a7db50e42ad40aea8311e1994f53a1efdc0
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Jun 23 16:27:17 2009 +0200

    Allow MetaTree open to succeed with no file
    
    You can check with meta_tree_exists if the file actually exists.
    This means that lookups work better for the initial set for a non-existing
    file.

 metadata/metatree.c |   23 +++++++++++++++++------
 metadata/metatree.h |    1 +
 2 files changed, 18 insertions(+), 6 deletions(-)
---
diff --git a/metadata/metatree.c b/metadata/metatree.c
index e6fa62b..9664fa8 100644
--- a/metadata/metatree.c
+++ b/metadata/metatree.c
@@ -269,7 +269,7 @@ meta_tree_clear (MetaTree *tree)
     }
 
   tree->len = 0;
-  if (tree->fd != 0)
+  if (tree->fd != -1)
     {
       close (tree->fd);
       tree->fd = 0;
@@ -447,6 +447,7 @@ meta_tree_init (MetaTree *tree)
 	    }
 	  meta_builder_free (builder);
 	}
+      tree->fd = -1;
       return FALSE;
     }
 
@@ -526,12 +527,10 @@ meta_tree_open (const char *filename,
   tree->ref_count = 1;
   tree->filename = g_strdup (filename);
   tree->for_write = for_write;
+  tree->fd = -1;
+
+  meta_tree_init (tree);
 
-  if (!meta_tree_init (tree))
-    {
-      meta_tree_unref (tree);
-      return NULL;
-    }
   return tree;
 }
 
@@ -541,6 +540,12 @@ meta_tree_get_filename (MetaTree *tree)
   return tree->filename;
 }
 
+gboolean
+meta_tree_exists (MetaTree *tree)
+{
+  return tree->fd != -1;
+}
+
 static GHashTable *cached_trees = NULL;
 G_LOCK_DEFINE_STATIC (cached_trees);
 
@@ -607,6 +612,9 @@ meta_tree_unref (MetaTree *tree)
 static gboolean
 meta_tree_needs_rereading (MetaTree *tree)
 {
+  if (tree->fd == -1)
+    return TRUE;
+
   if (tree->header != NULL &&
       GUINT32_FROM_BE (tree->header->rotated) == 0)
     return FALSE; /* Got a valid tree and its not rotated */
@@ -734,6 +742,9 @@ meta_tree_lookup (MetaTree *tree,
   MetaFileDirEnt *dirent;
   char *path_copy;
 
+  if (tree->root == NULL)
+    return NULL;
+
   path_copy = g_strdup (path);
   dirent = dir_lookup_path (tree, tree->root, path_copy);
   g_free (path_copy);
diff --git a/metadata/metatree.h b/metadata/metatree.h
index a5bbab7..325e6fe 100644
--- a/metadata/metatree.h
+++ b/metadata/metatree.h
@@ -40,6 +40,7 @@ MetaTree *  meta_tree_ref            (MetaTree   *tree);
 void        meta_tree_unref          (MetaTree   *tree);
 void        meta_tree_refresh        (MetaTree   *tree);
 const char *meta_tree_get_filename   (MetaTree   *tree);
+gboolean    meta_tree_exists         (MetaTree   *tree);
 
 MetaKeyType meta_tree_lookup_key_type  (MetaTree                         *tree,
 					const char                       *path,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]