[tracker] Do volumes initialization in a more efficient manner.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] Do volumes initialization in a more efficient manner.
- Date: Wed, 29 Jul 2009 13:04:54 +0000 (UTC)
commit 5becd284ff2772b98638b81da467de52ec33e8d6
Author: Carlos Garnacho <carlos lanedo com>
Date: Wed Jul 29 15:01:31 2009 +0200
Do volumes initialization in a more efficient manner.
Now tracker-miner-fs gets a list of mounted volumes, according to both HAL and
tracker-store, then does the diff and just updates state of changed volumes.
src/tracker-miner-fs/tracker-indexer.c | 151 ++++++++++++++++++++++----------
1 files changed, 105 insertions(+), 46 deletions(-)
---
diff --git a/src/tracker-miner-fs/tracker-indexer.c b/src/tracker-miner-fs/tracker-indexer.c
index 523b033..9843be2 100644
--- a/src/tracker-miner-fs/tracker-indexer.c
+++ b/src/tracker-miner-fs/tracker-indexer.c
@@ -179,6 +179,11 @@ enum TrackerIndexerState {
};
enum {
+ VOLUME_MOUNTED_IN_STORE = 1 << 0,
+ VOLUME_MOUNTED = 1 << 1
+};
+
+enum {
PROP_0,
PROP_CONFIG,
PROP_STORAGE,
@@ -820,7 +825,8 @@ static void
set_up_mount_point (TrackerIndexer *indexer,
const gchar *removable_device_urn,
const gchar *mount_point,
- gboolean mounted)
+ gboolean mounted,
+ GString *accumulator)
{
GString *queries;
GError *error = NULL;
@@ -871,14 +877,19 @@ set_up_mount_point (TrackerIndexer *indexer,
g_free (now);
}
- tracker_resources_batch_sparql_update (indexer->private->client, queries->str, &error);
- g_string_free (queries, TRUE);
+ if (accumulator) {
+ g_string_append_printf (accumulator, "%s ", queries->str);
+ } else {
+ tracker_resources_sparql_update (indexer->private->client, queries->str, &error);
- if (error) {
- g_critical ("Could not set up mount point '%s': %s",
- removable_device_urn, error->message);
- g_error_free (error);
+ if (error) {
+ g_critical ("Could not set up mount point '%s': %s",
+ removable_device_urn, error->message);
+ g_error_free (error);
+ }
}
+
+ g_string_free (queries, TRUE);
}
static void
@@ -895,8 +906,7 @@ mount_point_added_cb (TrackerStorage *storage,
indexer = TRACKER_INDEXER (user_data);
urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
- set_up_mount_point (indexer, urn, mount_point, TRUE);
- tracker_resources_batch_commit (indexer->private->client, NULL);
+ set_up_mount_point (indexer, urn, mount_point, TRUE, NULL);
g_free (urn);
}
@@ -914,74 +924,123 @@ mount_point_removed_cb (TrackerStorage *storage,
indexer = TRACKER_INDEXER (user_data);
urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
- set_up_mount_point (indexer, urn, mount_point, FALSE);
- tracker_resources_batch_commit (indexer->private->client, NULL);
+ set_up_mount_point (indexer, urn, mount_point, FALSE, NULL);
g_free (urn);
}
static void
-disable_all_mount_points (TrackerIndexer *indexer)
+init_mount_points (TrackerIndexer *indexer)
{
- GString *queries;
+ GHashTable *volumes;
+ GHashTableIter iter;
+ gpointer key, value;
+ GPtrArray *sparql_result;
GError *error = NULL;
+ GString *accumulator;
+ gint i;
+#ifdef HAVE_HAL
+ GList *udis, *u;
+#endif
- g_debug ("Disabling all mount points");
-
- queries = g_string_new (NULL);
-
- /* FIXME: no need to remove tracker:available for files in non removable media */
- g_string_append (queries,
- "DELETE { ?do tracker:available true } WHERE { ?do nie:dataSource ?u } ");
-
- g_string_append (queries,
- "DELETE { ?o tracker:isMounted ?d } WHERE { ?o tracker:isMounted ?d "
- "FILTER (?o != <" TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN ">) } ");
+ g_debug ("Initializing mount points");
- g_string_append (queries,
- "INSERT { ?o a tracker:Volume; tracker:isMounted false } WHERE { ?o a tracker:Volume "
- "FILTER (?o != <" TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN ">) }");
+ volumes = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ NULL);
- tracker_resources_batch_sparql_update (indexer->private->client, queries->str, &error);
- g_string_free (queries, TRUE);
+ /* First, get all mounted volumes, according to tracker-store */
+ sparql_result = tracker_resources_sparql_query (indexer->private->client,
+ "SELECT ?v WHERE { ?v a tracker:Volume ; tracker:isMounted true }",
+ &error);
if (error) {
- g_critical ("Could not disable all mount points: %s", error->message);
+ g_critical ("Could not obtain the mounted volumes");
g_error_free (error);
+ return;
}
-}
-static void
-init_mount_points (TrackerIndexer *indexer)
-{
-#ifdef HAVE_HAL
- GList *udis, *u;
-#endif
+ for (i = 0; i < sparql_result->len; i++) {
+ gchar **row;
+ gint state;
- disable_all_mount_points (indexer);
+ row = g_ptr_array_index (sparql_result, i);
+ state = VOLUME_MOUNTED_IN_STORE;
- /* set up root mount point */
- set_up_mount_point (indexer,
- TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN,
- NULL, TRUE);
+ if (strcmp (row[0], TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN) == 0) {
+ /* Report non-removable media to be mounted by HAL as well */
+ state |= VOLUME_MOUNTED;
+ }
+
+ g_hash_table_insert (volumes, g_strdup (row[0]), GINT_TO_POINTER (state));
+ }
+
+ g_ptr_array_foreach (sparql_result, (GFunc) g_strfreev, NULL);
+ g_ptr_array_free (sparql_result, TRUE);
#ifdef HAVE_HAL
udis = tracker_storage_get_removable_device_udis (indexer->private->storage);
+ /* Then, get all currently mounted volumes, according to HAL */
for (u = udis; u; u = u->next) {
+ const gchar *udi;
gchar *removable_device_urn;
- const gchar *udi, *mount_point;
+ gint state;
udi = u->data;
- mount_point = tracker_storage_udi_get_mount_point (indexer->private->storage, udi);
removable_device_urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
- set_up_mount_point (indexer, removable_device_urn, mount_point, TRUE);
+ state = GPOINTER_TO_INT (g_hash_table_lookup (volumes, removable_device_urn));
+ state |= VOLUME_MOUNTED;
- g_free (removable_device_urn);
+ g_hash_table_replace (volumes, removable_device_urn, GINT_TO_POINTER (state));
}
g_list_free (udis);
#endif
+
+ accumulator = g_string_new (NULL);
+ g_hash_table_iter_init (&iter, volumes);
+
+ /* Finally, set up volumes based on the composed info */
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ const gchar *urn = key;
+ gint state = GPOINTER_TO_INT (value);
+
+ if ((state & VOLUME_MOUNTED) &&
+ !(state & VOLUME_MOUNTED_IN_STORE)) {
+ const gchar *mount_point = NULL;
+
+#ifdef HAVE_HAL
+ if (g_str_has_prefix (urn, TRACKER_DATASOURCE_URN_PREFIX)) {
+ const gchar *udi;
+
+ udi = urn + strlen (TRACKER_DATASOURCE_URN_PREFIX);
+ mount_point = tracker_storage_udi_get_mount_point (indexer->private->storage, udi);
+ }
+#endif
+
+ g_debug ("URN '%s' (mount point: %s) was not reported to be mounted, but now it is, updating state",
+ mount_point, urn);
+ set_up_mount_point (indexer, urn, mount_point, TRUE, accumulator);
+ } else if (!(state & VOLUME_MOUNTED) &&
+ (state & VOLUME_MOUNTED_IN_STORE)) {
+ g_debug ("URN '%s' was reported to be mounted, but it isn't anymore, updating state", urn);
+ set_up_mount_point (indexer, urn, NULL, FALSE, accumulator);
+ }
+ }
+
+ if (accumulator->str[0] != '\0') {
+ tracker_resources_sparql_update (indexer->private->client, accumulator->str, &error);
+
+ if (error) {
+ g_critical ("Could not initialize currently active mount points: %s",
+ error->message);
+ g_error_free (error);
+ }
+ }
+
+ g_string_free (accumulator, TRUE);
+ g_hash_table_destroy (volumes);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]