[gvfs] Add MetaTree lookup by name
- From: Alexander Larsson <alexl src gnome org>
- To: svn-commits-list gnome org
- Subject: [gvfs] Add MetaTree lookup by name
- Date: Tue, 23 Jun 2009 11:10:17 -0400 (EDT)
commit 9a185243a13620b860ba1ed3601a16a6d2f7c3a1
Author: Alexander Larsson <alexl redhat com>
Date: Mon Jun 22 20:49:30 2009 +0200
Add MetaTree lookup by name
metadata/metatree.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
metadata/metatree.h | 19 +++++++++++--------
2 files changed, 55 insertions(+), 11 deletions(-)
---
diff --git a/metadata/metatree.c b/metadata/metatree.c
index 465d067..1ec73ed 100644
--- a/metadata/metatree.c
+++ b/metadata/metatree.c
@@ -325,6 +325,38 @@ meta_tree_open (const char *filename,
return tree;
}
+static GHashTable *cached_trees = NULL;
+
+MetaTree *
+meta_tree_lookup_by_name (const char *name,
+ gboolean for_write)
+{
+ MetaTree *tree;
+ char *filename;
+
+ if (cached_trees == NULL)
+ cached_trees = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ (GDestroyNotify)g_free,
+ (GDestroyNotify)meta_tree_unref);
+
+ tree = g_hash_table_lookup (cached_trees, name);
+ if (tree && tree->for_write == for_write)
+ {
+ meta_tree_refresh (tree);
+ return meta_tree_ref (tree);
+ }
+
+ filename = g_build_filename (g_get_user_data_dir (), "gvfs-metadata", name, NULL);
+ tree = meta_tree_open (filename, for_write);
+ g_free (filename);
+
+ if (tree)
+ g_hash_table_insert (cached_trees, g_strdup (name), meta_tree_ref (tree));
+
+ return tree;
+}
+
MetaTree *
meta_tree_ref (MetaTree *tree)
{
@@ -2325,7 +2357,9 @@ expand_parents (MetaLookupCache *cache,
MetaTree *
meta_lookup_cache_lookup_path (MetaLookupCache *cache,
const char *filename,
- guint64 device)
+ guint64 device,
+ gboolean for_write,
+ char **tree_path)
{
const char *mountpoint;
const char *treename;
@@ -2334,7 +2368,7 @@ meta_lookup_cache_lookup_path (MetaLookupCache *cache,
static struct HomedirData homedir_data_storage;
static gsize homedir_datap = 0;
struct HomedirData *homedir_data;
- char *extra_prefix;
+ MetaTree *tree;
if (g_once_init_enter (&homedir_datap))
{
@@ -2390,7 +2424,14 @@ meta_lookup_cache_lookup_path (MetaLookupCache *cache,
}
found:
- g_print ("Found tree %s:%s\n", treename, prefix);
+ tree = meta_tree_lookup_by_name (treename, for_write);
+
+ if (tree)
+ {
+ *tree_path = prefix;
+ return tree;
+ }
+ g_free (prefix);
return NULL;
}
diff --git a/metadata/metatree.h b/metadata/metatree.h
index 734412c..e36fc69 100644
--- a/metadata/metatree.h
+++ b/metadata/metatree.h
@@ -24,14 +24,17 @@ MetaLookupCache *meta_lookup_cache_new (void);
void meta_lookup_cache_free (MetaLookupCache *cache);
MetaTree *meta_lookup_cache_lookup_path (MetaLookupCache *cache,
const char *filename,
- guint64 device);
-
-MetaTree *meta_tree_open (const char *filename,
- gboolean for_write);
-MetaTree *meta_tree_ref (MetaTree *tree);
-void meta_tree_unref (MetaTree *tree);
-void meta_tree_refresh (MetaTree *tree); /* May invalidates all strings */
+ guint64 device,
+ gboolean for_write,
+ char **tree_path);
+MetaTree *meta_tree_open (const char *filename,
+ gboolean for_write);
+MetaTree *meta_tree_lookup_by_name (const char *name,
+ gboolean for_write);
+MetaTree *meta_tree_ref (MetaTree *tree);
+void meta_tree_unref (MetaTree *tree);
+void meta_tree_refresh (MetaTree *tree); /* May invalidates all strings */
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]