evolution-data-server r9828 - branches/gnome-2-24/camel
- From: sragavan svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-data-server r9828 - branches/gnome-2-24/camel
- Date: Mon, 15 Dec 2008 06:29:21 +0000 (UTC)
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]