diff options
Diffstat (limited to 'src/trackerd/tracker-db.c')
-rw-r--r-- | src/trackerd/tracker-db.c | 1254 |
1 files changed, 0 insertions, 1254 deletions
diff --git a/src/trackerd/tracker-db.c b/src/trackerd/tracker-db.c deleted file mode 100644 index 447842123..000000000 --- a/src/trackerd/tracker-db.c +++ /dev/null @@ -1,1254 +0,0 @@ -/* Tracker - indexer and metadata database engine - * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc@gnome.org) - * Copyright (C) 2007, Jason Kivlighn (jkivlighn@gmail.com) - * Copyright (C) 2007, Creative Commons (http://creativecommons.org) - * - * 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 <stdlib.h> -#include <string.h> -#include <time.h> - -#include <glib/gstdio.h> - -#include <libtracker-common/tracker-log.h> -#include <libtracker-common/tracker-config.h> - -#include "tracker-db.h" -#include "tracker-email.h" -#include "tracker-metadata.h" -#include "tracker-os-dependant.h" -#include "tracker-service-manager.h" -#include "tracker-process-files.h" - -extern Tracker *tracker; - -#define XMP_MIME_TYPE "application/rdf+xml" -#define STACK_SIZE 30 -#define BLACK_LIST_SECONDS 3600 -#define MAX_DURATION 180 -#define MAX_CHANGE_TIMES 3 - -typedef struct { - DBConnection *db_con; - char *file_id; - char *service; - GHashTable *table; -} DatabaseAction; - -static void -free_metadata_list (GSList *list) -{ - g_slist_foreach (list, (GFunc) g_free, NULL); - g_slist_free (list); - -} - -gboolean -tracker_db_is_file_up_to_date (DBConnection *db_con, const char *uri, guint32 *id) -{ - TrackerDBResultSet *result_set; - char *path, *name; - gint32 index_time; - - g_return_val_if_fail (db_con, FALSE); - g_return_val_if_fail (tracker_check_uri (uri), FALSE); - - if (uri[0] == G_DIR_SEPARATOR) { - name = g_path_get_basename (uri); - path = g_path_get_dirname (uri); - } else { - name = tracker_get_vfs_name (uri); - path = tracker_get_vfs_path (uri); - } - - result_set = tracker_exec_proc (db_con, "GetServiceID", path, name, NULL); - - g_free (path); - g_free (name); - - index_time = 0; - *id = 0; - - if (result_set) { - tracker_db_result_set_get (result_set, - 0, id, - 1, &index_time, - -1); - - g_object_unref (result_set); - } else { - return FALSE; - } - - if (index_time < (gint32) tracker_get_file_mtime (uri)) { - return FALSE; - } - - return TRUE; -} - - -guint32 -tracker_db_get_file_id (DBConnection *db_con, const char *uri) -{ - TrackerDBResultSet *result_set; - char *path, *name; - guint32 id; - - g_return_val_if_fail (db_con, 0); - g_return_val_if_fail (uri, 0); - - if (uri[0] == G_DIR_SEPARATOR) { - name = g_path_get_basename (uri); - path = g_path_get_dirname (uri); - } else { - name = tracker_get_vfs_name (uri); - path = tracker_get_vfs_path (uri); - } - - result_set = tracker_exec_proc (db_con->index, "GetServiceID", path, name, NULL); - - g_free (path); - g_free (name); - - id = 0; - - if (result_set) { - tracker_db_result_set_get (result_set, 0, &id, -1); - g_object_unref (result_set); - } - - return id; -} - - -FileInfo * -tracker_db_get_file_info (DBConnection *db_con, FileInfo *info) -{ - TrackerDBResultSet *result_set; - gchar *path, *name; - - g_return_val_if_fail (db_con, info); - g_return_val_if_fail (info, info); - - if (!tracker_process_files_is_file_info_valid (info)) { - return NULL; - } - - name = g_path_get_basename (info->uri); - path = g_path_get_dirname (info->uri); - - //apath = tracker_escape_string (path); - //aname = tracker_escape_string (name); - - result_set = tracker_exec_proc (db_con->index, "GetServiceID", path, name, NULL); - -// g_free (aname); -// g_free (apath); - - g_free (name); - g_free (path); - - if (result_set) { - gint id, indextime, service_type_id; - gboolean is_directory; - - tracker_db_result_set_get (result_set, - 0, &id, - 1, &indextime, - 2, &is_directory, - 3, &service_type_id, - -1); - - if (id > 0) { - info->file_id = id; - info->is_new = FALSE; - } - - info->indextime = indextime; - info->is_directory = is_directory; - info->service_type_id = service_type_id; - - g_object_unref (result_set); - } - - return info; -} - - - -static void -add_embedded_keywords (DBConnection *db_con, const char *service, const char *file_id, const char *keyword_type, const char *keywords, GHashTable *table) -{ - char **array; - - if (!service) { - return; - } - - array = g_strsplit_set (keywords, "\t\n\v\f\r !\"#$%&'()*/<=>?[\\]^`{|}~+,.:;@\"[]", -1); - - tracker_db_insert_embedded_metadata (db_con, service, file_id, keyword_type, array, -1, table); - - g_strfreev (array); -} - - - -static void -save_meta_table_data (gpointer mtype, - gpointer value, - gpointer user_data) -{ - DatabaseAction *db_action; - - if (mtype == NULL || value == NULL) { - return; - } - - db_action = user_data; - - /* auto-tag keyword related metadata */ - if (tracker_db_metadata_is_child (db_action->db_con, mtype, "DC:Keywords")) { - - GSList *tmp; - for (tmp = value; tmp; tmp = tmp->next) { - - if (tmp->data) { - add_embedded_keywords (db_action->db_con, db_action->service, db_action->file_id, mtype, tmp->data, db_action->table); - } - } - - } else { - gchar **array = tracker_gslist_to_string_list (value); - - tracker_db_insert_embedded_metadata (db_action->db_con, db_action->service, db_action->file_id, mtype, array, g_slist_length (value), db_action->table); - - g_strfreev (array); - } - -} - - -GHashTable * -tracker_db_save_metadata (DBConnection *db_con, GHashTable *table, GHashTable *index_table, const char *service, guint32 file_id, gboolean new_file) -{ - DatabaseAction db_action; - - g_return_val_if_fail (db_con, NULL); - g_return_val_if_fail (table, NULL); - - if (file_id == 0) { - return NULL; - } - - db_action.db_con = db_con; - db_action.table = index_table; - db_action.file_id = tracker_uint_to_str (file_id); - db_action.service = (char *) service; - - if (table) { - g_hash_table_foreach (table, save_meta_table_data, &db_action); - } - - g_free (db_action.file_id); - - return db_action.table; -} - - -void -tracker_db_save_thumbs (DBConnection *db_con, const char *small_thumb, const char *large_thumb, guint32 file_id) -{ - char *str_file_id; - - str_file_id = tracker_uint_to_str (file_id); - - g_return_if_fail (str_file_id); - - if (small_thumb) { - char *small_thumb_file; - - small_thumb_file = tracker_escape_string (small_thumb); -/* tracker_db_set_metadata (db_con, "Files", str_file_id, "File.SmallThumbnailPath", small_thumb_file, TRUE, FALSE, TRUE); */ -/* tracker_exec_proc (db_con, "SetMetadata", "Files", str_file_id, "File.SmallThumbnailPath", small_thumb_file, "1", NULL); */ - g_free (small_thumb_file); - } - - if (large_thumb) { - char *large_thumb_file; - - large_thumb_file = tracker_escape_string (large_thumb); -/* tracker_db_set_metadata (db_con, "Files", str_file_id, "File.LargeThumbnailPath", large_thumb_file, TRUE, FALSE, TRUE); */ - g_free (large_thumb_file); - } - - g_free (str_file_id); -} - - -char ** -tracker_db_get_files_in_folder (DBConnection *db_con, const char *folder_uri) -{ - TrackerDBResultSet *result_set; - GPtrArray *array; - - g_return_val_if_fail (db_con, NULL); - g_return_val_if_fail (db_con->index, NULL); - g_return_val_if_fail (folder_uri, NULL); - g_return_val_if_fail (folder_uri[0] != '\0', NULL); - - result_set = tracker_exec_proc (db_con->index, "SelectFileChild", folder_uri, NULL); - array = g_ptr_array_new (); - - if (result_set) { - gboolean valid = TRUE; - gchar *name, *prefix; - - while (valid) { - tracker_db_result_set_get (result_set, - 1, &prefix, - 2, &name, - -1); - - g_ptr_array_add (array, g_build_filename (prefix, name, NULL)); - - g_free (prefix); - g_free (name); - valid = tracker_db_result_set_iter_next (result_set); - } - - g_object_unref (result_set); - } - - g_ptr_array_add (array, NULL); - - return (gchar **) g_ptr_array_free (array, FALSE); -} - - -gboolean -tracker_metadata_is_date (DBConnection *db_con, const char *meta) -{ - FieldDef *def; - gboolean res; - - def = tracker_db_get_field_def (db_con, meta); - - if (!def) { - tracker_error ("ERROR: failed to get info for metadata type %s", meta); - return FALSE; - } - - g_return_val_if_fail (def, FALSE); - - res = (def->type == DATA_DATE); - - tracker_db_free_field_def (def); - - return res; -} - - -FileInfo * -tracker_db_get_pending_file (DBConnection *db_con, const char *uri) -{ - TrackerDBResultSet *result_set; - FileInfo *info; - - info = NULL; - result_set = tracker_exec_proc (db_con->cache, "SelectPendingByUri", uri, NULL); - - if (result_set) { - gboolean is_directory, is_new, extract_embedded, extract_contents; - gint counter, service_type_id; - gchar *mimetype; - - tracker_db_result_set_get (result_set, - 2, &counter, - 3, &mimetype, - 4, &is_directory, - 5, &is_new, - 6, &extract_embedded, - 7, &extract_contents, - 8, &service_type_id, - -1); - - info = tracker_create_file_info (uri, counter, 0, 0); - info->mime = mimetype; - info->is_directory = is_directory; - info->is_new = is_new; - info->extract_embedded = extract_embedded; - info->extract_contents = extract_contents; - info->service_type_id = service_type_id; - - g_object_unref (result_set); - } - - return info; -} - - -static void -make_pending_file (DBConnection *db_con, guint32 file_id, const char *uri, const char *moved_to_uri, const char *mime, int counter, TrackerChangeAction action, gboolean is_directory, gboolean is_new, int service_type_id) -{ - char *str_file_id, *str_action, *str_counter; - - g_return_if_fail (tracker_check_uri (uri)); - - str_file_id = tracker_uint_to_str ( file_id); - str_action = tracker_int_to_str (action); - str_counter = tracker_int_to_str (counter); - - if (tracker->is_running) { - - gboolean move_file = (action == TRACKER_ACTION_FILE_MOVED_FROM || action == TRACKER_ACTION_DIRECTORY_MOVED_FROM); - - if (!move_file && ((counter > 0) || (g_async_queue_length (tracker->file_process_queue) > tracker->max_process_queue_size))) { - - /* tracker_log ("************ counter for pending file %s is %d ***********", uri, counter); */ - if (!mime) { - tracker_db_insert_pending (db_con, str_file_id, str_action, str_counter, uri, "unknown", is_directory, is_new, service_type_id); - } else { - tracker_db_insert_pending (db_con, str_file_id, str_action, str_counter, uri, mime, is_directory, is_new, service_type_id); - } - - } else { - - FileInfo *info; - - info = tracker_create_file_info (uri, action, 0, WATCH_OTHER); - - info->is_directory = is_directory; - info->is_new = is_new; - - if (!mime) { - info->mime = g_strdup ("unknown"); - } else { - info->mime = g_strdup (mime); - } - - if (action == TRACKER_ACTION_FILE_MOVED_FROM || action == TRACKER_ACTION_DIRECTORY_MOVED_FROM) { - info->moved_to_uri = g_strdup (moved_to_uri); - } - - if (action != TRACKER_ACTION_EXTRACT_METADATA) { - g_async_queue_push (tracker->file_process_queue, info); - } else { - g_async_queue_push (tracker->file_metadata_queue, info); - } - } - - } else { - g_free (str_file_id); - g_free (str_action); - g_free (str_counter); - return; - } - - /* tracker_log ("inserting pending file for %s with action %s", uri, tracker_actions[action]); */ - - /* signal respective thread that data is available and awake it if its asleep */ - if (action == TRACKER_ACTION_EXTRACT_METADATA) { - tracker_notify_meta_data_available (); - } else { - tracker_notify_file_data_available (); - } - - g_free (str_file_id); - g_free (str_action); - g_free (str_counter); -} - - -void -tracker_db_update_pending_file (DBConnection *db_con, const char *uri, int counter, TrackerChangeAction action) -{ - char *str_counter, *str_action; - - g_return_if_fail (tracker_check_uri (uri)); - - str_counter = tracker_int_to_str (counter); - str_action = tracker_int_to_str (action); - - if (tracker->is_running) { - tracker_db_update_pending (db_con, str_counter, str_action, uri); - } - - g_free (str_counter); - g_free (str_action); -} - - -void -tracker_db_add_to_extract_queue (DBConnection *db_con, FileInfo *info) -{ - int i; - - g_return_if_fail (info); - g_return_if_fail (tracker_check_uri (info->uri)); - - i = g_async_queue_length (tracker->file_metadata_queue); - - if (i < tracker->max_extract_queue_size) { - - /* inc ref count to prevent it being deleted */ - info = tracker_inc_info_ref (info); - - g_async_queue_push (tracker->file_metadata_queue, info); - - } else { - tracker_db_insert_pending_file (db_con, info->file_id, info->uri, NULL, info->mime, 0, TRACKER_ACTION_EXTRACT_METADATA, info->is_directory, info->is_new, info->service_type_id); - } - - tracker_notify_meta_data_available (); -} - -static void -refresh_file_change_queue (gpointer data, gpointer user_data) -{ - FileChange *change = (FileChange*)data; - int *current = (int *)user_data; - - if ((*current - change->first_change_time) > MAX_DURATION) { - g_queue_remove_all (tracker->file_change_queue, data); - free_file_change (&change); - } -} - -static gint -uri_comp (gconstpointer a, gconstpointer b) -{ - FileChange *change = (FileChange *)a; - char *valuea = change->uri; - char *valueb = (char *)b; - - return strcmp (valuea, valueb); -} - -static gint -file_change_sort_comp (gconstpointer a, gconstpointer b, gpointer user_data) -{ - FileChange *changea, *changeb; - changea = (FileChange *)a; - changeb = (FileChange *)b; - - if ((changea->num_of_change - changeb->num_of_change) == 0) { - return changea->first_change_time - changeb->first_change_time; - } else { - return changea->num_of_change - changeb->num_of_change; - } -} - -static void -print_file_change_queue () -{ - GList *head, *l; - FileChange *change; - gint count; - - head = g_queue_peek_head_link (tracker->file_change_queue); - - tracker_log ("File Change queue is:"); - count = 1; - for (l = g_list_first (head); l != NULL; l = g_list_next (l)) { - change = (FileChange*)l->data; - tracker_info ("%d\t%s\t%d\t%d", - count++, change->uri, - change->first_change_time, - change->num_of_change); - } - -} - -static void -index_blacklist_file (char *uri) -{ - FileInfo *info; - - info = tracker_create_file_info (uri, TRACKER_ACTION_FILE_CHECK, 0, WATCH_OTHER); - - info->is_directory = FALSE; - - info->is_new = FALSE; - - info->mime = g_strdup ("unknown"); - - g_async_queue_push (tracker->file_process_queue, info); - - tracker_notify_file_data_available (); - -} - - -static gboolean -index_black_list () -{ - GSList *black_list; - - black_list = tracker_process_files_get_temp_black_list (); - g_slist_foreach (black_list, - (GFunc) index_blacklist_file, - NULL); - - tracker_process_files_set_temp_black_list (NULL); - - tracker->black_list_timer_active = FALSE; - - return FALSE; - -} - - - -static gboolean -check_uri_changed_frequently (const char *uri) -{ - GList *find; - FileChange *change; - time_t current; - - if (!tracker->file_change_queue) { - /* init queue */ - tracker->file_change_queue = g_queue_new (); - } - - current = time (NULL); - - /* remove items which are very old */ - g_queue_foreach (tracker->file_change_queue, - refresh_file_change_queue, ¤t); - - find = g_queue_find_custom (tracker->file_change_queue, uri, uri_comp); - if (!find) { - /* not found, add to in the queue */ - - change = g_new0 (FileChange, 1); - change->uri = g_strdup (uri); - change->first_change_time = current; - change->num_of_change = 1; - if (g_queue_get_length (tracker->file_change_queue) == STACK_SIZE) { - FileChange *tmp = (FileChange*) g_queue_pop_head ( - tracker->file_change_queue); - free_file_change (&tmp); - } - g_queue_insert_sorted (tracker->file_change_queue, change, - file_change_sort_comp, NULL); - print_file_change_queue (); - return FALSE; - } else { - change = (FileChange *) find->data; - (change->num_of_change)++; - g_queue_sort (tracker->file_change_queue, - file_change_sort_comp, NULL); - if (change->num_of_change < MAX_CHANGE_TIMES) { - print_file_change_queue (); - return FALSE; - } else { - print_file_change_queue (); - - /* add uri to blacklist */ - - tracker_log ("blacklisting %s", change->uri); - - tracker_process_files_append_temp_black_list (change->uri); - - if (!tracker->black_list_timer_active) { - tracker->black_list_timer_active = TRUE; - g_timeout_add_seconds (BLACK_LIST_SECONDS, (GSourceFunc) index_black_list, NULL); - } - - g_queue_remove_all (tracker->file_change_queue, change); - free_file_change (&change); - - return TRUE; - } - } - -} - -void -tracker_db_insert_pending_file (DBConnection *db_con, guint32 file_id, const char *uri, const char *moved_to_uri, const char *mime, int counter, TrackerChangeAction action, gboolean is_directory, gboolean is_new, int service_type_id) -{ - FileInfo *info; - - g_return_if_fail (tracker_check_uri (uri)); - - /* check if uri changed too frequently */ - if (((action == TRACKER_ACTION_CHECK) || - (action == TRACKER_ACTION_FILE_CHECK) || (action == TRACKER_ACTION_WRITABLE_FILE_CLOSED)) && - check_uri_changed_frequently (uri)) { - - return; - } - - - /* check if uri already has a pending action and update accordingly */ - info = tracker_db_get_pending_file (db_con, uri); - - if (info) { - switch (action) { - - case TRACKER_ACTION_FILE_CHECK: - - /* update counter for any existing event in the file_scheduler */ - - if ((info->action == TRACKER_ACTION_FILE_CHECK) || - (info->action == TRACKER_ACTION_FILE_CREATED) || - (info->action == TRACKER_ACTION_FILE_CHANGED)) { - - tracker_db_update_pending_file (db_con, uri, counter, action); - } - - break; - - case TRACKER_ACTION_FILE_CHANGED: - - tracker_db_update_pending_file (db_con, uri, counter, action); - - break; - - case TRACKER_ACTION_WRITABLE_FILE_CLOSED: - - tracker_db_update_pending_file (db_con, uri, 0, action); - - break; - - case TRACKER_ACTION_FILE_DELETED: - case TRACKER_ACTION_FILE_CREATED: - case TRACKER_ACTION_DIRECTORY_DELETED: - case TRACKER_ACTION_DIRECTORY_CREATED: - - /* overwrite any existing event in the file_scheduler */ - tracker_db_update_pending_file (db_con, uri, 0, action); - - break; - - case TRACKER_ACTION_EXTRACT_METADATA: - - /* we only want to continue extracting metadata if file is not being changed/deleted in any way */ - if (info->action == TRACKER_ACTION_FILE_CHECK) { - tracker_db_update_pending_file (db_con, uri, 0, action); - } - - break; - - default: - break; - } - - tracker_free_file_info (info); - - } else { - make_pending_file (db_con, file_id, uri, moved_to_uri, mime, counter, action, is_directory, is_new, service_type_id); - } -} - - -static void -restore_backup_data (gpointer mtype, - gpointer value, - gpointer user_data) -{ - DatabaseAction *db_action; - gchar **string_list; - - if (mtype == NULL || value == NULL) { - return; - } - - db_action = user_data; - - string_list = tracker_gslist_to_string_list (value); - tracker_log ("restoring keyword list with %d items", g_slist_length (value)); - - tracker_db_set_metadata (db_action->db_con->index, db_action->service, db_action->file_id, mtype, string_list, g_slist_length (value), FALSE); - - g_strfreev (string_list); -} - - - -void -tracker_db_index_service (DBConnection *db_con, FileInfo *info, const char *service, GHashTable *meta_table, const char *attachment_uri, const char *attachment_service, gboolean get_embedded, gboolean get_full_text, gboolean get_thumbs) -{ - char *str_file_id; - const char *uri; - GHashTable *index_table, *old_table; - - if (!service) { - /* its an external service - TODO get external service name */ - if (service) { - tracker_log ("External service %s not supported yet", service); - } else { - tracker_log ("External service not supported yet"); - } - return; - } - - if (!attachment_uri) { - uri = info->uri; - } else { - uri = attachment_uri; - } - - info->service_type_id = tracker_service_manager_get_id_for_service (service); - - if (info->service_type_id == -1) { - tracker_log ("Service %s not supported yet", service); - return; - } - - if (info->mime == NULL) { - info->mime = g_strdup("unknown"); - } - - if (info->is_new) { - if (info->mime) - tracker_info ("Indexing %s with service %s and mime %s (new)", uri, service, info->mime); - else - tracker_info ("Indexing %s with service %s (new)", uri, service); - } else { - if (info->mime) - tracker_info ("Indexing %s with service %s and mime %s (existing)", uri, service, info->mime); - else - tracker_info ("Indexing %s with service %s (existing)", uri, service); - } - - - - if (!info->is_new) { - old_table = g_hash_table_new (g_str_hash, g_str_equal); - } else { - old_table = NULL; - } - - index_table = g_hash_table_new (g_str_hash, g_str_equal); - - /* get embedded metadata filter */ - if (get_embedded && meta_table) { - tracker_metadata_get_embedded (info->uri, info->mime, meta_table); - } - - if (info->is_new) { - - char *old_uri = info->uri; - info->uri = (char *) uri; - - if (attachment_service) { - info->file_id = tracker_db_create_service (db_con->index, attachment_service, info); - } else { - info->file_id = tracker_db_create_service (db_con->index, service, info); - } - - info->uri = old_uri; - - if (info->file_id == 0) { - tracker_error ("ERROR: could not get file id for %s - unable to continue indexing this file", uri); - return; - } - - if (info->service_type_id == -1) { - tracker_error ("ERROR: unknown service type for %s with service %s and mime %s", uri, service, info->mime); - } - } - - str_file_id = tracker_uint_to_str (info->file_id); - - if (get_thumbs && tracker_config_get_enable_thumbnails (tracker->config)) { - char *small_thumb_file = NULL; - - small_thumb_file = tracker_metadata_get_thumbnail (info->uri, info->mime, "normal"); - - g_free (small_thumb_file); - - } - - - if (!info->is_new) { - /* get original text for the differential indexer */ - old_table = tracker_db_get_file_contents_words (db_con->blob, info->file_id, old_table); - } - - - if (get_full_text && tracker_config_get_enable_content_indexing (tracker->config)) { - char *file_as_text; - - file_as_text = tracker_metadata_get_text_file (info->uri, info->mime); - - if (file_as_text) { - - tracker_db_save_file_contents (db_con, index_table, old_table, file_as_text, info); - - /* clear up if text contents are in a temp file */ - if (g_str_has_prefix (file_as_text, tracker->sys_tmp_root_dir)) { - g_unlink (file_as_text); - } - - g_free (file_as_text); - - } else { - get_full_text = FALSE; - } - - } - - if (attachment_service) { - info->service_type_id = tracker_service_manager_get_id_for_service (attachment_service); - } - - /* save stuff to Db */ - - - - if (!info->is_new) { - - /* update existing file entry */ - tracker_db_update_file (db_con, info); - - /* get original embedded metadata for the differential indexer */ - old_table = tracker_db_get_indexable_content_words (db_con, info->file_id, old_table, TRUE); - - /* delete any exisitng embedded metadata */ - tracker_exec_proc (db_con, "DeleteEmbeddedServiceMetadata1", str_file_id, NULL); - tracker_exec_proc (db_con, "DeleteEmbeddedServiceMetadata2", str_file_id, NULL); - tracker_exec_proc (db_con, "DeleteEmbeddedServiceMetadata3", str_file_id, NULL); - - } - - if (meta_table && (g_hash_table_size (meta_table) > 0)) { - tracker_db_save_metadata (db_con->index, meta_table, index_table, service, info->file_id, info->is_new); - } - - - - - - /* update full text indexes */ - if (info->is_new) { - tracker_db_update_indexes_for_new_service (info->file_id, info->service_type_id, index_table); - } else { - tracker_db_update_differential_index (db_con, old_table, index_table, str_file_id, info->service_type_id); - } - - tracker_word_table_free (index_table); - tracker_word_table_free (old_table); - - - /* check for backup user defined metadata */ - if (info->is_new) { - TrackerDBResultSet *result_set; - char *name = tracker_get_vfs_name (info->uri); - char *path = tracker_get_vfs_path (info->uri); - - result_set = tracker_exec_proc (db_con->common, "GetBackupMetadata", path, name, NULL); - - if (result_set) { - gboolean valid = TRUE; - GHashTable *meta_table; - DatabaseAction db_action; - gchar *key, *value; - - meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify) g_free, - (GDestroyNotify) free_metadata_list); - - while (valid) { - tracker_db_result_set_get (result_set, - 0, &key, - 1, &value, - -1); - - tracker_log ("found backup metadata for %s\%s with key %s and value %s", path, name, key, value); - tracker_add_metadata_to_table (meta_table, key, value); - - valid = tracker_db_result_set_iter_next (result_set); - } - - g_object_unref (result_set); - - db_action.db_con = db_con; - db_action.file_id = str_file_id; - - if (attachment_service) { - db_action.service = (char *) attachment_service; - } else { - db_action.service = (char *) service; - } - - g_hash_table_foreach (meta_table, restore_backup_data, &db_action); - - g_hash_table_destroy (meta_table); - } - - g_free (name); - g_free (path); - } - - - g_free (str_file_id); -} - - - - -void -tracker_db_index_master_files (DBConnection *db_con, const gchar *dirname, const gchar *basename, const gchar *filename) -{ - GDir* dir = g_dir_open (dirname, 0, NULL); - - if (dir) { - - const gchar *curr_ext; - const gchar *curr_filename; - - FileInfo *master_info; - gchar *master_uri; - - while ((curr_filename = g_dir_read_name (dir)) != NULL) { - curr_ext = strrchr (curr_filename, '.'); - if (!curr_ext) { - curr_ext = &curr_filename[strlen (curr_filename)]; - } - - if (curr_ext+1 && strncmp (basename, curr_filename, curr_ext-curr_filename) == 0 && - strcmp (curr_ext+1, "xmp") != 0 && - !g_str_has_suffix (curr_ext+1, "~")) { - - tracker_debug ("master file, %s, about to be updated", curr_filename); - - master_uri = g_build_filename (dirname, curr_filename, NULL); - master_info = tracker_create_file_info (master_uri, TRACKER_ACTION_FILE_CHANGED, 0, 0); - master_info = tracker_db_get_file_info (db_con, master_info); - g_free (master_uri); - - tracker_db_index_file (db_con, master_info, NULL, NULL); - } - } - - g_dir_close (dir); - } -} - - -void -tracker_db_index_file (DBConnection *db_con, FileInfo *info, const char *attachment_uri, const char *attachment_service) -{ - - GHashTable *meta_table; - const char *ext; - char *filename, *dirname; - char *str_link_uri, *service_name; - gboolean is_file_indexable, service_has_metadata, is_external_service, service_has_fulltext, service_has_thumbs, is_sidecar; - - const char *uri; - - if (!attachment_uri) { - uri = info->uri; - } else { - uri = attachment_uri; - } - - if (info->mime) { - g_free (info->mime); - } - - if (info->is_directory) { - service_name = g_strdup ("Folders"); - info->mime = g_strdup ("Folder"); - info->file_size = 0; - } else { - info->mime = tracker_get_mime_type (info->uri); - - if (!info->mime) { - info->mime = g_strdup ("unknown"); - } - - tracker_info ("mime is %s for %s", info->mime, info->uri); - - service_name = tracker_service_manager_get_service_type_for_mime (info->mime); - - } - - if (info->is_link) { - str_link_uri = g_build_filename (info->link_path, info->link_name, NULL); - } else { - str_link_uri = NULL; - } - - if (!info->is_hidden) { - - meta_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) free_metadata_list); - - tracker_add_metadata_to_table (meta_table, g_strdup ("File:NameDelimited"), g_strdup (uri)); - - dirname = g_path_get_dirname (uri); - filename = g_path_get_basename (uri); - ext = strrchr (filename, '.'); - if (ext) { - ext++; - tracker_debug ("file extension is %s", ext); - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Ext"), g_strdup (ext)); - is_sidecar = strcmp("xmp",ext) == 0; - } else { - is_sidecar = FALSE; - } - - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Path"), g_strdup (dirname)); - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Name"), g_strdup (filename)); - - if (str_link_uri) { - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Link"), str_link_uri); - } - - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Mime"), g_strdup (info->mime)); - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Size"), tracker_uint_to_str (info->file_size)); - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Modified"), tracker_date_to_str (info->mtime)); - tracker_add_metadata_to_table (meta_table, g_strdup ("File:Accessed"), tracker_date_to_str (info->atime)); - - /* need to add special data for web history */ - if (attachment_service != NULL && strcmp(attachment_service,"WebHistory") == 0) { - - gchar* meta_file = g_strconcat(dirname,"/.",filename,NULL); - - FILE* fp = g_fopen(meta_file, "r"); - - if (fp != NULL) { - char buf[512]; - - fgets(buf,512,fp); //get the first line, it is URL for this web history object - tracker_debug("URL for this WebHistory is %s\n",buf); - tracker_add_metadata_to_table (meta_table, g_strdup ("Doc:URL"), g_strdup(buf)); - - fgets(buf,512,fp); - fgets(buf,512,fp); - fgets(buf,512,fp); - fgets(buf,512,fp); // get the keywords for this file - - if (buf != NULL) { - - /* format like t:dc:keyword=xxx */ - gchar** keys = g_strsplit (buf,"=",0); - - if (keys != NULL && strcmp(keys[0],"t:dc:keyword") == 0 && keys[1]) { - - char *doc_keyword = g_strdup (keys[1]); - - tracker_debug("found keywords : %s\n",doc_keyword); - - tracker_add_metadata_to_table (meta_table, g_strdup ("Doc:Keywords"), doc_keyword); - } - - - if (keys) g_strfreev(keys); - - - } - - fclose (fp); - } - g_free (meta_file); - } - - - - is_external_service = g_str_has_prefix (info->mime, "service/"); - is_file_indexable = (!info->is_directory && - (strcmp (info->mime, "unknown") != 0) && - (strcmp (info->mime, "symlink") != 0) && - tracker_file_is_indexable (info->uri)); - - service_has_metadata = - (is_external_service || - (is_file_indexable && - tracker_service_manager_has_metadata (service_name))) && - !is_sidecar; - service_has_fulltext = - (is_external_service || - (is_file_indexable && - tracker_service_manager_has_text (service_name))) && - !is_sidecar; - service_has_thumbs = - (is_external_service || - (is_file_indexable && - tracker_service_manager_has_thumbnails (service_name))); - - #ifdef HAVE_EXEMPI - if (!info->is_directory) { - gchar *basename; - - if (ext) { - basename = g_strndup (filename, (ext - filename -1)); - } else { - basename = g_strdup (filename); - } - - if (is_sidecar) { - tracker_db_index_master_files (db_con, dirname, basename, filename); - } else { - gchar *sidecar_filename = g_strconcat (basename, ".xmp", NULL); - gchar *sidecar_uri = g_build_filename (dirname, sidecar_filename, NULL); - - if (g_file_test (sidecar_uri, G_FILE_TEST_EXISTS)) { - tracker_debug ("xmp sidecar found for %s", uri); - tracker_metadata_get_embedded (sidecar_uri, XMP_MIME_TYPE, meta_table); - } - - g_free (sidecar_filename); - g_free (sidecar_uri); - } - g_free (basename); - } - #endif - - tracker_debug ("file %s has fulltext %d with service %s", info->uri, service_has_fulltext, service_name); - tracker_db_index_service (db_con, info, service_name, meta_table, uri, attachment_service, service_has_metadata, service_has_fulltext, service_has_thumbs); - - g_hash_table_destroy (meta_table); - - g_free (filename); - g_free (dirname); - } else { - tracker_db_index_service (db_con, info, service_name, NULL, uri, NULL, FALSE, FALSE, FALSE); - - } - - g_free (service_name); - - if (attachment_uri ) { - tracker_unlink (info->uri); - } - - tracker_dec_info_ref (info); -} - - -void -tracker_db_index_conversation (DBConnection *db_con, FileInfo *info) -{ - /* to do use offsets */ - - tracker_db_index_file (db_con, info, NULL, "GaimConversations"); -} - -void -tracker_db_index_webhistory(DBConnection *db_con, FileInfo *info) -{ - tracker_db_index_file (db_con, info, NULL, "WebHistory"); -} - |