#define d(x)
+#if d(1)+0
+# define LOCK_MUTEX(mutex) \
+ G_STMT_START { \
+ g_message ("%s: DB Locking ", G_STRFUNC); \
+ g_mutex_lock (mutex); \
+ g_message ("%s: DB Locked ", G_STRFUNC); \
+ } G_STMT_END
+
+
+# define UNLOCK_MUTEX(mutex) \
+ G_STMT_START { \
+ g_message ("%s: Unlocking ", G_STRFUNC); \
+ g_mutex_unlock (mutex); \
+ g_message ("%s: DB Unlocked ", G_STRFUNC); \
+ } G_STMT_END
+#else
+# define LOCK_MUTEX(mutex) g_mutex_lock (mutex)
+# define UNLOCK_MUTEX(mutex) g_mutex_unlock (mutex)
+#endif
+
#define DB_FILENAME "contacts.db"
#define FOLDER_VERSION 3
-#define READER_LOCK(ebsdb) g_rw_lock_reader_lock (&ebsdb->priv->rwlock)
-#define READER_UNLOCK(ebsdb) g_rw_lock_reader_unlock (&ebsdb->priv->rwlock)
-#define WRITER_LOCK(ebssdb) g_rw_lock_writer_lock (&ebsdb->priv->rwlock)
-#define WRITER_UNLOCK(ebssdb) g_rw_lock_writer_unlock (&ebsdb->priv->rwlock)
-
typedef enum {
INDEX_PREFIX = (1 << 0),
INDEX_SUFFIX = (1 << 1)
gchar *path;
gchar *hash_key;
- gboolean store_vcard;
- GRWLock rwlock;
+ GMutex lock;
+ GMutex updates_lock; /* This is for deprecated e_book_backend_sqlitedb_lock_updates() */
- GMutex in_transaction_lock;
+ gboolean store_vcard;
guint32 in_transaction;
SummaryField *summary_fields;
priv = E_BOOK_BACKEND_SQLITEDB_GET_PRIVATE (object);
- g_rw_lock_clear (&priv->rwlock);
-
sqlite3_close (priv->db);
g_free (priv->path);
g_free (priv->summary_fields);
- g_mutex_clear (&priv->in_transaction_lock);
+ g_mutex_clear (&priv->lock);
+ g_mutex_clear (&priv->updates_lock);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_book_backend_sqlitedb_parent_class)->finalize (object);
ebsdb->priv = E_BOOK_BACKEND_SQLITEDB_GET_PRIVATE (ebsdb);
ebsdb->priv->store_vcard = TRUE;
- g_rw_lock_init (&ebsdb->priv->rwlock);
ebsdb->priv->in_transaction = 0;
- g_mutex_init (&ebsdb->priv->in_transaction_lock);
+ g_mutex_init (&ebsdb->priv->lock);
+ g_mutex_init (&ebsdb->priv->updates_lock);
}
static gint
return book_backend_sql_exec_real (db, stmt, callback, data, error);
}
-/* the first caller holds the writer lock too */
+/* This function must always be called with the priv->lock held */
static gboolean
book_backend_sqlitedb_start_transaction (EBookBackendSqliteDB *ebsdb,
GError **error)
g_return_val_if_fail (ebsdb->priv != NULL, FALSE);
g_return_val_if_fail (ebsdb->priv->db != NULL, FALSE);
- g_mutex_lock (&ebsdb->priv->in_transaction_lock);
-
ebsdb->priv->in_transaction++;
- if (ebsdb->priv->in_transaction == 0) {
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
- g_return_val_if_fail (ebsdb->priv->in_transaction != 0, FALSE);
- return FALSE;
- }
+ g_return_val_if_fail (ebsdb->priv->in_transaction > 0, FALSE);
if (ebsdb->priv->in_transaction == 1) {
- WRITER_LOCK (ebsdb);
success = book_backend_sql_exec (
ebsdb->priv->db, "BEGIN", NULL, NULL, error);
}
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
return success;
}
-/* the last caller releases the writer lock too */
+/* This function must always be called with the priv->lock held */
static gboolean
book_backend_sqlitedb_commit_transaction (EBookBackendSqliteDB *ebsdb,
GError **error)
g_return_val_if_fail (ebsdb->priv != NULL, FALSE);
g_return_val_if_fail (ebsdb->priv->db != NULL, FALSE);
- g_mutex_lock (&ebsdb->priv->in_transaction_lock);
-
- if (ebsdb->priv->in_transaction == 0) {
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
- g_return_val_if_fail (ebsdb->priv->in_transaction > 0, FALSE);
- return FALSE;
- }
+ g_return_val_if_fail (ebsdb->priv->in_transaction > 0, FALSE);
ebsdb->priv->in_transaction--;
if (ebsdb->priv->in_transaction == 0) {
success = book_backend_sql_exec (
ebsdb->priv->db, "COMMIT", NULL, NULL, error);
-
- WRITER_UNLOCK (ebsdb);
}
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
return success;
}
-/* the last caller releases the writer lock too */
+/* This function must always be called with the priv->lock held */
static gboolean
book_backend_sqlitedb_rollback_transaction (EBookBackendSqliteDB *ebsdb,
GError **error)
g_return_val_if_fail (ebsdb->priv != NULL, FALSE);
g_return_val_if_fail (ebsdb->priv->db != NULL, FALSE);
- g_mutex_lock (&ebsdb->priv->in_transaction_lock);
-
- if (ebsdb->priv->in_transaction == 0) {
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
- g_return_val_if_fail (ebsdb->priv->in_transaction > 0, FALSE);
- return FALSE;
- }
+ g_return_val_if_fail (ebsdb->priv->in_transaction > 0, FALSE);
ebsdb->priv->in_transaction--;
success = book_backend_sql_exec (
ebsdb->priv->db, "ROLLBACK", NULL, NULL, error);
- WRITER_UNLOCK (ebsdb);
}
-
- g_mutex_unlock (&ebsdb->priv->in_transaction_lock);
-
return success;
}
stmt = sqlite3_mprintf (string->str, folderid);
g_string_free (string, TRUE);
- WRITER_LOCK (ebsdb);
-
success = book_backend_sql_exec (
ebsdb->priv->db, stmt, NULL, NULL , error);
}
- WRITER_UNLOCK (ebsdb);
-
if (success)
success = introspect_summary (ebsdb, folderid, error);
return FALSE;
}
- WRITER_LOCK (ebsdb);
-
book_backend_sql_exec (
ebsdb->priv->db,
"ATTACH DATABASE ':memory:' AS mem",
"PRAGMA case_sensitive_like = ON",
NULL, NULL, NULL);
- WRITER_UNLOCK (ebsdb);
-
return create_folders_table (ebsdb, error);
}
if (ebsdb) {
g_object_ref (ebsdb);
- g_mutex_unlock (&dbcon_lock);
g_free (hash_key);
goto exit;
}
g_hash_table_insert (db_connections, hash_key, ebsdb);
ebsdb->priv->hash_key = g_strdup (hash_key);
+ exit:
+ /* While the global dbcon_lock is held, hold the ebsdb specific lock and
+ * prolong the locking on that instance until the folders are all set up
+ */
+ LOCK_MUTEX (&ebsdb->priv->lock);
g_mutex_unlock (&dbcon_lock);
-exit:
if (!add_folder_into_db (ebsdb, folderid, folder_name, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
g_object_unref (ebsdb);
return NULL;
}
if (!create_contacts_table (ebsdb, folderid, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
g_object_unref (ebsdb);
return NULL;
}
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
return ebsdb;
}
e_book_backend_sqlitedb_lock_updates (EBookBackendSqliteDB *ebsdb,
GError **error)
{
+ gboolean success;
+
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
- return book_backend_sqlitedb_start_transaction (ebsdb, error);
+ LOCK_MUTEX (&ebsdb->priv->updates_lock);
+
+ LOCK_MUTEX (&ebsdb->priv->lock);
+ success = book_backend_sqlitedb_start_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
+ return success;
}
gboolean
gboolean do_commit,
GError **error)
{
+ gboolean success;
+
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
- return do_commit ?
+ LOCK_MUTEX (&ebsdb->priv->lock);
+ success = do_commit ?
book_backend_sqlitedb_commit_transaction (ebsdb, error) :
book_backend_sqlitedb_rollback_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
+ UNLOCK_MUTEX (&ebsdb->priv->updates_lock);
+
+ return success;
}
/* Add Contact (free the result with g_free() ) */
GError **error)
{
GSList *l;
- gboolean success;
+ gboolean success = TRUE;
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
g_return_val_if_fail (contacts != NULL, FALSE);
- success = book_backend_sqlitedb_start_transaction (ebsdb, error);
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+ return FALSE;
+ }
for (l = contacts; success && l != NULL; l = g_slist_next (l)) {
EContact *contact = (EContact *) l->data;
}
if (success)
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
- return FALSE;
+ return success;
}
/**
GSList *uids,
GError **error)
{
- gboolean success;
+ gboolean success = TRUE;
gchar *stmt;
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
g_return_val_if_fail (uids != NULL, FALSE);
- success = book_backend_sqlitedb_start_transaction (ebsdb, error);
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+ return FALSE;
+ }
/* Delete the auxillary contact infos first */
if (success && ebsdb->priv->have_attr_list) {
}
if (success)
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
- return FALSE;
+ return success;
}
struct _contact_info {
cinfo.exists = FALSE;
cinfo.partial_content = FALSE;
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT partial_content FROM %Q WHERE uid = %Q",
if (success)
*partial_content = cinfo.partial_content;
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
/* FIXME Returning FALSE can mean either "contact not found" or
* "error occurred". Add a boolean (out) "exists" parameter. */
**/
gboolean
e_book_backend_sqlitedb_check_summary_fields (EBookBackendSqliteDB *ebsdb,
- GHashTable *fields_of_interest)
+ GHashTable *fields_of_interest)
{
gboolean summary_fields = TRUE;
GHashTableIter iter;
if (!fields_of_interest)
return FALSE;
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
g_hash_table_iter_init (&iter, fields_of_interest);
while (g_hash_table_iter_next (&iter, &key, &value)) {
const gchar *field_name = key;
}
}
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
return summary_fields;
}
g_return_val_if_fail (folderid != NULL, NULL);
g_return_val_if_fail (uid != NULL, NULL);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
/* Try constructing contacts from only UID/REV first if that's requested */
if (uid_rev_fields (fields_of_interest)) {
}
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
if (with_all_required_fields)
*with_all_required_fields = local_with_all_required_fields;
{ "exists", func_check, 0 }
};
-/**
- * e_book_backend_sqlitedb_check_summary_query:
- * @ebsdb: an #EBookBackendSqliteDB
- * @query: the query to check
- * @with_list_attrs: Return location to store whether the query touches upon list attributes
- *
- * Checks whether @query contains only checks for the summary fields
- * configured in @ebsdb
- *
- * Since: 3.8
- **/
-gboolean
-e_book_backend_sqlitedb_check_summary_query (EBookBackendSqliteDB *ebsdb,
- const gchar *query,
- gboolean *with_list_attrs)
+static gboolean
+e_book_backend_sqlitedb_check_summary_query_locked (EBookBackendSqliteDB *ebsdb,
+ const gchar *query,
+ gboolean *with_list_attrs)
{
ESExp *sexp;
ESExpResult *r;
}
/**
+ * e_book_backend_sqlitedb_check_summary_query:
+ * @ebsdb: an #EBookBackendSqliteDB
+ * @query: the query to check
+ * @with_list_attrs: Return location to store whether the query touches upon list attributes
+ *
+ * Checks whether @query contains only checks for the summary fields
+ * configured in @ebsdb
+ *
+ * Since: 3.8
+ **/
+gboolean
+e_book_backend_sqlitedb_check_summary_query (EBookBackendSqliteDB *ebsdb,
+ const gchar *query,
+ gboolean *with_list_attrs)
+{
+ gboolean is_summary;
+
+ g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
+
+ LOCK_MUTEX (&ebsdb->priv->lock);
+ is_summary = e_book_backend_sqlitedb_check_summary_query_locked (ebsdb, query, with_list_attrs);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
+ return is_summary;
+}
+
+/**
* e_book_backend_sqlitedb_is_summary_query:
*
* Checks whether the query contains only checks for the default summary fields
gboolean
e_book_backend_sqlitedb_is_summary_query (const gchar *query)
{
- return e_book_backend_sqlitedb_check_summary_query (NULL, query, NULL);
+ return e_book_backend_sqlitedb_check_summary_query_locked (NULL, query, NULL);
}
static ESExpResult *
gboolean local_with_all_required_fields = FALSE;
gboolean success = TRUE;
- READER_LOCK (ebsdb);
-
/* Try constructing contacts from only UID/REV first if that's requested */
if (uid_rev_fields (fields_of_interest)) {
gchar *select_portion;
_("Full search_contacts are not stored in cache. vcards cannot be returned."));
}
- READER_UNLOCK (ebsdb);
-
if (!success) {
g_warn_if_fail (vcard_data == NULL);
return NULL;
gboolean success;
gchar *stmt;
- READER_LOCK (ebsdb);
-
stmt = sqlite3_mprintf ("SELECT uid, vcard, bdata FROM %Q", folderid);
success = book_backend_sql_exec (
ebsdb->priv->db, stmt, addto_vcard_list_cb , &all, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
-
if (!success) {
g_warn_if_fail (all == NULL);
return NULL;
if (sexp && !*sexp)
sexp = NULL;
- if (!sexp || e_book_backend_sqlitedb_check_summary_query (ebsdb, sexp,
- &query_with_list_attrs)) {
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!sexp || e_book_backend_sqlitedb_check_summary_query_locked (ebsdb, sexp,
+ &query_with_list_attrs)) {
gchar *sql_query;
sql_query = sexp ? sexp_to_sql_query (ebsdb, folderid, sexp) : NULL;
"Hence only summary query is supported."));
}
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
if (searched)
*searched = local_searched;
if (with_all_required_fields)
if (sexp && !*sexp)
sexp = NULL;
- if (!sexp || e_book_backend_sqlitedb_check_summary_query (ebsdb, sexp, &query_with_list_attrs)) {
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!sexp || e_book_backend_sqlitedb_check_summary_query_locked (ebsdb, sexp, &query_with_list_attrs)) {
gchar *stmt;
gchar *sql_query = sexp ? sexp_to_sql_query (ebsdb, folderid, sexp) : NULL;
- READER_LOCK (ebsdb);
-
if (sql_query && sql_query[0]) {
if (query_with_list_attrs) {
sqlite3_free (stmt);
}
- READER_UNLOCK (ebsdb);
-
local_searched = TRUE;
g_free (sql_query);
"Hence only summary query is supported."));
}
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
if (searched)
*searched = local_searched;
uids_and_rev = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf ("SELECT uid,rev FROM %Q", folderid);
book_backend_sql_exec (
get_uids_and_rev_cb, uids_and_rev, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return uids_and_rev;
}
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT is_populated FROM folders WHERE folder_id = %Q",
ebsdb->priv->db, stmt, get_bool_cb , &ret, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return ret;
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "UPDATE folders SET is_populated = %d "
+ "UPDATE folders SET is_populated = %d "
"WHERE folder_id = %Q", populated, folderid);
- success =book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ success = book_backend_sql_exec (
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (folderid && folderid[0], FALSE);
g_return_val_if_fail (revision_out != NULL && *revision_out == NULL, FALSE);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT revision FROM folders WHERE folder_id = %Q", folderid);
ebsdb->priv->db, stmt, get_string_cb, &revision_out, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return success;
}
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid && folderid[0], FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "UPDATE folders SET revision = %Q "
+ "UPDATE folders SET revision = %Q "
"WHERE folder_id = %Q", revision, folderid);
success = book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT partial_content FROM folders "
ebsdb->priv->db, stmt, get_bool_cb , &ret, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return ret;
}
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "UPDATE folders SET partial_content = %d "
+ "UPDATE folders SET partial_content = %d "
"WHERE folder_id = %Q", partial_content, folderid);
success = book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
-
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (folderid != NULL, NULL);
g_return_val_if_fail (uid != NULL, NULL);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT bdata FROM %Q WHERE uid = %Q", folderid, uid);
ebsdb->priv->db, stmt, get_string_cb , &ret, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
if (!success) {
g_warn_if_fail (ret == NULL);
g_return_val_if_fail (uid != NULL, FALSE);
g_return_val_if_fail (value != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "UPDATE %Q SET bdata = %Q WHERE uid = %Q",
+ "UPDATE %Q SET bdata = %Q WHERE uid = %Q",
folderid, value, uid);
success = book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
-
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), NULL);
g_return_val_if_fail (folderid != NULL, NULL);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT sync_data FROM folders WHERE folder_id = %Q",
ebsdb->priv->db, stmt, get_string_cb , &ret, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return ret;
}
g_return_val_if_fail (folderid != NULL, FALSE);
g_return_val_if_fail (sync_data != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "UPDATE folders SET sync_data = %Q "
+ "UPDATE folders SET sync_data = %Q "
"WHERE folder_id = %Q", sync_data, folderid);
success = book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (folderid != NULL, NULL);
g_return_val_if_fail (key != NULL, NULL);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT value FROM keys WHERE folder_id = %Q AND key = %Q",
ebsdb->priv->db, stmt, get_string_cb , &ret, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return ret;
}
g_return_val_if_fail (key != NULL, FALSE);
g_return_val_if_fail (value != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
stmt = sqlite3_mprintf (
- "INSERT or REPLACE INTO keys (key, value, folder_id) "
+ "INSERT or REPLACE INTO keys (key, value, folder_id) "
"values (%Q, %Q, %Q)", key, value, folderid);
success = book_backend_sql_exec (
- ebsdb->priv->db, stmt, NULL, NULL, error);
+ ebsdb->priv->db, stmt, NULL, NULL, error);
sqlite3_free (stmt);
- if (!success)
- goto rollback;
-
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ if (success)
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ else
+ /* The GError is already set. */
+ book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
-rollback:
- /* The GError is already set. */
- book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
- return FALSE;
+ return success;
}
/**
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), NULL);
g_return_val_if_fail (folderid != NULL, NULL);
- READER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
stmt = sqlite3_mprintf (
"SELECT uid FROM %Q WHERE partial_content = 1",
ebsdb->priv->db, stmt, addto_slist_cb, &uids, error);
sqlite3_free (stmt);
- READER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return uids;
}
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
g_return_val_if_fail (folderid != NULL, FALSE);
- if (!book_backend_sqlitedb_start_transaction (ebsdb, error))
+ LOCK_MUTEX (&ebsdb->priv->lock);
+
+ if (!book_backend_sqlitedb_start_transaction (ebsdb, error)) {
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
return FALSE;
+ }
/* delete the contacts table */
stmt = sqlite3_mprintf ("DROP TABLE %Q ", folderid);
if (!success)
goto rollback;
- return book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ success = book_backend_sqlitedb_commit_transaction (ebsdb, error);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
+ return success;
rollback:
/* The GError is already set. */
book_backend_sqlitedb_rollback_transaction (ebsdb, NULL);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
+
return FALSE;
}
g_return_val_if_fail (E_IS_BOOK_BACKEND_SQLITEDB (ebsdb), FALSE);
- WRITER_LOCK (ebsdb);
+ LOCK_MUTEX (&ebsdb->priv->lock);
sqlite3_close (ebsdb->priv->db);
ret = g_unlink (filename);
g_free (filename);
- WRITER_UNLOCK (ebsdb);
+ UNLOCK_MUTEX (&ebsdb->priv->lock);
if (ret == -1) {
g_set_error (