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
|
* under a higher revision number, which can be generated with
|
||||||
* notmuch_database_new_revision. */
|
* notmuch_database_new_revision. */
|
||||||
unsigned long revision;
|
unsigned long revision;
|
||||||
|
const char *uuid;
|
||||||
|
|
||||||
Xapian::QueryParser *query_parser;
|
Xapian::QueryParser *query_parser;
|
||||||
Xapian::TermGenerator *term_gen;
|
Xapian::TermGenerator *term_gen;
|
||||||
|
|
|
@ -992,6 +992,8 @@ notmuch_database_open_verbose (const char *path,
|
||||||
notmuch->revision = 0;
|
notmuch->revision = 0;
|
||||||
else
|
else
|
||||||
notmuch->revision = Xapian::sortable_unserialise (last_mod);
|
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->query_parser = new Xapian::QueryParser;
|
||||||
notmuch->term_gen = new Xapian::TermGenerator;
|
notmuch->term_gen = new Xapian::TermGenerator;
|
||||||
|
@ -1666,6 +1668,15 @@ DONE:
|
||||||
return NOTMUCH_STATUS_SUCCESS;
|
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 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
|
* we have a term-length limit. So if we exceed that, we'll use the
|
||||||
* SHA-1 of the path for the database term.
|
* 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_status_t
|
||||||
notmuch_database_end_atomic (notmuch_database_t *notmuch);
|
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'.
|
* 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 \
|
sed \
|
||||||
-e 's/^Date: Fri, 05 Jan 2001 .*0000/Date: GENERATED_DATE/'
|
-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
|
# End of notmuch helper functions
|
||||||
|
|
||||||
# Use test_set_prereq to tell that a particular prerequisite is available.
|
# Use test_set_prereq to tell that a particular prerequisite is available.
|
||||||
|
|
Loading…
Reference in a new issue