aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--README9
-rw-r--r--acconfig.h3
-rw-r--r--addressbook/ChangeLog6
-rw-r--r--addressbook/backend/pas/Makefile.am1
-rw-r--r--addressbook/backend/pas/pas-backend-file.c258
-rw-r--r--configure.in156
-rw-r--r--e-util/ChangeLog9
-rw-r--r--e-util/Makefile.am4
-rw-r--r--e-util/e-db3-utils.c185
-rw-r--r--e-util/e-db3-utils.h29
-rw-r--r--e-util/e-dbhash.c69
-rw-r--r--wombat/ChangeLog4
-rw-r--r--wombat/Makefile.am8
14 files changed, 627 insertions, 125 deletions
diff --git a/ChangeLog b/ChangeLog
index dcd2621652..9f3269408f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2001-05-31 Christopher James Lahey <clahey@ximian.com>
+ * README: Included information about db3.
+
+ * acconfig.h: Added HAVE_DB_H and HAVE_DB3_DB_H.
+
+ * configure.in: Added various checks for db3 libraries and
+ includes. Of note are the new configure options
+ --with-db3-includes=PREFIX and --with-db3-libs=PREFIX to specify
+ the location for your db3 library.
+
+2001-05-31 Christopher James Lahey <clahey@ximian.com>
+
* configure.in (GTKHTML_DATADIR): Use --moddatadir to derive this.
2001-05-30 Dan Winship <danw@ximian.com>
diff --git a/README b/README
index 21bf017d32..4401543b87 100644
--- a/README
+++ b/README
@@ -140,6 +140,15 @@ and -devel packages for each library.
- gtkhtml - later than 0.9.3
+ - Berkeley's libdb - 3.1.17
+
+ db3 is available from www.sleepycat.com. Make sure to get 3.1.17,
+ it isn't the newest version.
+
+ *** Note that db3 installs by default in /usr/local/BerkeleyDB.3.1
+ *** so you may need to specify evolution to look in this directory
+ *** for it. We will add a check for this directory later.
+
If you want support for PalmPilot syncing (currently experimental so
please back up your pilot) you will also need to do the following:
diff --git a/acconfig.h b/acconfig.h
index 4b6a2c2d6f..63f8f69d2a 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -24,6 +24,9 @@
#undef USE_FLOCK
#undef ENABLE_NNTP
+#undef HAVE_DB_H
+#undef HAVE_DB3_DB_H
+
/* Sub-version identification string. */
#undef SUB_VERSION
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index 6c47e2f67d..b12a636bb6 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,3 +1,9 @@
+2001-05-31 Christopher James Lahey <clahey@ximian.com>
+
+ * backend/pas/Makefile.am (INCLUDES): Added db3 cflags.
+
+ * backend/pas/pas-backend-file.c: Updated this to use db3.
+
2001-05-31 Federico Mena Quintero <federico@ximian.com>
* gui/widgets/e-addressbook-view.h (EAddressbookView): Added
diff --git a/addressbook/backend/pas/Makefile.am b/addressbook/backend/pas/Makefile.am
index 5ed8753a39..6d239689bf 100644
--- a/addressbook/backend/pas/Makefile.am
+++ b/addressbook/backend/pas/Makefile.am
@@ -13,6 +13,7 @@ $(CORBA_SOURCE): $(idls)
$(ORBIT_IDL) -I $(srcdir) $(srcdir)/../idl/addressbook.idl $(idl_flags)
INCLUDES = \
+ $(DB3_CFLAGS) \
-DGNOMELOCALEDIR=\""$(localedir)"\" \
-DG_LOG_DOMAIN=\"wombat-pas\" \
-I$(top_srcdir) \
diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c
index d5bf2c6410..0c0cd5c7db 100644
--- a/addressbook/backend/pas/pas-backend-file.c
+++ b/addressbook/backend/pas/pas-backend-file.c
@@ -13,14 +13,14 @@
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
-#ifdef HAVE_DB_185_H
-#include <db_185.h>
-#else
-#ifdef HAVE_DB1_DB_H
-#include <db1/db.h>
-#else
#include <db.h>
-#endif
+
+#include <e-util/e-db3-utils.h>
+
+#if DB_VERSION_MAJOR != 3 || \
+ DB_VERSION_MINOR != 1 || \
+ DB_VERSION_PATCH != 17
+#error Including wrong DB3. Need libdb 3.1.17.
#endif
#include <gtk/gtksignal.h>
@@ -32,6 +32,7 @@
#include <ebook/e-card-simple.h>
#include <e-util/e-sexp.h>
#include <e-util/e-dbhash.h>
+#include <e-util/e-db3-utils.h>
#include "pas-book.h"
#include "pas-card-cursor.h"
@@ -476,22 +477,32 @@ pas_backend_file_search (PASBackendFile *bf,
{
int db_error = 0;
GList *cards = NULL;
- gint card_count = 0, card_threshold = 20, card_threshold_max = 200;
+ gint card_count = 0, card_threshold = 20, card_threshold_max = 1000;
DB *db = bf->priv->file_db;
+ DBC *dbc;
DBT id_dbt, vcard_dbt;
int i, file_version_name_len;
int esexp_error;
PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview;
+ gboolean search_needed;
if (!bf->priv->loaded)
return;
- pas_book_view_notify_status_message (view->book_view, "Searching...");
+ search_needed = TRUE;
+
+ if ( ! strcmp (view->search, "(contains \"x-evolution-any-field\" \"\")"))
+ search_needed = FALSE;
+
+ if (search_needed)
+ pas_book_view_notify_status_message (view->book_view, "Searching...");
+ else
+ pas_book_view_notify_status_message (view->book_view, "Loading...");
if (view->search_sexp)
e_sexp_unref(view->search_sexp);
view->search_sexp = e_sexp_new();
-
+
for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
if (symbols[i].type == 1) {
e_sexp_add_ifunction(view->search_sexp, 0, symbols[i].name,
@@ -505,8 +516,6 @@ pas_backend_file_search (PASBackendFile *bf,
e_sexp_input_text(view->search_sexp, view->search, strlen(view->search));
esexp_error = e_sexp_parse(view->search_sexp);
- file_version_name_len = strlen (PAS_BACKEND_FILE_VERSION_NAME);
-
if (esexp_error == -1) {
/* need a different error message here. */
pas_book_view_notify_complete (view->book_view);
@@ -514,43 +523,56 @@ pas_backend_file_search (PASBackendFile *bf,
return;
}
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
+ file_version_name_len = strlen (PAS_BACKEND_FILE_VERSION_NAME);
+
+ db_error = db->cursor (db, NULL, &dbc, 0);
+
+ memset (&id_dbt, 0, sizeof (id_dbt));
+ memset (&vcard_dbt, 0, sizeof (vcard_dbt));
+
+ if (db_error != 0) {
+ g_warning ("pas_backend_file_search: error building list\n");
+ } else {
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_FIRST);
+
+ while (db_error == 0) {
- while (db_error == 0) {
+ /* don't include the version in the list of cards */
+ if (id_dbt.size != file_version_name_len+1
+ || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
+ char *vcard_string = vcard_dbt.data;
- /* don't include the version in the list of cards */
- if (id_dbt.size != file_version_name_len+1
- || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
- char *vcard_string = vcard_dbt.data;
+ /* check if the vcard matches the search sexp */
+ if ((!search_needed) || vcard_matches_search (view, vcard_string)) {
+ cards = g_list_prepend (cards, g_strdup (vcard_string));
+ }
- /* check if the vcard matches the search sexp */
- if (vcard_matches_search (view, vcard_string)) {
- cards = g_list_prepend (cards, g_strdup (vcard_string));
- ++card_count;
+ card_count ++;
- /* If we've accumulated a number of matches, pass them off to the client. */
- if (card_count > card_threshold) {
+ /* If we've accumulated a number of checks, pass them off to the client. */
+ if (card_count >= card_threshold) {
+ cards = g_list_reverse (cards);
pas_book_view_notify_add (view->book_view, cards);
- /* Clean up the handed-off data. */
+ /* Clean up the handed-off data. */
g_list_foreach (cards, (GFunc)g_free, NULL);
g_list_free (cards);
cards = NULL;
card_count = 0;
- /* Yeah, this scheme is over-complicated. But I like it. */
- if (card_threshold <= card_threshold_max) {
+ /* Yeah, this scheme is over-complicated. But I like it. */
+ if (card_threshold < card_threshold_max) {
card_threshold = MIN (2*card_threshold, card_threshold_max);
}
}
-
}
+
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT);
}
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
- }
+ dbc->c_close (dbc);
- if (db_error == -1) {
- g_warning ("pas_backend_file_search: error building list\n");
+ if (db_error != DB_NOTFOUND) {
+ g_warning ("pas_backend_file_search: error building list\n");
+ }
}
if (card_count)
@@ -575,7 +597,7 @@ pas_backend_file_changes_foreach_key (const char *key, gpointer user_data)
int db_error = 0;
string_to_dbt (key, &id_dbt);
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
if (db_error == 1) {
char *id = id_dbt.data;
@@ -595,6 +617,7 @@ pas_backend_file_changes (PASBackendFile *bf,
EDbHash *ehash;
GList *i, *v;
DB *db = bf->priv->file_db;
+ DBC *dbc;
PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview;
PASBackendFileChangeContext *ctx = cnstview->change_context;
@@ -606,32 +629,39 @@ pas_backend_file_changes (PASBackendFile *bf,
ehash = e_dbhash_new (filename);
g_free (filename);
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
-
- while (db_error == 0) {
-
- /* don't include the version in the list of cards */
- if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1
- || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
- char *id = id_dbt.data;
- char *vcard_string = vcard_dbt.data;
-
- /* check what type of change has occurred, if any */
- switch (e_dbhash_compare (ehash, id, vcard_string)) {
- case E_DBHASH_STATUS_SAME:
- break;
- case E_DBHASH_STATUS_NOT_FOUND:
- ctx->add_cards = g_list_append (ctx->add_cards, strdup(vcard_string));
- ctx->add_ids = g_list_append (ctx->add_ids, strdup(id));
- break;
- case E_DBHASH_STATUS_DIFFERENT:
- ctx->mod_cards = g_list_append (ctx->mod_cards, strdup(vcard_string));
- ctx->mod_ids = g_list_append (ctx->mod_ids, strdup(id));
- break;
+ db_error = db->cursor (db, NULL, &dbc, 0);
+
+ if (db_error != 0) {
+ g_warning ("pas_backend_file_changes: error building list\n");
+ } else {
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_FIRST);
+
+ while (db_error == 0) {
+
+ /* don't include the version in the list of cards */
+ if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1
+ || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) {
+ char *id = id_dbt.data;
+ char *vcard_string = vcard_dbt.data;
+
+ /* check what type of change has occurred, if any */
+ switch (e_dbhash_compare (ehash, id, vcard_string)) {
+ case E_DBHASH_STATUS_SAME:
+ break;
+ case E_DBHASH_STATUS_NOT_FOUND:
+ ctx->add_cards = g_list_append (ctx->add_cards, strdup(vcard_string));
+ ctx->add_ids = g_list_append (ctx->add_ids, strdup(id));
+ break;
+ case E_DBHASH_STATUS_DIFFERENT:
+ ctx->mod_cards = g_list_append (ctx->mod_cards, strdup(vcard_string));
+ ctx->mod_ids = g_list_append (ctx->mod_ids, strdup(id));
+ break;
+ }
}
+
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT);
}
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
+ dbc->c_close (dbc);
}
e_dbhash_foreach_key (ehash, (EDbHashFunc)pas_backend_file_changes_foreach_key, view->change_context);
@@ -650,13 +680,13 @@ pas_backend_file_changes (PASBackendFile *bf,
for (i = ctx->del_ids; i != NULL; i = i->next){
char *id = i->data;
e_dbhash_remove (ehash, id);
- }
+ }
e_dbhash_write (ehash);
e_dbhash_destroy (ehash);
/* Send the changes */
- if (db_error == -1) {
+ if (db_error != DB_NOTFOUND) {
g_warning ("pas_backend_file_changes: error building list\n");
} else {
if (ctx->add_cards != NULL)
@@ -698,7 +728,7 @@ do_create(PASBackend *backend,
string_to_dbt (vcard, &vcard_dbt);
- db_error = db->put (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->put (db, NULL, &id_dbt, &vcard_dbt, 0);
if (0 == db_error) {
db_error = db->sync (db, 0);
@@ -776,7 +806,7 @@ pas_backend_file_process_remove_card (PASBackend *backend,
string_to_dbt (req->id, &id_dbt);
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
if (0 != db_error) {
pas_book_respond_remove (
book,
@@ -785,7 +815,7 @@ pas_backend_file_process_remove_card (PASBackend *backend,
return;
}
- db_error = db->del (db, &id_dbt, 0);
+ db_error = db->del (db, NULL, &id_dbt, 0);
if (0 != db_error) {
pas_book_respond_remove (
book,
@@ -837,7 +867,7 @@ pas_backend_file_process_modify_card (PASBackend *backend,
string_to_dbt (id, &id_dbt);
/* get the old ecard - the one that's presently in the db */
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
if (0 != db_error) {
pas_book_respond_modify (
book,
@@ -849,7 +879,7 @@ pas_backend_file_process_modify_card (PASBackend *backend,
string_to_dbt (req->vcard, &vcard_dbt);
- db_error = db->put (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->put (db, NULL, &id_dbt, &vcard_dbt, 0);
if (0 == db_error) {
db_error = db->sync (db, 0);
@@ -901,12 +931,19 @@ pas_backend_file_build_all_cards_list(PASBackend *backend,
{
PASBackendFile *bf = PAS_BACKEND_FILE (backend);
DB *db = bf->priv->file_db;
+ DBC *dbc;
int db_error;
DBT id_dbt, vcard_dbt;
cursor_data->elements = NULL;
-
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST);
+
+ db_error = db->cursor (db, NULL, &dbc, 0);
+
+ if (db_error != 0) {
+ g_warning ("pas_backend_file_build_all_cards_list: error building list\n");
+ }
+
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_FIRST);
while (db_error == 0) {
@@ -919,11 +956,11 @@ pas_backend_file_build_all_cards_list(PASBackend *backend,
}
- db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT);
+ db_error = dbc->c_get(dbc, &id_dbt, &vcard_dbt, DB_NEXT);
}
- if (db_error == -1) {
+ if (db_error != DB_NOTFOUND) {
g_warning ("pas_backend_file_build_all_cards_list: error building list\n");
}
else {
@@ -1254,7 +1291,7 @@ pas_backend_file_get_vcard (PASBook *book, const char *id)
string_to_dbt (id, &id_dbt);
- db_error = db->get (db, &id_dbt, &vcard_dbt, 0);
+ db_error = db->get (db, NULL, &id_dbt, &vcard_dbt, 0);
if (db_error == 0) {
/* success */
return g_strdup (vcard_dbt.data);
@@ -1281,7 +1318,7 @@ pas_backend_file_upgrade_db (PASBackendFile *bf, char *old_version)
string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt);
string_to_dbt (PAS_BACKEND_FILE_VERSION, &version_dbt);
- db_error = db->put (db, &version_name_dbt, &version_dbt, 0);
+ db_error = db->put (db, NULL, &version_name_dbt, &version_dbt, 0);
if (db_error == 0)
return TRUE;
else
@@ -1305,7 +1342,7 @@ pas_backend_file_maybe_upgrade_db (PASBackendFile *bf)
string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt);
- db_error = db->get (db, &version_name_dbt, &version_dbt, 0);
+ db_error = db->get (db, NULL, &version_name_dbt, &version_dbt, 0);
if (db_error == 0) {
/* success */
version = g_strdup (version_dbt.data);
@@ -1323,6 +1360,7 @@ pas_backend_file_maybe_upgrade_db (PASBackendFile *bf)
return ret_val;
}
+
#define INITIAL_VCARD "BEGIN:VCARD\n\
X-EVOLUTION-FILE-AS:Ximian, Inc.\n\
LABEL;WORK;QUOTED-PRINTABLE:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA\n\
@@ -1340,26 +1378,53 @@ pas_backend_file_load_uri (PASBackend *backend,
{
PASBackendFile *bf = PAS_BACKEND_FILE (backend);
char *filename;
- gboolean writable = FALSE;
+ gboolean writable = FALSE;
GList *l;
+ int db_error;
+ DB *db;
+ int major, minor, patch;
g_assert (bf->priv->loaded == FALSE);
+ db_version (&major, &minor, &patch);
+
+ if (major != 3 ||
+ minor != 1 ||
+ patch != 17) {
+ g_warning ("Wrong version of libdb.");
+ return FALSE;
+ }
+
filename = pas_backend_file_extract_path_from_uri (uri);
- bf->priv->file_db = dbopen (filename, O_RDWR, 0666, DB_HASH, NULL);
- if (bf->priv->file_db) {
- writable = TRUE;
+ db_error = e_db3_utils_maybe_recover (filename);
+ if (db_error != 0)
+ return FALSE;
+
+ db_error = db_create (&db, NULL, 0);
+ if (db_error != 0)
+ return FALSE;
+
+ db_error = db->open (db, filename, NULL, DB_HASH, 0, 0666);
+
+ if (db_error == DB_OLD_VERSION) {
+ db_error = e_db3_utils_upgrade_format (filename);
+
+ if (db_error != 0)
+ return FALSE;
+
+ db_error = db->open (db, filename, NULL, DB_HASH, 0, 0666);
}
- else {
- /* try to open the file read-only */
- bf->priv->file_db = dbopen (filename, O_RDONLY, 0666, DB_HASH, NULL);
- if (!bf->priv->file_db) {
- /* lastly, try and create the file */
- bf->priv->file_db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL);
+ if (db_error == 0) {
+ writable = TRUE;
+ } else {
+ db_error = db->open (db, filename, NULL, DB_HASH, DB_RDONLY, 0666);
+
+ if (db_error != 0) {
+ db_error = db->open (db, filename, NULL, DB_HASH, DB_CREATE, 0666);
- if (bf->priv->file_db) {
+ if (db_error == 0) {
char *create_initial_file;
char *dir;
@@ -1382,15 +1447,24 @@ pas_backend_file_load_uri (PASBackend *backend,
g_free (filename);
- if (bf->priv->file_db != NULL) {
- if (pas_backend_file_maybe_upgrade_db (bf))
- bf->priv->loaded = TRUE;
- /* XXX what if we fail to upgrade it? */
-
- g_free(bf->priv->uri);
- bf->priv->uri = g_strdup (uri);
- } else
+ if (db_error != 0) {
return FALSE;
+ }
+
+ bf->priv->writable = writable;
+ bf->priv->file_db = db;
+
+ if (pas_backend_file_maybe_upgrade_db (bf))
+ bf->priv->loaded = TRUE;
+ else {
+ db->close (db, 0);
+ bf->priv->file_db = NULL;
+ bf->priv->writable = FALSE;
+ return FALSE;
+ }
+
+ g_free(bf->priv->uri);
+ bf->priv->uri = g_strdup (uri);
/* report the writable status of the book to all its clients */
for (l = bf->priv->clients; l; l = g_list_next (l)) {
@@ -1399,8 +1473,6 @@ pas_backend_file_load_uri (PASBackend *backend,
pas_book_report_writable (book, writable);
}
- bf->priv->writable = writable;
-
return TRUE;
}
diff --git a/configure.in b/configure.in
index 3304686ff0..652af381b2 100644
--- a/configure.in
+++ b/configure.in
@@ -206,12 +206,158 @@ fi
dnl **************************************************
dnl * pas-backend-file stuff.
-dnl * check for db_185.h. if it's there, we use it.
-dnl * otherwise, we use db.h (since it'll be 185).
-dnl * Except on RH7.0, which puts db in yet another place
+dnl * check for version 3.1.17 of db.h. First check
+dnl * in db.h, then in db3/db.h (For Red Hat Linux
+dnl * 7.0).
dnl **************************************************
-AC_CHECK_HEADERS(db_185.h)
-AC_CHECK_HEADERS(db1/db.h)
+
+AC_ARG_WITH(db3-includes, [ --with-db3-includes=PREFIX Location of db3 includes.],
+ with_db3_includes="$withval")
+
+DB3_CFLAGS=
+
+AC_CACHE_CHECK([for libdb3 version 3.1.17], ac_cv_db3_version_check,
+[
+ CPPFLAGS_save="$CPPFLAGS"
+ if test "x${with_db3_includes}" != "x"; then
+ CPPFLAGS="-I$with_db3_includes $CPPFLAGS"
+ fi
+
+ AC_TRY_COMPILE([
+ #include <db.h>
+ ],[
+ #if DB_VERSION_MAJOR != 3 || \
+ DB_VERSION_MINOR != 1 || \
+ DB_VERSION_PATCH != 17
+ #error
+ #endif
+ ], ac_cv_db3_version_check=yes, ac_cv_db3_version_check=no)
+
+ CPPFLAGS="$CPPFLAGS_save"
+])
+
+if test $ac_cv_db3_version_check = yes; then
+ AC_DEFINE(HAVE_DB_H)
+ if test "x${with_db3_includes}" != "x"; then
+ DB3_CFLAGS="-I$with_db3_includes"
+ fi
+else
+ AC_CACHE_CHECK([for libdb3 version 3.1.17 in db3/db.h], ac_cv_db3_db3_db_h_version_check,
+ [
+ CPPFLAGS_save="$CPPFLAGS"
+ if test "x${with_db3_includes}" != "x"; then
+ CPPFLAGS="-I$with_db3_includes $CPPFLAGS"
+ fi
+
+ AC_TRY_COMPILE([
+ #include <db3/db.h>
+ ],[
+ #if DB_VERSION_MAJOR != 3 || \
+ DB_VERSION_MINOR != 1 || \
+ DB_VERSION_PATCH != 17
+ #error
+ #endif
+ ], ac_cv_db3_db3_db_h_version_check=yes, ac_cv_db3_db3_db_h_version_check=no)
+
+ CPPFLAGS="$CPPFLAGS_save"
+ ])
+ if test $ac_cv_db3_db3_db_h_version_check = yes; then
+ AC_DEFINE(HAVE_DB3_DB_H)
+ if test "x${with_db3_includes}" != "x"; then
+ DB3_CFLAGS="-I$with_db3_includes"
+ fi
+ else
+ AC_ERROR(You must have libdb3 version 3.1.17 installed to compile evolution)
+ fi
+fi
+
+AC_SUBST(DB3_CFLAGS)
+
+
+AC_ARG_WITH(db3-libs, [ --with-db3-libs=PREFIX Location of db3 libs.],
+ with_db3_libs="$withval", with_db3_libs="/usr/lib/")
+
+DB3_LDADD=
+
+if test $ac_cv_db3_version_check = yes; then
+ HAVE_DB3_DB_H_INTERNAL=0
+else
+ HAVE_DB3_DB_H_INTERNAL=1
+fi
+
+AC_CACHE_CHECK([for -ldb 3.1.17], ac_cv_db3_lib_check,
+[
+ LIBS_save="$LIBS"
+ LIBS="$with_db3_libs/libdb.a $LIBS"
+ CPPFLAGS_save="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $DB3_CFLAGS"
+
+ AC_TRY_RUN([
+#if $HAVE_DB3_DB_H_INTERNAL
+#include <db3/db.h>
+#else
+#include <db.h>
+#endif
+int
+main (void)
+{
+ int major, minor, patch;
+ db_version (&major, &minor, &patch);
+ if (major == 3 &&
+ minor == 1 &&
+ patch == 17)
+ return 0;
+ else
+ return 1;
+}
+], ac_cv_db3_lib_check=yes, ac_cv_db3_lib_check=no)
+
+ LIBS="$LIBS_save"
+ CPPFLAGS="$CPPFLAGS_save"
+])
+
+if test $ac_cv_db3_lib_check = yes; then
+ DB3_LDADD="$with_db3_libs/libdb.a"
+else
+ AC_CACHE_CHECK([for -ldb3 3.1.17], ac_cv_db3_lib_db3_check,
+ [
+ LIBS_save="$LIBS"
+ LIBS="$with_db3_libs/libdb3.a $LIBS"
+ CPPFLAGS_save="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $DB3_CFLAGS"
+
+ AC_TRY_RUN([
+#if $HAVE_DB3_DB_H_INTERNAL
+#include <db3/db.h>
+#else
+#include <db.h>
+#endif
+int
+main (void)
+{
+ int major, minor, patch;
+ db_version (&major, &minor, &patch);
+ if (major == 3 &&
+ minor == 1 &&
+ patch == 17)
+ return 0;
+ else
+ return 1;
+}
+], ac_cv_db3_lib_db3_check=yes, ac_cv_db3_lib_db3_check=no)
+
+ LIBS="$LIBS_save"
+ CPPFLAGS="$CPPFLAGS_save"
+ ])
+
+ if test $ac_cv_db3_lib_db3_check = yes; then
+ DB3_LDADD="$with_db3_libs/libdb3.a"
+ else
+ AC_ERROR(Didn't find libdb 3.1.17 libraries. You must have libdb version 3.1.17 installed to compile evolution)
+ fi
+fi
+
+AC_SUBST(DB3_LDADD)
dnl **************************************************
dnl * ldap related stuff.
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index 8f350ea0f5..0084885485 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,12 @@
+2001-05-31 Christopher James Lahey <clahey@ximian.com>
+
+ * Makefile.am (INCLUDES): Added db3 cflags.
+
+ * e-dbhash.c: Made this use db3.
+
+ * e-db3-utils.c, e-db3-utils.h: New files with some helper
+ functions.
+
2001-05-27 Dan Winship <danw@ximian.com>
* e-gui-utils.c: Remove e_pixmaps_update (moved to libeshell) so
diff --git a/e-util/Makefile.am b/e-util/Makefile.am
index 822c766f43..4b901acd30 100644
--- a/e-util/Makefile.am
+++ b/e-util/Makefile.am
@@ -3,6 +3,7 @@ SUBDIRS = . ename
imagesdir = $(datadir)/images/evolution
INCLUDES = \
+ $(DB3_CFLAGS) \
-I$(top_srcdir) \
$(GNOME_INCLUDEDIR) \
$(EXTRA_GNOME_CFLAGS) \
@@ -44,6 +45,8 @@ libeutil_la_SOURCES = \
e-time-utils.h \
e-url.c \
e-url.h \
+ e-db3-utils.c \
+ e-db3-utils.h \
e-dbhash.c \
e-dbhash.h \
md5-utils.c \
@@ -52,6 +55,7 @@ libeutil_la_SOURCES = \
libeutil_la_LIBADD = $(GAL_LIBS)
libeutil_static_la_SOURCES = $(libeutil_la_SOURCES)
+libeutil_static_la_LIBADD = $(libeutil_la_LIBADD)
libeutil_static_la_LDFLAGS = --all-static
pilot_sources = \
diff --git a/e-util/e-db3-utils.c b/e-util/e-db3-utils.c
new file mode 100644
index 0000000000..c1da265453
--- /dev/null
+++ b/e-util/e-db3-utils.c
@@ -0,0 +1,185 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include "config.h"
+
+#include "e-db3-utils.h"
+
+#include <db.h>
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-util.h>
+
+#if DB_VERSION_MAJOR != 3 || \
+ DB_VERSION_MINOR != 1 || \
+ DB_VERSION_PATCH != 17
+#error Including wrong DB3. Need libdb 3.1.17.
+#endif
+
+static char *
+get_check_filename (const char *filename)
+{
+ return g_strdup_printf ("%s-upgrading", filename);
+}
+
+static char *
+get_copy_filename (const char *filename)
+{
+ return g_strdup_printf ("%s-copy", filename);
+}
+
+static int
+cp_file (const char *src, const char *dest)
+{
+ int i;
+ int o;
+ char buffer[1024];
+ int length;
+ int place;
+
+ i = open (src, O_RDONLY);
+ if (i == -1)
+ return -1;
+ o = creat (dest, S_IREAD | S_IWRITE);
+ if (o == -1) {
+ close (i);
+ return -1;
+ }
+ while (1) {
+ length = read (i, &buffer, sizeof (buffer));
+
+ if (length == 0)
+ break;
+
+ if (length == -1) {
+ if (errno == EINTR)
+ continue;
+ else {
+ close (i);
+ close (o);
+ unlink (dest);
+ return -1;
+ }
+ }
+
+ place = 0;
+ while (length != 0) {
+ int count;
+ count = write (o, buffer + place, length);
+ if (count == -1) {
+ if (errno == EINTR)
+ continue;
+ else {
+ close (i);
+ close (o);
+ unlink (dest);
+ return -1;
+ }
+ }
+
+ length -= count;
+ place += count;
+ }
+ }
+ if (close (i))
+ return -1;
+ if (close (o))
+ return -1;
+ return 0;
+}
+
+static int
+touch_file (const char *file)
+{
+ int o;
+ o = creat (file, S_IREAD | S_IWRITE);
+ if (o == -1)
+ return -1;
+
+ if (close (o) == -1)
+ return -1;
+
+ return 0;
+}
+
+static int
+resume_upgrade (const char *filename, const char *copy_filename, const char *check_filename)
+{
+ DB *db;
+ int ret_val;
+
+ ret_val = db_create (&db, NULL, 0);
+
+ if (ret_val == 0)
+ ret_val = cp_file (copy_filename, filename);
+
+ if (ret_val == 0)
+ ret_val = db->upgrade (db, filename, 0);
+
+ if (ret_val == 0)
+ ret_val = unlink (check_filename);
+ if (ret_val == 0)
+ ret_val = unlink (copy_filename);
+
+ db->close (db, 0);
+
+ return ret_val;
+}
+
+int
+e_db3_utils_maybe_recover (const char *filename)
+{
+ int ret_val = 0;
+ char *copy_filename;
+ char *check_filename;
+
+ copy_filename = get_copy_filename (filename);
+ check_filename = get_check_filename (filename);
+
+ if (g_file_exists (check_filename)) {
+ ret_val = resume_upgrade(filename, copy_filename, check_filename);
+ } else if (g_file_exists (copy_filename)) {
+ unlink (copy_filename);
+ }
+
+ g_free (copy_filename);
+ g_free (check_filename);
+ return ret_val;
+}
+
+int
+e_db3_utils_upgrade_format (const char *filename)
+{
+ char *copy_filename;
+ char *check_filename;
+ DB *db;
+ int ret_val;
+
+ ret_val = db_create (&db, NULL, 0);
+ if (ret_val != 0)
+ return ret_val;
+
+ copy_filename = get_copy_filename (filename);
+ check_filename = get_check_filename (filename);
+
+ ret_val = cp_file (filename, copy_filename);
+
+ if (ret_val == 0)
+ ret_val = touch_file (check_filename);
+ if (ret_val == 0)
+ ret_val = db->upgrade (db, filename, 0);
+ if (ret_val == 0)
+ ret_val = unlink (check_filename);
+
+ if (ret_val == 0)
+ ret_val = unlink (copy_filename);
+
+ db->close (db, 0);
+
+ g_free (check_filename);
+ g_free (copy_filename);
+ return ret_val;
+}
diff --git a/e-util/e-db3-utils.h b/e-util/e-db3-utils.h
new file mode 100644
index 0000000000..a574e59178
--- /dev/null
+++ b/e-util/e-db3-utils.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * db3 utils.
+ *
+ * Author:
+ * Chris Lahey <clahey@ximian.com>
+ *
+ * Copyright 2001, Ximian, Inc.
+ */
+
+#ifndef __E_DB3_UTILS_H__
+#define __E_DB3_UTILS_H__
+
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus */
+
+int e_db3_utils_maybe_recover (const char *filename);
+int e_db3_utils_upgrade_format (const char *filename);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* ! __E_DB3_UTILS_H__ */
+
diff --git a/e-util/e-dbhash.c b/e-util/e-dbhash.c
index e286500066..a61318e7ab 100644
--- a/e-util/e-dbhash.c
+++ b/e-util/e-dbhash.c
@@ -7,19 +7,19 @@
*/
#include <config.h>
+
+#include "e-dbhash.h"
+
#include <string.h>
#include <fcntl.h>
-#ifdef HAVE_DB_185_H
-#include <db_185.h>
-#else
-#ifdef HAVE_DB1_DB_H
-#include <db1/db.h>
-#else
#include <db.h>
-#endif
-#endif
#include "md5-utils.h"
-#include "e-dbhash.h"
+
+#if DB_VERSION_MAJOR != 3 || \
+ DB_VERSION_MINOR != 1 || \
+ DB_VERSION_PATCH != 17
+#error Including wrong DB3. Need libdb 3.1.17.
+#endif
struct _EDbHashPrivate
{
@@ -31,20 +31,37 @@ e_dbhash_new (const char *filename)
{
EDbHash *edbh;
DB *db;
+ int rv;
+
+ int major, minor, patch;
+
+ db_version (&major, &minor, &patch);
+
+ if (major != 3 ||
+ minor != 1 ||
+ patch != 17) {
+ g_warning ("Wrong version of libdb.");
+ return NULL;
+ }
/* Attempt to open the database */
- db = dbopen (filename, O_RDWR, 0666, DB_HASH, NULL);
- if (db == NULL) {
- db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL);
+ rv = db_create (&db, NULL, 0);
+ if (rv != 0) {
+ return NULL;
+ }
+
+ rv = db->open (db, filename, NULL, DB_HASH, 0, 0666);
+ if (rv != 0) {
+ rv = db->open (db, filename, NULL, DB_HASH, DB_CREATE, 0666);
- if (db == NULL)
+ if (rv != 0)
return NULL;
}
-
+
edbh = g_new (EDbHash, 1);
edbh->priv = g_new (EDbHashPrivate, 1);
edbh->priv->db = db;
-
+
return edbh;
}
@@ -86,7 +103,7 @@ e_dbhash_add (EDbHash *edbh, const gchar *key, const gchar *data)
md5_to_dbt (local_hash, &ddata);
/* Add to database */
- db->put (db, &dkey, &ddata, 0);
+ db->put (db, NULL, &dkey, &ddata, 0);
}
void
@@ -105,7 +122,7 @@ e_dbhash_remove (EDbHash *edbh, const char *key)
string_to_dbt (key, &dkey);
/* Remove from database */
- db->del (db, &dkey, 0);
+ db->del (db, NULL, &dkey, 0);
}
void
@@ -114,6 +131,7 @@ e_dbhash_foreach_key (EDbHash *edbh, EDbHashFunc func, gpointer user_data)
DB *db;
DBT dkey;
DBT ddata;
+ DBC *dbc;
int db_error = 0;
g_return_if_fail (edbh != NULL);
@@ -122,13 +140,20 @@ e_dbhash_foreach_key (EDbHash *edbh, EDbHashFunc func, gpointer user_data)
db = edbh->priv->db;
- db_error = db->seq(db, &dkey, &ddata, R_FIRST);
+ db_error = db->cursor (db, NULL, &dbc, 0);
+
+ if (db_error != 0) {
+ return;
+ }
+
+ db_error = dbc->c_get(dbc, &dkey, &ddata, DB_FIRST);
while (db_error == 0) {
(*func) ((const char *)dkey.data, user_data);
- db_error = db->seq(db, &dkey, &ddata, R_NEXT);
+ db_error = dbc->c_get(dbc, &dkey, &ddata, DB_NEXT);
}
+ dbc->c_close (dbc);
}
EDbHashStatus
@@ -151,7 +176,7 @@ e_dbhash_compare (EDbHash *edbh, const char *key, const char *compare_data)
/* Lookup in database */
memset (&ddata, 0, sizeof (DBT));
- db->get (db, &dkey, &ddata, 0);
+ db->get (db, NULL, &dkey, &ddata, 0);
/* Compare */
if (ddata.data) {
@@ -191,10 +216,8 @@ e_dbhash_destroy (EDbHash *edbh)
db = edbh->priv->db;
/* Close datbase */
- db->close (db);
+ db->close (db, 0);
g_free (edbh->priv);
g_free (edbh);
}
-
-
diff --git a/wombat/ChangeLog b/wombat/ChangeLog
index fda6fc5e00..f146e26b2f 100644
--- a/wombat/ChangeLog
+++ b/wombat/ChangeLog
@@ -1,3 +1,7 @@
+2001-05-31 Christopher James Lahey <clahey@ximian.com>
+
+ * Makefile.am (wombat_LDADD): Added db3 libs.
+
2001-04-03 Dietmar Maurer <dietmar@ximian.com>
* wombat-moniker.c (wombat_lookup_db): fix ref. counting problem
diff --git a/wombat/Makefile.am b/wombat/Makefile.am
index 0d0919613b..be6fb7fce8 100644
--- a/wombat/Makefile.am
+++ b/wombat/Makefile.am
@@ -22,8 +22,6 @@ wombat_SOURCES = \
wombat.c
wombat_LDADD = \
- $(EXTRA_GNOME_LIBS) \
- $(BONOBO_VFS_GNOME_LIBS) \
$(top_builddir)/addressbook/backend/pas/libpas.a \
$(top_builddir)/addressbook/backend/ebook/libebook.la \
$(top_builddir)/e-util/ename/libename.la \
@@ -32,7 +30,10 @@ wombat_LDADD = \
$(top_builddir)/libical/src/libical/libical.la \
$(top_builddir)/libversit/libversit.la \
$(top_builddir)/e-util/libeutil.la \
- $(LDAP_LIBS)
+ $(LDAP_LIBS) \
+ $(DB3_LDADD) \
+ $(EXTRA_GNOME_LIBS) \
+ $(BONOBO_VFS_GNOME_LIBS)
oafdir = $(datadir)/oaf
@@ -54,4 +55,3 @@ wombat.pure: wombat
$(PLINK) $(wombat_LDFLAGS) $(wombat_OBJECTS) $(wombat_LDADD) $(LIBS)
endif
-