evolution-data-server r9828 - branches/gnome-2-24/camel



Author: sragavan
Date: Mon Dec 15 06:29:20 2008
New Revision: 9828
URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9828&view=rev

Log:
2008-12-15  Srinivasa Ragavan  <sragavan novell com>

	** Major changes for better vfolders.

	* camel-db.c: (camel_db_open),
	(camel_db_delete_uid_from_vfolder_transaction),
	(read_uids_flags_callback), (camel_db_get_folder_uids_flags):
	* camel-db.h:
	* camel-folder-summary.c: (camel_folder_summary_init),
	(camel_folder_summary_finalize), (remove_cache),
	(camel_folder_summary_get_flag_cache),
	(camel_folder_summary_load_from_db),
	(camel_folder_summary_save_to_db):
	* camel-folder-summary.h:
	* camel-private.h:




Modified:
   branches/gnome-2-24/camel/ChangeLog
   branches/gnome-2-24/camel/camel-db.c
   branches/gnome-2-24/camel/camel-db.h
   branches/gnome-2-24/camel/camel-folder-summary.c
   branches/gnome-2-24/camel/camel-folder-summary.h
   branches/gnome-2-24/camel/camel-private.h

Modified: branches/gnome-2-24/camel/camel-db.c
==============================================================================
--- branches/gnome-2-24/camel/camel-db.c	(original)
+++ branches/gnome-2-24/camel/camel-db.c	Mon Dec 15 06:29:20 2008
@@ -124,7 +124,6 @@
 		cache = g_strdup ("PRAGMA cache_size=100");
 
 	camel_db_command (cdb, cache, NULL);
-
 	g_free (cache);
 
 	sqlite3_busy_timeout (cdb->db, CAMEL_DB_SLEEP_INTERVAL);
@@ -561,6 +560,53 @@
 	return ret;
 }
 
+struct _db_data_uids_flags {
+	GPtrArray *uids;
+	GPtrArray *flags;
+};
+static int
+read_uids_flags_callback (void *ref, int ncol, char ** cols, char ** name)
+{
+	struct _db_data_uids_flags *data= (struct _db_data_uids_flags *) ref;
+	 
+	int i;
+	for (i = 0; i < ncol; ++i) {
+		if (!strcmp (name [i], "uid"))
+			g_ptr_array_add (data->uids, (char *) (camel_pstring_strdup(cols [i])));
+		else if (!strcmp (name [i], "flags"))
+			g_ptr_array_add (data->flags, GUINT_TO_POINTER(strtoul (cols [i], NULL, 10)));
+	}
+	 
+	 return 0;
+}
+
+int
+camel_db_get_folder_uids_flags (CamelDB *db, char *folder_name, char *sort_by, char *collate, GPtrArray *summary, GHashTable *table, CamelException *ex)
+{
+	 GPtrArray *uids = summary;
+	 GPtrArray *flags = g_ptr_array_new ();
+	 char *sel_query;
+	 int ret;
+	 struct _db_data_uids_flags data;
+	 int i;
+	
+	 data.uids = uids;
+	 data.flags = flags;
+
+
+	 sel_query = sqlite3_mprintf("SELECT uid,flags FROM %Q%s%s%s%s", folder_name, sort_by ? " order by " : "", sort_by ? sort_by: "", (sort_by && collate) ? " collate " : "", (sort_by && collate) ? collate : "");	 
+
+	 ret = camel_db_select (db, sel_query, read_uids_flags_callback, &data, ex);
+	 sqlite3_free (sel_query);
+
+	 for (i=0; i<uids->len; i++) {
+		 g_hash_table_insert (table, uids->pdata[i], flags->pdata[i]);
+	 }
+
+	 g_ptr_array_free (flags, TRUE);
+	 return ret;
+}
+
 static int
 read_uids_callback (void *ref, int ncol, char ** cols, char ** name)
 {

Modified: branches/gnome-2-24/camel/camel-db.h
==============================================================================
--- branches/gnome-2-24/camel/camel-db.h	(original)
+++ branches/gnome-2-24/camel/camel-db.h	Mon Dec 15 06:29:20 2008
@@ -156,6 +156,7 @@
 int camel_db_add_to_vfolder_transaction (CamelDB *db, char *folder_name, char *vuid, CamelException *ex);
 
 int camel_db_get_folder_uids (CamelDB *db, char *folder_name, char *sort_by, char *collate, GPtrArray *array, CamelException *ex);
+int camel_db_get_folder_uids_flags (CamelDB *db, char *folder_name, char *sort_by, char *collate, GPtrArray *summary, GHashTable *table, CamelException *ex);
 
 GPtrArray * camel_db_get_folder_junk_uids (CamelDB *db, char *folder_name, CamelException *ex);
 GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, char *folder_name, CamelException *ex);

Modified: branches/gnome-2-24/camel/camel-folder-summary.c
==============================================================================
--- branches/gnome-2-24/camel/camel-folder-summary.c	(original)
+++ branches/gnome-2-24/camel/camel-folder-summary.c	Mon Dec 15 06:29:20 2008
@@ -67,6 +67,7 @@
 
 /* Make 5 minutes as default cache drop */
 #define SUMMARY_CACHE_DROP 300
+#define dd(x) if (camel_debug("sync")) x
 
 static pthread_mutex_t info_lock = PTHREAD_MUTEX_INITIALIZER;
 
@@ -78,7 +79,6 @@
 /* this should probably be conditional on it existing */
 #define USE_BSEARCH
 
-#define dd(x)
 #define d(x)
 #define io(x)			/* io debug */
 #define w(x)
@@ -154,6 +154,7 @@
 
 	s->message_info_size = sizeof(CamelMessageInfoBase);
 	s->content_info_size = sizeof(CamelMessageContentInfo);
+	p->flag_cache = g_hash_table_new (g_str_hash, g_str_equal);
 
 	s->message_info_chunks = NULL;
 	s->content_info_chunks = NULL;
@@ -199,7 +200,7 @@
 	CamelFolderSummary *s = (CamelFolderSummary *)obj;
 
 	p = _PRIVATE(obj);
-
+	g_hash_table_destroy (p->flag_cache);
 	if (s->timeout_handle)
 		g_source_remove (s->timeout_handle);
 	//camel_folder_summary_clear(s);
@@ -823,16 +824,17 @@
 	CamelFolderSummary *s = m->summary;
 
 	CAMEL_DB_RELEASE_SQLITE_MEMORY;
-	
+	if (g_getenv("CAMEL_SYNC_SUMMARY"))
+		camel_folder_sync (s->folder, FALSE, NULL);
+
 	if (time(NULL) - s->cache_load_time < SUMMARY_CACHE_DROP)
 		return;
 	
-	d(printf("removing cache for  %s %d %p\n", s->folder ? s->folder->full_name : s->summary_path, g_hash_table_size (s->loaded_infos), s->loaded_infos));
-	#warning "hack. fix it"
+	dd(printf("removing cache for  %s %d %p\n", s->folder ? s->folder->full_name : s->summary_path, g_hash_table_size (s->loaded_infos), s->loaded_infos));
 	CAMEL_SUMMARY_LOCK (s, summary_lock);
 	g_hash_table_foreach_remove  (s->loaded_infos, (GHRFunc) remove_item, s);
 	CAMEL_SUMMARY_UNLOCK (s, summary_lock);
-	d(printf("done .. now %d\n",g_hash_table_size (s->loaded_infos)));
+	dd(printf("done .. now %d\n",g_hash_table_size (s->loaded_infos)));
 
 	s->cache_load_time = time(NULL);
 	
@@ -929,14 +931,23 @@
 	printf("\n");
 }
 
+GHashTable *
+camel_folder_summary_get_flag_cache (CamelFolderSummary *summary)
+{
+	struct _CamelFolderSummaryPrivate *p = _PRIVATE(summary);
+	
+	return p->flag_cache;
+}
+
 int
 camel_folder_summary_load_from_db (CamelFolderSummary *s, CamelException *ex)
 {
 	CamelDB *cdb;
 	char *folder_name;
 	int ret = 0;
+	struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
+
 	/* struct _db_pass_data data; */
-	
 	d(printf ("\ncamel_folder_summary_load_from_db called \n"));
 	s->flags &= ~CAMEL_SUMMARY_DIRTY;
 
@@ -948,7 +959,7 @@
 	folder_name = s->folder->full_name;
 	cdb = s->folder->parent_store->cdb_r;
 
-	ret = camel_db_get_folder_uids (cdb, folder_name, (char *)s->sort_by, (char *)s->collate, s->uids, ex);
+	ret = camel_db_get_folder_uids_flags (cdb, folder_name, (char *)s->sort_by, (char *)s->collate, s->uids, p->flag_cache, ex);
 	/* camel_folder_summary_dump (s); */
 
 #if 0
@@ -1378,7 +1389,7 @@
 	if (!count) 
 		return camel_folder_summary_header_save_to_db (s, ex);
 
-	d(printf("Saving %d/%d dirty records of %s\n", count, g_hash_table_size (s->loaded_infos), s->folder->full_name));
+	dd(printf("Saving %d/%d dirty records of %s\n", count, g_hash_table_size (s->loaded_infos), s->folder->full_name));
 
 	camel_db_begin_transaction (cdb, ex);
 

Modified: branches/gnome-2-24/camel/camel-folder-summary.h
==============================================================================
--- branches/gnome-2-24/camel/camel-folder-summary.h	(original)
+++ branches/gnome-2-24/camel/camel-folder-summary.h	Mon Dec 15 06:29:20 2008
@@ -407,6 +407,7 @@
 GPtrArray *camel_folder_summary_array(CamelFolderSummary *summary);
 GHashTable *camel_folder_summary_get_hashtable(CamelFolderSummary *s);
 void camel_folder_summary_free_hashtable (GHashTable *ht);
+GHashTable *camel_folder_summary_get_flag_cache (CamelFolderSummary *summary);
 
 /* basically like strings, but certain keywords can be compressed and de-cased */
 int camel_folder_summary_encode_token(FILE *out, const char *str);

Modified: branches/gnome-2-24/camel/camel-private.h
==============================================================================
--- branches/gnome-2-24/camel/camel-private.h	(original)
+++ branches/gnome-2-24/camel/camel-private.h	Mon Dec 15 06:29:20 2008
@@ -128,6 +128,7 @@
 	GMutex *filter_lock;	/* for accessing any of the filtering/indexing stuff, since we share them */
 	GMutex *alloc_lock;	/* for setting up and using allocators */
 	GMutex *ref_lock;	/* for reffing/unreffing messageinfo's ALWAYS obtain before summary_lock */
+	GHashTable *flag_cache;
 };
 
 #define CAMEL_SUMMARY_LOCK(f, l) \



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