evolution-data-server r9039 - branches/camel-db-summary/camel



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]