lib: API to retrieve database revision and UUID

This exposes the committed database revision to library users along
with a UUID that can be used to detect when revision numbers are no
longer comparable (e.g., because the database has been replaced).
This commit is contained in:
Austin Clements 2014-10-13 02:20:02 -04:00 committed by David Bremner
parent 7f57b747b9
commit 98ee460eaa
5 changed files with 72 additions and 0 deletions

View file

@ -170,6 +170,7 @@ struct _notmuch_database {
* under a higher revision number, which can be generated with
* notmuch_database_new_revision. */
unsigned long revision;
const char *uuid;
Xapian::QueryParser *query_parser;
Xapian::TermGenerator *term_gen;

View file

@ -992,6 +992,8 @@ notmuch_database_open_verbose (const char *path,
notmuch->revision = 0;
else
notmuch->revision = Xapian::sortable_unserialise (last_mod);
notmuch->uuid = talloc_strdup (
notmuch, notmuch->xapian_db->get_uuid ().c_str ());
notmuch->query_parser = new Xapian::QueryParser;
notmuch->term_gen = new Xapian::TermGenerator;
@ -1666,6 +1668,15 @@ DONE:
return NOTMUCH_STATUS_SUCCESS;
}
unsigned long
notmuch_database_get_revision (notmuch_database_t *notmuch,
const char **uuid)
{
if (uuid)
*uuid = notmuch->uuid;
return notmuch->revision;
}
/* We allow the user to use arbitrarily long paths for directories. But
* we have a term-length limit. So if we exceed that, we'll use the
* SHA-1 of the path for the database term.

View file

@ -467,6 +467,24 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch);
notmuch_status_t
notmuch_database_end_atomic (notmuch_database_t *notmuch);
/**
* Return the committed database revision and UUID.
*
* The database revision number increases monotonically with each
* commit to the database. Hence, all messages and message changes
* committed to the database (that is, visible to readers) have a last
* modification revision <= the committed database revision. Any
* messages committed in the future will be assigned a modification
* revision > the committed database revision.
*
* The UUID is a NUL-terminated opaque string that uniquely identifies
* this database. Two revision numbers are only comparable if they
* have the same database UUID.
*/
unsigned long
notmuch_database_get_revision (notmuch_database_t *notmuch,
const char **uuid);
/**
* Retrieve a directory object from the database for 'path'.
*

37
test/T570-revision-tracking.sh Executable file
View file

@ -0,0 +1,37 @@
#!/usr/bin/env bash
test_description="database revision tracking"
. ./test-lib.sh || exit 1
add_email_corpus
test_begin_subtest "notmuch_database_get_revision"
test_C ${MAIL_DIR} <<'EOF'
#include <stdio.h>
#include <string.h>
#include <notmuch.h>
int main (int argc, char** argv)
{
notmuch_database_t *db;
notmuch_status_t stat;
unsigned long revision;
const char *uuid;
unsigned long rev;
stat = notmuch_database_open (argv[1], NOTMUCH_DATABASE_MODE_READ_ONLY, &db);
if (stat)
fputs ("open failed\n", stderr);
revision = notmuch_database_get_revision (db, &uuid);
printf("%s\t%lu\n", uuid, revision);
}
EOF
notmuch_uuid_sanitize < OUTPUT > CLEAN
cat <<'EOF' >EXPECTED
== stdout ==
UUID 53
== stderr ==
EOF
test_expect_equal_file EXPECTED CLEAN
test_done

View file

@ -720,6 +720,11 @@ notmuch_date_sanitize ()
sed \
-e 's/^Date: Fri, 05 Jan 2001 .*0000/Date: GENERATED_DATE/'
}
notmuch_uuid_sanitize ()
{
sed 's/[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}/UUID/g'
}
# End of notmuch helper functions
# Use test_set_prereq to tell that a particular prerequisite is available.