Commit 8920540b authored by Carlos Garnacho's avatar Carlos Garnacho

miners: Drop tracker-miner-apps

Now that all functionality has been taken over by tracker-miner-fs,
this miner can disappear.
parent e9e91392
Pipeline #40460 passed with stage
in 1 minute and 27 seconds
......@@ -104,7 +104,6 @@ libmath = cc.find_library('m', required: false)
uuid = cc.find_library('uuid')
have_tracker_extract = get_option('extract')
have_tracker_miner_apps = get_option('miner_apps')
have_tracker_miner_fs = get_option('miner_fs')
have_tracker_miner_rss = get_option('miner_rss')
have_tracker_writeback = get_option('writeback')
......@@ -409,7 +408,6 @@ summary = [
' Build with Journal support: ' + get_option('journal').to_string(),
'\nData Miners / Writebacks:',
' FS (File System): ' + have_tracker_miner_fs.to_string(),
' Applications: ' + have_tracker_miner_apps.to_string(),
' RSS: ' + have_tracker_miner_rss.to_string(),
' Extract (secondary extraction): ' + have_tracker_extract.to_string(),
' Writeback (writing changes back): ' + have_tracker_writeback.to_string(),
......
......@@ -11,8 +11,6 @@ option('guarantee_metadata', type: 'boolean', value: true,
description: 'Set nie:title and nie:contentCreated from filename and mtime if no metadata available')
option('journal', type: 'boolean', value: true,
description: 'Enable database journal backup mechanism')
option('miner_apps', type: 'boolean', value: true,
description: 'Enable the Tracker applications miner')
option('miner_fs', type: 'boolean', value: true,
description: 'Enable the Tracker filesystem miner')
option('miner_rss', type: 'boolean', value: true,
......
......@@ -2,9 +2,6 @@
# Please keep this file sorted alphabetically.
src/libtracker-miners-common/tracker-dbus.c
src/libtracker-miners-common/tracker-utils.c
src/miners/apps/org.freedesktop.Tracker1.Miner.Applications.service.in.in
src/miners/apps/tracker-main.c
src/miners/apps/tracker-miner-apps.desktop.in.in
src/miners/fs/org.freedesktop.Tracker1.Miner.Files.service.in.in
src/miners/fs/org.freedesktop.Tracker.Miner.Files.gschema.xml.in
src/miners/fs/tracker-main.c
......
......@@ -8,14 +8,10 @@ set -e
dbus_services_dir="$1"
tracker_miner_services_dir="$2"
have_tracker_miner_apps="$3"
have_tracker_miner_fs="$4"
have_tracker_miner_rss="$5"
have_tracker_miner_fs="$3"
have_tracker_miner_rss="$4"
mkdir -p ${DESTDIR}/${tracker_miner_services_dir}
if [[ "$have_tracker_miner_apps" -eq "true" ]]; then
ln -sf "${dbus_services_dir}/org.freedesktop.Tracker1.Miner.Applications.service" "${DESTDIR}/${tracker_miner_services_dir}/"
fi
ln -sf "${dbus_services_dir}/org.freedesktop.Tracker1.Miner.Extract.service" "${DESTDIR}/${tracker_miner_services_dir}/"
if [[ "$have_tracker_miner_fs" -eq "true" ]]; then
ln -sf "${dbus_services_dir}/org.freedesktop.Tracker1.Miner.Files.service" "${DESTDIR}/${tracker_miner_services_dir}/"
......
......@@ -31,4 +31,4 @@ custom_target('tracker-miners-settings-enums',
install: true,
install_dir: gsettings_schema_dir)
meson.add_install_script('create-miner-symlinks.sh', dbus_services_dir, tracker_miner_services_dir, have_tracker_miner_apps.to_string(), have_tracker_miner_fs.to_string(), have_tracker_miner_rss.to_string())
meson.add_install_script('create-miner-symlinks.sh', dbus_services_dir, tracker_miner_services_dir, have_tracker_miner_fs.to_string(), have_tracker_miner_rss.to_string())
tracker-miner-apps
*.service
sources = [
'tracker-main.c',
'tracker-miner-applications.c',
]
executable('tracker-miner-apps', sources,
dependencies: [tracker_miner, tracker_sparql, tracker_miners_common_dep],
c_args: tracker_c_args,
install: true,
install_dir: get_option('libexecdir'),
install_rpath: tracker_internal_libs_dir,
)
dbus_service_file_untranslated = configure_file(
input: 'org.freedesktop.Tracker1.Miner.Applications.service.in.in',
output: 'org.freedesktop.Tracker1.Miner.Applications.service.in',
configuration: conf)
dbus_service_file = custom_target('tracker-miner-apps-dbus-service-file',
input: dbus_service_file_untranslated,
output: 'org.freedesktop.Tracker1.Miner.Applications.service',
command: ['intltool-merge', '--quiet', '--desktop-style', '--utf8', join_paths(meson.source_root(), 'po'), '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: dbus_services_dir)
desktop_file_untranslated = configure_file(
input: 'tracker-miner-apps.desktop.in.in',
output: 'tracker-miner-apps.desktop.in',
configuration: conf)
desktop_file = custom_target('tracker-miner-apps-desktop-file',
input: desktop_file_untranslated,
output: 'tracker-miner-apps.desktop',
command: ['intltool-merge', '--quiet', '--desktop-style', '--utf8', join_paths(meson.source_root(), 'po'), '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: join_paths(get_option('sysconfdir'), 'xdg/autostart'))
if install_systemd_user_services
configure_file(
input: 'tracker-miner-apps.service.in',
output: 'tracker-miner-apps.service',
configuration: conf,
install: true,
install_dir: systemd_user_services_dir)
endif
[D-BUS Service]
Name=org.freedesktop.Tracker1.Miner.Applications
Exec=@libexecdir@/tracker-miner-apps
SystemdService=tracker-miner-apps.service
# Miner details needed for tracker-control
Path=/org/freedesktop/Tracker1/Miner/Applications
NameSuffix=Miner.Applications
_DisplayName=Applications
_Comment=Applications data miner
/*
* Copyright (C) 2014, Lanedo GmbH. <martyn@lanedo.com>
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <locale.h>
#include <errno.h>
#include <glib.h>
#include <glib-unix.h>
#include <glib-object.h>
#include <glib/gi18n.h>
#include <libtracker-miners-common/tracker-common.h>
#include <libtracker-miner/tracker-miner.h>
#include "tracker-miner-applications.h"
#define ABOUT \
"Tracker " PACKAGE_VERSION "\n"
#define LICENSE \
"This program is free software and comes without any warranty.\n" \
"It is licensed under version 2 or later of the General Public " \
"License which can be viewed at:\n" \
"\n" \
" http://www.gnu.org/licenses/gpl.txt\n"
#define DBUS_NAME_SUFFIX "Tracker1.Miner.Applications"
#define DBUS_PATH "/org/freedesktop/Tracker1/Miner/Applications"
static GMainLoop *main_loop;
static gint verbosity = -1;
static gboolean no_daemon;
static gboolean version;
static gchar *domain_ontology_name = NULL;
static GOptionEntry entries[] = {
{ "verbosity", 'v', 0,
G_OPTION_ARG_INT, &verbosity,
N_("Logging, 0 = errors only, "
"1 = minimal, 2 = detailed and 3 = debug (default=0)"),
NULL },
{ "no-daemon", 'n', 0,
G_OPTION_ARG_NONE, &no_daemon,
N_("Runs until all applications are indexed and then exits"),
NULL },
{ "domain-ontology", 'd', 0,
G_OPTION_ARG_STRING, &domain_ontology_name,
N_("Runs for a specific domain ontology"),
NULL },
{ "version", 'V', 0,
G_OPTION_ARG_NONE, &version,
N_("Displays version information"),
NULL },
{ NULL }
};
static gboolean
signal_handler (gpointer user_data)
{
int signo = GPOINTER_TO_INT (user_data);
static gboolean in_loop = FALSE;
/* Die if we get re-entrant signals handler calls */
if (in_loop) {
_exit (EXIT_FAILURE);
}
switch (signo) {
case SIGTERM:
case SIGINT:
in_loop = TRUE;
g_main_loop_quit (main_loop);
/* Fall through */
default:
if (g_strsignal (signo)) {
g_print ("\n");
g_print ("Received signal:%d->'%s'\n",
signo,
g_strsignal (signo));
}
break;
}
return G_SOURCE_CONTINUE;
}
static void
initialize_signal_handler (void)
{
#ifndef G_OS_WIN32
g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM));
g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT));
#endif /* G_OS_WIN32 */
}
static void
initialize_priority_and_scheduling (TrackerSchedIdle sched_idle,
gboolean first_time_index)
{
/* Set CPU priority */
if (sched_idle == TRACKER_SCHED_IDLE_ALWAYS ||
(sched_idle == TRACKER_SCHED_IDLE_FIRST_INDEX && first_time_index)) {
tracker_sched_idle ();
}
/* Set disk IO priority and scheduling */
tracker_ioprio_init ();
/* Set process priority:
* The nice() function uses attribute "warn_unused_result" and
* so complains if we do not check its returned value. But it
* seems that since glibc 2.2.4, nice() can return -1 on a
* successful call so we have to check value of errno too.
* Stupid...
*/
g_message ("Setting priority nice level to 19");
errno = 0;
if (nice (19) == -1 && errno != 0) {
const gchar *str = g_strerror (errno);
g_message ("Couldn't set nice value to 19, %s",
str ? str : "no error given");
}
}
static void
miner_finished_cb (TrackerMinerFS *fs,
gdouble seconds_elapsed,
guint total_directories_found,
guint total_directories_ignored,
guint total_files_found,
guint total_files_ignored,
gpointer user_data)
{
g_info ("Finished mining in seconds:%f, total directories:%d, total files:%d",
seconds_elapsed,
total_directories_found,
total_files_found);
if (no_daemon && main_loop) {
g_main_loop_quit (main_loop);
}
}
static void
on_domain_vanished (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
GMainLoop *loop = user_data;
g_main_loop_quit (loop);
}
int
main (gint argc, gchar *argv[])
{
TrackerMiner *miner_applications;
GOptionContext *context;
GError *error = NULL;
gchar *log_filename = NULL;
GDBusConnection *connection;
TrackerMinerProxy *proxy;
TrackerDomainOntology *domain_ontology;
gchar *domain_name, *dbus_name;
main_loop = NULL;
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
/* Set timezone info */
tzset ();
/* Translators: this messagge will apper immediately after the
* usage string - Usage: COMMAND <THIS_MESSAGE>
*/
context = g_option_context_new (_("— start the application data miner"));
g_option_context_add_main_entries (context, entries, NULL);
g_option_context_parse (context, &argc, &argv, &error);
g_option_context_free (context);
if (error) {
g_printerr ("%s\n", error->message);
g_error_free (error);
return EXIT_FAILURE;
}
if (version) {
g_print ("\n" ABOUT "\n" LICENSE "\n");
return EXIT_SUCCESS;
}
tracker_sparql_connection_set_domain (domain_ontology_name);
domain_ontology = tracker_domain_ontology_new (domain_ontology_name, NULL, &error);
if (error) {
g_critical ("Could not load domain ontology '%s': %s",
domain_ontology_name, error->message);
g_error_free (error);
return EXIT_FAILURE;
}
connection = g_bus_get_sync (TRACKER_IPC_BUS, NULL, &error);
if (error) {
g_critical ("Could not create DBus connection: %s\n",
error->message);
g_error_free (error);
return EXIT_FAILURE;
}
tracker_log_init (verbosity, &log_filename);
if (log_filename) {
g_message ("Using log file:'%s'", log_filename);
g_free (log_filename);
}
/* This makes sure we don't steal all the system's resources */
initialize_priority_and_scheduling (TRACKER_SCHED_IDLE_ALWAYS, FALSE);
main_loop = g_main_loop_new (NULL, FALSE);
if (domain_ontology && domain_ontology_name) {
/* If we are running for a specific domain, we tie the lifetime of this
* process to the domain. For example, if the domain name is
* org.example.MyApp then this tracker-miner-apps process will exit as
* soon as org.example.MyApp exits.
*/
domain_name = tracker_domain_ontology_get_domain (domain_ontology, NULL);
g_bus_watch_name_on_connection (connection, domain_name,
G_BUS_NAME_WATCHER_FLAGS_NONE,
NULL, on_domain_vanished,
main_loop, NULL);
g_free (domain_name);
}
g_message ("Checking if we're running as a daemon:");
g_message (" %s %s",
no_daemon ? "No" : "Yes",
no_daemon ? "(forced by command line)" : "");
/* Create miner for applications */
miner_applications = tracker_miner_applications_new (&error);
if (!miner_applications) {
g_critical ("Couldn't create new applications miner, '%s'",
error ? error->message : "unknown error");
tracker_log_shutdown ();
return EXIT_FAILURE;
}
proxy = tracker_miner_proxy_new (miner_applications, connection, DBUS_PATH, NULL, &error);
if (!proxy) {
g_critical ("Couldn't create miner DBus proxy: %s", error->message);
g_error_free (error);
tracker_log_shutdown ();
return EXIT_FAILURE;
}
g_signal_connect (miner_applications, "finished",
G_CALLBACK (miner_finished_cb),
NULL);
/* Request DBus name */
dbus_name = tracker_domain_ontology_get_domain (domain_ontology, DBUS_NAME_SUFFIX);
if (!tracker_dbus_request_name (connection, dbus_name, &error)) {
g_critical ("Could not request DBus name '%s': %s",
dbus_name, error->message);
g_error_free (error);
g_free (dbus_name);
return EXIT_FAILURE;
}
g_free (dbus_name);
initialize_signal_handler ();
/* Go, go, go! */
tracker_miner_start (miner_applications);
g_main_loop_run (main_loop);
g_message ("Shutdown started");
g_main_loop_unref (main_loop);
g_object_unref (G_OBJECT (miner_applications));
g_object_unref (connection);
g_object_unref (proxy);
g_object_unref (domain_ontology);
tracker_log_shutdown ();
g_print ("\nOK\n\n");
return EXIT_SUCCESS;
}
/*
* Copyright (C) 2008, Nokia <ivan.frade@nokia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include <libtracker-miners-common/tracker-common.h>
#include "tracker-miner-applications.h"
#define LOCALE_FILENAME "locale-for-miner-apps.txt"
#define GROUP_DESKTOP_ENTRY "Desktop Entry"
#define APPLICATION_DATASOURCE_URN "urn:nepomuk:datasource:84f20000-1241-11de-8c30-0800200c9a66"
#define APPLET_DATASOURCE_URN "urn:nepomuk:datasource:192bd060-1f9a-11de-8c30-0800200c9a66"
#define SOFTWARE_CATEGORY_URN_PREFIX "urn:software-category:"
#define THEME_ICON_URN_PREFIX "urn:theme-icon:"
static void miner_applications_initable_iface_init (GInitableIface *iface);
static gboolean miner_applications_initable_init (GInitable *initable,
GCancellable *cancellable,
GError **error);
static gboolean miner_applications_process_file (TrackerMinerFS *fs,
GFile *file,
GTask *task);
static gboolean miner_applications_process_file_attributes (TrackerMinerFS *fs,
GFile *file,
GTask *task);
static gchar * miner_applications_remove_file (TrackerMinerFS *fs,
GFile *file);
static GQuark miner_applications_error_quark = 0;
typedef struct ProcessApplicationData ProcessApplicationData;
struct ProcessApplicationData {
TrackerMinerFS *miner;
GFile *file;
TrackerSparqlBuilder *sparql;
GCancellable *cancellable;
GKeyFile *key_file;
gchar *type;
GTask *task;
};
static GInitableIface* miner_applications_initable_parent_iface;
G_DEFINE_TYPE_WITH_CODE (TrackerMinerApplications, tracker_miner_applications, TRACKER_TYPE_MINER_FS,
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
miner_applications_initable_iface_init));
static void
tracker_miner_applications_class_init (TrackerMinerApplicationsClass *klass)
{
TrackerMinerFSClass *miner_fs_class = TRACKER_MINER_FS_CLASS (klass);
miner_fs_class->process_file = miner_applications_process_file;
miner_fs_class->process_file_attributes = miner_applications_process_file_attributes;
miner_fs_class->remove_file = miner_applications_remove_file;
miner_applications_error_quark = g_quark_from_static_string ("TrackerMinerApplications");
}
static void
tracker_miner_applications_init (TrackerMinerApplications *ma)
{
}
static void
miner_applications_initable_iface_init (GInitableIface *iface)
{
miner_applications_initable_parent_iface = g_type_interface_peek_parent (iface);
iface->init = miner_applications_initable_init;
}
static void
miner_applications_basedir_add (TrackerMinerFS *fs,
const gchar *basedir)
{
TrackerIndexingTree *indexing_tree;
GFile *file;
gchar *path;
indexing_tree = tracker_miner_fs_get_indexing_tree (fs);
/* Add $dir/applications */
path = g_build_filename (basedir, "applications", NULL);
file = g_file_new_for_path (path);
g_message (" Adding:'%s'", path);
tracker_indexing_tree_add (indexing_tree, file,
TRACKER_DIRECTORY_FLAG_RECURSE |
TRACKER_DIRECTORY_FLAG_MONITOR |
TRACKER_DIRECTORY_FLAG_CHECK_MTIME);
g_object_unref (file);
g_free (path);
/* Add $dir/desktop-directories */
path = g_build_filename (basedir, "desktop-directories", NULL);
file = g_file_new_for_path (path);
g_message (" Adding:'%s'", path);
tracker_indexing_tree_add (indexing_tree, file,
TRACKER_DIRECTORY_FLAG_RECURSE |
TRACKER_DIRECTORY_FLAG_MONITOR |
TRACKER_DIRECTORY_FLAG_CHECK_MTIME);
g_object_unref (file);
g_free (path);
}
static void
miner_applications_add_directories (TrackerMinerFS *fs)
{
const gchar * const *xdg_dirs;
const gchar *user_data_dir;
gint i;
g_message ("Setting up applications to iterate from XDG system directories");
/* Add all XDG system and local dirs */
xdg_dirs = g_get_system_data_dirs ();
for (i = 0; xdg_dirs[i]; i++) {
miner_applications_basedir_add (fs, xdg_dirs[i]);
}
g_message ("Setting up applications to iterate from XDG user directories");
user_data_dir = g_get_user_data_dir ();
if (user_data_dir) {
miner_applications_basedir_add (fs, user_data_dir);
}
}
static void
miner_finished_cb (TrackerMinerFS *fs,
gdouble seconds_elapsed,
guint total_directories_found,
guint total_directories_ignored,
guint total_files_found,
guint total_files_ignored,
gpointer user_data)
{
/* Save locale, if it changes the variation in the desktop
* file languages needs to be re-indexed.
*/
GError *error = NULL;
gchar *locale = tracker_locale_get (TRACKER_LOCALE_LANGUAGE);
gchar *locale_file = g_build_filename (g_get_user_cache_dir (), "tracker", LOCALE_FILENAME, NULL);
g_message ("Saving locale used to index applications");
g_message (" Creating locale file '%s'", locale_file);
if (locale == NULL) {
locale = g_strdup ("");
}
if (!g_file_set_contents (locale_file, locale, -1, &error)) {
g_message (" Could not set file contents, %s",
error ? error->message : "no error given");
g_clear_error (&error);
}
g_free (locale);
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
* (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 */
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 &&