/*
- * $Id: cnid_update.c,v 1.18 2002-01-21 04:06:41 jmarcus Exp $
+ * $Id: cnid_update.c,v 1.21 2003-06-06 21:22:45 srittau Exp $
*/
#ifdef HAVE_CONFIG_H
#include <atalk/adouble.h>
#include <atalk/cnid.h>
+#define use_make_cnid_data
#include "cnid_private.h"
+#ifdef CNID_DB_CDB
+ #define tid NULL
+#endif /* CNID_DB_CDB */
+
/* cnid_update: takes the given cnid and updates the metadata. To
* handle the did/name data, there are a bunch of functions to get
* and set the various fields. */
{
CNID_private *db;
DBT key, data, altdata;
+#ifndef CNID_DB_CDB
DB_TXN *tid;
+#endif /* CNID_DB_CDB */
int rc;
if (!(db = CNID) || !id || !st || !name || (db->flags & CNIDFLAG_DB_RO)) {
memset(&key, 0, sizeof(key));
memset(&altdata, 0, sizeof(altdata));
+#ifndef CNID_DB_CDB
retry:
if ((rc = txn_begin(db->dbenv, NULL, &tid, 0))) {
LOG(log_error, logtype_default, "cnid_update: Failed to begin transaction: %s", db_strerror(rc));
return rc;
}
+#endif /* CNID_DB_CDB */
/* Get the old info. */
key.data = (cnid_t *)&id;
key.size = sizeof(id);
memset(&data, 0, sizeof(data));
+#ifdef CNID_DB_CDB
+ if ((rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0))) {
+#else /* CNID_DB_CDB */
if ((rc = db->db_cnid->get(db->db_cnid, tid, &key, &data, DB_RMW))) {
txn_abort(tid);
+#endif /* CNID_DB_CDB */
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
goto retry;
+#endif /* CNID_DB_CDB */
case DB_NOTFOUND:
/* Silently fail here. We're allowed to do this since this CNID
* might have been deleted out from under us, or someone has
key.size = CNID_DEVINO_LEN;
if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
txn_abort(tid);
goto retry;
+#endif /* CNID_DB_CDB */
case DB_NOTFOUND:
break;
default:
+#ifndef CNID_DB_CDB
txn_abort(tid);
+#endif /* CNID_DB_CDB */
goto update_err;
}
}
key.size = data.size - CNID_DEVINO_LEN;
if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
txn_abort(tid);
goto retry;
+#endif /* CNID_DB_CDB */
case DB_NOTFOUND:
break;
default:
+#ifndef CNID_DB_CDB
txn_abort(tid);
+#endif /* CNID_DB_CDB */
goto update_err;
}
}
key.data = (cnid_t *) &id;
key.size = sizeof(id);
if ((rc = db->db_cnid->put(db->db_cnid, tid, &key, &data, 0))) {
+#ifndef CNID_DB_CDB
txn_abort(tid);
+#endif /* CNID_DB_CDB */
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
goto retry;
+#endif /* CNID_DB_CDB */
default:
goto update_err;
}
altdata.data = (cnid_t *) &id;
altdata.size = sizeof(id);
if ((rc = db->db_devino->put(db->db_devino, tid, &key, &altdata, 0))) {
+#ifndef CNID_DB_CDB
txn_abort(tid);
+#endif /* CNID_DB_CDB */
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
goto retry;
+#endif /* CNID_DB_CDB */
default:
goto update_err;
}
key.data = (char *) data.data + CNID_DEVINO_LEN;
key.size = data.size - CNID_DEVINO_LEN;
if ((rc = db->db_didname->put(db->db_didname, tid, &key, &altdata, 0))) {
+#ifndef CNID_DB_CDB
txn_abort(tid);
+#endif /* CNID_DB_CDB */
switch (rc) {
+#ifndef CNID_DB_CDB
case DB_LOCK_DEADLOCK:
goto retry;
+#endif /* CNID_DB_CDB */
default:
goto update_err;
}
}
+#ifdef CNID_DB_CDB
+ return 0;
+#else /* CNID_DB_CDB */
return txn_commit(tid, 0);
+#endif /* CNID_DB_CDB */
update_err:
LOG(log_error, logtype_default, "cnid_update: Unable to update CNID %u: %s",