2
* $Id: cnid_db3_delete.c,v 1.1.4.2 2003/10/21 16:23:54 didg Exp $
4
* Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
5
* All Rights Reserved. See COPYRIGHT.
7
* cnid_delete: delete a CNID from the database
12
#endif /* HAVE_CONFIG_H */
14
#ifdef CNID_BACKEND_DB3
19
#include <atalk/logger.h>
26
#include <netatalk/endian.h>
27
#include <atalk/adouble.h>
30
#include "cnid_db3_private.h"
32
int cnid_db3_delete(struct _cnid_db *cdb, const cnid_t id) {
38
if (!cdb || !(db = cdb->_private) || !id || (db->flags & CNIDFLAG_DB_RO)) {
42
memset(&key, 0, sizeof(key));
43
memset(&data, 0, sizeof(data));
45
/* Get from ain CNID database. */
46
key.data = (cnid_t *)&id;
47
key.size = sizeof(id);
49
rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0);
54
case DB_LOCK_DEADLOCK:
58
LOG(log_info, logtype_default, "cnid_delete: CNID %u not in database",
63
LOG(log_error, logtype_default, "cnid_delete: Unable to delete entry: %s",
70
if ((rc = db3_txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
71
LOG(log_error, logtype_default, "cnid_delete: Failed to begin transaction: %s",
76
/* Now delete from the main CNID database. */
77
key.data = (cnid_t *)&id;
78
key.size = sizeof(id);
79
if ((rc = db->db_cnid->del(db->db_cnid, tid, &key, 0))) {
81
if ((ret = db3_txn_abort(tid)) != 0) {
82
LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s", db_strerror(ret));
86
case DB_LOCK_DEADLOCK:
93
/* Now delete from dev/ino database. */
95
key.size = CNID_DEVINO_LEN;
96
if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
98
case DB_LOCK_DEADLOCK:
99
if ((rc = db3_txn_abort(tid)) != 0) {
100
LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
106
/* Quietly fall through if the entry isn't found. */
109
if ((rc = db3_txn_abort(tid)) != 0) {
110
LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
118
/* Get data from the did/name database.
119
* TODO Also handle did/macname, did/shortname, and did/longname. */
120
key.data = (char *)data.data + CNID_DEVINO_LEN;
121
key.size = data.size - CNID_DEVINO_LEN;
122
if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
124
case DB_LOCK_DEADLOCK:
125
if ((rc = db3_txn_abort(tid)) != 0) {
126
LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
134
if ((rc = db3_txn_abort(tid)) != 0) {
135
LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
144
LOG(log_info, logtype_default, "cnid_delete: Deleting CNID %u", ntohl(id));
146
if ((rc = db3_txn_commit(tid, 0)) != 0) {
147
LOG(log_error, logtype_default, "cnid_delete: Failed to commit transaction: %s",
154
LOG(log_error, logtype_default, "cnid_delete: Unable to delete CNID %u: %s",
155
ntohl(id), db_strerror(rc));
159
#endif /* CNID_BACKEND_DB3 */