[GW-Mailer] Get Multiple Items in a single call
"P Sankar" <[email protected]>
| Newsgroups | gmane.comp.gnome.evolution.patches |
|---|---|
| Message-ID | <[email protected]> |
Hi, Attached patch is to get multiple items together instead of getting one-by-one so that the operations complete faster. Please review. Sankar _______________________________________________ Evolution-patches mailing list [email protected] http://mail.gnome.org/mailman/listinfo/evolution-patches
getITems.patch
(text/plain, 16 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 07:08:11 -0000 @@ -1,3 +1,8 @@ +2006-04-19 Sankar P <[email protected]> + + * camel-groupwise-folder.c: + Get Items in a 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 07:08:12 -0000 @@ -586,7 +586,7 @@ groupwise_sync (CamelFolder *folder, gbo EGwConnectionStatus status; EGwConnection *cnc; int count, i; - + if (((CamelOfflineStore *) gw_store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL || ((CamelService *)gw_store)->status == CAMEL_SERVICE_DISCONNECTED) { groupwise_sync_summary (folder, ex); @@ -893,8 +893,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) { @@ -1070,6 +1068,8 @@ gw_update_cache (CamelFolder *folder, GL GList *item_list = list; int total_items = g_list_length (item_list), i=0; + int MAX_ITERATOR_COUNT = 10; + CAMEL_SERVICE_ASSERT_LOCKED (gw_store, connect_lock); changes = camel_folder_change_info_new (); @@ -1084,9 +1084,14 @@ gw_update_cache (CamelFolder *folder, GL is_junk = TRUE; } + /*if (g_getenv ("MAX_ITERATOR_COUNT")) + MAX_ITERATOR_COUNT = atoi( g_getenv(MAX_ITERATOR_COUNT)); + else + MAX_ITERATOR_COUNT = 1;*/ + camel_operation_start (NULL, _("Fetching summary information for new messages in %s"), folder->name); - for ( ; item_list != NULL ; item_list = g_list_next (item_list) ) { + for ( ; item_list != NULL ; ) { EGwItem *temp_item ; EGwItem *item; EGwItemType type = E_GW_ITEM_TYPE_UNKNOWN; @@ -1099,187 +1104,203 @@ gw_update_cache (CamelFolder *folder, GL CamelMimeMessage *mail_msg = NULL; gboolean is_sent_folder = FALSE; - exists = FALSE; - - if (uid_flag == FALSE) { - temp_item = (EGwItem *)item_list->data; - id = e_gw_item_get_id (temp_item); - } else - id = (char *) item_list->data; - - camel_operation_progress (NULL, (100*i)/total_items); - - status = e_gw_connection_get_item (cnc, container_id, id, "peek default distribution recipient message attachments subject notification created recipientStatus status size", &item); - if (status != E_GW_CONNECTION_STATUS_OK) { - i++; - continue; - } - - /************************ First populate summary *************************/ - mi = NULL; - pmi = NULL; - pmi = camel_folder_summary_uid (folder->summary, id); - if (pmi) { - exists = TRUE; - camel_message_info_ref (pmi); - mi = (CamelGroupwiseMessageInfo *)pmi; + GPtrArray *items_iterator = NULL; + int iterator_count; + GList *items_list; + + items_list = NULL; + + for (iterator_count = 0; iterator_count < MAX_ITERATOR_COUNT && item_list != NULL ; iterator_count++) { + if (!items_iterator) + items_iterator = g_ptr_array_new (); + if (uid_flag == FALSE) { + temp_item = (EGwItem *)item_list->data; + g_ptr_array_add (items_iterator, (char *)e_gw_item_get_id (temp_item)); + } else + g_ptr_array_add (items_iterator, (char *) item_list->data); + item_list = g_list_next (item_list); } - if (!exists) { - type = e_gw_item_get_item_type (item); - if ((type == E_GW_ITEM_TYPE_CONTACT) || (type == E_GW_ITEM_TYPE_UNKNOWN)) { - exists = FALSE; + camel_operation_progress (NULL, (100*i)/total_items); + if (items_iterator) { + status = e_gw_connection_get_items_from_ids (cnc, container_id, "peek default distribution recipient message attachments subject notification created recipientStatus status size", items_iterator, &items_list); + if (status != E_GW_CONNECTION_STATUS_OK) continue; - } - - mi = (CamelGroupwiseMessageInfo *)camel_message_info_new (folder->summary); - if (mi->info.content == NULL) { - mi->info.content = camel_folder_summary_content_info_new (folder->summary); - mi->info.content->type = camel_content_type_new ("multipart", "mixed"); - } - } - - /*all items in the Junk Mail folder should have this flag set*/ - if (is_junk) - mi->info.flags |= CAMEL_GW_MESSAGE_JUNK; - item_status = e_gw_item_get_item_status (item); - if (item_status & E_GW_ITEM_STAT_READ) - status_flags |= CAMEL_MESSAGE_SEEN; - else - mi->info.flags &= ~CAMEL_MESSAGE_SEEN; + while (items_list) { + item = (EGwItem *) items_list->data; + items_list = g_list_next (items_list); + exists = FALSE; - if (item_status & E_GW_ITEM_STAT_REPLIED) - status_flags |= CAMEL_MESSAGE_ANSWERED; - if (exists) - mi->info.flags |= status_flags; - else - mi->info.flags = status_flags; + /************************ First populate summary *************************/ + mi = NULL; + pmi = NULL; + pmi = camel_folder_summary_uid (folder->summary, id); + if (pmi) { + exists = TRUE; + camel_message_info_ref (pmi); + mi = (CamelGroupwiseMessageInfo *)pmi; + } - priority = e_gw_item_get_priority (item); - if (priority && !(g_ascii_strcasecmp (priority,"High"))) { - mi->info.flags |= CAMEL_MESSAGE_FLAGGED; - } + if (!exists) { + type = e_gw_item_get_item_type (item); + if ((type == E_GW_ITEM_TYPE_CONTACT) || (type == E_GW_ITEM_TYPE_UNKNOWN)) { + exists = FALSE; + continue; + } - mi->server_flags = mi->info.flags; + mi = (CamelGroupwiseMessageInfo *)camel_message_info_new (folder->summary); + if (mi->info.content == NULL) { + mi->info.content = camel_folder_summary_content_info_new (folder->summary); + mi->info.content->type = camel_content_type_new ("multipart", "mixed"); + } + } - attach_list = e_gw_item_get_attach_id_list (item); - if (attach_list) { - GSList *al = attach_list; - gboolean has_attachments = TRUE; - EGwItemAttachment *attach = (EGwItemAttachment *)al->data; + /*all items in the Junk Mail folder should have this flag set*/ + if (is_junk) + mi->info.flags |= CAMEL_GW_MESSAGE_JUNK; + + item_status = e_gw_item_get_item_status (item); + if (item_status & E_GW_ITEM_STAT_READ) + status_flags |= CAMEL_MESSAGE_SEEN; + else + mi->info.flags &= ~CAMEL_MESSAGE_SEEN; + + if (item_status & E_GW_ITEM_STAT_REPLIED) + status_flags |= CAMEL_MESSAGE_ANSWERED; + if (exists) + mi->info.flags |= status_flags; + else + mi->info.flags = status_flags; + + priority = e_gw_item_get_priority (item); + if (priority && !(g_ascii_strcasecmp (priority,"High"))) { + mi->info.flags |= CAMEL_MESSAGE_FLAGGED; + } - if (!g_ascii_strcasecmp (attach->name, "Mime.822") || - !g_ascii_strcasecmp (attach->name, "TEXT.htm")) - has_attachments = FALSE; + mi->server_flags = mi->info.flags; - if (has_attachments) - mi->info.flags |= CAMEL_MESSAGE_ATTACHMENTS; - } + attach_list = e_gw_item_get_attach_id_list (item); + if (attach_list) { + GSList *al = attach_list; + gboolean has_attachments = TRUE; + EGwItemAttachment *attach = (EGwItemAttachment *)al->data; + + if (!g_ascii_strcasecmp (attach->name, "Mime.822") || + !g_ascii_strcasecmp (attach->name, "TEXT.htm")) + has_attachments = FALSE; - org = e_gw_item_get_organizer (item); - if (org) { - GString *str; - str = g_string_new (""); - if (org->display_name && org->display_name[0]) - str = g_string_append (str, org->display_name); - if (org->email && org->email[0]) { - g_string_append (str, "<"); - str = g_string_append (str, org->email); - g_string_append (str, ">"); - } - mi->info.from = camel_pstring_strdup (str->str); - g_string_free (str, TRUE); - } - g_string_truncate (str, 0); - recp_list = e_gw_item_get_recipient_list (item); - if (recp_list) { - GSList *rl; - int i = 0; - for (rl = recp_list; rl != NULL; rl = rl->next) { - EGwItemRecipient *recp = (EGwItemRecipient *) rl->data; - if (recp->type == E_GW_ITEM_RECIPIENT_TO) { - if (i) - str = g_string_append (str, ", "); - g_string_append_printf (str,"%s <%s>", recp->display_name, recp->email); - i++; + if (has_attachments) + mi->info.flags |= CAMEL_MESSAGE_ATTACHMENTS; } - } - if (exists) - camel_pstring_free(mi->info.to); - mi->info.to = camel_pstring_strdup (str->str); - g_string_truncate (str, 0); - } - if (type == E_GW_ITEM_TYPE_APPOINTMENT - || type == E_GW_ITEM_TYPE_NOTE - || type == E_GW_ITEM_TYPE_TASK ) { - temp_date = e_gw_item_get_start_date (item); - if (temp_date) { - time_t time = e_gw_connection_get_date_from_string (temp_date); - time_t actual_time = camel_header_decode_date (ctime(&time), NULL); - mi->info.date_sent = mi->info.date_received = actual_time; - } - } else { - temp_date = e_gw_item_get_delivered_date(item); - if (temp_date) { - time_t time = e_gw_connection_get_date_from_string (temp_date); - time_t actual_time = camel_header_decode_date (ctime(&time), NULL); - mi->info.date_sent = mi->info.date_received = actual_time; - } else { - time_t time; - time_t actual_time; - temp_date = e_gw_item_get_creation_date (item); - time = e_gw_connection_get_date_from_string (temp_date); - actual_time = camel_header_decode_date (ctime(&time), NULL); - mi->info.date_sent = mi->info.date_received = actual_time; - } - } + org = e_gw_item_get_organizer (item); + if (org) { + GString *str; + str = g_string_new (""); + if (org->display_name && org->display_name[0]) + str = g_string_append (str, org->display_name); + if (org->email && org->email[0]) { + g_string_append (str, "<"); + str = g_string_append (str, org->email); + g_string_append (str, ">"); + } + mi->info.from = camel_pstring_strdup (str->str); + g_string_free (str, TRUE); + } + g_string_truncate (str, 0); + recp_list = e_gw_item_get_recipient_list (item); + if (recp_list) { + GSList *rl; + int i = 0; + for (rl = recp_list; rl != NULL; rl = rl->next) { + EGwItemRecipient *recp = (EGwItemRecipient *) rl->data; + if (recp->type == E_GW_ITEM_RECIPIENT_TO) { + if (i) + str = g_string_append (str, ", "); + g_string_append_printf (str,"%s <%s>", recp->display_name, recp->email); + i++; + } + } + if (exists) + camel_pstring_free(mi->info.to); + mi->info.to = camel_pstring_strdup (str->str); + g_string_truncate (str, 0); + } - if (!exists) { - mi->info.uid = g_strdup (e_gw_item_get_id(item)); - mi->info.size = e_gw_item_get_mail_size (item); - mi->info.subject = camel_pstring_strdup(e_gw_item_get_subject(item)); - } + if (type == E_GW_ITEM_TYPE_APPOINTMENT + || type == E_GW_ITEM_TYPE_NOTE + || type == E_GW_ITEM_TYPE_TASK ) { + temp_date = e_gw_item_get_start_date (item); + if (temp_date) { + time_t time = e_gw_connection_get_date_from_string (temp_date); + time_t actual_time = camel_header_decode_date (ctime(&time), NULL); + mi->info.date_sent = mi->info.date_received = actual_time; + } + } else { + temp_date = e_gw_item_get_delivered_date(item); + if (temp_date) { + time_t time = e_gw_connection_get_date_from_string (temp_date); + time_t actual_time = camel_header_decode_date (ctime(&time), NULL); + mi->info.date_sent = mi->info.date_received = actual_time; + } else { + time_t time; + time_t actual_time; + temp_date = e_gw_item_get_creation_date (item); + time = e_gw_connection_get_date_from_string (temp_date); + actual_time = camel_header_decode_date (ctime(&time), NULL); + mi->info.date_sent = mi->info.date_received = actual_time; + } + } - if (exists) { - camel_folder_change_info_change_uid (changes, mi->info.uid); - camel_message_info_free (pmi); - } else { - camel_folder_summary_add (folder->summary,(CamelMessageInfo *)mi); - camel_folder_change_info_add_uid (changes, mi->info.uid); - camel_folder_change_info_recent_uid (changes, mi->info.uid); - } + if (!exists) { + mi->info.uid = g_strdup (e_gw_item_get_id(item)); + mi->info.size = e_gw_item_get_mail_size (item); + mi->info.subject = camel_pstring_strdup(e_gw_item_get_subject(item)); + } - /********************* Summary ends *************************/ - if (!strcmp (folder->full_name, "Junk Mail")) - continue; + if (exists) { + camel_folder_change_info_change_uid (changes, mi->info.uid); + camel_message_info_free (pmi); + } else { + camel_folder_summary_add (folder->summary,(CamelMessageInfo *)mi); + camel_folder_change_info_add_uid (changes, mi->info.uid); + camel_folder_change_info_recent_uid (changes, mi->info.uid); + } - if (!strcmp (folder->full_name, "Sent Items")) - is_sent_folder = TRUE; - /******************** Begine Caching ************************/ - /* add to cache if its a new message*/ - t_cache_stream = camel_data_cache_get (gw_folder->cache, "cache", id, ex); - if (t_cache_stream && !is_sent_folder) { - camel_object_unref (t_cache_stream); - - mail_msg = groupwise_folder_item_to_msg (folder, item, ex); - if (mail_msg) - camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (priv)); + /********************* Summary ends *************************/ + if (!strcmp (folder->full_name, "Junk Mail")) + continue; - CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock); - if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", id, NULL))) { - if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) mail_msg, cache_stream) == -1 || camel_stream_flush (cache_stream) == -1) - camel_data_cache_remove (gw_folder->cache, "cache", id, NULL); - camel_object_unref (cache_stream); - } + if (!strcmp (folder->full_name, "Sent Items")) + is_sent_folder = TRUE; + /******************** Begine Caching ************************/ + /* add to cache if its a new message*/ + t_cache_stream = camel_data_cache_get (gw_folder->cache, "cache", id, ex); + if (t_cache_stream && !is_sent_folder) { + camel_object_unref (t_cache_stream); + + mail_msg = groupwise_folder_item_to_msg (folder, item, ex); + if (mail_msg) + camel_medium_set_header (CAMEL_MEDIUM (mail_msg), "X-Evolution-Source", groupwise_base_url_lookup (priv)); + + CAMEL_GROUPWISE_FOLDER_LOCK (folder, cache_lock); + if ((cache_stream = camel_data_cache_add (gw_folder->cache, "cache", id, NULL))) { + if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *) mail_msg, cache_stream) == -1 || camel_stream_flush (cache_stream) == -1) + camel_data_cache_remove (gw_folder->cache, "cache", id, NULL); + camel_object_unref (cache_stream); + } - camel_object_unref (mail_msg); - CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock); - } - /******************** Caching stuff ends *************************/ - i++; - } + camel_object_unref (mail_msg); + CAMEL_GROUPWISE_FOLDER_UNLOCK (folder, cache_lock); + } + /******************** Caching stuff ends *************************/ + } //End of While LOOP; Move onto the next item + g_ptr_array_free (items_iterator, FALSE); + items_iterator = FALSE; + } //End of IF for items_iterator NULL checking + i += MAX_ITERATOR_COUNT; + } // End of the FOR loop camel_operation_end (NULL); g_free (container_id); g_string_free (str, TRUE); @@ -1960,6 +1981,7 @@ groupwise_expunge (CamelFolder *folder, CamelFolderChangeInfo *changes; int i, max; gboolean delete = FALSE; + cnc = cnc_lookup (priv);