[tracker] libtracker-miner: Simplify deleted contents querying in TrackerFileNotifier
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-miner: Simplify deleted contents querying in TrackerFileNotifier
- Date: Mon, 15 Feb 2016 23:39:13 +0000 (UTC)
commit 1d95241efa341e1b1944dae6cf5f36cce937c702
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Feb 15 21:48:49 2016 +0100
libtracker-miner: Simplify deleted contents querying in TrackerFileNotifier
Now that we perform per-directory crawling+querying, we can just check
whether the currently crawled dir was updated, and remove all filtering
features from sparql_contents_query_start().
We actually were interpreting the filter incorrectly, because the
directories would be added to the updated_dirs array sooner than they
would be crawled, so the check for deleted contents was simply
forgotten. This simplification fixes such situation.
src/libtracker-miner/tracker-file-notifier.c | 60 ++++++++++++-------------
1 files changed, 29 insertions(+), 31 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c
index 6e59ffa..1b47620 100644
--- a/src/libtracker-miner/tracker-file-notifier.c
+++ b/src/libtracker-miner/tracker-file-notifier.c
@@ -59,7 +59,6 @@ typedef struct {
GFile *current_dir;
GQueue *pending_dirs;
GPtrArray *query_files;
- GPtrArray *updated_dirs;
guint flags;
guint directories_found;
guint directories_ignored;
@@ -169,7 +168,6 @@ root_data_new (TrackerFileNotifier *notifier,
data->root = g_object_ref (file);
data->pending_dirs = g_queue_new ();
data->query_files = g_ptr_array_new_with_free_func (g_object_unref);
- data->updated_dirs = g_ptr_array_new ();
data->flags = flags;
g_queue_push_tail (data->pending_dirs, g_object_ref (file));
@@ -182,7 +180,6 @@ root_data_free (RootData *data)
{
g_queue_free_full (data->pending_dirs, (GDestroyNotify) g_object_unref);
g_ptr_array_unref (data->query_files);
- g_ptr_array_unref (data->updated_dirs);
if (data->current_dir) {
g_object_unref (data->current_dir);
}
@@ -277,7 +274,6 @@ file_notifier_traverse_tree_foreach (GFile *file,
TrackerFileNotifierPrivate *priv;
guint64 *store_mtime, *disk_mtime;
GFile *current_root;
- GFileType file_type;
notifier = user_data;
priv = notifier->priv;
@@ -295,7 +291,6 @@ file_notifier_traverse_tree_foreach (GFile *file,
quark_property_store_mtime);
disk_mtime = tracker_file_system_get_property (priv->file_system, file,
quark_property_filesystem_mtime);
- file_type = tracker_file_system_get_file_type (priv->file_system, file);
if (store_mtime && !disk_mtime) {
/* In store but not in disk, delete */
@@ -308,17 +303,6 @@ file_notifier_traverse_tree_foreach (GFile *file,
} else if (store_mtime && disk_mtime && *disk_mtime != *store_mtime) {
/* Mtime changed, update */
g_signal_emit (notifier, signals[FILE_UPDATED], 0, file, FALSE);
-
- if (file_type == G_FILE_TYPE_DIRECTORY) {
- /* A directory has updated its mtime, this means something
- * was either added or removed in the mean time. Crawling
- * will always find all newly added files. But still, we
- * must check the contents in the store to handle contents
- * having been deleted in the directory.
- */
- g_ptr_array_add (priv->current_index_root->updated_dirs,
- file);
- }
} else if (!store_mtime && !disk_mtime) {
/* what are we doing with such file? should happen rarely,
* only with files that we've queried, but we decided not
@@ -385,6 +369,22 @@ file_notifier_traverse_tree (TrackerFileNotifier *notifier, gint max_depth)
}
static gboolean
+file_notifier_is_directory_modified (TrackerFileNotifier *notifier,
+ GFile *file)
+{
+ TrackerFileNotifierPrivate *priv;
+ guint64 *store_mtime, *disk_mtime;
+
+ priv = notifier->priv;
+ store_mtime = tracker_file_system_get_property (priv->file_system, file,
+ quark_property_store_mtime);
+ disk_mtime = tracker_file_system_get_property (priv->file_system, file,
+ quark_property_filesystem_mtime);
+
+ return (store_mtime && disk_mtime && *disk_mtime != *store_mtime);
+}
+
+static gboolean
file_notifier_add_node_foreach (GNode *node,
gpointer user_data)
{
@@ -721,8 +721,7 @@ out:
static gchar *
sparql_contents_compose_query (GFile **directories,
- guint n_dirs,
- GQueue *filter)
+ guint n_dirs)
{
GString *str;
gchar *uri;
@@ -736,9 +735,6 @@ sparql_contents_compose_query (GFile **directories,
" FILTER (?folder = nfo:Folder) } ."
" FILTER (?url IN (");
for (i = 0; i < n_dirs; i++) {
- if (g_queue_find (filter, directories[i]))
- continue;
-
if (!first) {
g_string_append_c (str, ',');
}
@@ -757,8 +753,7 @@ sparql_contents_compose_query (GFile **directories,
static void
sparql_contents_query_start (TrackerFileNotifier *notifier,
GFile **directories,
- guint n_dirs,
- GQueue *filter)
+ guint n_dirs)
{
TrackerFileNotifierPrivate *priv;
gchar *sparql;
@@ -769,7 +764,7 @@ sparql_contents_query_start (TrackerFileNotifier *notifier,
return;
}
- sparql = sparql_contents_compose_query (directories, n_dirs, filter);
+ sparql = sparql_contents_compose_query (directories, n_dirs);
tracker_sparql_connection_query_async (priv->connection,
sparql,
priv->cancellable,
@@ -789,6 +784,7 @@ sparql_files_query_cb (GObject *object,
TrackerFileNotifier *notifier;
TrackerSparqlCursor *cursor;
GError *error = NULL;
+ GFile *directory;
cursor = tracker_sparql_connection_query_finish (TRACKER_SPARQL_CONNECTION (object),
result, &error);
@@ -807,14 +803,16 @@ sparql_files_query_cb (GObject *object,
}
file_notifier_traverse_tree (notifier, data->max_depth);
+ directory = priv->current_index_root->current_dir;
- if (priv->current_index_root->updated_dirs->len > 0) {
- /* Updated directories have been found, check for deleted contents in those */
- sparql_contents_query_start (notifier,
- (GFile**) priv->current_index_root->updated_dirs->pdata,
- priv->current_index_root->updated_dirs->len,
- priv->current_index_root->pending_dirs);
- g_ptr_array_set_size (priv->current_index_root->updated_dirs, 0);
+ if (file_notifier_is_directory_modified (notifier, directory)) {
+ /* The directory has updated its mtime, this means something
+ * was either added or removed in the mean time. Crawling
+ * will always find all newly added files. But still, we
+ * must check the contents in the store to handle contents
+ * having been deleted in the directory.
+ */
+ sparql_contents_query_start (notifier, &directory, 1);
} else {
finish_current_directory (notifier, FALSE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]