[evolution-data-server/gnome-3-36] I#222 - Camel: Match-All condition doesn't show any messages



commit 075e7c20bf12558185f61b52814058f4ec61e3e5
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jun 1 17:40:41 2020 +0200

    I#222 - Camel: Match-All condition doesn't show any messages
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/222

 src/camel/camel-folder-search.c   |   8 +--
 src/camel/camel-search-sql-sexp.c | 109 ++++++++++++++++++++------------------
 2 files changed, 62 insertions(+), 55 deletions(-)
---
diff --git a/src/camel/camel-folder-search.c b/src/camel/camel-folder-search.c
index 33741fd4e..346af67a4 100644
--- a/src/camel/camel-folder-search.c
+++ b/src/camel/camel-folder-search.c
@@ -2256,10 +2256,10 @@ camel_folder_search_count (CamelFolderSearch *search,
 
                dd (printf ("sexp is : [%s]\n", expr));
                tmp1 = camel_db_sqlize_string (full_name);
-               tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, sql_query ? "WHERE" : "", 
sql_query ? sql_query : "");
+               tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, (sql_query && *sql_query) ? 
"WHERE" : "", sql_query ? sql_query : "");
                camel_db_free_sqlized_string (tmp1);
                g_free (sql_query);
-               dd (printf ("Equivalent sql %s\n", tmp));
+               dd (printf ("Equivalent sql: \"%s\"\n", tmp));
 
                cdb = camel_store_get_db (parent_store);
                camel_db_count_message_info  (cdb, tmp, &count, &local_error);
@@ -2432,10 +2432,10 @@ camel_folder_search_search (CamelFolderSearch *search,
 
                dd (printf ("sexp is : [%s]\n", expr));
                tmp1 = camel_db_sqlize_string (full_name);
-               tmp = g_strdup_printf ("SELECT uid FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query ? 
sql_query:"");
+               tmp = g_strdup_printf ("SELECT uid FROM %s %s %s", tmp1, (sql_query && *sql_query) ? "WHERE" 
: "", sql_query ? sql_query : "");
                camel_db_free_sqlized_string (tmp1);
                g_free (sql_query);
-               dd (printf ("Equivalent sql %s\n", tmp));
+               dd (printf ("Equivalent sql: \"%s\"\n", tmp));
 
                matches = g_ptr_array_new ();
                cdb = camel_store_get_db (parent_store);
diff --git a/src/camel/camel-search-sql-sexp.c b/src/camel/camel-search-sql-sexp.c
index 72489694a..59e99435a 100644
--- a/src/camel/camel-search-sql-sexp.c
+++ b/src/camel/camel-search-sql-sexp.c
@@ -72,69 +72,75 @@ get_db_safe_string (const gchar *str)
 }
 
 /* Configuration of your sexp expression */
-
 static CamelSExpResult *
-func_and (CamelSExp *f,
-          gint argc,
-          struct _CamelSExpTerm **argv,
-          gpointer data)
+func_and_or (CamelSExp *f,
+            gint argc,
+            struct _CamelSExpTerm **argv,
+            const gchar *term)
 {
        CamelSExpResult *r, *r1;
        GString *string;
        gint i;
 
-       d (printf ("executing and: %d", argc));
+       string = NULL;
 
-       string = g_string_new ("( ");
        for (i = 0; i < argc; i++) {
                r1 = camel_sexp_term_eval (f, argv[i]);
 
-               if (r1->type != CAMEL_SEXP_RES_STRING) {
-                       camel_sexp_result_free (f, r1);
-                       continue;
+               if (r1->type == CAMEL_SEXP_RES_STRING &&
+                   r1->value.string && *r1->value.string) {
+                       if (!string)
+                               string = g_string_new ("( ");
+
+                       if (string->len > 2) {
+                               g_string_append_c (string, ' ');
+                               g_string_append (string, term);
+                               g_string_append_c (string, ' ');
+                       }
+
+                       g_string_append (string, r1->value.string);
                }
-               if (r1->value.string && *r1->value.string)
-                       g_string_append_printf (string, "%s%s", r1->value.string, ((argc > 1) && (i != argc - 
1)) ? " AND ":"");
+
                camel_sexp_result_free (f, r1);
        }
-       g_string_append (string, " )");
+
        r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
-       if (string->len == 4)
-               g_string_set_size (string, 0);
-       r->value.string = g_string_free (string, FALSE);
+       if (string) {
+               if (string->len == 2)
+                       g_string_set_size (string, 0);
+               else
+                       g_string_append (string, " )");
+
+               r->value.string = g_string_free (string, FALSE);
+       } else {
+               r->value.string = g_strdup ("");
+       }
 
        return r;
 }
 
+static CamelSExpResult *
+func_and (CamelSExp *f,
+          gint argc,
+          struct _CamelSExpTerm **argv,
+          gpointer data)
+{
+
+       d (printf ("executing and: %d\n", argc));
+
+       return func_and_or (f, argc, argv, "AND");
+}
+
 static CamelSExpResult *
 func_or (CamelSExp *f,
          gint argc,
          struct _CamelSExpTerm **argv,
          gpointer data)
 {
-       CamelSExpResult *r, *r1;
-       GString *string;
-       gint i;
-
-       d (printf ("executing or: %d", argc));
+       d (printf ("executing or: %d\n", argc));
 
-       string = g_string_new ("( ");
-       for (i = 0; i < argc; i++) {
-               r1 = camel_sexp_term_eval (f, argv[i]);
-
-               if (r1->type != CAMEL_SEXP_RES_STRING) {
-                       camel_sexp_result_free (f, r1);
-                       continue;
-               }
-               g_string_append_printf (string, "%s%s", r1->value.string, ((argc > 1) && (i != argc - 1)) ? " 
OR ":"");
-               camel_sexp_result_free (f, r1);
-       }
-       g_string_append (string, " )");
-
-       r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
-       r->value.string = g_string_free (string, FALSE);
-       return r;
+       return func_and_or (f, argc, argv, "OR");
 }
 
 static CamelSExpResult *
@@ -145,7 +151,7 @@ func_not (CamelSExp *f,
 {
        CamelSExpResult *r = NULL, *r1;
 
-       d (printf ("executing not: %d", argc));
+       d (printf ("executing not: %d\n", argc));
        r1 = camel_sexp_term_eval (f, argv[0]);
 
        if (r1->type == CAMEL_SEXP_RES_STRING) {
@@ -153,9 +159,10 @@ func_not (CamelSExp *f,
                /* HACK: Fix and handle completed-on better. */
                if (g_strcmp0 (r1->value.string, "( (usertags LIKE '%completed-on 0%' AND usertags LIKE 
'%completed-on%') )") == 0)
                        r->value.string = g_strdup ("( (not (usertags LIKE '%completed-on 0%')) AND usertags 
LIKE '%completed-on%' )");
+               else if (r1->value.string && *r1->value.string)
+                       r->value.string = g_strdup_printf ("(NOT (%s))", r1->value.string);
                else
-                       r->value.string = g_strdup_printf (
-                               "(NOT (%s))", r1->value.string);
+                       r->value.string = g_strdup ("");
        }
        camel_sexp_result_free (f, r1);
 
@@ -325,7 +332,7 @@ match_all (struct _CamelSExp *f,
 {
        CamelSExpResult *r;
 
-       d (printf ("executing match-all: %d", argc));
+       d (printf ("executing match-all: %d\n", argc));
        if (argc == 0) {
                r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
                r->value.string = g_strdup ("1");
@@ -350,7 +357,7 @@ match_threads (struct _CamelSExp *f,
        gint i;
        GString *str = g_string_new ("( ");
 
-       d (printf ("executing match-threads: %d", argc));
+       d (printf ("executing match-threads: %d\n", argc));
 
        for (i = 1; i < argc; i++) {
                r = camel_sexp_term_eval (f, argv[i]);
@@ -434,7 +441,7 @@ header_contains (struct _CamelSExp *f,
                  struct _CamelSExpResult **argv,
                  gpointer data)
 {
-       d (printf ("executing header-contains: %d", argc));
+       d (printf ("executing header-contains: %d\n", argc));
 
        return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_CONTAINS);
 }
@@ -445,7 +452,7 @@ header_has_words (struct _CamelSExp *f,
                   struct _CamelSExpResult **argv,
                   gpointer data)
 {
-       d (printf ("executing header-has-word: %d", argc));
+       d (printf ("executing header-has-word: %d\n", argc));
 
        return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_WORD);
 }
@@ -456,7 +463,7 @@ header_matches (struct _CamelSExp *f,
                 struct _CamelSExpResult **argv,
                 gpointer data)
 {
-       d (printf ("executing header-matches: %d", argc));
+       d (printf ("executing header-matches: %d\n", argc));
 
        return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_EXACT);
 }
@@ -467,7 +474,7 @@ header_starts_with (struct _CamelSExp *f,
                     struct _CamelSExpResult **argv,
                     gpointer data)
 {
-       d (printf ("executing header-starts-with: %d", argc));
+       d (printf ("executing header-starts-with: %d\n", argc));
 
        return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_STARTS);
 }
@@ -478,7 +485,7 @@ header_ends_with (struct _CamelSExp *f,
                   struct _CamelSExpResult **argv,
                   gpointer data)
 {
-       d (printf ("executing header-ends-with: %d", argc));
+       d (printf ("executing header-ends-with: %d\n", argc));
 
        return check_header (f, argc, argv, data, CAMEL_SEARCH_MATCH_ENDS);
 }
@@ -492,7 +499,7 @@ header_exists (struct _CamelSExp *f,
        CamelSExpResult *r;
        gchar *headername;
 
-       d (printf ("executing header-exists: %d", argc));
+       d (printf ("executing header-exists: %d\n", argc));
 
        headername = camel_db_get_column_name (argv[0]->value.string);
        if (!headername) {
@@ -517,7 +524,7 @@ user_tag (struct _CamelSExp *f,
 {
        CamelSExpResult *r;
 
-       d (printf ("executing user-tag: %d", argc));
+       d (printf ("executing user-tag: %d\n", argc));
 
        r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
        /* Hacks no otherway to fix these really :( */
@@ -541,7 +548,7 @@ user_flag (struct _CamelSExp *f,
        CamelSExpResult *r;
        gchar *tstr, *qstr;
 
-       d (printf ("executing user-flag: %d", argc));
+       d (printf ("executing user-flag: %d\n", argc));
 
        r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 
@@ -567,7 +574,7 @@ system_flag (struct _CamelSExp *f,
        CamelSExpResult *r;
        gchar *tstr;
 
-       d (printf ("executing system-flag: %d", argc));
+       d (printf ("executing system-flag: %d\n", argc));
 
        r = camel_sexp_result_new (f, CAMEL_SEXP_RES_STRING);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]