mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
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:
parent
7f57b747b9
commit
98ee460eaa
5 changed files with 72 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
37
test/T570-revision-tracking.sh
Executable 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
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue