Files
evolution/e-util/e-dbhash.c
Christopher James Lahey 8f183d269e Included information about db3.
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.

From addressbook/ChangeLog:

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.

From e-util/ChangeLog:

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.

From wombat/ChangeLog:

2001-05-31  Christopher James Lahey  <clahey@ximian.com>

	* Makefile.am (wombat_LDADD): Added db3 libs.

svn path=/trunk/; revision=10077
2001-06-01 01:02:12 +00:00

224 lines
3.9 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Author:
* JP Rosevear (jpr@helixcode.com)
*
* Copyright 2000, Helix Code, Inc.
*/
#include <config.h>
#include "e-dbhash.h"
#include <string.h>
#include <fcntl.h>
#include <db.h>
#include "md5-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
struct _EDbHashPrivate
{
DB *db;
};
EDbHash *
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 */
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 (rv != 0)
return NULL;
}
edbh = g_new (EDbHash, 1);
edbh->priv = g_new (EDbHashPrivate, 1);
edbh->priv->db = db;
return edbh;
}
static void
string_to_dbt(const char *str, DBT *dbt)
{
dbt->data = (void*)str;
dbt->size = strlen (str) + 1;
}
static void
md5_to_dbt(const char str[16], DBT *dbt)
{
dbt->data = (void*)str;
dbt->size = 16;
}
void
e_dbhash_add (EDbHash *edbh, const gchar *key, const gchar *data)
{
DB *db;
DBT dkey;
DBT ddata;
guchar local_hash[16];
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);
db = edbh->priv->db;
/* Key dbt */
string_to_dbt (key, &dkey);
/* Data dbt */
md5_get_digest (data, strlen (data), local_hash);
md5_to_dbt (local_hash, &ddata);
/* Add to database */
db->put (db, NULL, &dkey, &ddata, 0);
}
void
e_dbhash_remove (EDbHash *edbh, const char *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);
}
void
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);
g_return_if_fail (edbh->priv != NULL);
g_return_if_fail (func != NULL);
db = edbh->priv->db;
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 = dbc->c_get(dbc, &dkey, &ddata, DB_NEXT);
}
dbc->c_close (dbc);
}
EDbHashStatus
e_dbhash_compare (EDbHash *edbh, const char *key, const char *compare_data)
{
DB *db;
DBT dkey;
DBT ddata;
guchar compare_hash[16];
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) {
md5_get_digest (compare_data, strlen (compare_data), compare_hash);
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;
}
void
e_dbhash_write (EDbHash *edbh)
{
DB *db;
g_return_if_fail (edbh != NULL);
g_return_if_fail (edbh->priv != NULL);
db = edbh->priv->db;
/* Flush database to disk */
db->sync (db, 0);
}
void
e_dbhash_destroy (EDbHash *edbh)
{
DB *db;
g_return_if_fail (edbh != NULL);
g_return_if_fail (edbh->priv != NULL);
db = edbh->priv->db;
/* Close datbase */
db->close (db, 0);
g_free (edbh->priv);
g_free (edbh);
}