[tracker/urn-cache: 3/5] TrackerMinerFS: Add GFile->urn cache.



commit 8916e65f7584acb2b32aa21f686387913d78b384
Author: Carlos Garnacho <carlos lanedo com>
Date:   Tue Feb 16 15:08:37 2010 +0100

    TrackerMinerFS: Add GFile->urn cache.
    
    Although anonymous, URNs are supposed to be static during
    a file lifetime. tracker_miner_fs_get_urn() has been added
    to let implementations query and cache the URN for a GFile.
    This cache is cleared on TrackerMinerFS::finished, so memory
    usage doesn't grow indefinitely.

 src/libtracker-miner/tracker-miner-fs.c |   41 ++++++++++++++++++++++++++++++-
 src/libtracker-miner/tracker-miner-fs.h |    3 ++
 2 files changed, 43 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index 2b8dc6d..633e796 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -100,6 +100,9 @@ struct TrackerMinerFSPrivate {
 	GList          *processing_pool;
 	guint           pool_limit;
 
+	/* GFile -> URN cache */
+	GHashTable     *file_urn_cache;
+
 	/* Status */
 	guint           been_started : 1;
 	guint           been_crawled : 1;
@@ -487,6 +490,12 @@ tracker_miner_fs_init (TrackerMinerFS *object)
 	                  G_CALLBACK (monitor_item_moved_cb),
 	                  object);
 
+	/* Set up GFile->urn cache */
+	priv->file_urn_cache = g_hash_table_new_full (g_file_hash,
+	                                              (GEqualFunc) g_file_equal,
+	                                              (GDestroyNotify) g_object_unref,
+	                                              (GDestroyNotify) g_free);
+
 	priv->quark_ignore_file = g_quark_from_static_string ("tracker-ignore-file");
 }
 
@@ -593,6 +602,8 @@ fs_finalize (GObject *object)
 
 	g_hash_table_unref (priv->items_ignore_next_update);
 
+	g_hash_table_unref (priv->file_urn_cache);
+
 	G_OBJECT_CLASS (tracker_miner_fs_parent_class)->finalize (object);
 }
 
@@ -842,6 +853,8 @@ process_stop (TrackerMinerFS *fs)
 	fs->private->total_files_ignored = 0;
 
 	fs->private->been_crawled = TRUE;
+
+	g_hash_table_remove_all (fs->private->file_urn_cache);
 }
 
 static ItemMovedData *
@@ -955,7 +968,7 @@ item_add_or_update_cb (TrackerMinerFS *fs,
 
 		g_debug ("Adding item '%s'", uri);
 
-		full_sparql = g_strdup_printf ("DROP GRAPH <%s> %s",
+		full_sparql = g_strdup_printf ("DROP GRAPH <%s>\n%s",
 		                               uri, tracker_sparql_builder_get_result (data->builder));
 
 		tracker_miner_execute_batch_update (TRACKER_MINER (fs),
@@ -2512,3 +2525,29 @@ tracker_miner_fs_get_throttle (TrackerMinerFS *fs)
 
 	return fs->private->throttle;
 }
+
+G_CONST_RETURN gchar *
+tracker_miner_fs_get_urn (TrackerMinerFS *fs,
+			  GFile          *file)
+{
+	gchar *urn;
+
+	g_return_val_if_fail (TRACKER_IS_MINER_FS (fs), NULL);
+	g_return_val_if_fail (G_IS_FILE (file), NULL);
+
+	urn = g_hash_table_lookup (fs->private->file_urn_cache, file);
+
+	if (urn)
+		return urn;
+
+	if (!item_query_exists (fs, file, &urn, NULL))
+		return NULL;
+
+	if (urn) {
+		g_hash_table_insert (fs->private->file_urn_cache,
+				     g_object_ref (file),
+				     urn);
+	}
+
+	return urn;
+}
diff --git a/src/libtracker-miner/tracker-miner-fs.h b/src/libtracker-miner/tracker-miner-fs.h
index fd2682d..19392b1 100644
--- a/src/libtracker-miner/tracker-miner-fs.h
+++ b/src/libtracker-miner/tracker-miner-fs.h
@@ -104,6 +104,9 @@ void     tracker_miner_fs_set_throttle     (TrackerMinerFS *fs,
                                             gdouble         throttle);
 gdouble  tracker_miner_fs_get_throttle     (TrackerMinerFS *fs);
 
+G_CONST_RETURN gchar * tracker_miner_fs_get_urn (TrackerMinerFS *fs,
+						 GFile          *file);
+
 G_END_DECLS
 
 #endif /* __LIBTRACKERMINER_MINER_FS_H__ */



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