diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2014-03-22 23:09:11 +0100 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2014-05-08 12:46:21 +0100 |
commit | 32904b79a0694988b57859b02e768f71a938ea78 (patch) | |
tree | 8eba25bb6cbe493aa960bb06c0afd58c3bdfccac | |
parent | 983e701c9234203f3d2623dd3b80575e5afddc62 (diff) | |
download | tracker-32904b79a0694988b57859b02e768f71a938ea78.tar.gz |
libtracker-miner: Make crawler take a maximum recursion depth
TrackerCrawler gets now the maximum depth to recurse into as a parameter
to tracker_crawler_start(), this can be used to divide crawling into
units bigger than individual folders. A value of -1 can be passed
to have it recurse with no restrictions as with the previous recurse=TRUE
argument.
-rw-r--r-- | src/libtracker-miner/tracker-crawler.c | 35 | ||||
-rw-r--r-- | src/libtracker-miner/tracker-crawler.h | 2 | ||||
-rw-r--r-- | src/libtracker-miner/tracker-file-notifier.c | 2 | ||||
-rw-r--r-- | tests/libtracker-miner/tracker-crawler-test.c | 14 |
4 files changed, 22 insertions, 31 deletions
diff --git a/src/libtracker-miner/tracker-crawler.c b/src/libtracker-miner/tracker-crawler.c index 0978996a9..d4a1dbaad 100644 --- a/src/libtracker-miner/tracker-crawler.c +++ b/src/libtracker-miner/tracker-crawler.c @@ -55,7 +55,7 @@ struct DirectoryProcessingData { struct DirectoryRootInfo { GFile *directory; GNode *tree; - guint recurse : 1; + gint max_depth; GQueue *directory_processing_queue; @@ -79,8 +79,6 @@ struct TrackerCrawlerPrivate { gchar *file_attributes; - gboolean recurse; - /* Statistics */ GTimer *timer; @@ -370,9 +368,9 @@ directory_processing_data_add_child (DirectoryProcessingData *data, } static DirectoryRootInfo * -directory_root_info_new (GFile *file, - gboolean recurse, - gchar *file_attributes) +directory_root_info_new (GFile *file, + gint max_depth, + gchar *file_attributes) { DirectoryRootInfo *info; DirectoryProcessingData *dir_info; @@ -380,7 +378,7 @@ directory_root_info_new (GFile *file, info = g_slice_new0 (DirectoryRootInfo); info->directory = g_object_ref (file); - info->recurse = recurse; + info->max_depth = max_depth; info->directory_processing_queue = g_queue_new (); info->tree = g_node_new (g_object_ref (file)); @@ -461,19 +459,13 @@ process_func (gpointer data) } if (dir_data) { - /* One directory inside the tree hierarchy is being inspected */ - if (!dir_data->was_inspected) { - gboolean iterate; + gint depth = g_node_depth (dir_data->node) - 1; + gboolean iterate; - if (G_NODE_IS_ROOT (dir_data->node)) { - iterate = check_directory (crawler, info, dir_data->node->data); - } else { - /* Directory has been already checked in the block below, so - * so obey the settings for the current directory root. - */ - iterate = info->recurse; - } + iterate = (info->max_depth >= 0) ? depth < info->max_depth : TRUE; + /* One directory inside the tree hierarchy is being inspected */ + if (!dir_data->was_inspected) { dir_data->was_inspected = TRUE; /* Crawler may have been already stopped while we were waiting for the @@ -511,7 +503,7 @@ process_func (gpointer data) g_object_ref (child_data->child)); } - if (info->recurse && priv->is_running && + if (iterate && priv->is_running && child_node && child_data->is_dir) { DirectoryProcessingData *child_dir_data; @@ -839,7 +831,7 @@ file_enumerate_children (TrackerCrawler *crawler, gboolean tracker_crawler_start (TrackerCrawler *crawler, GFile *file, - gboolean recurse) + gint max_depth) { TrackerCrawlerPrivate *priv; DirectoryRootInfo *info; @@ -857,7 +849,6 @@ tracker_crawler_start (TrackerCrawler *crawler, } priv->was_started = TRUE; - priv->recurse = recurse; /* Time the event */ if (priv->timer) { @@ -874,7 +865,7 @@ tracker_crawler_start (TrackerCrawler *crawler, priv->is_running = TRUE; priv->is_finished = FALSE; - info = directory_root_info_new (file, recurse, priv->file_attributes); + info = directory_root_info_new (file, max_depth, priv->file_attributes); g_queue_push_tail (priv->directories, info); process_func_start (crawler); diff --git a/src/libtracker-miner/tracker-crawler.h b/src/libtracker-miner/tracker-crawler.h index 1bae0f601..669343fbe 100644 --- a/src/libtracker-miner/tracker-crawler.h +++ b/src/libtracker-miner/tracker-crawler.h @@ -73,7 +73,7 @@ GType tracker_crawler_get_type (void); TrackerCrawler *tracker_crawler_new (void); gboolean tracker_crawler_start (TrackerCrawler *crawler, GFile *file, - gboolean recurse); + gint max_depth); void tracker_crawler_stop (TrackerCrawler *crawler); void tracker_crawler_pause (TrackerCrawler *crawler); void tracker_crawler_resume (TrackerCrawler *crawler); diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c index 96b8c1adf..fdfda92b2 100644 --- a/src/libtracker-miner/tracker-file-notifier.c +++ b/src/libtracker-miner/tracker-file-notifier.c @@ -596,7 +596,7 @@ crawl_directories_start (TrackerFileNotifier *notifier) if ((flags & TRACKER_DIRECTORY_FLAG_IGNORE) == 0 && tracker_crawler_start (priv->crawler, directory, - (flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0)) { + (flags & TRACKER_DIRECTORY_FLAG_RECURSE) ? -1 : 1)) { gchar *uri; sparql_file_query_start (notifier, directory, diff --git a/tests/libtracker-miner/tracker-crawler-test.c b/tests/libtracker-miner/tracker-crawler-test.c index 69a9630c6..4f44edeeb 100644 --- a/tests/libtracker-miner/tracker-crawler-test.c +++ b/tests/libtracker-miner/tracker-crawler-test.c @@ -126,7 +126,7 @@ test_crawler_crawl (void) file = g_file_new_for_path (TEST_DATA_DIR); - started = tracker_crawler_start (crawler, file, TRUE); + started = tracker_crawler_start (crawler, file, -1); g_assert_cmpint (started, ==, 1); @@ -153,7 +153,7 @@ test_crawler_crawl_interrupted (void) file = g_file_new_for_path (TEST_DATA_DIR); - started = tracker_crawler_start (crawler, file, TRUE); + started = tracker_crawler_start (crawler, file, -1); g_assert_cmpint (started, ==, 1); @@ -175,7 +175,7 @@ test_crawler_crawl_nonexisting (void) crawler = tracker_crawler_new (); file = g_file_new_for_path (TEST_DATA_DIR "-idontexist"); - started = tracker_crawler_start (crawler, file, TRUE); + started = tracker_crawler_start (crawler, file, -1); g_assert_cmpint (started, ==, 0); @@ -200,7 +200,7 @@ test_crawler_crawl_recursive (void) file = g_file_new_for_path (TEST_DATA_DIR); - tracker_crawler_start (crawler, file, TRUE); + tracker_crawler_start (crawler, file, -1); g_main_loop_run (test.main_loop); @@ -232,7 +232,7 @@ test_crawler_crawl_non_recursive (void) file = g_file_new_for_path (TEST_DATA_DIR); - tracker_crawler_start (crawler, file, FALSE); + tracker_crawler_start (crawler, file, 1); g_main_loop_run (test.main_loop); @@ -270,7 +270,7 @@ test_crawler_crawl_n_signals (void) file = g_file_new_for_path (TEST_DATA_DIR); - tracker_crawler_start (crawler, file, TRUE); + tracker_crawler_start (crawler, file, -1); g_main_loop_run (test.main_loop); @@ -308,7 +308,7 @@ test_crawler_crawl_n_signals_non_recursive (void) file = g_file_new_for_path (TEST_DATA_DIR); - tracker_crawler_start (crawler, file, FALSE); + tracker_crawler_start (crawler, file, 1); g_main_loop_run (test.main_loop); |