using namespace std;
+const char *
+notmuch_status_to_string (notmuch_status_t status)
+{
+ switch (status) {
+ case NOTMUCH_STATUS_SUCCESS:
+ return "No error occurred";
+ case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
+ return "A Xapian exception occurred";
+ case NOTMUCH_STATUS_FILE_ERROR:
+ return "Something went wrong trying to read or write a file";
+ case NOTMUCH_STATUS_FILE_NOT_EMAIL:
+ return "File is not an email";
+ case NOTMUCH_STATUS_NULL_POINTER:
+ return "Erroneous NULL pointer";
+ case NOTMUCH_STATUS_TAG_TOO_LONG:
+ return "Tag value is too long";
+ default:
+ case NOTMUCH_STATUS_LAST_STATUS:
+ return "Unknown error status value";
+ }
+}
+
/* "128 bits of thread-id ought to be enough for anybody" */
#define NOTMUCH_THREAD_ID_BITS 128
#define NOTMUCH_THREAD_ID_DIGITS (NOTMUCH_THREAD_ID_BITS / 4)
}
}
+/* XXX: We should drop this function and convert all callers to call
+ * _notmuch_message_add_term instead. */
static void
add_term (Xapian::Document doc,
const char *prefix_name,
return db->get_document (docid);
}
-Xapian::Document
-find_message_by_message_id (Xapian::Database *db, const char *message_id)
-{
- Xapian::PostingIterator i, end;
-
- find_messages_by_term (db, "msgid", message_id, &i, &end);
-
- if (i != end)
- return find_message_by_docid (db, *i);
- else
- return Xapian::Document ();
-}
-
static void
insert_thread_id (GHashTable *thread_ids, Xapian::Document doc)
{
}
}
+notmuch_message_t *
+notmuch_database_find_message (notmuch_database_t *notmuch,
+ const char *message_id)
+{
+ Xapian::PostingIterator i, end;
+
+ find_messages_by_term (notmuch->xapian_db,
+ "msgid", message_id, &i, &end);
+
+ if (i == end)
+ return NULL;
+
+ return _notmuch_message_create (notmuch, notmuch, *i);
+}
+
/* Return one or more thread_ids, (as a GPtrArray of strings), for the
* given message based on looking into the database for any messages
* referenced in parents, and also for any messages in the database
* Caller should free all strings in the array and the array itself,
* (g_ptr_array_free) when done. */
static GPtrArray *
-find_thread_ids (Xapian::Database *db,
+find_thread_ids (notmuch_database_t *notmuch,
GPtrArray *parents,
const char *message_id)
{
+ Xapian::WritableDatabase *db = notmuch->xapian_db;
Xapian::PostingIterator child, children_end;
Xapian::Document doc;
GHashTable *thread_ids;
}
for (i = 0; i < parents->len; i++) {
+ notmuch_message_t *parent;
+ notmuch_thread_ids_t *ids;
+
parent_message_id = (char *) g_ptr_array_index (parents, i);
- doc = find_message_by_message_id (db, parent_message_id);
- insert_thread_id (thread_ids, doc);
+ parent = notmuch_database_find_message (notmuch, parent_message_id);
+ if (parent == NULL)
+ continue;
+
+ for (ids = notmuch_message_get_thread_ids (parent);
+ notmuch_thread_ids_has_more (ids);
+ notmuch_thread_ids_advance (ids))
+ {
+ const char *id;
+
+ id = notmuch_thread_ids_get (ids);
+ g_hash_table_insert (thread_ids, strdup (id), NULL);
+ }
+
+ notmuch_message_destroy (parent);
}
result = g_ptr_array_new ();
Xapian::WritableDatabase *db = notmuch->xapian_db;
Xapian::Document doc;
notmuch_message_file_t *message;
+ notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
GPtrArray *parents, *thread_ids;
if (message_id == NULL)
message_id = xstrdup (header);
} else {
- /* XXX: Should generate a message_id here, (such as a SHA1
- * sum of the message itself) */
- message_id = NULL;
+ /* No message-id at all, let's generate one by taking a
+ * hash over the file's contents. */
+ char *sha1 = notmuch_sha1_of_file (filename);
+
+ /* If that failed too, something is really wrong. Give up. */
+ if (sha1 == NULL) {
+ ret = NOTMUCH_STATUS_FILE_ERROR;
+ goto DONE;
+ }
+
+ message_id = g_strdup_printf ("notmuch-sha1-%s", sha1);
+ free (sha1);
}
- thread_ids = find_thread_ids (db, parents, message_id);
+ thread_ids = find_thread_ids (notmuch, parents, message_id);
for (i = 0; i < parents->len; i++)
g_free (g_ptr_array_index (parents, i));
g_ptr_array_free (parents, TRUE);
- if (message_id) {
- add_term (doc, "msgid", message_id);
- doc.add_value (NOTMUCH_VALUE_MESSAGE_ID, message_id);
- }
+
+ add_term (doc, "msgid", message_id);
+ doc.add_value (NOTMUCH_VALUE_MESSAGE_ID, message_id);
+
+ free (message_id);
if (thread_ids->len) {
unsigned int i;
}
doc.add_value (NOTMUCH_VALUE_THREAD, thread_id->str);
g_string_free (thread_id, TRUE);
- } else if (message_id) {
+ } else {
/* If not part of any existing thread, generate a new thread_id. */
thread_id_t thread_id;
g_ptr_array_free (thread_ids, TRUE);
- free (message_id);
-
date = notmuch_message_file_get_header (message, "date");
time_value = notmuch_parse_date (date, NULL);
subject == NULL &&
to == NULL)
{
- notmuch_message_file_close (message);
- return NOTMUCH_STATUS_FILE_NOT_EMAIL;
+ ret = NOTMUCH_STATUS_FILE_NOT_EMAIL;
+ goto DONE;
} else {
db->add_document (doc);
}
} catch (const Xapian::Error &error) {
fprintf (stderr, "A Xapian exception occurred: %s.\n",
error.get_msg().c_str());
- return NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+ ret = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+ goto DONE;
}
- notmuch_message_file_close (message);
+ DONE:
+ if (message)
+ notmuch_message_file_close (message);
- return NOTMUCH_STATUS_SUCCESS;
+ return ret;
}