[notmuch] [PATCH 3/4] integrate date parser
Integrate and make use of the notmuch_parse_date() function in date.c that is being called by the new MaildateValueRangeProcessor in lib/database.cc Thanks to keithp for donating the date parser for achieving this in a nice way. Signed-off-by: Sebastian Spaeth --- lib/Makefile.local |1 + lib/database.cc| 33 - lib/notmuch.h | 17 + 3 files changed, 50 insertions(+), 1 deletions(-) diff --git a/lib/Makefile.local b/lib/Makefile.local index 70489e1..44deaf8 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -3,6 +3,7 @@ extra_cflags += -I$(dir) libnotmuch_c_srcs =\ $(dir)/libsha1.c\ + $(dir)/date.c \ $(dir)/message-file.c \ $(dir)/messages.c \ $(dir)/sha1.c \ diff --git a/lib/database.cc b/lib/database.cc index ddda933..78cd898 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -496,6 +496,37 @@ _notmuch_database_ensure_writable (notmuch_database_t *notmuch) return NOTMUCH_STATUS_SUCCESS; } +struct MaildateValueRangeProcessor : public Xapian::ValueRangeProcessor { +MaildateValueRangeProcessor() {} + +Xapian::valueno operator()(std::string &begin, std::string &end) { + time_t begin_first,begin_last, end_first, end_last; + int retval; + + if (begin.substr(0, 5) != "date:") +return Xapian::BAD_VALUENO; + begin.erase(0, 5); + + retval = notmuch_parse_date(begin.c_str(), &begin_first, &begin_last, 0); + + if (retval == NOTMUCH_STATUS_INVALID_DATE) { + fprintf(stderr,"Begin date failed to parse: %s",begin.c_str()); + return Xapian::BAD_VALUENO; + } + + retval = notmuch_parse_date(end.c_str(),&end_first,&end_last,begin_first); + if (retval == NOTMUCH_STATUS_INVALID_DATE) { + fprintf(stderr,"End date failed to parse: %s",end.c_str()); + return Xapian::BAD_VALUENO; + } + + begin.assign(Xapian::sortable_serialise(begin_first)); + end.assign(Xapian::sortable_serialise(end_last)); + + return NOTMUCH_VALUE_TIMESTAMP; +} +}; + notmuch_database_t * notmuch_database_open (const char *path, notmuch_database_mode_t mode) @@ -572,7 +603,7 @@ notmuch_database_open (const char *path, notmuch->query_parser = new Xapian::QueryParser; notmuch->term_gen = new Xapian::TermGenerator; notmuch->term_gen->set_stemmer (Xapian::Stem ("english")); - notmuch->value_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP); + notmuch->value_range_processor = new MaildateValueRangeProcessor(); notmuch->query_parser->set_default_op (Xapian::Query::OP_AND); notmuch->query_parser->set_database (*notmuch->xapian_db); diff --git a/lib/notmuch.h b/lib/notmuch.h index 56a76d1..fa8f41a 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -1089,6 +1089,23 @@ notmuch_filenames_advance (notmuch_filenames_t *filenames); void notmuch_filenames_destroy (notmuch_filenames_t *filenames); +notmuch_status_t +notmuch_parse_date(const char *text, time_t *first, time_t *last, time_t after); +/* Parse a string into the first and last possible timestamps. + * It parses the possible formats and stops if one pattern matches. + * Keywords: 'today','yesterday','thisweek','lastweek','thismonth', + * 'lastmonth' + * Month-day : month[-day]] (month: January, Jan, or 1)\n" + * ISO format: year[-month[-day]] + * US format : month[/day[/year]] + * + * 'after' is used to fill in bits from context if left out, e.g. a + * 'date:2004..01' will find from 2004-01-01 through 2004-01-31 + * + * Return values: + * NOTMUCH_STATUS_SUCCESS + * NOTMUCH_STATUS_INVALID_DATE: Error parsing the date string + */ NOTMUCH_END_DECLS #endif -- 1.6.3.3
[notmuch] [PATCH 3/4] integrate date parser
Integrate and make use of the notmuch_parse_date() function in date.c that is being called by the new MaildateValueRangeProcessor in lib/database.cc Thanks to keithp for donating the date parser for achieving this in a nice way. Signed-off-by: Sebastian Spaeth --- lib/Makefile.local |1 + lib/database.cc| 33 - lib/notmuch.h | 17 + 3 files changed, 50 insertions(+), 1 deletions(-) diff --git a/lib/Makefile.local b/lib/Makefile.local index 70489e1..44deaf8 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -3,6 +3,7 @@ extra_cflags += -I$(dir) libnotmuch_c_srcs =\ $(dir)/libsha1.c\ + $(dir)/date.c \ $(dir)/message-file.c \ $(dir)/messages.c \ $(dir)/sha1.c \ diff --git a/lib/database.cc b/lib/database.cc index ddda933..78cd898 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -496,6 +496,37 @@ _notmuch_database_ensure_writable (notmuch_database_t *notmuch) return NOTMUCH_STATUS_SUCCESS; } +struct MaildateValueRangeProcessor : public Xapian::ValueRangeProcessor { +MaildateValueRangeProcessor() {} + +Xapian::valueno operator()(std::string &begin, std::string &end) { + time_t begin_first,begin_last, end_first, end_last; + int retval; + + if (begin.substr(0, 5) != "date:") +return Xapian::BAD_VALUENO; + begin.erase(0, 5); + + retval = notmuch_parse_date(begin.c_str(), &begin_first, &begin_last, 0); + + if (retval == NOTMUCH_STATUS_INVALID_DATE) { + fprintf(stderr,"Begin date failed to parse: %s",begin.c_str()); + return Xapian::BAD_VALUENO; + } + + retval = notmuch_parse_date(end.c_str(),&end_first,&end_last,begin_first); + if (retval == NOTMUCH_STATUS_INVALID_DATE) { + fprintf(stderr,"End date failed to parse: %s",end.c_str()); + return Xapian::BAD_VALUENO; + } + + begin.assign(Xapian::sortable_serialise(begin_first)); + end.assign(Xapian::sortable_serialise(end_last)); + + return NOTMUCH_VALUE_TIMESTAMP; +} +}; + notmuch_database_t * notmuch_database_open (const char *path, notmuch_database_mode_t mode) @@ -572,7 +603,7 @@ notmuch_database_open (const char *path, notmuch->query_parser = new Xapian::QueryParser; notmuch->term_gen = new Xapian::TermGenerator; notmuch->term_gen->set_stemmer (Xapian::Stem ("english")); - notmuch->value_range_processor = new Xapian::NumberValueRangeProcessor (NOTMUCH_VALUE_TIMESTAMP); + notmuch->value_range_processor = new MaildateValueRangeProcessor(); notmuch->query_parser->set_default_op (Xapian::Query::OP_AND); notmuch->query_parser->set_database (*notmuch->xapian_db); diff --git a/lib/notmuch.h b/lib/notmuch.h index 56a76d1..fa8f41a 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -1089,6 +1089,23 @@ notmuch_filenames_advance (notmuch_filenames_t *filenames); void notmuch_filenames_destroy (notmuch_filenames_t *filenames); +notmuch_status_t +notmuch_parse_date(const char *text, time_t *first, time_t *last, time_t after); +/* Parse a string into the first and last possible timestamps. + * It parses the possible formats and stops if one pattern matches. + * Keywords: 'today','yesterday','thisweek','lastweek','thismonth', + * 'lastmonth' + * Month-day : month[-day]] (month: January, Jan, or 1)\n" + * ISO format: year[-month[-day]] + * US format : month[/day[/year]] + * + * 'after' is used to fill in bits from context if left out, e.g. a + * 'date:2004..01' will find from 2004-01-01 through 2004-01-31 + * + * Return values: + * NOTMUCH_STATUS_SUCCESS + * NOTMUCH_STATUS_INVALID_DATE: Error parsing the date string + */ NOTMUCH_END_DECLS #endif -- 1.6.3.3 ___ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch