I accidentally¹ ported the EWS addressbook to EBookSqlite. Patch (against 3.12.5) attached. It ends up hitting this check and not actually doing any database writes: (evolution-addressbook-factory:19473): libedata-book-WARNING **: The GCancellable passed to `e_book_sqlite_add_contacts' is not the same as the cancel object passed to e_book_sqlite_lock() I think the check is wrong, because we're not using e_book_sqlite_lock() at all. Does it make sense to fix it thus: diff --git a/addressbook/libedata-book/e-book-sqlite.c b/addressbook/libedata-book/e-book-sqlite.c index 0ae89cd..9e5cb78 100644 --- a/addressbook/libedata-book/e-book-sqlite.c +++ b/addressbook/libedata-book/e-book-sqlite.c @@ -209,7 +209,7 @@ ebsql_init_debug (void) #define EBSQL_LOCK_OR_RETURN(ebsql, cancellable, val) \ G_STMT_START { \ EBSQL_LOCK_MUTEX (&(ebsql)->priv->lock); \ - if (cancellable != NULL && \ + if (cancellable != NULL && (ebsql)->priv->cancel && \ (ebsql)->priv->cancel != cancellable) { \ g_warning ("The GCancellable passed to `%s' " \ "is not the same as the cancel object " \ -- dwmw2 ¹ Seriously, it *was* an accident. I thought I needed to port to EBookSqlite to make cursors work, which I need for Yuuma's PKCS#11 module. But EBookBackendSqliteDB can do cursors anyway, so I didn't need to do the conversion. Not that it's not worthwhile anyway...
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c index 3315475..ec7bf38 100644 --- a/src/addressbook/e-book-backend-ews.c +++ b/src/addressbook/e-book-backend-ews.c @@ -73,7 +73,7 @@ struct _EBookBackendEwsPrivate { gchar *oab_url; gchar *folder_name; - EBookBackendSqliteDB *summary; + EBookSqlite *summary; gboolean only_if_exists; gboolean is_writable; @@ -1371,7 +1371,7 @@ ews_create_contact_cb (GObject *object, e_contact_set (create_contact->contact, E_CONTACT_UID, item_id->id); e_contact_set (create_contact->contact, E_CONTACT_REV, item_id->change_key); - e_book_backend_sqlitedb_new_contact (ebews->priv->summary, ebews->priv->folder_id, create_contact->contact, TRUE, &error); + e_book_sqlite_add_contact (ebews->priv->summary, create_contact->contact, NULL, TRUE, create_contact->cancellable, &error); if (error == NULL) { GSList *contacts; @@ -1510,6 +1510,7 @@ typedef struct { EDataBook *book; guint32 opid; GSList *sl_ids; + GCancellable *cancellable; } EwsRemoveContact; static void @@ -1529,7 +1530,7 @@ ews_book_remove_contact_cb (GObject *object, g_return_if_fail (priv->summary != NULL); if (!g_simple_async_result_propagate_error (simple, &error)) - deleted = e_book_backend_sqlitedb_remove_contacts (priv->summary, priv->folder_id, remove_contact->sl_ids, &error); + deleted = e_book_sqlite_remove_contacts (priv->summary, remove_contact->sl_ids, remove_contact->cancellable, &error); if (deleted) e_data_book_respond_remove_contacts (remove_contact->book, remove_contact->opid, EDB_ERROR (SUCCESS), remove_contact->sl_ids); @@ -1542,6 +1543,7 @@ ews_book_remove_contact_cb (GObject *object, g_slist_free_full (remove_contact->sl_ids, g_free); g_object_unref (remove_contact->ebews); g_object_unref (remove_contact->book); + g_object_unref (remove_contact->cancellable); g_free (remove_contact); g_clear_error (&error); } @@ -1593,6 +1595,7 @@ e_book_backend_ews_remove_contacts (EBookBackend *backend, remove_contact->book = g_object_ref (book); remove_contact->opid = opid; remove_contact->sl_ids = copy; + remove_contact->cancellable = g_object_ref(cancellable); e_ews_connection_delete_items ( priv->cnc, EWS_PRIORITY_MEDIUM, (GSList *) id_list, @@ -1647,12 +1650,11 @@ ews_modify_contact_cb (GObject *object, id = e_contact_get (modify_contact->old_contact, E_CONTACT_UID); - e_book_backend_sqlitedb_remove_contact (priv->summary, priv->folder_id, id, &error); - e_book_backend_sqlitedb_new_contact ( + e_book_sqlite_remove_contact (ebews->priv->summary, id, modify_contact->cancellable, &error); + e_book_sqlite_add_contact ( ebews->priv->summary, - ebews->priv->folder_id, - modify_contact->new_contact, - TRUE, + modify_contact->new_contact, NULL, + TRUE, modify_contact->cancellable, &error); if (error == NULL) { @@ -1830,10 +1832,7 @@ e_book_backend_ews_modify_contacts (EBookBackend *backend, id->id = e_contact_get (contact, E_CONTACT_UID); id->change_key = e_contact_get (contact, E_CONTACT_REV); - old_contact = e_book_backend_sqlitedb_get_contact ( - priv->summary, priv->folder_id, - id->id, NULL, NULL, &error); - if (!old_contact) { + if (!e_book_sqlite_get_contact (priv->summary, id->id, TRUE, &old_contact, &error)) { g_object_unref (contact); e_data_book_respond_modify_contacts (book, opid, EDB_ERROR (NOT_SUPPORTED), NULL); return; @@ -1900,20 +1899,25 @@ e_book_backend_ews_get_contact_list (EBookBackend *backend, GError *error = NULL; EBookBackendEws *ebews; EBookBackendEwsPrivate *priv; + gint populated = 0; ebews = E_BOOK_BACKEND_EWS (backend); priv = ebews->priv; - if (!e_backend_get_online (E_BACKEND (backend))) { - if (priv->summary && e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL)) { - list = e_book_backend_sqlitedb_search (priv->summary, priv->folder_id, query, NULL, NULL, NULL, &error); - l = list; - while (l) { - EbSdbSearchData *s_data = (EbSdbSearchData *) l->data; + if (priv->summary) + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &populated, NULL); - vcard_list = g_slist_append (vcard_list, g_strdup (s_data->vcard)); - e_book_backend_sqlitedb_search_data_free (s_data); - l = l->next; + if (!e_backend_get_online (E_BACKEND (backend))) { + if (populated) { + if (e_book_sqlite_search (priv->summary, query, FALSE, &list, cancellable, &error)) { + l = list; + while (l) { + EbSqlSearchData *s_data = (EbSqlSearchData *) l->data; + + vcard_list = g_slist_append (vcard_list, g_strdup (s_data->vcard)); + e_book_sqlite_search_data_free (s_data); + l = l->next; + } } convert_error_to_edb_error (&error); e_data_book_respond_get_contact_list (book, opid, error, vcard_list); @@ -1932,15 +1936,16 @@ e_book_backend_ews_get_contact_list (EBookBackend *backend, return; } - if (priv->summary && e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL)) { - list = e_book_backend_sqlitedb_search (priv->summary, priv->folder_id, query, NULL, NULL, NULL, &error); - l = list; - while (l) { - EbSdbSearchData *s_data = (EbSdbSearchData *) l->data; + if (populated) { + if (e_book_sqlite_search (priv->summary, query, FALSE, &list, cancellable, &error)) { + l = list; + while (l) { + EbSqlSearchData *s_data = (EbSqlSearchData *) l->data; - vcard_list = g_slist_append (vcard_list, g_strdup (s_data->vcard)); - e_book_backend_sqlitedb_search_data_free (s_data); - l = l->next; + vcard_list = g_slist_append (vcard_list, g_strdup (s_data->vcard)); + e_book_sqlite_search_data_free (s_data); + l = l->next; + } } convert_error_to_edb_error (&error); @@ -2282,9 +2287,8 @@ ews_download_gal (EBookBackendEws *cbews, EwsOALDetails *full, GSList *deltas, g cache_dir = e_book_backend_get_cache_dir (E_BOOK_BACKEND (cbews)); - thisoab = e_book_backend_sqlitedb_get_key_value (priv->summary, priv->folder_id, - "oab-filename", NULL); - if (!thisoab) + if (!e_book_sqlite_get_key_value (priv->summary, "oab-filename", &thisoab, NULL) + || !thisoab) goto full; for (p = deltas; p; p = p->next) { @@ -2351,8 +2355,7 @@ ews_remove_old_gal_file (EBookBackendEws *cbews, if (!priv->summary) return FALSE; - filename = e_book_backend_sqlitedb_get_key_value (priv->summary, priv->folder_id, "oab-filename", error); - if (*error) + if (!e_book_sqlite_get_key_value (priv->summary, "oab-filename", &filename, error)) return FALSE; if (filename) @@ -2366,6 +2369,7 @@ struct _db_data { GSList *contact_collector; guint collected_length; EBookBackendEws *cbews; + GCancellable *cancellable; }; static void @@ -2398,7 +2402,7 @@ ews_gal_store_contact (EContact *contact, g_free (status_message); data->contact_collector = g_slist_reverse (data->contact_collector); - e_book_backend_sqlitedb_new_contacts (priv->summary, priv->folder_id, data->contact_collector, TRUE, error); + e_book_sqlite_add_contacts (priv->summary, data->contact_collector, NULL, TRUE, data->cancellable, error); for (l = data->contact_collector; l != NULL; l = g_slist_next (l)) e_book_backend_notify_update (E_BOOK_BACKEND (data->cbews), E_CONTACT (l->data)); @@ -2425,17 +2429,19 @@ ews_replace_gal_in_db (EBookBackendEws *cbews, EBookBackendEwsPrivate *priv = cbews->priv; EwsOabDecoder *eod; gboolean ret = TRUE; + gint populated = 0; struct _db_data data; g_return_val_if_fail (priv->summary != NULL, FALSE); /* remove the old address-book and create a new one in db */ - if (e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL)) { - GSList *uids; + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &populated, NULL); + if (populated) { + GSList *uids = NULL; - uids = e_book_backend_sqlitedb_search_uids (priv->summary, priv->folder_id, NULL, NULL, NULL); + e_book_sqlite_search_uids (priv->summary, NULL, &uids, cancellable, NULL); if (uids) { - e_book_backend_sqlitedb_remove_contacts (priv->summary, priv->folder_id, uids, NULL); + e_book_sqlite_remove_contacts (priv->summary, uids, cancellable, NULL); g_slist_free_full (uids, g_free); } @@ -2452,6 +2458,7 @@ ews_replace_gal_in_db (EBookBackendEws *cbews, data.contact_collector = NULL; data.collected_length = 0; data.cbews = cbews; + data.cancellable = cancellable; ret = ews_oab_decoder_decode (eod, ews_gal_store_contact, &data, cancellable, error); @@ -2463,7 +2470,7 @@ ews_replace_gal_in_db (EBookBackendEws *cbews, return ret; /* mark the db as populated */ - ret = e_book_backend_sqlitedb_set_is_populated (priv->summary, priv->folder_id, TRUE, error); + ret = e_book_sqlite_set_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, TRUE, error); return ret; } @@ -2479,7 +2486,7 @@ ebews_start_gal_sync (gpointer data) GSList *full_l = NULL; GSList *deltas = NULL; gboolean ret = TRUE; - gboolean is_populated; + gint is_populated = 0; gchar *uncompressed_filename = NULL; gchar *password; gchar *old_etag = NULL, *etag = NULL; @@ -2510,13 +2517,13 @@ ebews_start_gal_sync (gpointer data) d (printf ("Ewsgal: Fetching oal full details file \n");) - is_populated = e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL); + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &is_populated, NULL); if (is_populated) { - gchar *tmp; - old_etag = e_book_backend_sqlitedb_get_key_value ( - priv->summary, priv->folder_id, "etag", NULL); - tmp = e_book_backend_sqlitedb_get_key_value ( - priv->summary, priv->folder_id, "seq", NULL); + gchar *tmp = NULL; + e_book_sqlite_get_key_value ( + priv->summary, "etag", &old_etag, NULL); + e_book_sqlite_get_key_value ( + priv->summary, "seq", &tmp, NULL); if (tmp) old_seq = strtoul(tmp, NULL, 10); else @@ -2578,31 +2585,33 @@ ebews_start_gal_sync (gpointer data) d (printf ("Ewsgal: Removing old gal \n");) /* remove old_gal_file */ - ret = ews_remove_old_gal_file (cbews, &error); - if (!ret) { - goto exit; - } + ews_remove_old_gal_file (cbews, &error); d (printf ("Ewsgal: Replacing old gal with new gal contents in db \n");) ret = ews_replace_gal_in_db (cbews, uncompressed_filename, cancellable, &error); if (!ret) goto exit; - e_book_backend_sqlitedb_set_key_value (priv->summary, priv->folder_id, "etag", etag ? etag : "", NULL); - if (e_book_backend_sqlitedb_set_key_value (priv->summary, priv->folder_id, - "oab-filename", uncompressed_filename, - NULL)) { + e_book_sqlite_set_key_value (priv->summary, "etag", etag ? etag : "", NULL); + if (e_book_sqlite_set_key_value (priv->summary, "oab-filename", + uncompressed_filename, NULL)) { /* Don't let it get deleted */ g_free (uncompressed_filename); uncompressed_filename = NULL; } seq = g_strdup_printf ("%"G_GUINT32_FORMAT, full->seq); - ret = e_book_backend_sqlitedb_set_key_value (priv->summary, priv->folder_id, "seq", seq, &error); + ret = e_book_sqlite_set_key_value (priv->summary, "seq", seq, &error); g_free (seq); if (!ret) { - e_book_backend_sqlitedb_delete_addressbook (priv->summary, priv->folder_id, &error); + gchar *db_filename = g_build_filename ( + e_book_backend_get_cache_dir (E_BOOK_BACKEND (cbews)), + "contacts.dn", NULL); + g_object_unref (priv->summary); + priv->summary = NULL; + g_unlink (db_filename); + g_free (db_filename); goto exit; } @@ -2647,6 +2656,7 @@ exit: static void ebews_sync_deleted_items (EBookBackendEws *ebews, GSList *deleted_ids, + GCancellable *cancellable, GError **error) { GSList *l; @@ -2658,10 +2668,10 @@ ebews_sync_deleted_items (EBookBackendEws *ebews, for (l = deleted_ids; l != NULL; l = g_slist_next (l)) { gchar *id = (gchar *) l->data; - gboolean partial_content; + gboolean exists = FALSE; - if (e_book_backend_sqlitedb_has_contact (priv->summary, priv->folder_id, id, &partial_content, NULL)) - e_book_backend_sqlitedb_remove_contact (priv->summary, priv->folder_id, id, error); + if (e_book_sqlite_has_contact (priv->summary, id, &exists, NULL) && exists) + e_book_sqlite_remove_contact (priv->summary, id, cancellable, error); e_book_backend_notify_remove (E_BOOK_BACKEND (ebews), id); } @@ -2724,7 +2734,7 @@ ebews_store_contact_items (EBookBackendEws *ebews, attr = e_vcard_attribute_new (NULL, "X-EWS-KIND"); e_vcard_add_attribute_with_value (E_VCARD (contact), attr, "DT_MAILUSER"); - e_book_backend_sqlitedb_new_contact (priv->summary, priv->folder_id, contact, TRUE, error); + e_book_sqlite_add_contact (priv->summary, contact, NULL, TRUE, cancellable, error); e_book_backend_notify_update (E_BOOK_BACKEND (ebews), contact); g_object_unref (item); @@ -2875,6 +2885,7 @@ ebews_store_distribution_list_items (EBookBackendEws *ebews, const EwsId *id, const gchar *d_name, GSList *members, + GCancellable *cancellable, GError **error) { EContact *contact; @@ -2890,7 +2901,7 @@ ebews_store_distribution_list_items (EBookBackendEws *ebews, attr = e_vcard_attribute_new (NULL, "X-EWS-KIND"); e_vcard_add_attribute_with_value (E_VCARD (contact), attr, "DT_DISTLIST"); - ret = e_book_backend_sqlitedb_new_contact (ebews->priv->summary, ebews->priv->folder_id, contact, TRUE, error); + ret = e_book_sqlite_add_contact (ebews->priv->summary, contact, NULL, TRUE, cancellable, error); if (ret) e_book_backend_notify_update (E_BOOK_BACKEND (ebews), contact); @@ -3021,7 +3032,7 @@ ebews_fetch_items (EBookBackendEws *ebews, goto cleanup; if (store_to_cache) - ret = ebews_store_distribution_list_items (ebews, id, d_name, members, error); + ret = ebews_store_distribution_list_items (ebews, id, d_name, members, cancellable, error); else ret = ebews_vcards_append_dl (ebews, id, d_name, members, vcards, error); @@ -3051,11 +3062,11 @@ ebews_forget_all_contacts (EBookBackendEws *ebews) backend = E_BOOK_BACKEND (ebews); g_return_if_fail (backend != NULL); - ids = e_book_backend_sqlitedb_search_uids (ebews->priv->summary, ebews->priv->folder_id, NULL, NULL, NULL); + e_book_sqlite_search_uids (ebews->priv->summary, NULL, &ids, ebews->priv->cancellable, NULL); if (ids) { GSList *id; - e_book_backend_sqlitedb_remove_contacts (ebews->priv->summary, ebews->priv->folder_id, ids, NULL); + e_book_sqlite_remove_contacts (ebews->priv->summary, ids, ebews->priv->cancellable, NULL); for (id = ids; id; id = id->next) { e_book_backend_notify_remove (backend, id->data); } @@ -3201,9 +3212,10 @@ static void fetch_from_offline (EBookBackendEws *ews, EDataBookView *book_view, const gchar *query, + GCancellable *cancellable, GError *error) { - GSList *contacts, *l; + GSList *contacts = NULL, *l; EBookBackendEwsPrivate *priv; priv = ews->priv; @@ -3217,13 +3229,13 @@ fetch_from_offline (EBookBackendEws *ews, g_return_if_fail (priv->summary != NULL); - contacts = e_book_backend_sqlitedb_search (priv->summary, priv->folder_id, query, NULL, NULL, NULL, &error); + e_book_sqlite_search (priv->summary, query, FALSE, &contacts, cancellable, &error); for (l = contacts; l != NULL; l = g_slist_next (l)) { - EbSdbSearchData *s_data = (EbSdbSearchData *) l->data; + EbSqlSearchData *s_data = (EbSqlSearchData *) l->data; e_data_book_view_notify_update_prefiltered_vcard (book_view, s_data->uid, s_data->vcard); - e_book_backend_sqlitedb_search_data_free (s_data); + e_book_sqlite_search_data_free (s_data); } if (contacts) @@ -3250,6 +3262,7 @@ e_book_backend_ews_start_view (EBookBackend *backend, const gchar *extension_name; GError *error = NULL; gboolean includes_last_item; + gint is_populated = 0; ebews = E_BOOK_BACKEND_EWS (backend); priv = ebews->priv; @@ -3263,8 +3276,10 @@ e_book_backend_ews_start_view (EBookBackend *backend, e_data_book_view_notify_progress (book_view, -1, _("Searching...")); if (!e_backend_get_online (E_BACKEND (backend))) { - if (priv->summary && e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL)) { - fetch_from_offline (ebews, book_view, query, error); + if (priv->summary) + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &is_populated, NULL); + if (!is_populated) { + fetch_from_offline (ebews, book_view, query, /*XXX*/NULL, error); return; } @@ -3294,9 +3309,10 @@ e_book_backend_ews_start_view (EBookBackend *backend, ebews_start_refreshing (ebews); - if (priv->summary && - e_book_backend_sqlitedb_get_is_populated (priv->summary, priv->folder_id, NULL)) { - fetch_from_offline (ebews, book_view, query, error); + if (priv->summary) + e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &is_populated, NULL); + if (!is_populated) { + fetch_from_offline (ebews, book_view, query, /*XXX*/NULL, error); return; } @@ -3404,24 +3420,26 @@ static void e_book_backend_ews_load_source (EBookBackend *backend, ESource *source, gboolean only_if_exists, + GCancellable *cancellable, GError **perror) { EBookBackendEws *cbews; EBookBackendEwsPrivate *priv; CamelEwsSettings *settings; ESourceExtension *extension; - const gchar *cache_dir, *email; + const gchar *cache_dir; const gchar *display_name; const gchar *extension_name; const gchar *gal_uid; const gchar *uid; + gchar *db_filename; cbews = E_BOOK_BACKEND_EWS (backend); priv = cbews->priv; cache_dir = e_book_backend_get_cache_dir (backend); + db_filename = g_build_filename (cache_dir, "contacts.db", NULL); settings = book_backend_ews_get_collection_settings (cbews); - email = camel_ews_settings_get_email (settings); uid = e_source_get_uid (source); gal_uid = camel_ews_settings_get_gal_uid (settings); @@ -3435,10 +3453,8 @@ e_book_backend_ews_load_source (EBookBackend *backend, priv->folder_id = e_source_ews_folder_dup_id ( E_SOURCE_EWS_FOLDER (extension)); - priv->summary = e_book_backend_sqlitedb_new ( - cache_dir, email, priv->folder_id, - display_name, TRUE, perror); - + priv->summary = e_book_sqlite_new (db_filename, /* 3.13 onwards: source,*/ cancellable, perror); + g_free (db_filename); if (priv->summary == NULL) return; @@ -3641,13 +3657,13 @@ ews_update_items_thread (gpointer data) { EBookBackendEws *ebews = data; EBookBackendEwsPrivate *priv; - gchar *sync_state; + gchar *sync_state = NULL; GError *error = NULL; gboolean includes_last_item; priv = ebews->priv; - sync_state = e_book_backend_sqlitedb_get_sync_data (priv->summary, priv->folder_id, NULL); + e_book_sqlite_get_key_value (priv->summary, "sync_data", &sync_state, NULL); do { GSList *items_created = NULL; GSList *items_updated = NULL; @@ -3678,7 +3694,7 @@ ews_update_items_thread (gpointer data) if (error != NULL) { if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_INVALIDSYNCSTATEDATA)) { g_clear_error (&error); - e_book_backend_sqlitedb_set_sync_data (priv->summary, priv->folder_id, NULL, &error); + e_book_sqlite_set_key_value (priv->summary, "sync_data", NULL, &error); if (error != NULL) break; @@ -3709,6 +3725,7 @@ ews_update_items_thread (gpointer data) ebews_sync_deleted_items ( ebews, items_deleted, /* freed inside the function */ + priv->cancellable, &error); if (error != NULL) { g_slist_free_full (items_created, g_object_unref); @@ -3743,13 +3760,13 @@ ews_update_items_thread (gpointer data) break; } - e_book_backend_sqlitedb_set_sync_data (priv->summary, priv->folder_id, sync_state, &error); + e_book_sqlite_set_key_value (priv->summary, "sync_data", sync_state, &error); if (error != NULL) break; } while (!includes_last_item); if (error == NULL) - e_book_backend_sqlitedb_set_is_populated (priv->summary, priv->folder_id, TRUE, &error); + e_book_sqlite_set_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, TRUE, &error); if (error != NULL) { g_warning ("%s: %s", G_STRFUNC, error->message); @@ -3826,7 +3843,7 @@ e_book_backend_ews_open (EBookBackend *backend, priv = ebews->priv; source = e_backend_get_source (E_BACKEND (backend)); - e_book_backend_ews_load_source (backend, source, only_if_exists, &error); + e_book_backend_ews_load_source (backend, source, only_if_exists, cancellable, &error); ews_settings = book_backend_ews_get_collection_settings (ebews); if (error == NULL) {
Attachment:
smime.p7s
Description: S/MIME cryptographic signature