Commit a4393df8 authored by Rusty Russell's avatar Rusty Russell

tdb2: tdb_deq: inline helper for comparing two struct tdb_data

Everyone writes their own, so provide a standard one.
parent a97da100
...@@ -23,3 +23,5 @@ Interface differences between TDB1 and TDB2. ...@@ -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, 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 and which has only three values: TDB_LOG_ERROR, TDB_LOG_USE_ERROR and
TDB_LOG_WARNING. TDB_LOG_WARNING.
- tdb2 provides tdb_deq() for comparing two struct tdb_data.
...@@ -40,6 +40,8 @@ extern "C" { ...@@ -40,6 +40,8 @@ extern "C" {
#include <stdint.h> #include <stdint.h>
/* For bool */ /* For bool */
#include <stdbool.h> #include <stdbool.h>
/* For memcmp */
#include <string.h>
#endif #endif
#include <ccan/compiler/compiler.h> #include <ccan/compiler/compiler.h>
#include <ccan/typesafe_cb/typesafe_cb.h> #include <ccan/typesafe_cb/typesafe_cb.h>
...@@ -208,6 +210,16 @@ enum TDB_ERROR tdb_delete(struct tdb_context *tdb, struct tdb_data key); ...@@ -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); 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_transaction_start - start a transaction
* @tdb: the tdb context returned from tdb_open() * @tdb: the tdb context returned from tdb_open()
......
...@@ -56,8 +56,7 @@ static enum agent_return do_operation(enum operation op, const char *name) ...@@ -56,8 +56,7 @@ static enum agent_return do_operation(enum operation op, const char *name)
ret = FAILED; ret = FAILED;
} else if (ecode < 0) { } else if (ecode < 0) {
ret = OTHER_FAILURE; ret = OTHER_FAILURE;
} else if (data.dsize != k.dsize } else if (!tdb_deq(data, k)) {
|| memcmp(data.dptr, k.dptr, k.dsize) != 0) {
ret = OTHER_FAILURE; ret = OTHER_FAILURE;
free(data.dptr); free(data.dptr);
} else { } else {
......
...@@ -12,11 +12,4 @@ extern union tdb_attribute tap_log_attr; ...@@ -12,11 +12,4 @@ extern union tdb_attribute tap_log_attr;
void tap_log_fn(struct tdb_context *tdb, void tap_log_fn(struct tdb_context *tdb,
enum tdb_log_level level, void *priv, enum tdb_log_level level, void *priv,
const char *message); 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 */ #endif /* TDB2_TEST_LOGGING_H */
...@@ -60,7 +60,7 @@ int main(int argc, char *argv[]) ...@@ -60,7 +60,7 @@ int main(int argc, char *argv[])
if (!ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS)) if (!ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS))
goto fail; goto fail;
failtest_suppress = true; failtest_suppress = true;
ok1(data_equal(d, data)); ok1(tdb_deq(d, data));
free(d.dptr); free(d.dptr);
ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(tdb_check(tdb, NULL, NULL) == 0);
tdb_close(tdb); tdb_close(tdb);
......
...@@ -16,13 +16,6 @@ static uint64_t fixedhash(const void *key, size_t len, uint64_t seed, void *p) ...@@ -16,13 +16,6 @@ static uint64_t fixedhash(const void *key, size_t len, uint64_t seed, void *p)
*(uint64_t *)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[]) int main(int argc, char *argv[])
{ {
unsigned int i, j; unsigned int i, j;
...@@ -54,7 +47,7 @@ int main(int argc, char *argv[]) ...@@ -54,7 +47,7 @@ int main(int argc, char *argv[])
struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */ struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */
ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0); ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0);
ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS); ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS);
ok1(equal(d, data)); ok1(tdb_deq(d, data));
free(d.dptr); free(d.dptr);
} }
tdb_close(tdb); tdb_close(tdb);
......
...@@ -33,9 +33,7 @@ static bool store_records(struct tdb_context *tdb) ...@@ -33,9 +33,7 @@ static bool store_records(struct tdb_context *tdb)
if (tdb_store(tdb, key, data, TDB_REPLACE) != 0) if (tdb_store(tdb, key, data, TDB_REPLACE) != 0)
return false; return false;
tdb_fetch(tdb, key, &d); tdb_fetch(tdb, key, &d);
if (d.dsize != data.dsize) if (!tdb_deq(d, data))
return false;
if (memcmp(d.dptr, data.dptr, d.dsize) != 0)
return false; return false;
free(d.dptr); free(d.dptr);
} }
......
...@@ -11,9 +11,7 @@ ...@@ -11,9 +11,7 @@
static enum TDB_ERROR parse(TDB_DATA key, TDB_DATA data, TDB_DATA *expected) static enum TDB_ERROR parse(TDB_DATA key, TDB_DATA data, TDB_DATA *expected)
{ {
if (data.dsize != expected->dsize) if (!tdb_deq(data, *expected))
return TDB_ERR_EINVAL;
if (memcmp(data.dptr, expected->dptr, data.dsize) != 0)
return TDB_ERR_EINVAL; return TDB_ERR_EINVAL;
return TDB_SUCCESS; return TDB_SUCCESS;
} }
......
...@@ -34,8 +34,7 @@ int main(int argc, char *argv[]) ...@@ -34,8 +34,7 @@ int main(int argc, char *argv[])
/* Store in one, fetch in the other. */ /* Store in one, fetch in the other. */
ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0); ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0);
ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS); ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS);
ok1(d.dptr && d.dsize == data.dsize ok1(tdb_deq(d, data));
&& memcmp(d.dptr, data.dptr, d.dsize) == 0);
free(d.dptr); free(d.dptr);
/* Vice versa, with delete. */ /* Vice versa, with delete. */
...@@ -47,8 +46,7 @@ int main(int argc, char *argv[]) ...@@ -47,8 +46,7 @@ int main(int argc, char *argv[])
ok1(tdb_store(tdb2, key, data, TDB_REPLACE) == 0); ok1(tdb_store(tdb2, key, data, TDB_REPLACE) == 0);
ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS); ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS);
ok1(d.dptr && d.dsize == data.dsize ok1(tdb_deq(d, data));
&& memcmp(d.dptr, data.dptr, d.dsize) == 0);
free(d.dptr); free(d.dptr);
/* Reopen */ /* Reopen */
...@@ -75,8 +73,7 @@ int main(int argc, char *argv[]) ...@@ -75,8 +73,7 @@ int main(int argc, char *argv[])
ok1(tdb_close(tdb2) == 0); ok1(tdb_close(tdb2) == 0);
ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS); ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS);
ok1(d.dptr && d.dsize == data.dsize ok1(tdb_deq(d, data));
&& memcmp(d.dptr, data.dptr, d.dsize) == 0);
free(d.dptr); free(d.dptr);
ok1(tdb_close(tdb) == 0); ok1(tdb_close(tdb) == 0);
ok1(tap_log_messages == 4); ok1(tap_log_messages == 4);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment