Filtering: add date_before and date_after
authorColin Leroy <colin@colino.net>
Fri, 24 Aug 2018 07:58:09 +0000 (09:58 +0200)
committerColin Leroy <colin@colino.net>
Fri, 24 Aug 2018 07:58:09 +0000 (09:58 +0200)
src/advsearch.c
src/gtk/quicksearch.c
src/matcher.c
src/matcher.h
src/matcher_parser_parse.y

index 3abbeaa..ecd3acd 100644 (file)
@@ -157,6 +157,8 @@ gchar *advsearch_expand_search_string(const gchar *search_string)
                { "c",  "cc",                           1,      TRUE,   TRUE  },
                { "C",  "to_or_cc",                     1,      TRUE,   TRUE  },
                { "D",  "deleted",                      0,      FALSE,  FALSE },
+               { "da", "date_after",                   1,      FALSE,  TRUE  },
+               { "db", "date_before",                  1,      FALSE,  TRUE  },
                { "e",  "header \"Sender\"",            1,      TRUE,   TRUE  },
                { "E",  "execute",                      1,      FALSE,  TRUE  },
                { "f",  "from",                         1,      TRUE,   TRUE  },
index 33c883e..ca01473 100644 (file)
@@ -485,6 +485,10 @@ static gchar *search_descr_strings[] = {
        "c S",   N_("messages carbon-copied to S"),
        "C S",   N_("message is either To: or Cc: to S"),
        "D",     N_("deleted messages"), /** how I can filter deleted messages **/
+       "da \"YYYY-MM-dd HH:mm:ss\"",  N_("messages whose date is after requested date "
+                                         "(time is optional)"),
+       "db \"YYYY-MM-dd HH:mm:ss\"",  N_("messages whose date is before requested date "
+                                         "(time is optional)"),
        "e S",   N_("messages which contain S in the Sender field"),
        "E S",   N_("true if execute \"S\" succeeds"),
        "f S",   N_("messages originating from user S"),
index a0d8ab7..29581e9 100644 (file)
@@ -112,6 +112,8 @@ static const MatchParser matchparser_tab[] = {
        {MATCHCRITERIA_AGE_LOWER, "age_lower"},
        {MATCHCRITERIA_AGE_GREATER_HOURS, "age_greater_hours"},
        {MATCHCRITERIA_AGE_LOWER_HOURS, "age_lower_hours"},
+       {MATCHCRITERIA_DATE_AFTER, "date_after"},
+       {MATCHCRITERIA_DATE_BEFORE, "date_before"},
        {MATCHCRITERIA_NEWSGROUPS, "newsgroups"},
        {MATCHCRITERIA_NOT_NEWSGROUPS, "~newsgroups"},
        {MATCHCRITERIA_MESSAGEID, "messageid"},
@@ -932,6 +934,27 @@ static gboolean matcherprop_match(MatcherProp *prop,
                }
                return ret;
        }
+       case MATCHCRITERIA_DATE_AFTER:
+       {
+               gboolean ret;
+
+               ret = prop->value < info->date_t;
+
+               /* debug output */
+               if (debug_filtering_session
+                               && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
+                       if (ret) {
+                               log_print(LOG_DEBUG_FILTERING,
+                                               "message date [ %ld ] is after [ %d ]\n",
+                                               info->date_t, prop->value);
+                       } else {
+                               log_print(LOG_DEBUG_FILTERING,
+                                               "message date [ %ld ] is not after [ %d ]\n",
+                                               info->date_t, prop->value);
+                       }
+               }
+               return ret;
+       }
        case MATCHCRITERIA_AGE_LOWER:
                age_mult_hours = 24;
                /* Fallthrough intended */
@@ -959,6 +982,27 @@ static gboolean matcherprop_match(MatcherProp *prop,
                }
                return ret;
        }
+       case MATCHCRITERIA_DATE_BEFORE:
+       {
+               gboolean ret;
+
+               ret = prop->value > info->date_t;
+
+               /* debug output */
+               if (debug_filtering_session
+                               && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
+                       if (ret) {
+                               log_print(LOG_DEBUG_FILTERING,
+                                               "message date [ %ld ] is before [ %d ]\n",
+                                               info->date_t, prop->value);
+                       } else {
+                               log_print(LOG_DEBUG_FILTERING,
+                                               "message date [ %ld ] is not before [ %d ]\n",
+                                               info->date_t, prop->value);
+                       }
+               }
+               return ret;
+       }
        case MATCHCRITERIA_SCORE_GREATER:
        {
                gboolean ret = (info->score > prop->value);
@@ -1912,6 +1956,8 @@ gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info)
                case MATCHCRITERIA_AGE_LOWER:
                case MATCHCRITERIA_AGE_GREATER_HOURS:
                case MATCHCRITERIA_AGE_LOWER_HOURS:
+               case MATCHCRITERIA_DATE_AFTER:
+               case MATCHCRITERIA_DATE_BEFORE:
                case MATCHCRITERIA_NEWSGROUPS:
                case MATCHCRITERIA_NOT_NEWSGROUPS:
                case MATCHCRITERIA_MESSAGEID:
@@ -2104,6 +2150,8 @@ gchar *matcherprop_to_string(MatcherProp *matcher)
                return g_strdup(criteria_str);
        case MATCHCRITERIA_TEST:
        case MATCHCRITERIA_NOT_TEST:
+       case MATCHCRITERIA_DATE_AFTER:
+       case MATCHCRITERIA_DATE_BEFORE:
                quoted_expr = matcher_quote_str(matcher->expr);
                matcher_str = g_strdup_printf("%s \"%s\"",
                                              criteria_str, quoted_expr);
index e9c3239..392924d 100644 (file)
@@ -88,6 +88,7 @@ enum {
        MC_(TO_OR_CC), MC_(NOT_TO_AND_NOT_CC),
        MC_(AGE_GREATER), MC_(AGE_LOWER),
        MC_(AGE_GREATER_HOURS), MC_(AGE_LOWER_HOURS),
+       MC_(DATE_AFTER), MC_(DATE_BEFORE),
        MC_(NEWSGROUPS), MC_(NOT_NEWSGROUPS),
        MC_(MESSAGEID), MC_(NOT_MESSAGEID),
        MC_(INREPLYTO), MC_(NOT_INREPLYTO),
index ea37c44..19726de 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "utils.h"
 #include "filtering.h"
+#include "procheader.h"
 #include "matcher.h"
 #include "matcher_parser.h"
 #include "matcher_parser_lex.h"
@@ -326,6 +327,7 @@ int matcher_parserwrap(void)
 %token MATCHER_CC  MATCHER_NOT_CC  MATCHER_TO_OR_CC  MATCHER_NOT_TO_AND_NOT_CC
 %token MATCHER_AGE_GREATER  MATCHER_AGE_LOWER  MATCHER_NEWSGROUPS
 %token MATCHER_AGE_GREATER_HOURS  MATCHER_AGE_LOWER_HOURS
+%token MATCHER_DATE_AFTER  MATCHER_DATE_BEFORE
 %token MATCHER_NOT_NEWSGROUPS  MATCHER_INREPLYTO  MATCHER_NOT_INREPLYTO
 %token MATCHER_MESSAGEID MATCHER_NOT_MESSAGEID
 %token MATCHER_REFERENCES  MATCHER_NOT_REFERENCES  MATCHER_SCORE_GREATER
@@ -989,6 +991,28 @@ MATCHER_ALL
        value = strtol($2, NULL, 0);
        prop = matcherprop_new(criteria, NULL, 0, NULL, value);
 }
+| MATCHER_DATE_AFTER MATCHER_STRING
+{
+       gint criteria = 0;
+       gchar *expr = NULL;
+       time_t value;
+
+       criteria = MATCHCRITERIA_DATE_AFTER;
+       expr = $2;
+       value = procheader_date_parse(NULL, expr, 0);
+       prop = matcherprop_new(criteria, NULL, 0, expr, value);
+}
+| MATCHER_DATE_BEFORE MATCHER_STRING
+{
+       gint criteria = 0;
+       gchar *expr = NULL;
+       time_t value;
+
+       criteria = MATCHCRITERIA_DATE_BEFORE;
+       expr = $2;
+       value = procheader_date_parse(NULL, expr, 0);
+       prop = matcherprop_new(criteria, NULL, 0, expr, value);
+}
 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
 {
        gint criteria = 0;