[evolution-data-server/gnome-3-4] Bug 673527 - Addressbook bulk methods are broken
- From: Christophe Dumez <cdumez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-4] Bug 673527 - Addressbook bulk methods are broken
- Date: Thu, 5 Apr 2012 09:45:56 +0000 (UTC)
commit d9eb594a188804e4d15c270bbd1f8f0b8b2e2713
Author: Christophe Dumez <christophe dumez intel com>
Date: Thu Apr 5 10:50:46 2012 +0300
Bug 673527 - Addressbook bulk methods are broken
Fixes bulk methods in addressbook file backend, that was broken by:
e144f7b5b0aba6e7903c3c98c4db792fddbf9c50
(cherry picked from commit c3b75f197f07d98a52559c726f70f5faf9f952f3)
addressbook/backends/file/e-book-backend-file.c | 66 ++++++++++++----------
1 files changed, 36 insertions(+), 30 deletions(-)
---
diff --git a/addressbook/backends/file/e-book-backend-file.c b/addressbook/backends/file/e-book-backend-file.c
index 9c5344e..824e65f 100644
--- a/addressbook/backends/file/e-book-backend-file.c
+++ b/addressbook/backends/file/e-book-backend-file.c
@@ -190,6 +190,7 @@ create_contact (const gchar *uid,
static gchar *
load_vcard (EBookBackendFile *bf,
+ DB_TXN *txn,
const gchar *uid,
GError **error)
{
@@ -203,7 +204,7 @@ load_vcard (EBookBackendFile *bf,
memset (&vcard_dbt, 0, sizeof (vcard_dbt));
vcard_dbt.flags = DB_DBT_MALLOC;
- db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
+ db_error = db->get (db, txn, &id_dbt, &vcard_dbt, 0);
if (db_error == 0) {
vcard = vcard_dbt.data;
@@ -218,13 +219,14 @@ load_vcard (EBookBackendFile *bf,
static EContact *
load_contact (EBookBackendFile *bf,
+ DB_TXN *txn,
const gchar *uid,
GError **error)
{
EContact *contact = NULL;
gchar *vcard;
- if ((vcard = load_vcard (bf, uid, error)) != NULL) {
+ if ((vcard = load_vcard (bf, txn, uid, error)) != NULL) {
contact = create_contact (uid, vcard);
g_free (vcard);
}
@@ -294,23 +296,12 @@ maybe_delete_uri (EBookBackendFile *bf,
static void
maybe_delete_unused_uris (EBookBackendFile *bf,
- const gchar *id,
EContact *old_contact,
EContact *new_contact)
{
- GError *error = NULL;
gchar *uri_photo, *uri_logo;
- if (!old_contact) {
- old_contact = load_contact (bf, id, &error);
-
- if (!old_contact) {
- g_warning (G_STRLOC ": failed to load contact %s", error->message);
- g_error_free (error);
- return;
- }
- } else
- g_object_ref (old_contact);
+ g_return_if_fail (old_contact != NULL);
/* If there is no new contact, collect all the uris to delete from old_contact
*
@@ -329,8 +320,6 @@ maybe_delete_unused_uris (EBookBackendFile *bf,
maybe_delete_uri (bf, uri_logo);
g_free (uri_logo);
}
-
- g_object_unref (old_contact);
}
static gchar *
@@ -1013,7 +1002,7 @@ e_book_backend_file_remove_contacts (EBookBackendSync *backend,
DB_ENV *env = bf->priv->env;
DB_TXN *txn = NULL;
gint db_error;
- GSList *removed_ids = NULL;
+ GSList *removed_ids = NULL, *removed_contacts = NULL;
const GSList *l;
if (!db) {
@@ -1031,12 +1020,14 @@ e_book_backend_file_remove_contacts (EBookBackendSync *backend,
for (l = id_list; l != NULL; l = l->next) {
const gchar *id;
+ EContact *contact;
DBT id_dbt;
id = l->data;
- /* First collect uris to delete */
- maybe_delete_unused_uris (bf, id, NULL, NULL);
+ contact = load_contact(bf, txn, id, NULL);
+ if (contact)
+ removed_contacts = g_slist_prepend (removed_contacts, contact);
/* Then go on to delete from the db */
string_to_dbt (id, &id_dbt);
@@ -1071,6 +1062,12 @@ e_book_backend_file_remove_contacts (EBookBackendSync *backend,
if (db_error == 0) {
GError *error = NULL;
+
+ /* Delete URI associated to those contacts */
+ for (l = removed_contacts; l; l=l->next) {
+ maybe_delete_unused_uris (bf, E_CONTACT(l->data), NULL);
+ }
+
/* Remove from summary as well */
if (!e_book_backend_sqlitedb_remove_contacts (bf->priv->sqlitedb,
SQLITEDB_FOLDER_ID,
@@ -1086,6 +1083,7 @@ e_book_backend_file_remove_contacts (EBookBackendSync *backend,
}
e_book_backend_file_bump_revision (bf);
+ g_slist_free_full (removed_contacts, g_object_unref);
}
static void
@@ -1101,8 +1099,8 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
DB_ENV *env = bf->priv->env;
DB_TXN *txn = NULL;
gint db_error;
- const GSList *l;
- GSList *modified_contacts = NULL;
+ const GSList *lold, *l;
+ GSList *old_contacts = NULL, *modified_contacts = NULL;
GSList *ids = NULL;
PhotoModifiedStatus status = STATUS_NORMAL;
@@ -1134,7 +1132,7 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
break;
}
- old_contact = load_contact (bf, id, perror);
+ old_contact = load_contact (bf, txn, id, perror);
if (!old_contact) {
g_warning (G_STRLOC ": Failed to load contact %s", id);
status = STATUS_ERROR;
@@ -1143,6 +1141,7 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
g_object_unref (contact);
break;
}
+ old_contacts = g_slist_prepend (old_contacts, old_contact);
/* Transform incomming photo blobs to uris before storing this to the DB */
status = maybe_transform_vcard_for_photo (bf, old_contact, contact, NULL, perror);
@@ -1156,11 +1155,6 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
break;
}
- /* Delete old photo file uris if need be (this will compare the new contact
- * with the current copy in the BDB to extract the uris to delete) */
- maybe_delete_unused_uris (bf, id, old_contact, contact);
- g_object_unref (old_contact);
-
/* update the revision (modified time of contact) */
set_revision (contact);
vcard_with_rev = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30);
@@ -1215,6 +1209,17 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
if (db_error == 0 && status != STATUS_ERROR) {
GError *error = NULL;
+
+ /* Delete old photo file uris if need be (this will compare the new contact
+ * with the current copy in the BDB to extract the uris to delete) */
+ lold = old_contacts;
+ l = modified_contacts;
+ while (lold && l) {
+ maybe_delete_unused_uris (bf, E_CONTACT(lold->data), E_CONTACT(l->data));
+ lold = lold->next;
+ l = l->next;
+ }
+
/* Update summary as well */
if (!e_book_backend_sqlitedb_remove_contacts (bf->priv->sqlitedb,
SQLITEDB_FOLDER_ID,
@@ -1235,6 +1240,7 @@ e_book_backend_file_modify_contacts (EBookBackendSync *backend,
}
e_util_free_string_slist (ids);
+ g_slist_free_full (old_contacts, g_object_unref);
e_book_backend_file_bump_revision (bf);
}
@@ -1254,7 +1260,7 @@ e_book_backend_file_get_contact (EBookBackendSync *backend,
return;
}
- *vcard = load_vcard (bf, id, perror);
+ *vcard = load_vcard (bf, NULL, id, perror);
}
static void
@@ -1305,7 +1311,7 @@ e_book_backend_file_get_contact_list (EBookBackendSync *backend,
*/
gchar *vcard;
- vcard = load_vcard (bf, data->uid, perror);
+ vcard = load_vcard (bf, NULL, data->uid, perror);
/* Break out on the first BDB error */
if (!vcard)
@@ -1592,7 +1598,7 @@ book_view_thread (gpointer data)
/* The sqlitedb summary did not satisfy 'fields-of-interest',
* load the complete vcard here. */
- vcard = load_vcard (bf, data->uid, &error);
+ vcard = load_vcard (bf, NULL, data->uid, &error);
if (error) {
g_warning ("Error loading contact %s: %s",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]