173
173
gint flags; /* 0x02 = immediate, 0x01 = always enter */
175
175
/* these have default implementations in e-sexp */
176
{ "and", G_STRUCT_OFFSET(CamelFolderSearchClass, and_), 2 },
177
{ "or", G_STRUCT_OFFSET(CamelFolderSearchClass, or_), 2 },
176
{ "and", G_STRUCT_OFFSET (CamelFolderSearchClass, and_), 2 },
177
{ "or", G_STRUCT_OFFSET (CamelFolderSearchClass, or_), 2 },
178
178
/* we need to override this one though to implement an 'array not' */
179
{ "not", G_STRUCT_OFFSET(CamelFolderSearchClass, not_), 0 },
180
{ "<", G_STRUCT_OFFSET(CamelFolderSearchClass, lt), 2 },
181
{ ">", G_STRUCT_OFFSET(CamelFolderSearchClass, gt), 2 },
182
{ "=", G_STRUCT_OFFSET(CamelFolderSearchClass, eq), 2 },
179
{ "not", G_STRUCT_OFFSET (CamelFolderSearchClass, not_), 0 },
180
{ "<", G_STRUCT_OFFSET (CamelFolderSearchClass, lt), 2 },
181
{ ">", G_STRUCT_OFFSET (CamelFolderSearchClass, gt), 2 },
182
{ "=", G_STRUCT_OFFSET (CamelFolderSearchClass, eq), 2 },
184
184
/* these we have to use our own default if there is none */
185
185
/* they should all be defined in the language? so it parses, or should they not?? */
186
{ "match-all", G_STRUCT_OFFSET(CamelFolderSearchClass, match_all), 3 },
187
{ "match-threads", G_STRUCT_OFFSET(CamelFolderSearchClass, match_threads), 3 },
188
{ "body-contains", G_STRUCT_OFFSET(CamelFolderSearchClass, body_contains), 1 },
189
{ "body-regex", G_STRUCT_OFFSET(CamelFolderSearchClass, body_regex), 1 },
190
{ "header-contains", G_STRUCT_OFFSET(CamelFolderSearchClass, header_contains), 1 },
191
{ "header-matches", G_STRUCT_OFFSET(CamelFolderSearchClass, header_matches), 1 },
192
{ "header-starts-with", G_STRUCT_OFFSET(CamelFolderSearchClass, header_starts_with), 1 },
193
{ "header-ends-with", G_STRUCT_OFFSET(CamelFolderSearchClass, header_ends_with), 1 },
194
{ "header-exists", G_STRUCT_OFFSET(CamelFolderSearchClass, header_exists), 1 },
195
{ "header-soundex", G_STRUCT_OFFSET(CamelFolderSearchClass, header_soundex), 1 },
196
{ "header-regex", G_STRUCT_OFFSET(CamelFolderSearchClass, header_regex), 1 },
197
{ "header-full-regex", G_STRUCT_OFFSET(CamelFolderSearchClass, header_full_regex), 1 },
198
{ "user-tag", G_STRUCT_OFFSET(CamelFolderSearchClass, user_tag), 1 },
199
{ "user-flag", G_STRUCT_OFFSET(CamelFolderSearchClass, user_flag), 1 },
200
{ "system-flag", G_STRUCT_OFFSET(CamelFolderSearchClass, system_flag), 1 },
201
{ "get-sent-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_sent_date), 1 },
202
{ "get-received-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_received_date), 1 },
203
{ "get-current-date", G_STRUCT_OFFSET(CamelFolderSearchClass, get_current_date), 1 },
204
{ "get-relative-months", G_STRUCT_OFFSET(CamelFolderSearchClass, get_relative_months), 1 },
205
{ "get-size", G_STRUCT_OFFSET(CamelFolderSearchClass, get_size), 1 },
206
{ "uid", G_STRUCT_OFFSET(CamelFolderSearchClass, uid), 1 },
207
{ "message-location", G_STRUCT_OFFSET(CamelFolderSearchClass, message_location), 1 },
186
{ "match-all", G_STRUCT_OFFSET (CamelFolderSearchClass, match_all), 3 },
187
{ "match-threads", G_STRUCT_OFFSET (CamelFolderSearchClass, match_threads), 3 },
188
{ "body-contains", G_STRUCT_OFFSET (CamelFolderSearchClass, body_contains), 1 },
189
{ "body-regex", G_STRUCT_OFFSET (CamelFolderSearchClass, body_regex), 1 },
190
{ "header-contains", G_STRUCT_OFFSET (CamelFolderSearchClass, header_contains), 1 },
191
{ "header-matches", G_STRUCT_OFFSET (CamelFolderSearchClass, header_matches), 1 },
192
{ "header-starts-with", G_STRUCT_OFFSET (CamelFolderSearchClass, header_starts_with), 1 },
193
{ "header-ends-with", G_STRUCT_OFFSET (CamelFolderSearchClass, header_ends_with), 1 },
194
{ "header-exists", G_STRUCT_OFFSET (CamelFolderSearchClass, header_exists), 1 },
195
{ "header-soundex", G_STRUCT_OFFSET (CamelFolderSearchClass, header_soundex), 1 },
196
{ "header-regex", G_STRUCT_OFFSET (CamelFolderSearchClass, header_regex), 1 },
197
{ "header-full-regex", G_STRUCT_OFFSET (CamelFolderSearchClass, header_full_regex), 1 },
198
{ "user-tag", G_STRUCT_OFFSET (CamelFolderSearchClass, user_tag), 1 },
199
{ "user-flag", G_STRUCT_OFFSET (CamelFolderSearchClass, user_flag), 1 },
200
{ "system-flag", G_STRUCT_OFFSET (CamelFolderSearchClass, system_flag), 1 },
201
{ "get-sent-date", G_STRUCT_OFFSET (CamelFolderSearchClass, get_sent_date), 1 },
202
{ "get-received-date", G_STRUCT_OFFSET (CamelFolderSearchClass, get_received_date), 1 },
203
{ "get-current-date", G_STRUCT_OFFSET (CamelFolderSearchClass, get_current_date), 1 },
204
{ "get-relative-months", G_STRUCT_OFFSET (CamelFolderSearchClass, get_relative_months), 1 },
205
{ "get-size", G_STRUCT_OFFSET (CamelFolderSearchClass, get_size), 1 },
206
{ "uid", G_STRUCT_OFFSET (CamelFolderSearchClass, uid), 1 },
207
{ "message-location", G_STRUCT_OFFSET (CamelFolderSearchClass, message_location), 1 },
460
466
/* Sync the db, so that we search the db for changes */
461
467
camel_folder_summary_save_to_db (search->folder->summary, error);
463
dd(printf ("sexp is : [%s]\n", expr));
469
dd (printf ("sexp is : [%s]\n", expr));
464
470
sql_query = camel_sexp_to_sql_sexp (expr);
465
471
tmp1 = camel_db_sqlize_string (full_name);
466
tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query?sql_query:"");
472
tmp = g_strdup_printf ("SELECT COUNT (*) FROM %s %s %s", tmp1, sql_query ? "WHERE":"", sql_query ? sql_query:"");
467
473
camel_db_free_sqlized_string (tmp1);
468
474
g_free (sql_query);
469
dd(printf("Equivalent sql %s\n", tmp));
475
dd (printf ("Equivalent sql %s\n", tmp));
471
477
cdb = (CamelDB *) (parent_store->cdb_r);
472
478
camel_db_count_message_info (cdb, tmp, &count, &local_error);
473
479
if (local_error != NULL) {
474
480
const gchar *message = local_error->message;
475
if (strncmp(message, "no such table", 13) == 0) {
476
d(g_warning ("Error during searching %s: %s\n", tmp, message));
481
if (strncmp (message, "no such table", 13) == 0) {
482
d (g_warning ("Error during searching %s: %s\n", tmp, message));
477
483
/* Suppress no such table */
478
484
g_clear_error (&local_error);
1046
1075
/* only a subset of headers are supported .. */
1047
1076
headername = argv[0]->value.string;
1048
if (!g_ascii_strcasecmp(headername, "subject")) {
1077
if (!g_ascii_strcasecmp (headername, "subject")) {
1049
1078
header = camel_message_info_subject (search->current);
1050
} else if (!g_ascii_strcasecmp(headername, "date")) {
1079
} else if (!g_ascii_strcasecmp (headername, "date")) {
1051
1080
/* FIXME: not a very useful form of the date */
1052
sprintf(strbuf, "%d", (gint)camel_message_info_date_sent(search->current));
1081
sprintf (strbuf, "%d", (gint) camel_message_info_date_sent (search->current));
1053
1082
header = strbuf;
1054
} else if (!g_ascii_strcasecmp(headername, "from")) {
1083
} else if (!g_ascii_strcasecmp (headername, "from")) {
1055
1084
header = camel_message_info_from (search->current);
1056
1085
type = CAMEL_SEARCH_TYPE_ADDRESS;
1057
} else if (!g_ascii_strcasecmp(headername, "to")) {
1086
} else if (!g_ascii_strcasecmp (headername, "to")) {
1058
1087
header = camel_message_info_to (search->current);
1059
1088
type = CAMEL_SEARCH_TYPE_ADDRESS;
1060
} else if (!g_ascii_strcasecmp(headername, "cc")) {
1089
} else if (!g_ascii_strcasecmp (headername, "cc")) {
1061
1090
header = camel_message_info_cc (search->current);
1062
1091
type = CAMEL_SEARCH_TYPE_ADDRESS;
1063
} else if (!g_ascii_strcasecmp(headername, "x-camel-mlist")) {
1092
} else if (!g_ascii_strcasecmp (headername, "x-camel-mlist")) {
1064
1093
header = camel_message_info_mlist (search->current);
1065
1094
type = CAMEL_SEARCH_TYPE_MLIST;