From: Rusty Russell Date: Thu, 17 Mar 2011 11:42:21 +0000 (+1030) Subject: tdb2: tdb_deq: inline helper for comparing two struct tdb_data X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=a4393df8ed138b853b4ff212db7e1a50aba0b8c7 tdb2: tdb_deq: inline helper for comparing two struct tdb_data Everyone writes their own, so provide a standard one. --- diff --git a/ccan/tdb2/doc/TDB1_porting.txt b/ccan/tdb2/doc/TDB1_porting.txt index fee02007..4a6e9244 100644 --- a/ccan/tdb2/doc/TDB1_porting.txt +++ b/ccan/tdb2/doc/TDB1_porting.txt @@ -23,3 +23,5 @@ Interface differences between TDB1 and TDB2. already formatted, and it takes an enum tdb_log_level not a tdb_debug_level, and which has only three values: TDB_LOG_ERROR, TDB_LOG_USE_ERROR and TDB_LOG_WARNING. + +- tdb2 provides tdb_deq() for comparing two struct tdb_data. diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index 50903a76..811d9120 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -40,6 +40,8 @@ extern "C" { #include /* For bool */ #include +/* For memcmp */ +#include #endif #include #include @@ -208,6 +210,16 @@ enum TDB_ERROR tdb_delete(struct tdb_context *tdb, struct tdb_data key); */ bool tdb_exists(struct tdb_context *tdb, TDB_DATA key); +/** + * tdb_deq - are struct tdb_data equal? + * @a: one struct tdb_data + * @b: another struct tdb_data + */ +static inline bool tdb_deq(struct tdb_data a, struct tdb_data b) +{ + return a.dsize == b.dsize && memcmp(a.dptr, b.dptr, a.dsize) == 0; +} + /** * tdb_transaction_start - start a transaction * @tdb: the tdb context returned from tdb_open() diff --git a/ccan/tdb2/test/external-agent.c b/ccan/tdb2/test/external-agent.c index b5dc56f4..79c299a0 100644 --- a/ccan/tdb2/test/external-agent.c +++ b/ccan/tdb2/test/external-agent.c @@ -56,8 +56,7 @@ static enum agent_return do_operation(enum operation op, const char *name) ret = FAILED; } else if (ecode < 0) { ret = OTHER_FAILURE; - } else if (data.dsize != k.dsize - || memcmp(data.dptr, k.dptr, k.dsize) != 0) { + } else if (!tdb_deq(data, k)) { ret = OTHER_FAILURE; free(data.dptr); } else { diff --git a/ccan/tdb2/test/logging.h b/ccan/tdb2/test/logging.h index 07d4e10a..502506d4 100644 --- a/ccan/tdb2/test/logging.h +++ b/ccan/tdb2/test/logging.h @@ -12,11 +12,4 @@ extern union tdb_attribute tap_log_attr; void tap_log_fn(struct tdb_context *tdb, enum tdb_log_level level, void *priv, const char *message); - -static inline bool data_equal(struct tdb_data a, struct tdb_data b) -{ - if (a.dsize != b.dsize) - return false; - return memcmp(a.dptr, b.dptr, a.dsize) == 0; -} #endif /* TDB2_TEST_LOGGING_H */ diff --git a/ccan/tdb2/test/run-11-simple-fetch.c b/ccan/tdb2/test/run-11-simple-fetch.c index c16c28f8..ad1933cd 100644 --- a/ccan/tdb2/test/run-11-simple-fetch.c +++ b/ccan/tdb2/test/run-11-simple-fetch.c @@ -60,7 +60,7 @@ int main(int argc, char *argv[]) if (!ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS)) goto fail; failtest_suppress = true; - ok1(data_equal(d, data)); + ok1(tdb_deq(d, data)); free(d.dptr); ok1(tdb_check(tdb, NULL, NULL) == 0); tdb_close(tdb); diff --git a/ccan/tdb2/test/run-12-store.c b/ccan/tdb2/test/run-12-store.c index 0b3c2965..5c21e3a1 100644 --- a/ccan/tdb2/test/run-12-store.c +++ b/ccan/tdb2/test/run-12-store.c @@ -16,13 +16,6 @@ static uint64_t fixedhash(const void *key, size_t len, uint64_t seed, void *p) *(uint64_t *)p); } -static bool equal(struct tdb_data a, struct tdb_data b) -{ - if (a.dsize != b.dsize) - return false; - return memcmp(a.dptr, b.dptr, a.dsize) == 0; -} - int main(int argc, char *argv[]) { unsigned int i, j; @@ -54,7 +47,7 @@ int main(int argc, char *argv[]) struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */ ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0); ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS); - ok1(equal(d, data)); + ok1(tdb_deq(d, data)); free(d.dptr); } tdb_close(tdb); diff --git a/ccan/tdb2/test/run-13-delete.c b/ccan/tdb2/test/run-13-delete.c index 3eaeee7a..aba6fe29 100644 --- a/ccan/tdb2/test/run-13-delete.c +++ b/ccan/tdb2/test/run-13-delete.c @@ -33,9 +33,7 @@ static bool store_records(struct tdb_context *tdb) if (tdb_store(tdb, key, data, TDB_REPLACE) != 0) return false; tdb_fetch(tdb, key, &d); - if (d.dsize != data.dsize) - return false; - if (memcmp(d.dptr, data.dptr, d.dsize) != 0) + if (!tdb_deq(d, data)) return false; free(d.dptr); } diff --git a/ccan/tdb2/test/run-21-parse_record.c b/ccan/tdb2/test/run-21-parse_record.c index b6601d01..773cdff4 100644 --- a/ccan/tdb2/test/run-21-parse_record.c +++ b/ccan/tdb2/test/run-21-parse_record.c @@ -11,9 +11,7 @@ static enum TDB_ERROR parse(TDB_DATA key, TDB_DATA data, TDB_DATA *expected) { - if (data.dsize != expected->dsize) - return TDB_ERR_EINVAL; - if (memcmp(data.dptr, expected->dptr, data.dsize) != 0) + if (!tdb_deq(data, *expected)) return TDB_ERR_EINVAL; return TDB_SUCCESS; } diff --git a/ccan/tdb2/test/run-open-multiple-times.c b/ccan/tdb2/test/run-open-multiple-times.c index 1f35648b..240828df 100644 --- a/ccan/tdb2/test/run-open-multiple-times.c +++ b/ccan/tdb2/test/run-open-multiple-times.c @@ -34,8 +34,7 @@ int main(int argc, char *argv[]) /* Store in one, fetch in the other. */ ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0); ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS); - ok1(d.dptr && d.dsize == data.dsize - && memcmp(d.dptr, data.dptr, d.dsize) == 0); + ok1(tdb_deq(d, data)); free(d.dptr); /* Vice versa, with delete. */ @@ -47,8 +46,7 @@ int main(int argc, char *argv[]) ok1(tdb_store(tdb2, key, data, TDB_REPLACE) == 0); ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS); - ok1(d.dptr && d.dsize == data.dsize - && memcmp(d.dptr, data.dptr, d.dsize) == 0); + ok1(tdb_deq(d, data)); free(d.dptr); /* Reopen */ @@ -75,8 +73,7 @@ int main(int argc, char *argv[]) ok1(tdb_close(tdb2) == 0); ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS); - ok1(d.dptr && d.dsize == data.dsize - && memcmp(d.dptr, data.dptr, d.dsize) == 0); + ok1(tdb_deq(d, data)); free(d.dptr); ok1(tdb_close(tdb) == 0); ok1(tap_log_messages == 4);