/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* A class to cache address book conents on local file system * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * * Authors: Devashish Sharma */ /** * SECTION: e-book-backend-db-cache * @include: libedata-book/libedata-book.h * @short_description: A Berkeley DB cache facility for addressbooks * * This API is deprecated, use #EBookSqlite instead. */ #include "evolution-data-server-config.h" #include #include #include #include "e-book-backend-db-cache.h" #include "e-book-backend.h" #include "e-book-backend-sexp.h" static void string_to_dbt (const gchar *str, DBT *dbt) { memset (dbt, 0, sizeof (DBT)); dbt->data = (gpointer) str; dbt->size = strlen (str) + 1; dbt->flags = DB_DBT_USERMEM; } static gchar * get_filename_from_uri (const gchar *uri) { const gchar *user_cache_dir; gchar *mangled_uri, *filename; user_cache_dir = e_get_user_cache_dir (); /* Mangle the URI to not contain invalid characters. */ mangled_uri = g_strdelimit (g_strdup (uri), ":/", '_'); filename = g_build_filename ( user_cache_dir, "addressbook", mangled_uri, "cache.db", NULL); g_free (mangled_uri); return filename; } /** * e_book_backend_db_cache_set_filename: * @db: DB Handle * @filename: filename to be set * * Set the filename for db cacahe file. * * Deprecated: 3.12: Use #EBookSqlite instead **/ void e_book_backend_db_cache_set_filename (DB *db, const gchar *filename) { DBT uid_dbt, vcard_dbt; gint db_error; string_to_dbt ("filename", &uid_dbt); string_to_dbt (filename, &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_get_filename: * @db: DB Handle * * Get the filename for db cache file. * * Returns: The filename for db cache file. Free with g_free() * when done with it. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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 (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_with_uid ((const gchar *) vcard_dbt.data, uid); g_free (vcard_dbt.data); return contact; } /** * 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. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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_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. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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; } /** * 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. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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_contacts: * @db: DB Handle * @query: an s-expression * * Returns a list of #EContact elements from @cache matching @query. * When done with the list, the caller must unref the contacts and * free the list. * * Returns: A #GList of pointers to #EContact. * * Deprecated: 3.12: Use #EBookSqlite instead **/ GList * e_book_backend_db_cache_get_contacts (DB *db, const gchar *query) { DBC *dbc; DBT uid_dbt, vcard_dbt; gint db_error; GList *list = NULL; EBookBackendSExp *sexp = NULL; EContact *contact; if (query) { sexp = e_book_backend_sexp_new (query); if (!sexp) return NULL; } db_error = db->cursor (db, NULL, &dbc, 0); if (db_error != 0) { g_warning ("db->cursor failed with %d", db_error); if (sexp) g_object_unref (sexp); return NULL; } memset (&vcard_dbt, 0 , sizeof (vcard_dbt)); memset (&uid_dbt, 0, sizeof (uid_dbt)); db_error = dbc->c_get (dbc, &uid_dbt, &vcard_dbt, DB_FIRST); while (db_error == 0) { if (vcard_dbt.data && !strncmp (vcard_dbt.data, "BEGIN:VCARD", 11)) { contact = e_contact_new_from_vcard (vcard_dbt.data); if (!sexp || e_book_backend_sexp_match_contact (sexp, contact)) list = g_list_prepend (list, contact); else g_object_unref (contact); } db_error = dbc->c_get (dbc, &uid_dbt, &vcard_dbt, DB_NEXT); } db_error = dbc->c_close (dbc); if (db_error != 0) g_warning ("db->c_close failed with %d", db_error); if (sexp) g_object_unref (sexp); return g_list_reverse (list); } /** * e_book_backend_db_cache_search: * @db: DB handle * @query: an s-expression * * Returns an array of pointers to unique contact ID strings for contacts * in @cache matching @query. When done with the array, the caller must * free the ID strings and the array. * * Returns: A #GPtrArray of pointers to contact ID strings. * * Deprecated: 3.12: Use #EBookSqlite instead **/ GPtrArray * e_book_backend_db_cache_search (DB *db, const gchar *query) { GList *matching_contacts, *temp; GPtrArray *ptr_array; matching_contacts = e_book_backend_db_cache_get_contacts (db, query); ptr_array = g_ptr_array_new (); temp = matching_contacts; for (; matching_contacts != NULL; matching_contacts = g_list_next (matching_contacts)) { g_ptr_array_add (ptr_array, e_contact_get (matching_contacts->data, E_CONTACT_UID)); g_object_unref (matching_contacts->data); } g_list_free (temp); return ptr_array; } /** * e_book_backend_db_cache_exists: * @uri: URI for the cache * * Checks if an #EBookBackendCache exists at @uri. * * Returns: %TRUE if cache exists, %FALSE if not. * * Deprecated: 3.12: Use #EBookSqlite instead **/ gboolean e_book_backend_db_cache_exists (const gchar *uri) { gchar *file_name; gboolean exists = FALSE; file_name = get_filename_from_uri (uri); if (file_name && g_file_test (file_name, G_FILE_TEST_EXISTS)) exists = TRUE; g_free (file_name); return exists; } /** * 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. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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_is_populated: * @db: DB Handle * * Checks if @cache is populated. * * Returns: %TRUE if @cache is populated, %FALSE otherwise. * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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_book_backend_db_cache_set_time: * @db: A Berkeley DB handle * @t: The time in string format * * Since: 2.26 * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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_get_time: * @db: A Berkeley DB handle * * Since: 2.26 * * Deprecated: 3.12: Use #EBookSqlite instead **/ 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; }