diff options
author | Martyn Russell <martyn@lanedo.com> | 2010-05-06 11:22:12 +0100 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2010-05-06 11:24:28 +0100 |
commit | 0cd9198200e12cba8d6691e7c9a2378fedda17dc (patch) | |
tree | da74b20e0ce4826f97601d724d687d3418cf8806 | |
parent | 207a19aecc364a5d601481f4d8e5f87d74a74b2f (diff) | |
download | tracker-0cd9198200e12cba8d6691e7c9a2378fedda17dc.tar.gz |
tracker-search: Added --contacts
-rw-r--r-- | docs/manpages/tracker-search.1 | 10 | ||||
-rw-r--r-- | src/tracker-utils/tracker-search.c | 128 |
2 files changed, 133 insertions, 5 deletions
diff --git a/docs/manpages/tracker-search.1 b/docs/manpages/tracker-search.1 index 3bd342aa9..2c2987186 100644 --- a/docs/manpages/tracker-search.1 +++ b/docs/manpages/tracker-search.1 @@ -56,10 +56,10 @@ Search for folders matching \fIEXPRESSION\fR (optional). .B \-m, \-\-music=EXPRESSION Search for music files matching \fIEXPRESSION\fR (optional). .TP -.B \-u, \-\-music\-albums=ALBUM +.B \-\-music\-albums=ALBUM Search for music albums matching \fIALBUM\fR (optional). .TP -.B \-c, \-\-music\-artists=ARTIST +.B \-\-music\-artists=ARTIST Search for music artists matching \fIARTIST\fR (optional). .TP .B \-l, \-\-images=EXPRESSION @@ -71,10 +71,14 @@ Search for videos matching \fIEXPRESSION\fR (optional). .B \-t, \-\-documents=EXPRESSION Search for documents matching \fIEXPRESSION\fR (optional). .TP -.B \-t, \-\-emails=EXPRESSION +.B \-e, \-\-emails=EXPRESSION Search for emails matching \fIEXPRESSION\fR (optional). Returns a list of subjects for emails found. .TP +.B \-c, \-\-contacts=EXPRESSION +Search for contacts matching \fIEXPRESSION\fR (optional). Returns a list +of names and email addresses found. +.TP .B \-V, \-\-version Print version. diff --git a/src/tracker-utils/tracker-search.c b/src/tracker-utils/tracker-search.c index aa9bf4e7c..e4402562e 100644 --- a/src/tracker-utils/tracker-search.c +++ b/src/tracker-utils/tracker-search.c @@ -55,6 +55,7 @@ static gboolean image_files; static gboolean video_files; static gboolean document_files; static gboolean emails; +static gboolean contacts; static gboolean print_version; static GOptionEntry entries[] = { @@ -90,11 +91,11 @@ static GOptionEntry entries[] = { N_("Search for music files"), NULL }, - { "music-albums", 'u', 0, G_OPTION_ARG_NONE, &music_albums, + { "music-albums", 0, 0, G_OPTION_ARG_NONE, &music_albums, N_("Search for music albums (--all has no effect on this)"), NULL }, - { "music-artists", 'c', 0, G_OPTION_ARG_NONE, &music_artists, + { "music-artists", 0, 0, G_OPTION_ARG_NONE, &music_artists, N_("Search for music artists (--all has no effect on this) "), NULL }, @@ -114,6 +115,10 @@ static GOptionEntry entries[] = { N_("Search for emails"), NULL }, + { "contacts", 'c', 0, G_OPTION_ARG_NONE, &contacts, + N_("Search for contacts"), + NULL + }, { "version", 'V', 0, G_OPTION_ARG_NONE, &print_version, N_("Print version"), NULL @@ -172,6 +177,115 @@ get_fts_string (GStrv search_words, } static void +get_contacts_foreach (gpointer value, + gpointer user_data) +{ + gchar **data; + gboolean details; + + data = value; + details = GPOINTER_TO_INT (user_data); + + if (details && data[1] && *data[1]) { + g_print (" %s, %s (%s)\n", data[0], data[1], data[2]); + } else { + g_print (" %s, %s\n", data[0], data[1]); + } +} + +static gboolean +get_contacts_results (TrackerClient *client, + const gchar *query, + gint search_limit, + gboolean details) +{ + GError *error = NULL; + GPtrArray *results; + + results = tracker_resources_sparql_query (client, query, &error); + + if (error) { + g_printerr ("%s, %s\n", + _("Could not get search results"), + error->message); + g_error_free (error); + + return FALSE; + } + + if (!results) { + g_print ("%s\n", + _("No contacts were found")); + } else { + g_print (g_dngettext (NULL, + "Contact: %d", + "Contacts: %d", + results->len), + results->len); + g_print ("\n"); + + g_ptr_array_foreach (results, + get_contacts_foreach, + GINT_TO_POINTER (details)); + + if (results->len >= search_limit) { + show_limit_warning (); + } + + g_ptr_array_foreach (results, (GFunc) g_strfreev, NULL); + g_ptr_array_free (results, TRUE); + } + + return TRUE; +} + +static gboolean +get_contacts (TrackerClient *client, + GStrv search_terms, + gboolean show_all, + gint search_offset, + gint search_limit, + gboolean use_or_operator, + gboolean details) +{ + gchar *fts; + gchar *query; + gboolean success; + + fts = get_fts_string (search_terms, use_or_operator); + + if (fts) { + query = g_strdup_printf ("SELECT tracker:coalesce(nco:fullname(?contact), \"Unknown\") nco:hasEmailAddress(?contact) ?contact " + "WHERE { " + " ?contact a nco:Contact ;" + " fts:match \"%s\" ." + "} " + "ORDER BY ASC(nco:fullname(?contact)) ASC(nco:hasEmailAddress(?contact)) " + "OFFSET %d " + "LIMIT %d", + fts, + search_offset, + search_limit); + } else { + query = g_strdup_printf ("SELECT tracker:coalesce(nco:fullname(?contact), \"Unknown\") nco:hasEmailAddress(?contact) ?contact " + "WHERE { " + " ?contact a nco:Contact ." + "} " + "ORDER BY ASC(nco:fullname(?contact)) ASC(nco:hasEmailAddress(?contact)) " + "OFFSET %d " + "LIMIT %d", + search_offset, + search_limit); + } + + success = get_contacts_results (client, query, search_limit, details); + g_free (query); + g_free (fts); + + return success; +} + +static void get_emails_foreach (gpointer value, gpointer user_data) { @@ -1018,6 +1132,7 @@ main (int argc, char **argv) !video_files && !document_files && !emails && + !contacts && !files && !folders && !terms) { gchar *help; @@ -1175,6 +1290,15 @@ main (int argc, char **argv) return success ? EXIT_SUCCESS : EXIT_FAILURE; } + if (contacts) { + gboolean success; + + success = get_contacts (client, terms, all, offset, limit, or_operator, detailed); + g_object_unref (client); + + return success ? EXIT_SUCCESS : EXIT_FAILURE; + } + if (terms) { gboolean success; |