Everyone writes their own, so provide a standard one.
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.
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.
#include <stdint.h>
/* For bool */
#include <stdbool.h>
#include <stdint.h>
/* For bool */
#include <stdbool.h>
+/* For memcmp */
+#include <string.h>
#endif
#include <ccan/compiler/compiler.h>
#include <ccan/typesafe_cb/typesafe_cb.h>
#endif
#include <ccan/compiler/compiler.h>
#include <ccan/typesafe_cb/typesafe_cb.h>
*/
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: the tdb context returned from tdb_open()
/**
* tdb_transaction_start - start a transaction
* @tdb: the tdb context returned from tdb_open()
ret = FAILED;
} else if (ecode < 0) {
ret = OTHER_FAILURE;
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 {
ret = OTHER_FAILURE;
free(data.dptr);
} else {
void tap_log_fn(struct tdb_context *tdb,
enum tdb_log_level level, void *priv,
const char *message);
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 */
#endif /* TDB2_TEST_LOGGING_H */
if (!ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS))
goto fail;
failtest_suppress = true;
if (!ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS))
goto fail;
failtest_suppress = true;
- ok1(data_equal(d, data));
free(d.dptr);
ok1(tdb_check(tdb, NULL, NULL) == 0);
tdb_close(tdb);
free(d.dptr);
ok1(tdb_check(tdb, NULL, NULL) == 0);
tdb_close(tdb);
-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;
int main(int argc, char *argv[])
{
unsigned int i, j;
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);
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);
free(d.dptr);
}
tdb_close(tdb);
free(d.dptr);
}
tdb_close(tdb);
if (tdb_store(tdb, key, data, TDB_REPLACE) != 0)
return false;
tdb_fetch(tdb, key, &d);
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)
return false;
free(d.dptr);
}
return false;
free(d.dptr);
}
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)
- 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;
}
return TDB_ERR_EINVAL;
return TDB_SUCCESS;
}
/* Store in one, fetch in the other. */
ok1(tdb_store(tdb, key, data, TDB_REPLACE) == 0);
ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS);
/* 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);
free(d.dptr);
/* Vice versa, with delete. */
free(d.dptr);
/* Vice versa, with delete. */
ok1(tdb_store(tdb2, key, data, TDB_REPLACE) == 0);
ok1(tdb_fetch(tdb2, key, &d) == TDB_SUCCESS);
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);
free(d.dptr);
/* Reopen */
free(d.dptr);
/* Reopen */
ok1(tdb_close(tdb2) == 0);
ok1(tdb_fetch(tdb, key, &d) == TDB_SUCCESS);
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);
free(d.dptr);
ok1(tdb_close(tdb) == 0);
ok1(tap_log_messages == 4);
free(d.dptr);
ok1(tdb_close(tdb) == 0);
ok1(tap_log_messages == 4);