Bug #269413 - Search treats "4 weeks" and "1 month" as synonymous
authorMilan Crha <mcrha@redhat.com>
Mon, 20 Jun 2011 11:56:46 +0000 (13:56 +0200)
committerMilan Crha <mcrha@redhat.com>
Mon, 20 Jun 2011 11:56:46 +0000 (13:56 +0200)
camel/camel-filter-search.c
camel/camel-folder-search.c
camel/camel-folder-search.h
camel/camel-search-sql-sexp.c

index 1c6a521..cf8ef83 100644 (file)
@@ -88,6 +88,7 @@ static ESExpResult *system_flag (struct _ESExp *f, gint argc, struct _ESExpResul
 static ESExpResult *get_sent_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
 static ESExpResult *get_received_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
 static ESExpResult *get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
+static ESExpResult *get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
 static ESExpResult *header_source (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
 static ESExpResult *get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
 static ESExpResult *pipe_message (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
@@ -117,6 +118,7 @@ static struct {
        { "get-sent-date",      (ESExpFunc *) get_sent_date,      0 },
        { "get-received-date",  (ESExpFunc *) get_received_date,  0 },
        { "get-current-date",   (ESExpFunc *) get_current_date,   0 },
+       { "get-relative-months",(ESExpFunc *) get_relative_months,0 },
        { "header-source",      (ESExpFunc *) header_source,      0 },
        { "get-size",           (ESExpFunc *) get_size,           0 },
        { "pipe-message",       (ESExpFunc *) pipe_message,       0 },
@@ -460,6 +462,24 @@ get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, Filte
        return r;
 }
 
+static ESExpResult *
+get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, FilterMessageSearch *fms)
+{
+       ESExpResult *r;
+
+       if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
+               r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+               r->value.boolean = FALSE;
+
+               g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
+       } else {
+               r = e_sexp_result_new (f, ESEXP_RES_INT);
+               r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
+       }
+
+       return r;
+}
+
 static CamelService *
 get_service_for_source (CamelSession *session, const gchar *src)
 {
index af8cf3b..78597c0 100644 (file)
@@ -84,6 +84,7 @@ static ESExpResult *search_system_flag (struct _ESExp *f, gint argc, struct _ESE
 static ESExpResult *search_get_sent_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 static ESExpResult *search_get_received_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 static ESExpResult *search_get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+static ESExpResult *search_get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 static ESExpResult *search_get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 static ESExpResult *search_uid (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 static ESExpResult *search_message_location (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
@@ -149,6 +150,7 @@ camel_folder_search_class_init (CamelFolderSearchClass *class)
        class->get_sent_date = search_get_sent_date;
        class->get_received_date = search_get_received_date;
        class->get_current_date = search_get_current_date;
+       class->get_relative_months = search_get_relative_months;
        class->get_size = search_get_size;
        class->uid = search_uid;
        class->message_location = search_message_location;
@@ -196,6 +198,7 @@ static struct {
        { "get-sent-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_sent_date), 1 },
        { "get-received-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_received_date), 1 },
        { "get-current-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_current_date), 1 },
+       { "get-relative-months", G_STRUCT_OFFSET(CamelFolderSearchClass, get_relative_months), 1 },
        { "get-size", G_STRUCT_OFFSET(CamelFolderSearchClass, get_size), 1 },
        { "uid", G_STRUCT_OFFSET(CamelFolderSearchClass, uid), 1 },
        { "message-location", G_STRUCT_OFFSET(CamelFolderSearchClass, message_location), 1 },
@@ -1761,6 +1764,26 @@ search_get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv
 }
 
 static ESExpResult *
+search_get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s)
+{
+       ESExpResult *r;
+
+       r(printf("executing get-relative-months\n"));
+
+       if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
+               r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+               r->value.boolean = FALSE;
+
+               g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
+       } else {
+               r = e_sexp_result_new (f, ESEXP_RES_INT);
+               r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
+       }
+
+       return r;
+}
+
+static ESExpResult *
 search_get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s)
 {
        ESExpResult *r;
@@ -1872,3 +1895,30 @@ search_message_location (struct _ESExp *f, gint argc, struct _ESExpResult **argv
 
        return r;
 }
+
+/* add or subtract given number of months to given time */
+time_t
+camel_folder_search_util_add_months (time_t t, gint months)
+{
+       GDateTime *dt, *dt2;
+       time_t res;
+
+       if (!months)
+               return t;
+
+       dt = g_date_time_new_from_unix_utc (t);
+
+       /* just for issues, to return something inaccurate, but sane */
+       res = t + (60 * 60 * 24 * 30 * months);
+
+       g_return_val_if_fail (dt != NULL, res);
+
+       dt2 = g_date_time_add_months (dt, months);
+       g_date_time_unref (dt);
+       g_return_val_if_fail (dt2 != NULL, res);
+
+       res = g_date_time_to_unix (dt2);
+       g_date_time_unref (dt2);
+
+       return res;
+}
index e8ba03e..cdd65e5 100644 (file)
@@ -137,6 +137,9 @@ struct _CamelFolderSearchClass {
        /* (get-current-date) Retrieve 'now' as a time_t */
        ESExpResult * (*get_current_date)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 
+       /* (get-relative-months) Retrieve relative seconds from 'now' and specified number of months as a time_t */
+       ESExpResult * (*get_relative_months)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
+
        /* (get-size) Retrieve message size as an gint (in kilobytes) */
        ESExpResult * (*get_size)(struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 
@@ -163,6 +166,8 @@ GPtrArray *camel_folder_search_search (CamelFolderSearch *search, const gchar *e
 guint32 camel_folder_search_count (CamelFolderSearch *search, const gchar *expr, GError **error);
 void camel_folder_search_free_result (CamelFolderSearch *search, GPtrArray *);
 
+time_t camel_folder_search_util_add_months (time_t t, gint months);
+
 G_END_DECLS
 
 #endif /* CAMEL_FOLDER_SEARCH_H */
index 53bbf11..25ee6a8 100644 (file)
@@ -536,6 +536,26 @@ get_current_date (struct _ESExp *f, gint argc, struct _ESExpResult **argv, gpoin
 }
 
 static ESExpResult *
+get_relative_months (struct _ESExp *f, gint argc, struct _ESExpResult **argv, gpointer data)
+{
+       ESExpResult *r;
+
+       d(printf("executing get-relative-months\n"));
+
+       if (argc != 1 || argv[0]->type != ESEXP_RES_INT) {
+               r = e_sexp_result_new (f, ESEXP_RES_BOOL);
+               r->value.boolean = FALSE;
+
+               g_debug ("%s: Expecting 1 argument, an integer, but got %d arguments", G_STRFUNC, argc);
+       } else {
+               r = e_sexp_result_new (f, ESEXP_RES_INT);
+               r->value.number = camel_folder_search_util_add_months (time (NULL), argv[0]->value.number);
+       }
+
+       return r;
+}
+
+static ESExpResult *
 get_size (struct _ESExp *f, gint argc, struct _ESExpResult **argv, gpointer data)
 {
        ESExpResult *r;
@@ -595,6 +615,7 @@ static struct {
        { "get-sent-date", get_sent_date, 0},
        { "get-received-date", get_received_date, 0},
        { "get-current-date", get_current_date, 0},
+       { "get-relative-months", get_relative_months, 0},
        { "get-size", get_size, 0},
        { "sql-exp", sql_exp, 0},