From b8d567197d9bc9cf371853d3a9863e8b376b7d1d Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 5 Jan 2015 16:58:36 +0100 Subject: [PATCH] miners: Detect locale changes only when the miner could be constructed https://bugzilla.gnome.org/show_bug.cgi?id=742391 --- src/miners/apps/tracker-miner-applications.c | 320 ++++++++++----------- src/miners/user-guides/tracker-miner-user-guides.c | 234 ++++++++------- 2 files changed, 273 insertions(+), 281 deletions(-) diff --git a/src/miners/apps/tracker-miner-applications.c b/src/miners/apps/tracker-miner-applications.c index 1c9288e..a01d3dd 100644 --- a/src/miners/apps/tracker-miner-applications.c +++ b/src/miners/apps/tracker-miner-applications.c @@ -196,6 +196,154 @@ miner_finished_cb (TrackerMinerFS *fs, g_free (locale_file); } +/* If a reset is requested, we will remove from the store all items previously + * inserted by the tracker-miner-applications, this is: + * (a) all elements which are nfo:softwareIcon of a given nfo:Software + * (b) all nfo:Software in our graph (includes both applications and maemo applets) + * (c) all elements which are nfo:softwareCategoryIcon of a given nfo:SoftwareCategory + * (d) all nfo:SoftwareCategory in our graph + */ +static void +miner_applications_reset (TrackerMiner *miner) +{ + GError *error = NULL; + TrackerSparqlBuilder *sparql; + + sparql = tracker_sparql_builder_new_update (); + + /* (a) all elements which are nfo:softwareIcon of a given nfo:Software */ + tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); + tracker_sparql_builder_subject_variable (sparql, "icon"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "rdfs:Resource"); + tracker_sparql_builder_delete_close (sparql); + + tracker_sparql_builder_where_open (sparql); + tracker_sparql_builder_subject_variable (sparql, "software"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "nfo:Software"); + tracker_sparql_builder_subject_variable (sparql, "icon"); + tracker_sparql_builder_predicate (sparql, "nfo:softwareIcon"); + tracker_sparql_builder_object_variable (sparql, "software"); + tracker_sparql_builder_where_close (sparql); + + /* (b) all nfo:Software in our graph (includes both applications and maemo applets) */ + tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); + tracker_sparql_builder_subject_variable (sparql, "software"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "rdfs:Resource"); + tracker_sparql_builder_delete_close (sparql); + + tracker_sparql_builder_where_open (sparql); + tracker_sparql_builder_subject_variable (sparql, "software"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "nfo:Software"); + tracker_sparql_builder_where_close (sparql); + + /* (c) all elements which are nfo:softwareCategoryIcon of a given nfo:SoftwareCategory */ + tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); + tracker_sparql_builder_subject_variable (sparql, "icon"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "rdfs:Resource"); + tracker_sparql_builder_delete_close (sparql); + + tracker_sparql_builder_where_open (sparql); + tracker_sparql_builder_subject_variable (sparql, "category"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "nfo:SoftwareCategory"); + tracker_sparql_builder_subject_variable (sparql, "icon"); + tracker_sparql_builder_predicate (sparql, "nfo:softwareCategoryIcon"); + tracker_sparql_builder_object_variable (sparql, "category"); + tracker_sparql_builder_where_close (sparql); + + /* (d) all nfo:SoftwareCategory in our graph */ + tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); + tracker_sparql_builder_subject_variable (sparql, "category"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "rdfs:Resource"); + tracker_sparql_builder_delete_close (sparql); + + tracker_sparql_builder_where_open (sparql); + tracker_sparql_builder_subject_variable (sparql, "category"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "nfo:SoftwareCategory"); + tracker_sparql_builder_where_close (sparql); + + /* Execute a sync update, we don't want the apps miner to start before + * we finish this. */ + tracker_sparql_connection_update (tracker_miner_get_connection (miner), + tracker_sparql_builder_get_result (sparql), + G_PRIORITY_HIGH, + NULL, + &error); + + if (error) { + /* Some error happened performing the query, not good */ + g_critical ("Couldn't reset mined applications: %s", + error ? error->message : "unknown error"); + g_error_free (error); + } + + g_object_unref (sparql); +} + +static gboolean +detect_locale_changed (TrackerMiner *miner) +{ + gchar *locale_file; + gchar *previous_locale = NULL; + gchar *current_locale; + gboolean changed; + + locale_file = g_build_filename (g_get_user_cache_dir (), "tracker", LOCALE_FILENAME, NULL); + + if (G_LIKELY (g_file_test (locale_file, G_FILE_TEST_EXISTS))) { + gchar *contents; + + /* Check locale is correct */ + if (G_LIKELY (g_file_get_contents (locale_file, &contents, NULL, NULL))) { + if (contents && + contents[0] == '\0') { + g_critical (" Empty locale file found at '%s'", locale_file); + g_free (contents); + } else { + /* Re-use contents */ + previous_locale = contents; + } + } else { + g_critical (" Could not get content of file '%s'", locale_file); + } + } else { + g_message (" Could not find locale file:'%s'", locale_file); + } + + g_free (locale_file); + + current_locale = tracker_locale_get (TRACKER_LOCALE_LANGUAGE); + + /* Note that having both to NULL is actually valid, they would default + * to the unicode collation without locale-specific stuff. */ + if (g_strcmp0 (previous_locale, current_locale) != 0) { + g_message ("Locale change detected from '%s' to '%s'...", + previous_locale, current_locale); + changed = TRUE; + } else { + g_message ("Current and previous locales match: '%s'", previous_locale); + changed = FALSE; + } + + g_free (current_locale); + g_free (previous_locale); + + if (changed) { + g_message ("Locale change detected, so resetting miner to " + "remove all previously created items..."); + miner_applications_reset (miner); + } + + return changed; +} + static gboolean miner_applications_initable_init (GInitable *initable, GCancellable *cancellable, @@ -233,6 +381,9 @@ miner_applications_initable_init (GInitable *initable, miner_applications_add_directories (fs); + /* If the locales changed, we need to reset things first */ + detect_locale_changed (TRACKER_MINER (fs)); + return TRUE; } @@ -856,169 +1007,14 @@ miner_applications_process_file_attributes (TrackerMinerFS *fs, return FALSE; } -/* If a reset is requested, we will remove from the store all items previously - * inserted by the tracker-miner-applications, this is: - * (a) all elements which are nfo:softwareIcon of a given nfo:Software - * (b) all nfo:Software in our graph (includes both applications and maemo applets) - * (c) all elements which are nfo:softwareCategoryIcon of a given nfo:SoftwareCategory - * (d) all nfo:SoftwareCategory in our graph - */ -static void -miner_applications_reset (TrackerMiner *miner) -{ - GError *error = NULL; - TrackerSparqlBuilder *sparql; - - sparql = tracker_sparql_builder_new_update (); - - /* (a) all elements which are nfo:softwareIcon of a given nfo:Software */ - tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); - tracker_sparql_builder_subject_variable (sparql, "icon"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "rdfs:Resource"); - tracker_sparql_builder_delete_close (sparql); - - tracker_sparql_builder_where_open (sparql); - tracker_sparql_builder_subject_variable (sparql, "software"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "nfo:Software"); - tracker_sparql_builder_subject_variable (sparql, "icon"); - tracker_sparql_builder_predicate (sparql, "nfo:softwareIcon"); - tracker_sparql_builder_object_variable (sparql, "software"); - tracker_sparql_builder_where_close (sparql); - - /* (b) all nfo:Software in our graph (includes both applications and maemo applets) */ - tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); - tracker_sparql_builder_subject_variable (sparql, "software"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "rdfs:Resource"); - tracker_sparql_builder_delete_close (sparql); - - tracker_sparql_builder_where_open (sparql); - tracker_sparql_builder_subject_variable (sparql, "software"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "nfo:Software"); - tracker_sparql_builder_where_close (sparql); - - /* (c) all elements which are nfo:softwareCategoryIcon of a given nfo:SoftwareCategory */ - tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); - tracker_sparql_builder_subject_variable (sparql, "icon"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "rdfs:Resource"); - tracker_sparql_builder_delete_close (sparql); - - tracker_sparql_builder_where_open (sparql); - tracker_sparql_builder_subject_variable (sparql, "category"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "nfo:SoftwareCategory"); - tracker_sparql_builder_subject_variable (sparql, "icon"); - tracker_sparql_builder_predicate (sparql, "nfo:softwareCategoryIcon"); - tracker_sparql_builder_object_variable (sparql, "category"); - tracker_sparql_builder_where_close (sparql); - - /* (d) all nfo:SoftwareCategory in our graph */ - tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); - tracker_sparql_builder_subject_variable (sparql, "category"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "rdfs:Resource"); - tracker_sparql_builder_delete_close (sparql); - - tracker_sparql_builder_where_open (sparql); - tracker_sparql_builder_subject_variable (sparql, "category"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "nfo:SoftwareCategory"); - tracker_sparql_builder_where_close (sparql); - - /* Execute a sync update, we don't want the apps miner to start before - * we finish this. */ - tracker_sparql_connection_update (tracker_miner_get_connection (miner), - tracker_sparql_builder_get_result (sparql), - G_PRIORITY_HIGH, - NULL, - &error); - - if (error) { - /* Some error happened performing the query, not good */ - g_critical ("Couldn't reset mined applications: %s", - error ? error->message : "unknown error"); - g_error_free (error); - } - - g_object_unref (sparql); -} - -static gboolean -detect_locale_changed (TrackerMiner *miner) -{ - gchar *locale_file; - gchar *previous_locale = NULL; - gchar *current_locale; - gboolean changed; - - locale_file = g_build_filename (g_get_user_cache_dir (), "tracker", LOCALE_FILENAME, NULL); - - if (G_LIKELY (g_file_test (locale_file, G_FILE_TEST_EXISTS))) { - gchar *contents; - - /* Check locale is correct */ - if (G_LIKELY (g_file_get_contents (locale_file, &contents, NULL, NULL))) { - if (contents && - contents[0] == '\0') { - g_critical (" Empty locale file found at '%s'", locale_file); - g_free (contents); - } else { - /* Re-use contents */ - previous_locale = contents; - } - } else { - g_critical (" Could not get content of file '%s'", locale_file); - } - } else { - g_message (" Could not find locale file:'%s'", locale_file); - } - - g_free (locale_file); - - current_locale = tracker_locale_get (TRACKER_LOCALE_LANGUAGE); - - /* Note that having both to NULL is actually valid, they would default - * to the unicode collation without locale-specific stuff. */ - if (g_strcmp0 (previous_locale, current_locale) != 0) { - g_message ("Locale change detected from '%s' to '%s'...", - previous_locale, current_locale); - changed = TRUE; - } else { - g_message ("Current and previous locales match: '%s'", previous_locale); - changed = FALSE; - } - - g_free (current_locale); - g_free (previous_locale); - - if (changed) { - g_message ("Locale change detected, so resetting miner to " - "remove all previously created items..."); - miner_applications_reset (miner); - } - - return changed; -} - TrackerMiner * tracker_miner_applications_new (GError **error) { - TrackerMiner *miner; - - miner = g_initable_new (TRACKER_TYPE_MINER_APPLICATIONS, - NULL, - error, - "name", "Applications", - "processing-pool-wait-limit", 10, - "processing-pool-ready-limit", 100, - NULL); - - /* If the locales changed, we need to reset things first */ - detect_locale_changed (miner); - - return miner; + return g_initable_new (TRACKER_TYPE_MINER_APPLICATIONS, + NULL, + error, + "name", "Applications", + "processing-pool-wait-limit", 10, + "processing-pool-ready-limit", 100, + NULL); } diff --git a/src/miners/user-guides/tracker-miner-user-guides.c b/src/miners/user-guides/tracker-miner-user-guides.c index 5d8307a..59dfc40 100644 --- a/src/miners/user-guides/tracker-miner-user-guides.c +++ b/src/miners/user-guides/tracker-miner-user-guides.c @@ -248,6 +248,111 @@ miner_finished_cb (TrackerMinerFS *fs, g_free (locale_file); } +/* If a reset is requested, we will remove from the store all items previously + * inserted by the tracker-miner-userguides, this is: + * (a) Remove all resources which are a nfo:HelpDocument + * (b) Remove all unnecessary directories + */ +static void +miner_userguides_reset (TrackerMiner *miner) +{ + GError *error = NULL; + TrackerSparqlBuilder *sparql; + + sparql = tracker_sparql_builder_new_update (); + + /* (a) Remove all resources which are a nfo:HelpDocument */ + tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); + tracker_sparql_builder_subject_variable (sparql, "userguide"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "rdfs:Resource"); + tracker_sparql_builder_delete_close (sparql); + + tracker_sparql_builder_where_open (sparql); + tracker_sparql_builder_subject_variable (sparql, "userguide"); + tracker_sparql_builder_predicate (sparql, "a"); + tracker_sparql_builder_object (sparql, "nfo:HelpDocument"); + tracker_sparql_builder_where_close (sparql); + + /* (b) Remove all unnecessary directories */ + /* TODO: Finish */ + + + /* Execute a sync update, we don't want the userguides miner to start before + * we finish this. */ + tracker_sparql_connection_update (tracker_miner_get_connection (miner), + tracker_sparql_builder_get_result (sparql), + G_PRIORITY_HIGH, + NULL, + &error); + + if (error) { + /* Some error happened performing the query, not good */ + g_critical ("Couldn't reset mined userguides: %s", + error ? error->message : "unknown error"); + g_error_free (error); + } + + g_object_unref (sparql); +} + +static gboolean +detect_locale_changed (TrackerMiner *miner) +{ + gchar *locale_file; + gchar *previous_locale = NULL; + gchar *current_locale; + gboolean changed; + + locale_file = g_build_filename (g_get_user_cache_dir (), "tracker", LOCALE_FILENAME, NULL); + + if (G_LIKELY (g_file_test (locale_file, G_FILE_TEST_EXISTS))) { + gchar *contents; + + /* Check locale is correct */ + if (G_LIKELY (g_file_get_contents (locale_file, &contents, NULL, NULL))) { + if (contents && + contents[0] == '\0') { + g_critical (" Empty locale file found at '%s'", locale_file); + g_free (contents); + } else { + /* Re-use contents */ + previous_locale = contents; + } + } else { + g_critical (" Could not get content of file '%s'", locale_file); + } + } else { + g_message (" Could not find locale file:'%s'", locale_file); + } + + g_free (locale_file); + + current_locale = tracker_locale_get (TRACKER_LOCALE_LANGUAGE); + + /* Note that having both to NULL is actually valid, they would default + * to the unicode collation without locale-specific stuff. */ + if (g_strcmp0 (previous_locale, current_locale) != 0) { + g_message ("Locale change detected from '%s' to '%s'...", + previous_locale, current_locale); + changed = TRUE; + } else { + g_message ("Current and previous locales match: '%s'", previous_locale); + changed = FALSE; + } + + g_free (current_locale); + g_free (previous_locale); + + if (changed) { + g_message ("Locale change detected, so resetting miner to " + "remove all previously created items..."); + miner_userguides_reset (miner); + } + + return changed; +} + static gboolean miner_userguides_initable_init (GInitable *initable, GCancellable *cancellable, @@ -282,6 +387,9 @@ miner_userguides_initable_init (GInitable *initable, miner_userguides_add_directories (fs); + /* If the locales changed, we need to reset things first */ + detect_locale_changed (TRACKER_MINER (fs)); + return TRUE; } @@ -657,126 +765,14 @@ parser_get_file_content (const gchar *uri, g_strstrip (*content); } -/* If a reset is requested, we will remove from the store all items previously - * inserted by the tracker-miner-userguides, this is: - * (a) Remove all resources which are a nfo:HelpDocument - * (b) Remove all unnecessary directories - */ -static void -miner_userguides_reset (TrackerMiner *miner) -{ - GError *error = NULL; - TrackerSparqlBuilder *sparql; - - sparql = tracker_sparql_builder_new_update (); - - /* (a) Remove all resources which are a nfo:HelpDocument */ - tracker_sparql_builder_delete_open (sparql, TRACKER_OWN_GRAPH_URN); - tracker_sparql_builder_subject_variable (sparql, "userguide"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "rdfs:Resource"); - tracker_sparql_builder_delete_close (sparql); - - tracker_sparql_builder_where_open (sparql); - tracker_sparql_builder_subject_variable (sparql, "userguide"); - tracker_sparql_builder_predicate (sparql, "a"); - tracker_sparql_builder_object (sparql, "nfo:HelpDocument"); - tracker_sparql_builder_where_close (sparql); - - /* (b) Remove all unnecessary directories */ - /* TODO: Finish */ - - - /* Execute a sync update, we don't want the userguides miner to start before - * we finish this. */ - tracker_sparql_connection_update (tracker_miner_get_connection (miner), - tracker_sparql_builder_get_result (sparql), - G_PRIORITY_HIGH, - NULL, - &error); - - if (error) { - /* Some error happened performing the query, not good */ - g_critical ("Couldn't reset mined userguides: %s", - error ? error->message : "unknown error"); - g_error_free (error); - } - - g_object_unref (sparql); -} - -static gboolean -detect_locale_changed (TrackerMiner *miner) -{ - gchar *locale_file; - gchar *previous_locale = NULL; - gchar *current_locale; - gboolean changed; - - locale_file = g_build_filename (g_get_user_cache_dir (), "tracker", LOCALE_FILENAME, NULL); - - if (G_LIKELY (g_file_test (locale_file, G_FILE_TEST_EXISTS))) { - gchar *contents; - - /* Check locale is correct */ - if (G_LIKELY (g_file_get_contents (locale_file, &contents, NULL, NULL))) { - if (contents && - contents[0] == '\0') { - g_critical (" Empty locale file found at '%s'", locale_file); - g_free (contents); - } else { - /* Re-use contents */ - previous_locale = contents; - } - } else { - g_critical (" Could not get content of file '%s'", locale_file); - } - } else { - g_message (" Could not find locale file:'%s'", locale_file); - } - - g_free (locale_file); - - current_locale = tracker_locale_get (TRACKER_LOCALE_LANGUAGE); - - /* Note that having both to NULL is actually valid, they would default - * to the unicode collation without locale-specific stuff. */ - if (g_strcmp0 (previous_locale, current_locale) != 0) { - g_message ("Locale change detected from '%s' to '%s'...", - previous_locale, current_locale); - changed = TRUE; - } else { - g_message ("Current and previous locales match: '%s'", previous_locale); - changed = FALSE; - } - - g_free (current_locale); - g_free (previous_locale); - - if (changed) { - g_message ("Locale change detected, so resetting miner to " - "remove all previously created items..."); - miner_userguides_reset (miner); - } - - return changed; -} - TrackerMiner * tracker_miner_userguides_new (GError **error) { - TrackerMiner *miner; - - miner = g_initable_new (TRACKER_TYPE_MINER_USERGUIDES, - NULL, - error, - "name", "Userguides", - "processing-pool-wait-limit", 10, - "processing-pool-ready-limit", 100, - NULL); - - /* If the locales changed, we need to reset things first */ - detect_locale_changed (miner); - - return miner; + return g_initable_new (TRACKER_TYPE_MINER_USERGUIDES, + NULL, + error, + "name", "Userguides", + "processing-pool-wait-limit", 10, + "processing-pool-ready-limit", 100, + NULL); } -- 2.1.0