evolution-data-server r9039 - branches/camel-db-summary/camel
- From: psankar svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-data-server r9039 - branches/camel-db-summary/camel
- Date: Tue, 24 Jun 2008 19:21:26 +0000 (UTC)
Author: psankar
Date: Tue Jun 24 19:21:25 2008
New Revision: 9039
URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9039&view=rev
Log:
Basic Search.
Only Sender and subject works. It is trivial to adapt to other
conditions.
AND, OR connectors are still pending. Currently OR is taken as the
default value.
Modified:
branches/camel-db-summary/camel/camel-db.c
branches/camel-db-summary/camel/camel-db.h
branches/camel-db-summary/camel/camel-folder-search.c
branches/camel-db-summary/camel/camel-folder-search.h
Modified: branches/camel-db-summary/camel/camel-db.c
==============================================================================
--- branches/camel-db-summary/camel/camel-db.c (original)
+++ branches/camel-db-summary/camel/camel-db.c Tue Jun 24 19:21:25 2008
@@ -715,3 +715,30 @@
g_free (record);
}
}
+
+char *
+camel_db_sqlize_string (const char *string)
+{
+ return sqlite3_mprintf ("%Q", string);
+}
+
+void
+camel_db_free_sqlized_string (char *string)
+{
+ sqlite3_free (string);
+ string = NULL;
+}
+
+char * camel_db_get_column_name (const char *raw_name)
+{
+ if (g_ascii_strcasecmp (raw_name, "Subject"))
+ return g_strdup ("subject");
+ else if (g_ascii_strcasecmp (raw_name, "from"))
+ return g_strdup ("mail_from");
+ else {
+ /* Let it crash for all unknown columns for now.
+ We need to load the messages into memory and search etc. */
+ return NULL;
+ }
+
+}
Modified: branches/camel-db-summary/camel/camel-db.h
==============================================================================
--- branches/camel-db-summary/camel/camel-db.h (original)
+++ branches/camel-db-summary/camel/camel-db.h Tue Jun 24 19:21:25 2008
@@ -132,5 +132,10 @@
int camel_db_add_to_vfolder (CamelDB *db, char *folder_name, char *vuid, CamelException *ex);
int camel_db_add_to_vfolder_transaction (CamelDB *db, char *folder_name, char *vuid, CamelException *ex);
+char * camel_db_sqlize_string (const char *string);
+void camel_db_free_sqlized_string (char *string);
+
+char * camel_db_get_column_name (const char *raw_name);
+
#endif
Modified: branches/camel-db-summary/camel/camel-folder-search.c
==============================================================================
--- branches/camel-db-summary/camel/camel-folder-search.c (original)
+++ branches/camel-db-summary/camel/camel-folder-search.c Tue Jun 24 19:21:25 2008
@@ -48,6 +48,8 @@
#include "camel-multipart.h"
#include "camel-search-private.h"
#include "camel-stream-mem.h"
+#include "camel-db.h"
+#include "camel-store.h"
#define d(x)
#define r(x)
@@ -65,6 +67,7 @@
static ESExpResult *search_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
static ESExpResult *search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
+static ESExpResult * db_search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
static ESExpResult *search_header_matches(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
static ESExpResult *search_header_starts_with(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
static ESExpResult *search_header_ends_with(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search);
@@ -87,6 +90,8 @@
static void camel_folder_search_init (CamelFolderSearch *obj);
static void camel_folder_search_finalize (CamelObject *obj);
+static int read_uid_callback (void * ref, int ncol, char ** cols, char **name);
+
static CamelObjectClass *camel_folder_search_parent;
static void
@@ -99,7 +104,7 @@
klass->match_all = search_match_all;
klass->match_threads = search_match_threads;
klass->body_contains = search_body_contains;
- klass->header_contains = search_header_contains;
+ klass->header_contains = db_search_header_contains;
klass->header_matches = search_header_matches;
klass->header_starts_with = search_header_starts_with;
klass->header_ends_with = search_header_ends_with;
@@ -155,6 +160,9 @@
g_hash_table_foreach(p->mempool_hash, free_mempool, obj);
g_hash_table_destroy(p->mempool_hash);
g_free(p);
+
+ g_print ("\nFinalizing search query and the query is : \n%s\n", search->query->str);
+ g_string_free (search->query, TRUE);
}
CamelType
@@ -237,6 +245,8 @@
}
}
}
+
+ search->query = NULL;
}
/**
@@ -273,6 +283,13 @@
camel_folder_search_set_folder(CamelFolderSearch *search, CamelFolder *folder)
{
search->folder = folder;
+
+ if (search->query)
+ g_string_free (search->query, TRUE);
+
+ /* FIXME: Get this string done from camel-db by parsing with sqlite_mprintf etc. */
+ search->query = g_string_new ("SELECT uid FROM ");
+ g_string_append_printf (search->query, "%s ", folder->full_name);
}
/**
@@ -479,8 +496,16 @@
goto fail;
}
+ printf ("\nSomething is returned in the top-level caller : [%s]\n", search->query->str);
+
matches = g_ptr_array_new();
+ CamelStore *store = search->folder->parent_store;
+// CamelDB *cdb = (CamelDB *) (search->folder->parent_store->cdb);
+ CamelDB *cdb = store->cdb;
+
+ camel_db_select (cdb, search->query->str, (CamelDBSelectCB) read_uid_callback, matches, ex);
+
/* now create a folder summary to return?? */
if (r->type == ESEXP_RES_ARRAY_PTR) {
d(printf("got result ...\n"));
@@ -680,32 +705,8 @@
return r;
}
- v = search->summary_set?search->summary_set:search->summary;
- for (i=0;i<v->len;i++) {
- const char *uid;
-
- search->current = camel_folder_summary_uid (search->folder->summary, v->pdata[i]);
- uid = camel_message_info_uid(search->current);
-
- if (argc>0) {
- r1 = e_sexp_term_eval(f, argv[0]);
- if (r1->type == ESEXP_RES_BOOL) {
- if (r1->value.bool)
- g_ptr_array_add(r->value.ptrarray, (char *)uid);
- } else {
- g_warning("invalid syntax, matches require a single bool result");
- error_msg = g_strdup_printf(_("(%s) requires a single bool result"), "match-all");
- e_sexp_fatal_error(f, error_msg);
- g_free(error_msg);
- }
- e_sexp_result_free(f, r1);
- } else {
- g_ptr_array_add(r->value.ptrarray, (char *)uid);
- }
- camel_message_info_free (search->current);
- }
+ e_sexp_term_eval (f, argv [0]);
search->current = NULL;
-
return r;
}
@@ -934,6 +935,33 @@
}
static ESExpResult *
+db_search_header_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
+{
+ /* FIXME: What to do for headers that are not stored in db */
+
+ ESExpResult *r;
+
+ char *column = camel_db_get_column_name (argv [0]->value.string);
+
+ char *temp = g_strdup_printf ("%%%s%%", argv [1]->value.string);
+ char *value = camel_db_sqlize_string (temp);
+ g_free (temp);
+
+ if (g_str_has_suffix (search->query->str, " "))
+ g_string_append_printf (search->query, "WHERE %s LIKE %s", column, value);
+ else
+ g_string_append_printf (search->query, " OR %s LIKE %s", column, value);
+
+ g_free (column);
+ camel_db_free_sqlized_string (value);
+
+ r = e_sexp_result_new(f, ESEXP_RES_BOOL);
+ r->value.bool = FALSE;
+
+ return r;
+}
+
+static ESExpResult *
search_header_matches(struct _ESExp *f, int argc, struct _ESExpResult **argv, CamelFolderSearch *search)
{
return check_header(f, argc, argv, search, CAMEL_SEARCH_MATCH_EXACT);
@@ -1421,3 +1449,23 @@
return r;
}
+
+static int
+read_uid_callback (void * ref, int ncol, char ** cols, char **name)
+{
+ GPtrArray *matches;
+
+ matches = (GPtrArray *) ref;
+
+#if 0
+
+ int i;
+ for (i = 0; i < ncol; ++i) {
+ if ( !strcmp (name [i], "uid") )
+ g_ptr_array_add (matches, g_strdup (cols [i]));
+ }
+#else
+ g_ptr_array_add (matches, g_strdup (cols [0]));
+#endif
+ return 0;
+}
Modified: branches/camel-db-summary/camel/camel-folder-search.h
==============================================================================
--- branches/camel-db-summary/camel/camel-folder-search.h (original)
+++ branches/camel-db-summary/camel/camel-folder-search.h Tue Jun 24 19:21:25 2008
@@ -48,6 +48,9 @@
CamelFolder *folder; /* folder for current search */
GPtrArray *summary; /* summary array for current search */
GPtrArray *summary_set; /* subset of summary to actually include in search */
+
+ GString *query; /* shall contain the SQL quer that should be executed */
+
// DEPRECATED
// GHashTable *summary_hash; /* hashtable of summary items */
CamelMessageInfo *current; /* current message info, when searching one by one */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]