static int _tdb1_transaction_start(struct tdb_context *tdb)
{
/* some sanity checks */
- if ((tdb->flags & TDB_RDONLY) || (tdb->flags & TDB_INTERNAL) || tdb->tdb1.traverse_read) {
- tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
- "tdb1_transaction_start: cannot start a"
- " transaction on a read-only or"
- " internal db");
+ if (tdb->flags & TDB_INTERNAL) {
+ tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL,
+ TDB_LOG_USE_ERROR,
+ "tdb1_transaction_start:"
+ " cannot start a"
+ " transaction on an"
+ " internal tdb");
+ return -1;
+ }
+
+ if ((tdb->flags & TDB_RDONLY) || tdb->tdb1.traverse_read) {
+ tdb->last_error = tdb_logerr(tdb, TDB_ERR_RDONLY,
+ TDB_LOG_USE_ERROR,
+ "tdb_transaction_start:"
+ " cannot start a"
+ " transaction on a "
+ " read-only tdb");
return -1;
}
/* cope with nested tdb1_transaction_start() calls */
if (tdb->tdb1.transaction != NULL) {
if (!(tdb->flags & TDB_ALLOW_NESTING)) {
- tdb->last_error = TDB_ERR_EINVAL;
+ tdb->last_error
+ = tdb_logerr(tdb, TDB_ERR_EINVAL,
+ TDB_LOG_USE_ERROR,
+ "tdb_transaction_start:"
+ " already inside transaction");
return -1;
}
tdb->stats.transaction_nest++;
_tdb1_transaction_cancel(tdb);
if (need_repack) {
- return tdb_repack(tdb);
+ if (tdb_repack(tdb) != 0)
+ return -1;
}
return 0;
/* find the recovery area */
if (tdb1_ofs_read(tdb, TDB1_RECOVERY_HEAD, &recovery_head) == -1) {
- return tdb->last_error;
+ return TDB_ERR_TO_OFF(tdb->last_error);
}
if (recovery_head == 0) {
/* read the recovery record */
if (tdb->tdb1.io->tdb1_read(tdb, recovery_head, &rec,
sizeof(rec), TDB1_DOCONV()) == -1) {
- return tdb->last_error;
+ return TDB_ERR_TO_OFF(tdb->last_error);
}
return (rec.magic == TDB1_RECOVERY_MAGIC);