/** * e_book_backend_db_cache_add_contact: * @db: DB Handle * @contact: an #EContact * * Adds @contact to @cache. * * Returns: %TRUE if the contact was cached successfully, %FALSE otherwise. **/ gboolean e_book_backend_db_cache_add_contact (DB *db, EContact *contact) { DBT uid_dbt, vcard_dbt; gint db_error; gchar *vcard_str; const gchar *uid; uid = e_contact_get_const (contact, E_CONTACT_UID); if (!uid) { printf ("no uid\n"); printf ( "name:%s, email:%s\n", (gchar *) e_contact_get (contact, E_CONTACT_GIVEN_NAME), (gchar *) e_contact_get (contact, E_CONTACT_EMAIL_1)); return FALSE; } string_to_dbt (uid, &uid_dbt); vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); string_to_dbt (vcard_str, &vcard_dbt); /* db_error = db->del (db, NULL, &uid_dbt, 0); */ db_error = db->put (db, NULL, &uid_dbt, &vcard_dbt, 0); g_free (vcard_str); if (db_error != 0) { g_warning ("db->put failed with %d", db_error); return FALSE; } else return TRUE; }
/** * e_book_backend_db_cache_set_populated: * @db: DB handle * * Flags @cache as being populated - that is, it is up-to-date on the * contents of the book it's caching. **/ void e_book_backend_db_cache_set_populated (DB *db) { DBT uid_dbt, vcard_dbt; gint db_error; string_to_dbt ("populated", &uid_dbt); string_to_dbt ("TRUE", &vcard_dbt); db_error = db->put (db, NULL, &uid_dbt, &vcard_dbt, 0); if (db_error != 0) { g_warning ("db->put failed with %d", db_error); } }
/** * e_book_backend_db_cache_set_time: * * Since: 2.26 **/ void e_book_backend_db_cache_set_time (DB *db, const gchar *t) { DBT uid_dbt, vcard_dbt; gint db_error; string_to_dbt ("last_update_time", &uid_dbt); string_to_dbt (t, &vcard_dbt); db_error = db->put (db, NULL, &uid_dbt, &vcard_dbt, 0); if (db_error != 0) { g_warning ("db->put failed with %d", db_error); } }
/** * e_book_backend_db_cache_is_populated: * @db: DB Handle * * Checks if @cache is populated. * * Returns: %TRUE if @cache is populated, %FALSE otherwise. **/ gboolean e_book_backend_db_cache_is_populated (DB *db) { DBT uid_dbt, vcard_dbt; gint db_error; string_to_dbt ("populated", &uid_dbt); memset (&vcard_dbt, 0, sizeof (vcard_dbt)); vcard_dbt.flags = DB_DBT_MALLOC; db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0); if (db_error != 0) { return FALSE; } else { free (vcard_dbt.data); return TRUE; } }
/** * e_dbhash_remove: * @edbh: an #EDbHash * @key: a database key * * Removes the database object corresponding to @key. **/ void e_dbhash_remove (EDbHash *edbh, const gchar *key) { DB *db; DBT dkey; g_return_if_fail (edbh != NULL); g_return_if_fail (edbh->priv != NULL); g_return_if_fail (key != NULL); db = edbh->priv->db; /* Key dbt */ string_to_dbt (key, &dkey); /* Remove from database */ db->del (db, NULL, &dkey, 0); }
/** * e_dbhash_compare: * @edbh: an #EDbHash * @key: a database key * @compare_data: data to compare against the database * * Compares @compare_data to the database object corresponding to * @key using an MD5 checksum. Returns #E_DBHASH_STATUS_SAME if the * checksums match, #E_DBHASH_STATUS_DIFFERENT if the checksums differ, * or #E_DBHASH_STATUS_NOT_FOUND if @key is not present in the database. * * Returns: a checksum comparison status **/ EDbHashStatus e_dbhash_compare (EDbHash *edbh, const gchar *key, const gchar *compare_data) { DB *db; DBT dkey; DBT ddata; guint8 compare_hash[16]; gsize length = sizeof (compare_hash); g_return_val_if_fail (edbh != NULL, FALSE); g_return_val_if_fail (edbh->priv != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); g_return_val_if_fail (compare_hash != NULL, FALSE); db = edbh->priv->db; /* Key dbt */ string_to_dbt (key, &dkey); /* Lookup in database */ memset (&ddata, 0, sizeof (DBT)); db->get (db, NULL, &dkey, &ddata, 0); /* Compare */ if (ddata.data) { GChecksum *checksum; checksum = g_checksum_new (G_CHECKSUM_MD5); g_checksum_update (checksum, (guchar *) compare_data, -1); g_checksum_get_digest (checksum, compare_hash, &length); g_checksum_free (checksum); if (memcmp (ddata.data, compare_hash, sizeof (guchar) * 16)) return E_DBHASH_STATUS_DIFFERENT; } else { return E_DBHASH_STATUS_NOT_FOUND; } return E_DBHASH_STATUS_SAME; }
/** * e_book_backend_db_cache_check_contact: * @db: DB Handle * @uid: a unique contact ID * * Checks if the contact identified by @uid exists in @cache. * * Returns: %TRUE if the cache contains the contact, %FALSE otherwise. **/ gboolean e_book_backend_db_cache_check_contact (DB *db, const gchar *uid) { DBT uid_dbt, vcard_dbt; gint db_error; g_return_val_if_fail (uid != NULL, FALSE); string_to_dbt (uid, &uid_dbt); memset (&vcard_dbt, 0 , sizeof (vcard_dbt)); vcard_dbt.flags = DB_DBT_MALLOC; db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt,0); if (db_error != 0) return FALSE; else { free (vcard_dbt.data); return TRUE; } }
/** * e_book_backend_db_cache_get_time: * * Since: 2.26 **/ gchar * e_book_backend_db_cache_get_time (DB *db) { DBT uid_dbt, vcard_dbt; gint db_error; gchar *t = NULL; string_to_dbt ("last_update_time", &uid_dbt); memset (&vcard_dbt, 0, sizeof (vcard_dbt)); vcard_dbt.flags = DB_DBT_MALLOC; db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0); if (db_error != 0) { g_warning ("db->get failed with %d", db_error); } else { t = g_strdup (vcard_dbt.data); free (vcard_dbt.data); } return t; }
/** * e_book_backend_db_cache_remove_contact: * @db: DB Handle * @uid: a unique contact ID * * Removes the contact identified by @uid from @cache. * * Returns: %TRUE if the contact was found and removed, %FALSE otherwise. **/ gboolean e_book_backend_db_cache_remove_contact (DB *db, const gchar *uid) { DBT uid_dbt; gint db_error; g_return_val_if_fail (uid != NULL, FALSE); string_to_dbt (uid, &uid_dbt); db_error = db->del (db, NULL, &uid_dbt, 0); if (db_error != 0) { g_warning ("db->del failed with %d", db_error); return FALSE; } else return TRUE; }
gchar * e_book_backend_db_cache_get_filename (DB *db) { DBT uid_dbt, vcard_dbt; gint db_error; gchar *filename; string_to_dbt ("filename", &uid_dbt); memset (&vcard_dbt, 0 , sizeof (vcard_dbt)); vcard_dbt.flags = DB_DBT_MALLOC; db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt, 0); if (db_error != 0) { g_warning ("db-<get failed with %d", db_error); return NULL; } else { filename = g_strdup (vcard_dbt.data); g_free (vcard_dbt.data); return filename; } }
/** * e_dbhash_add: * @edbh: an #EDbHash * @key: a database key * @data: a database object for @key * * Adds a database object for @key. **/ void e_dbhash_add (EDbHash *edbh, const gchar *key, const gchar *data) { DB *db; DBT dkey; DBT ddata; GChecksum *checksum; guint8 *digest; gsize length; g_return_if_fail (edbh != NULL); g_return_if_fail (edbh->priv != NULL); g_return_if_fail (edbh->priv->db != NULL); g_return_if_fail (key != NULL); g_return_if_fail (data != NULL); length = g_checksum_type_get_length (G_CHECKSUM_MD5); digest = g_alloca (length); db = edbh->priv->db; /* Key dbt */ string_to_dbt (key, &dkey); /* Compute MD5 checksum */ checksum = g_checksum_new (G_CHECKSUM_MD5); g_checksum_update (checksum, (guchar *) data, -1); g_checksum_get_digest (checksum, digest, &length); g_checksum_free (checksum); /* Data dbt */ md5_to_dbt (digest, &ddata); /* Add to database */ db->put (db, NULL, &dkey, &ddata, 0); }
/** * e_book_backend_db_cache_get_contact: * @db: DB Handle * @uid: a unique contact ID * * Get a cached contact. Note that the returned #EContact will be * newly created, and must be unreffed by the caller when no longer * needed. * * Returns: A cached #EContact, or %NULL if @uid is not cached. **/ EContact * e_book_backend_db_cache_get_contact (DB *db, const gchar *uid) { DBT uid_dbt, vcard_dbt; gint db_error; EContact *contact = NULL; g_return_val_if_fail (uid != NULL, NULL); string_to_dbt (uid, &uid_dbt); memset (&vcard_dbt, 0 , sizeof (vcard_dbt)); vcard_dbt.flags = DB_DBT_MALLOC; db_error = db->get (db, NULL, &uid_dbt, &vcard_dbt,0); if (db_error != 0) { g_warning ("db->get failed with %d", db_error); return NULL; } contact = e_contact_new_from_vcard ((const gchar *)vcard_dbt.data); g_free (vcard_dbt.data); return contact; }