[RFC PATCH 05/13] notmuch_database_add_message calculates sha1 of messages using mailstore
Ethan Glasser-Camp
glasse at cs.rpi.edu
Wed Feb 15 14:01:58 PST 2012
From: Ethan Glasser-Camp <ethan at betacantrips.com>
Previously, notmuch_database_add_message used the notmuch_sha1_of_file
function, which accesses a mail file directly. Create a new function
called notmuch_sha1_of_message which uses a mailstore to access the
file, and use that instead.
Also, as a drive-by cleanup, use the named constant BLOCK_SIZE instead
of the integer literal 4096.
Signed-off-by: Ethan Glasser-Camp <ethan at betacantrips.com>
---
lib/database.cc | 2 +-
lib/notmuch-private.h | 3 ++
lib/sha1.c | 52 ++++++++++++++++++++++++++++++++++++------------
3 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/lib/database.cc b/lib/database.cc
index e3c8095..ff44e76 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -1700,7 +1700,7 @@ notmuch_database_add_message (notmuch_database_t *notmuch,
if (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);
+ char *sha1 = notmuch_sha1_of_message (notmuch->mailstore, filename);
/* If that failed too, something is really wrong. Give up. */
if (sha1 == NULL) {
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index 0f01437..2589928 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -454,6 +454,9 @@ notmuch_sha1_of_string (const char *str);
char *
notmuch_sha1_of_file (const char *filename);
+char *
+notmuch_sha1_of_message (notmuch_mailstore_t *mailstore, const char *filename);
+
/* string-list.c */
typedef struct _notmuch_string_node {
diff --git a/lib/sha1.c b/lib/sha1.c
index cc48108..ea25999 100644
--- a/lib/sha1.c
+++ b/lib/sha1.c
@@ -64,19 +64,11 @@ notmuch_sha1_of_string (const char *str)
return _hex_of_sha1_digest (digest);
}
-/* Create a hexadecimal string version of the SHA-1 digest of the
- * contents of the named file.
- *
- * This function returns a newly allocated string which the caller
- * should free() when finished.
- *
- * If any error occurs while reading the file, (permission denied,
- * file not found, etc.), this function returns NULL.
+/* Internal function to feed the contents of a FILE * to the sha1 functions.
*/
-char *
-notmuch_sha1_of_file (const char *filename)
+static char *
+_notmuch_sha1_of_filep (FILE *file)
{
- FILE *file;
#define BLOCK_SIZE 4096
unsigned char block[BLOCK_SIZE];
size_t bytes_read;
@@ -84,14 +76,13 @@ notmuch_sha1_of_file (const char *filename)
unsigned char digest[SHA1_DIGEST_SIZE];
char *result;
- file = fopen (filename, "r");
if (file == NULL)
return NULL;
sha1_begin (&sha1);
while (1) {
- bytes_read = fread (block, 1, 4096, file);
+ bytes_read = fread (block, 1, BLOCK_SIZE, file);
if (bytes_read == 0) {
if (feof (file)) {
break;
@@ -113,3 +104,38 @@ notmuch_sha1_of_file (const char *filename)
return result;
}
+/* Create a hexadecimal string version of the SHA-1 digest of the
+ * contents of the named file.
+ *
+ * This function returns a newly allocated string which the caller
+ * should free() when finished.
+ *
+ * If any error occurs while reading the file, (permission denied,
+ * file not found, etc.), this function returns NULL.
+ */
+char *
+notmuch_sha1_of_file (const char *filename)
+{
+ FILE *file;
+
+ file = fopen (filename, "r");
+ return _notmuch_sha1_of_filep (file);
+}
+
+/* Create a hexadecimal string version of the SHA-1 digest of the
+ * contents of the named message, which is accessed via a mailstore.
+ *
+ * This function returns a newly allocated string which the caller
+ * should free() when finished.
+ *
+ * If any error occurs while reading the file, (permission denied,
+ * file not found, etc.), this function returns NULL.
+ */
+char *
+notmuch_sha1_of_message (notmuch_mailstore_t *mailstore, const char *filename)
+{
+ FILE *file;
+
+ file = notmuch_mailstore_open (mailstore, filename);
+ return _notmuch_sha1_of_filep (file);
+}
--
1.7.5.4
More information about the notmuch
mailing list