]> git.notmuchmail.org Git - notmuch/blobdiff - lib/parse-time-vrp.cc
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / lib / parse-time-vrp.cc
index 10809aa37453306ef9fc117c3d24f34fa52af581..6b07970b7960254b240bb68312f61200fa976336 100644 (file)
 #include "parse-time-vrp.h"
 #include "parse-time-string.h"
 
-Xapian::Query
-ParseTimeRangeProcessor::operator() (const std::string &begin, const std::string &end)
+notmuch_status_t
+_notmuch_date_strings_to_query (Xapian::valueno slot,
+                               const std::string &begin, const std::string &end,
+                               Xapian::Query &output, std::string &msg)
 {
     double from = DBL_MIN, to = DBL_MAX;
     time_t parsed_time, now;
     std::string str;
 
     /* Use the same 'now' for begin and end. */
-    if (time (&now) == (time_t) -1)
-       throw Xapian::QueryParserError ("unable to get current time");
+    if (time (&now) == (time_t) -1) {
+       msg = "unable to get current time";
+       return NOTMUCH_STATUS_ILLEGAL_ARGUMENT;
+    }
 
-    if (!begin.empty ()) {
-       if (parse_time_string (begin.c_str (), &parsed_time, &now, PARSE_TIME_ROUND_DOWN))
-           throw Xapian::QueryParserError ("Didn't understand date specification '" + begin + "'");
-       else
-           from = (double) parsed_time;
+    if (! begin.empty ()) {
+       if (parse_time_string (begin.c_str (), &parsed_time, &now, PARSE_TIME_ROUND_DOWN)) {
+           msg = "Didn't understand date specification '" + begin + "'";
+           return NOTMUCH_STATUS_BAD_QUERY_SYNTAX;
+       }
+
+       from = (double) parsed_time;
     }
 
-    if (!end.empty ()) {
+    if (! end.empty ()) {
        if (end == "!" && ! begin.empty ())
            str = begin;
        else
            str = end;
 
-       if (parse_time_string (str.c_str (), &parsed_time, &now, PARSE_TIME_ROUND_UP_INCLUSIVE))
-           throw Xapian::QueryParserError ("Didn't understand date specification '" + str + "'");
-       else
-           to = (double) parsed_time;
+       if (parse_time_string (str.c_str (), &parsed_time, &now, PARSE_TIME_ROUND_UP_INCLUSIVE)) {
+           msg = "Didn't understand date specification '" + str + "'";
+           return NOTMUCH_STATUS_BAD_QUERY_SYNTAX;
+       }
+       to = (double) parsed_time;
     }
 
-    return Xapian::Query (Xapian::Query::OP_VALUE_RANGE, slot,
-                         Xapian::sortable_serialise (from),
-                         Xapian::sortable_serialise (to));
+    output = Xapian::Query (Xapian::Query::OP_VALUE_RANGE, slot,
+                           Xapian::sortable_serialise (from),
+                           Xapian::sortable_serialise (to));
+    return NOTMUCH_STATUS_SUCCESS;
+}
+
+Xapian::Query
+ParseTimeRangeProcessor::operator() (const std::string &begin, const std::string &end)
+{
+
+    Xapian::Query output;
+    std::string msg;
+
+    if (_notmuch_date_strings_to_query (slot, begin, end, output, msg))
+       throw Xapian::QueryParserError (msg);
+
+    return output;
 }
 
 /* XXX TODO: is throwing an exception the right thing to do here? */