return module->ops->search_bytree(module, base, scope, tree, attrs, res);
}
+/*
+ check for an error return from an op
+ if an op fails, but has not setup an error string, then setup one now
+*/
+static int ldb_op_finish(struct ldb_context *ldb, int status)
+{
+ if (status == LDB_SUCCESS) {
+ return ldb_transaction_commit(ldb);
+ }
+ if (ldb->err_string == NULL) {
+ /* no error string was setup by the backend */
+ ldb_set_errstring(ldb->modules,
+ talloc_asprintf(ldb, "ldb error %d", status));
+ }
+ ldb_transaction_cancel(ldb);
+ return status;
+}
+
/*
add a record to the database. Will fail if a record with the given class and key
already exists
if (status != LDB_SUCCESS) return status;
status = module->ops->add_record(module, message);
- if (status != LDB_SUCCESS) {
- ldb_transaction_cancel(ldb);
- return status;
- }
- return ldb_transaction_commit(ldb);
+ return ldb_op_finish(ldb, status);
}
return module->ops->add_record(module, message);
if (status != LDB_SUCCESS) return status;
status = module->ops->modify_record(module, message);
- if (status != LDB_SUCCESS) {
- ldb_transaction_cancel(ldb);
- return status;
- }
- return ldb_transaction_commit(ldb);
+ return ldb_op_finish(ldb, status);
}
return module->ops->modify_record(module, message);
if (status != LDB_SUCCESS) return status;
status = module->ops->delete_record(module, dn);
- if (status != LDB_SUCCESS) {
- ldb_transaction_cancel(ldb);
- return status;
- }
- return ldb_transaction_commit(ldb);
+ return ldb_op_finish(ldb, status);
}
return module->ops->delete_record(module, dn);
if (status != LDB_SUCCESS) return status;
status = module->ops->rename_record(module, olddn, newdn);
- if (status != LDB_SUCCESS) {
- ldb_transaction_cancel(ldb);
- return status;
- }
- return ldb_transaction_commit(ldb);
+ return ldb_op_finish(ldb, status);
}
return module->ops->rename_record(module, olddn, newdn);
#include "ldb/include/ldb_private.h"
#include "ldb/ldb_tdb/ldb_tdb.h"
+
+/*
+ map a tdb error code to a ldb error code
+*/
+static int ltdb_err_map(enum TDB_ERROR tdb_code)
+{
+ switch (tdb_code) {
+ case TDB_SUCCESS:
+ return LDB_SUCCESS;
+ case TDB_ERR_CORRUPT:
+ case TDB_ERR_OOM:
+ case TDB_ERR_EINVAL:
+ return LDB_ERR_OPERATIONS_ERROR;
+ case TDB_ERR_IO:
+ return LDB_ERR_PROTOCOL_ERROR;
+ case TDB_ERR_LOCK:
+ case TDB_ERR_NOLOCK:
+ return LDB_ERR_BUSY;
+ case TDB_ERR_LOCK_TIMEOUT:
+ return LDB_ERR_TIME_LIMIT_EXCEEDED;
+ case TDB_ERR_EXISTS:
+ return LDB_ERR_ENTRY_ALREADY_EXISTS;
+ case TDB_ERR_NOEXIST:
+ return LDB_ERR_NO_SUCH_OBJECT;
+ case TDB_ERR_RDONLY:
+ return LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS;
+ }
+ return LDB_ERR_OTHER;
+}
+
+
/*
form a TDB_DATA for a record key
caller frees
ret = tdb_store(ltdb->tdb, tdb_key, tdb_data, flgs);
if (ret == -1) {
- ret = LDB_ERR_OTHER;
+ ret = ltdb_err_map(tdb_error(ltdb->tdb));
goto done;
}
ret = tdb_delete(ltdb->tdb, tdb_key);
talloc_free(tdb_key.dptr);
- if (ret != 0) ret = LDB_ERR_OTHER;
+ if (ret != 0) {
+ ret = ltdb_err_map(tdb_error(ltdb->tdb));
+ }
return ret;
}
tdb_data = tdb_fetch(ltdb->tdb, tdb_key);
if (!tdb_data.dptr) {
talloc_free(tdb_key.dptr);
- return LDB_ERR_OTHER;
+ return ltdb_err_map(tdb_error(ltdb->tdb));
}
msg2 = talloc(tdb_key.dptr, struct ldb_message);
struct ltdb_private *ltdb = module->private_data;
if (tdb_transaction_start(ltdb->tdb) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
+ return ltdb_err_map(tdb_error(ltdb->tdb));
}
return LDB_SUCCESS;
struct ltdb_private *ltdb = module->private_data;
if (tdb_transaction_commit(ltdb->tdb) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
+ return ltdb_err_map(tdb_error(ltdb->tdb));
}
return LDB_SUCCESS;
struct ltdb_private *ltdb = module->private_data;
if (tdb_transaction_cancel(ltdb->tdb) != 0) {
- return LDB_ERR_OPERATIONS_ERROR;
+ return ltdb_err_map(tdb_error(ltdb->tdb));
}
return LDB_SUCCESS;