X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb.c;h=f11701d9ea9c686cfc2b0beefbea069eb3602542;hb=233190071e5834e1a701d6d2ef4bc0a46cecc537;hp=254aac5f25a94e1daae9692ea03a9c42b1a6ddce;hpb=f6067e4cbd7b7415571f12438aec00faec5657fb;p=ccan diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index 254aac5f..f11701d9 100644 --- a/ccan/tdb2/tdb.c +++ b/ccan/tdb2/tdb.c @@ -38,10 +38,11 @@ static enum TDB_ERROR replace_data(struct tdb_context *tdb, /* We didn't like the existing one: remove it. */ if (old_off) { - add_stat(tdb, frees, 1); + tdb->stats.frees++; ecode = add_free_record(tdb, old_off, sizeof(struct tdb_used_record) - + key.dsize + old_room); + + key.dsize + old_room, + TDB_LOCK_WAIT, true); if (ecode == TDB_SUCCESS) ecode = replace_in_hash(tdb, h, new_off); } else { @@ -285,12 +286,13 @@ enum TDB_ERROR tdb_delete(struct tdb_context *tdb, struct tdb_data key) } /* Free the deleted entry. */ - add_stat(tdb, frees, 1); + tdb->stats.frees++; ecode = add_free_record(tdb, off, sizeof(struct tdb_used_record) + rec_key_length(&rec) + rec_data_length(&rec) - + rec_extra_padding(&rec)); + + rec_extra_padding(&rec), + TDB_LOCK_WAIT, true); if (tdb->flags & TDB_SEQNUM) tdb_inc_seqnum(tdb); @@ -327,6 +329,9 @@ void tdb_add_flag(struct tdb_context *tdb, unsigned flag) case TDB_SEQNUM: tdb->flags |= TDB_SEQNUM; break; + case TDB_ALLOW_NESTING: + tdb->flags |= TDB_ALLOW_NESTING; + break; default: tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR, @@ -357,6 +362,9 @@ void tdb_remove_flag(struct tdb_context *tdb, unsigned flag) case TDB_SEQNUM: tdb->flags &= ~TDB_SEQNUM; break; + case TDB_ALLOW_NESTING: + tdb->flags &= ~TDB_ALLOW_NESTING; + break; default: tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR, @@ -382,6 +390,11 @@ const char *tdb_errorstr(enum TDB_ERROR ecode) return "Invalid error code"; } +enum TDB_ERROR tdb_error(struct tdb_context *tdb) +{ + return tdb->last_error; +} + enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, enum TDB_ERROR ecode, enum tdb_log_level level, @@ -393,7 +406,7 @@ enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, /* tdb_open paths care about errno, so save it. */ int saved_errno = errno; - if (!tdb->logfn) + if (!tdb->log_fn) return ecode; va_start(ap, fmt); @@ -401,11 +414,11 @@ enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, va_end(ap); if (len < 0) { - tdb->logfn(tdb, TDB_LOG_ERROR, tdb->log_private, - "out of memory formatting message:"); - tdb->logfn(tdb, level, tdb->log_private, fmt); + tdb->log_fn(tdb, TDB_LOG_ERROR, + "out of memory formatting message:", tdb->log_data); + tdb->log_fn(tdb, level, fmt, tdb->log_data); } else { - tdb->logfn(tdb, level, tdb->log_private, message); + tdb->log_fn(tdb, level, message, tdb->log_data); free(message); } errno = saved_errno; @@ -414,15 +427,14 @@ enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, TDB_DATA key, - enum TDB_ERROR (*parse)(TDB_DATA key, - TDB_DATA data, - void *p), - void *p) + enum TDB_ERROR (*parse)(TDB_DATA k, + TDB_DATA d, + void *data), + void *data) { tdb_off_t off; struct tdb_used_record rec; struct hash_info h; - TDB_DATA data; enum TDB_ERROR ecode; off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL); @@ -433,16 +445,16 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, if (!off) { ecode = TDB_ERR_NOEXIST; } else { - data.dsize = rec_data_length(&rec); - data.dptr = (void *)tdb_access_read(tdb, - off + sizeof(rec) - + key.dsize, - data.dsize, false); - if (TDB_PTR_IS_ERR(data.dptr)) { - ecode = TDB_PTR_ERR(data.dptr); + const void *dptr; + dptr = tdb_access_read(tdb, off + sizeof(rec) + key.dsize, + rec_data_length(&rec), false); + if (TDB_PTR_IS_ERR(dptr)) { + ecode = TDB_PTR_ERR(dptr); } else { - ecode = parse(key, data, p); - tdb_access_release(tdb, data.dptr); + TDB_DATA d = tdb_mkdata(dptr, rec_data_length(&rec)); + + ecode = parse(key, d, data); + tdb_access_release(tdb, dptr); } }