2 * $Id: cnid_db3_delete.c,v 1.1.4.1 2003-09-09 16:42:21 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>
22 #include <netatalk/endian.h>
23 #include <atalk/adouble.h>
26 #include "cnid_db3_private.h"
28 int cnid_db3_delete(struct _cnid_db *cdb, const cnid_t id) {
34 if (!cdb || !(db = cdb->_private) || !id || (db->flags & CNIDFLAG_DB_RO)) {
38 memset(&key, 0, sizeof(key));
39 memset(&data, 0, sizeof(data));
41 /* Get from ain CNID database. */
42 key.data = (cnid_t *)&id;
43 key.size = sizeof(id);
45 rc = db->db_cnid->get(db->db_cnid, NULL, &key, &data, 0);
50 case DB_LOCK_DEADLOCK:
54 LOG(log_info, logtype_default, "cnid_delete: CNID %u not in database",
59 LOG(log_error, logtype_default, "cnid_delete: Unable to delete entry: %s",
66 if ((rc = db3_txn_begin(db->dbenv, NULL, &tid, 0)) != 0) {
67 LOG(log_error, logtype_default, "cnid_delete: Failed to begin transaction: %s",
72 /* Now delete from the main CNID database. */
73 key.data = (cnid_t *)&id;
74 key.size = sizeof(id);
75 if ((rc = db->db_cnid->del(db->db_cnid, tid, &key, 0))) {
77 if ((ret = db3_txn_abort(tid)) != 0) {
78 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s", db_strerror(ret));
82 case DB_LOCK_DEADLOCK:
89 /* Now delete from dev/ino database. */
91 key.size = CNID_DEVINO_LEN;
92 if ((rc = db->db_devino->del(db->db_devino, tid, &key, 0))) {
94 case DB_LOCK_DEADLOCK:
95 if ((rc = db3_txn_abort(tid)) != 0) {
96 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
102 /* Quietly fall through if the entry isn't found. */
105 if ((rc = db3_txn_abort(tid)) != 0) {
106 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
114 /* Get data from the did/name database.
115 * TODO Also handle did/macname, did/shortname, and did/longname. */
116 key.data = (char *)data.data + CNID_DEVINO_LEN;
117 key.size = data.size - CNID_DEVINO_LEN;
118 if ((rc = db->db_didname->del(db->db_didname, tid, &key, 0))) {
120 case DB_LOCK_DEADLOCK:
121 if ((rc = db3_txn_abort(tid)) != 0) {
122 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
130 if ((rc = db3_txn_abort(tid)) != 0) {
131 LOG(log_error, logtype_default, "cnid_delete: txn_abort: %s",
140 LOG(log_info, logtype_default, "cnid_delete: Deleting CNID %u", ntohl(id));
142 if ((rc = db3_txn_commit(tid, 0)) != 0) {
143 LOG(log_error, logtype_default, "cnid_delete: Failed to commit transaction: %s",
150 LOG(log_error, logtype_default, "cnid_delete: Unable to delete CNID %u: %s",
151 ntohl(id), db_strerror(rc));
155 #endif /* CNID_BACKEND_DB3 */