summaryrefslogtreecommitdiff
path: root/src/tracker-extract/tracker-extract-persistence.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tracker-extract/tracker-extract-persistence.c')
-rw-r--r--src/tracker-extract/tracker-extract-persistence.c273
1 files changed, 0 insertions, 273 deletions
diff --git a/src/tracker-extract/tracker-extract-persistence.c b/src/tracker-extract/tracker-extract-persistence.c
deleted file mode 100644
index 1dc542736..000000000
--- a/src/tracker-extract/tracker-extract-persistence.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2014 Carlos Garnacho <carlosg@gnome.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser 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 "tracker-extract-persistence.h"
-
-#define MAX_RETRIES 3
-
-typedef struct _TrackerExtractPersistencePrivate TrackerExtractPersistencePrivate;
-
-struct _TrackerExtractPersistencePrivate
-{
- GFile *tmp_dir;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (TrackerExtractPersistence, tracker_extract_persistence, G_TYPE_OBJECT)
-
-static GQuark n_retries_quark = 0;
-
-static void
-tracker_extract_persistence_class_init (TrackerExtractPersistenceClass *klass)
-{
- n_retries_quark = g_quark_from_static_string ("tracker-extract-n-retries-quark");
-}
-
-static void
-tracker_extract_persistence_init (TrackerExtractPersistence *persistence)
-{
- TrackerExtractPersistencePrivate *priv;
- gchar *dirname, *tmp_path;
-
- priv = tracker_extract_persistence_get_instance_private (persistence);
-
- dirname = g_strdup_printf ("tracker-extract-files.%d", getuid ());
- tmp_path = g_build_filename (g_get_tmp_dir (), dirname, NULL);
- g_free (dirname);
-
- if (g_mkdir_with_parents (tmp_path, 0700) != 0) {
- g_critical ("The directory %s could not be created, or has the wrong permissions",
- tmp_path);
- g_assert_not_reached ();
- }
-
- priv->tmp_dir = g_file_new_for_path (tmp_path);
- g_free (tmp_path);
-}
-
-static void
-increment_n_retries (GFile *file)
-{
- guint n_retries;
-
- n_retries = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (file), n_retries_quark));
- g_object_set_qdata (G_OBJECT (file), n_retries_quark, GUINT_TO_POINTER (n_retries + 1));
-}
-
-static GFile *
-persistence_create_symlink_file (TrackerExtractPersistence *persistence,
- GFile *file)
-{
- TrackerExtractPersistencePrivate *priv;
- guint n_retries = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (file), n_retries_quark));
- gchar *link_name, *path, *md5;
- GFile *link_file;
-
- priv = tracker_extract_persistence_get_instance_private (persistence);
- path = g_file_get_path (file);
- md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, path, -1);
- link_name = g_strdup_printf ("%d-%s", n_retries, md5);
- link_file = g_file_get_child (priv->tmp_dir, link_name);
-
- g_free (link_name);
- g_free (path);
- g_free (md5);
-
- return link_file;
-}
-
-static GFile *
-persistence_symlink_get_file (GFileInfo *info)
-{
- const gchar *symlink_name, *symlink_target;
- gchar *md5, **items;
- GFile *file = NULL;
- guint n_retries;
-
- symlink_name = g_file_info_get_name (info);
- symlink_target = g_file_info_get_symlink_target (info);
-
- if (!g_path_is_absolute (symlink_target)) {
- g_critical ("Symlink paths must be absolute, '%s' points to '%s'",
- symlink_name, symlink_target);
- return NULL;
- }
-
- md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, symlink_target, -1);
- items = g_strsplit (symlink_name, "-", 2);
- n_retries = g_strtod (items[0], NULL);
-
- if (g_strcmp0 (items[1], md5) == 0) {
- file = g_file_new_for_path (symlink_target);
- g_object_set_qdata (G_OBJECT (file), n_retries_quark,
- GUINT_TO_POINTER (n_retries));
- } else {
- g_critical ("path MD5 for '%s' doesn't match with symlink '%s'",
- symlink_target, symlink_name);
- }
-
- g_strfreev (items);
- g_free (md5);
-
- return file;
-}
-
-static gboolean
-persistence_store_file (TrackerExtractPersistence *persistence,
- GFile *file)
-{
- GError *error = NULL;
- gboolean success;
- GFile *link_file;
- gchar *path;
-
- increment_n_retries (file);
- path = g_file_get_path (file);
- link_file = persistence_create_symlink_file (persistence, file);
-
- success = g_file_make_symbolic_link (link_file, path, NULL, &error);
-
- if (!success) {
- g_warning ("Could not save '%s' into failsafe persistence store: %s",
- path, error ? error->message : "no error given");
- g_clear_error (&error);
- }
-
- g_object_unref (link_file);
- g_free (path);
-
- return success;
-}
-
-static gboolean
-persistence_remove_file (TrackerExtractPersistence *persistence,
- GFile *file)
-{
- GError *error = NULL;
- GFile *link_file;
- gboolean success;
-
- link_file = persistence_create_symlink_file (persistence, file);
- success = g_file_delete (link_file, NULL, &error);
-
- if (!success) {
- gchar *path = g_file_get_path (file);
-
- g_warning ("Could not delete '%s' from failsafe persistence store",
- path);
- g_free (path);
- }
-
- g_object_unref (link_file);
-
- return success;
-}
-
-static void
-persistence_retrieve_files (TrackerExtractPersistence *persistence,
- TrackerFileRecoveryFunc retry_func,
- TrackerFileRecoveryFunc ignore_func,
- gpointer user_data)
-{
- TrackerExtractPersistencePrivate *priv;
- GFileEnumerator *enumerator;
- GFileInfo *info;
-
- priv = tracker_extract_persistence_get_instance_private (persistence);
- enumerator = g_file_enumerate_children (priv->tmp_dir,
- G_FILE_ATTRIBUTE_STANDARD_NAME ","
- G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- NULL, NULL);
- if (!enumerator)
- return;
-
- while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
- GFile *file, *symlink_file;
- guint n_retries;
-
- symlink_file = g_file_enumerator_get_child (enumerator, info);
- file = persistence_symlink_get_file (info);
-
- if (!file) {
- /* If we got here, persistence_symlink_get_file() already emitted a g_critical */
- g_object_unref (symlink_file);
- g_object_unref (info);
- continue;
- }
-
- /* Delete the symlink, it will get probably added back soon after,
- * and n_retries incremented.
- */
- g_file_delete (symlink_file, NULL, NULL);
- g_object_unref (symlink_file);
-
- n_retries = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (file), n_retries_quark));
-
- /* Trigger retry/ignore func for the symlink target */
- if (n_retries >= MAX_RETRIES) {
- ignore_func (file, user_data);
- } else {
- retry_func (file, user_data);
- }
-
- g_object_unref (file);
- g_object_unref (info);
- }
-
- g_file_enumerator_close (enumerator, NULL, NULL);
- g_object_unref (enumerator);
-}
-
-TrackerExtractPersistence *
-tracker_extract_persistence_initialize (TrackerFileRecoveryFunc retry_func,
- TrackerFileRecoveryFunc ignore_func,
- gpointer user_data)
-{
- static TrackerExtractPersistence *persistence = NULL;
-
- if (!persistence) {
- persistence = g_object_new (TRACKER_TYPE_EXTRACT_PERSISTENCE,
- NULL);
- persistence_retrieve_files (persistence,
- retry_func, ignore_func,
- user_data);
- }
-
- return persistence;
-}
-
-void
-tracker_extract_persistence_add_file (TrackerExtractPersistence *persistence,
- GFile *file)
-{
- g_return_if_fail (TRACKER_IS_EXTRACT_PERSISTENCE (persistence));
- g_return_if_fail (G_IS_FILE (file));
-
- persistence_store_file (persistence, file);
-}
-
-void
-tracker_extract_persistence_remove_file (TrackerExtractPersistence *persistence,
- GFile *file)
-{
- g_return_if_fail (TRACKER_IS_EXTRACT_PERSISTENCE (persistence));
- g_return_if_fail (G_IS_FILE (file));
-
- persistence_remove_file (persistence, file);
-}