[GW-Mailer] Delete items in a bulk

"P Sankar" <[email protected]>
Newsgroups gmane.comp.gnome.evolution.patches
Message-ID <[email protected]>
Hi,

Attached patch deletes items in a bulk instead of sending removeItem
calls one-by-one. Reduces the time taken. Please review.

Sankar

_______________________________________________
Evolution-patches mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/evolution-patches
bulk.patch (text/plain, 8.3 KB)
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/ChangeLog,v
retrieving revision 1.156
diff -u -p -r1.156 ChangeLog
--- ChangeLog	18 Apr 2006 15:15:30 -0000	1.156
+++ ChangeLog	19 Apr 2006 13:22:43 -0000
@@ -1,3 +1,8 @@
+2006-04-19  Sankar P  <[email protected]>
+
+	* camel-groupwise-folder.c : 
+	Deletes items in bulk instead of one-by-one
+
 2006-04-18  Sankar P  <[email protected]>
 
 	* camel-groupwise-folder.c: (groupwise_sync):
Index: camel-groupwise-folder.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-folder.c,v
retrieving revision 1.130
diff -u -p -r1.130 camel-groupwise-folder.c
--- camel-groupwise-folder.c	18 Apr 2006 15:15:30 -0000	1.130
+++ camel-groupwise-folder.c	19 Apr 2006 13:22:43 -0000
@@ -61,6 +61,7 @@
 #define JUNK_FOLDER "Junk Mail"
 #define READ_CURSOR_MAX_IDS 500
 #define MAX_ATTACHMENT_SIZE 1*1024*1024   /*In bytes*/
+#define GROUPWISE_BULK_DELETE_LIMIT 100
 
 static CamelOfflineFolderClass *parent_class = NULL;
 
@@ -586,7 +587,9 @@ groupwise_sync (CamelFolder *folder, gbo
 	EGwConnectionStatus status;
 	EGwConnection *cnc;
 	int count, i;
-		
+
+	GList *deleted_items = NULL, *deleted_head;
+
 	if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL || 
 			((CamelService *)gw_store)->status == CAMEL_SERVICE_DISCONNECTED) {
 		groupwise_sync_summary (folder, ex);
@@ -606,7 +609,7 @@ groupwise_sync (CamelFolder *folder, gbo
 
 	count = camel_folder_summary_count (folder->summary);
 	CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
-	for (i=0 ; i <count ; i++) {
+	for (i=0 ; i < count ; i++) {
 		guint32 flags = 0;
 		info = camel_folder_summary_index (folder->summary, i);
 		gw_info = (CamelGroupwiseMessageInfo *) info;
@@ -635,22 +638,57 @@ groupwise_sync (CamelFolder *folder, gbo
 				if (diff.changed & CAMEL_MESSAGE_SEEN)
 					read_items = g_list_append (read_items, (char *)uid);
 				if (diff.changed & CAMEL_MESSAGE_DELETED) {
-					CAMEL_SERVICE_LOCK (gw_store, connect_lock);
-					status = e_gw_connection_remove_item (cnc, container_id, uid);
-					if (status == E_GW_CONNECTION_STATUS_OK) {
-						CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
-						camel_folder_summary_remove (folder->summary, info);
-						camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
-						CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
-						i--; count--;
+					if (deleted_items)
+						deleted_items = g_list_prepend (deleted_items, (char *)camel_message_info_uid (info));
+					else {
+						g_list_free (deleted_head);
+						deleted_head = NULL;
+						deleted_head = deleted_items = g_list_prepend (deleted_items, (char *)camel_message_info_uid (info));
+					}
+
+					if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) {
+						CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+						status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
+						CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
+						if (status == E_GW_CONNECTION_STATUS_OK) {
+							char *uid;
+							while (deleted_items) {
+								uid = (char *)deleted_items->data;
+								CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
+								camel_folder_summary_remove_uid (folder->summary, uid);
+								camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
+								CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+								deleted_items = g_list_next (deleted_items);
+								count -= GROUPWISE_BULK_DELETE_LIMIT;
+								i -= GROUPWISE_BULK_DELETE_LIMIT;
+							}
+						}
 					}
-					CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
 				}
 			}
 		}
 		camel_message_info_free (info);
 	}
-	CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+
+	if (deleted_items) {
+		CAMEL_SERVICE_LOCK (gw_store, connect_lock);
+		status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
+		CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
+		if (status == E_GW_CONNECTION_STATUS_OK) {
+			char *uid;
+			while (deleted_items) {
+				uid = (char *)deleted_items->data;
+				CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
+				camel_folder_summary_remove_uid (folder->summary, uid);
+				camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
+				CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+				deleted_items = g_list_next (deleted_items);
+				count -= GROUPWISE_BULK_DELETE_LIMIT;
+				i -= GROUPWISE_BULK_DELETE_LIMIT;
+			}
+		}
+		g_list_free (deleted_head);
+	}
 
 	if (read_items && g_list_length (read_items)) {
 		CAMEL_SERVICE_LOCK (gw_store, connect_lock);
@@ -893,10 +931,6 @@ groupwise_refresh_folder(CamelFolder *fo
 	struct _folder_update_msg *msg;
 	gboolean check_all = FALSE;
 
-	/* Sync-up the (un)read changes before getting updates,
-	so that the getFolderList will reflect the most recent changes too */
-	groupwise_sync (folder, FALSE, ex);
-
 	if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL) {
 		g_warning ("In offline mode. Cannot refresh!!!\n");
 		return;
@@ -1960,8 +1994,10 @@ groupwise_expunge (CamelFolder *folder, 
 	CamelFolderChangeInfo *changes;
 	int i, max;
 	gboolean delete = FALSE;
+	GList *deleted_items, *deleted_head;
+	
 
-
+	deleted_items = NULL;
 	cnc = cnc_lookup (priv);
 	if (!cnc)
 		return;
@@ -1988,26 +2024,65 @@ groupwise_expunge (CamelFolder *folder, 
 		info = camel_folder_summary_index (folder->summary, i);
 		ginfo = (CamelGroupwiseMessageInfo *) info;
 		if (ginfo && (ginfo->info.flags & CAMEL_MESSAGE_DELETED)) {
-			const char *uid = camel_message_info_uid (info);
-			CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
-			status = e_gw_connection_remove_item (cnc, container_id, uid);
-			if (status == E_GW_CONNECTION_STATUS_OK) {
+
+			if (deleted_items)
+				deleted_items = g_list_prepend (deleted_items, (char *)camel_message_info_uid (info));
+			else {
+				g_list_free (deleted_head);
+				deleted_head = NULL;
+				deleted_head = deleted_items = g_list_prepend (deleted_items, (char *)camel_message_info_uid (info));
+			}
+			if (g_list_length (deleted_items) == GROUPWISE_BULK_DELETE_LIMIT ) {
+				/* Read the FIXME below */
+				CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
+				status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
+				CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
+				if (status == E_GW_CONNECTION_STATUS_OK) {
+					char *uid;
+					while (deleted_items) {
+						uid = (char *)deleted_items->data;
+						CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
+						camel_folder_change_info_remove_uid (changes, uid);
+						camel_folder_summary_remove_uid (folder->summary, uid);
+						camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
+						CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
+						deleted_items = g_list_next (deleted_items);
+						max -= GROUPWISE_BULK_DELETE_LIMIT;
+						i -= GROUPWISE_BULK_DELETE_LIMIT;
+					}
+				}
+				delete = TRUE;
+			}
+		}
+		camel_message_info_free (info);
+	}
+
+	if (deleted_items) {
+		
+		/* FIXME: Make more mudular by putting these in a function and 
+		   call that in the above loop, here and in groupwise_sync */
+		
+		CAMEL_SERVICE_LOCK (groupwise_store, connect_lock);
+		status = e_gw_connection_remove_items (cnc, container_id, deleted_items);
+		CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
+		if (status == E_GW_CONNECTION_STATUS_OK) {
+			char *uid;
+			while (deleted_items) {
+				uid = (char *)deleted_items->data;
 				CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock);
-				camel_folder_change_info_remove_uid (changes, (char *) uid);
-				camel_folder_summary_remove (folder->summary, info);
+				camel_folder_change_info_remove_uid (changes, uid);
+				camel_folder_summary_remove_uid (folder->summary, uid);
 				camel_data_cache_remove(gw_folder->cache, "cache", uid, ex);
 				CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock);
-				delete = TRUE;
-				i--;  max--;
+				deleted_items = g_list_next (deleted_items);
 			}
-			CAMEL_SERVICE_UNLOCK (groupwise_store, connect_lock);
 		}
-		camel_message_info_free (info);
+		delete = TRUE;
+		g_list_free (deleted_head);
 	}
 
 	if (delete)
 		camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes);
-
 
 	g_free (container_id);
 	camel_folder_change_info_free (changes);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.