[notmuch] [PATCH 3/4] integrate date parser

2010-02-08 Thread Sebastian Spaeth
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

2010-02-08 Thread Sebastian Spaeth
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