Commit f367a1dc authored by Rusty Russell's avatar Rusty Russell

tdb2: tdb_mkdata

It's common to want to create a struct tdb_data which contains a const
pointer, so add a helper to do so, and use it to clean up other -Wcast-qual
warnings.
parent 45e9956d
...@@ -402,22 +402,26 @@ static enum TDB_ERROR check_hash_tree(struct tdb_context *tdb, ...@@ -402,22 +402,26 @@ static enum TDB_ERROR check_hash_tree(struct tdb_context *tdb,
check: check:
if (check) { if (check) {
TDB_DATA key, data; TDB_DATA key, data;
key.dsize = rec_key_length(&rec); const unsigned char *kptr;
data.dsize = rec_data_length(&rec);
key.dptr = (void *)tdb_access_read(tdb, kptr = tdb_access_read(tdb,
off + sizeof(rec), off + sizeof(rec),
key.dsize + data.dsize, rec_key_length(&rec)
false); + rec_data_length(&rec),
if (TDB_PTR_IS_ERR(key.dptr)) { false);
ecode = TDB_PTR_ERR(key.dptr); if (TDB_PTR_IS_ERR(kptr)) {
ecode = TDB_PTR_ERR(kptr);
goto fail; goto fail;
} }
data.dptr = key.dptr + key.dsize;
key = tdb_mkdata(kptr, rec_key_length(&rec));
data = tdb_mkdata(kptr + key.dsize,
rec_data_length(&rec));
ecode = check(key, data, private_data); ecode = check(key, data, private_data);
tdb_access_release(tdb, kptr);
if (ecode != TDB_SUCCESS) { if (ecode != TDB_SUCCESS) {
goto fail; goto fail;
} }
tdb_access_release(tdb, key.dptr);
} }
} }
} }
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#include <ccan/tdb2/tdb2.h> #include <ccan/tdb2/tdb2.h>
#include <ccan/likely/likely.h> #include <ccan/likely/likely.h>
#include <ccan/compiler/compiler.h> #include <ccan/compiler/compiler.h>
#include <ccan/cast/cast.h>
#if HAVE_BYTESWAP_H #if HAVE_BYTESWAP_H
#include <byteswap.h> #include <byteswap.h>
#endif #endif
......
...@@ -422,7 +422,6 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, ...@@ -422,7 +422,6 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
tdb_off_t off; tdb_off_t off;
struct tdb_used_record rec; struct tdb_used_record rec;
struct hash_info h; struct hash_info h;
TDB_DATA data;
enum TDB_ERROR ecode; enum TDB_ERROR ecode;
off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL); off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
...@@ -433,16 +432,16 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, ...@@ -433,16 +432,16 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
if (!off) { if (!off) {
ecode = TDB_ERR_NOEXIST; ecode = TDB_ERR_NOEXIST;
} else { } else {
data.dsize = rec_data_length(&rec); const void *dptr;
data.dptr = (void *)tdb_access_read(tdb, dptr = tdb_access_read(tdb, off + sizeof(rec) + key.dsize,
off + sizeof(rec) rec_data_length(&rec), false);
+ key.dsize, if (TDB_PTR_IS_ERR(dptr)) {
data.dsize, false); ecode = TDB_PTR_ERR(dptr);
if (TDB_PTR_IS_ERR(data.dptr)) {
ecode = TDB_PTR_ERR(data.dptr);
} else { } else {
TDB_DATA data = tdb_mkdata(dptr, rec_data_length(&rec));
ecode = parse(key, data, p); ecode = parse(key, data, p);
tdb_access_release(tdb, data.dptr); tdb_access_release(tdb, dptr);
} }
} }
......
...@@ -45,6 +45,7 @@ extern "C" { ...@@ -45,6 +45,7 @@ extern "C" {
#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>
#include <ccan/cast/cast.h>
union tdb_attribute; union tdb_attribute;
struct tdb_context; struct tdb_context;
...@@ -221,6 +222,24 @@ static inline bool tdb_deq(struct tdb_data a, struct tdb_data b) ...@@ -221,6 +222,24 @@ 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; return a.dsize == b.dsize && memcmp(a.dptr, b.dptr, a.dsize) == 0;
} }
/**
* tdb_mkdata - make a struct tdb_data from const data
* @p: the constant pointer
* @len: the length
*
* As the dptr member of struct tdb_data is not constant, you need to
* cast it. This function keeps thost casts in one place, as well as
* suppressing the warning some compilers give when casting away a
* qualifier (eg. gcc with -Wcast-qual)
*/
static inline struct tdb_data tdb_mkdata(const void *p, size_t len)
{
struct tdb_data d;
d.dptr = cast_const(void *, p);
d.dsize = len;
return d;
}
/** /**
* 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()
......
...@@ -31,8 +31,7 @@ static enum agent_return do_operation(enum operation op, const char *name) ...@@ -31,8 +31,7 @@ static enum agent_return do_operation(enum operation op, const char *name)
diag("external: %s", operation_name(op)); diag("external: %s", operation_name(op));
k.dptr = (void *)name; k = tdb_mkdata(name, strlen(name));
k.dsize = strlen(name);
locking_would_block = 0; locking_would_block = 0;
switch (op) { switch (op) {
......
...@@ -34,10 +34,8 @@ int main(int argc, char *argv[]) ...@@ -34,10 +34,8 @@ int main(int argc, char *argv[])
/* FIXME: Test TDB_CONVERT */ /* FIXME: Test TDB_CONVERT */
plan_tests(38); plan_tests(38);
data.dptr = (void *)"world"; data = tdb_mkdata("world", 5);
data.dsize = 5; key = tdb_mkdata("hello", 5);
key.dptr = (void *)"hello";
key.dsize = 5;
/* No coalescing can be done due to EOF */ /* No coalescing can be done due to EOF */
layout = new_tdb_layout("run-03-coalesce.tdb"); layout = new_tdb_layout("run-03-coalesce.tdb");
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
/* We rig the hash so adjacent-numbered records always clash. */ /* We rig the hash so adjacent-numbered records always clash. */
static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv) static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv)
{ {
return ((uint64_t)*(unsigned int *)key) return ((uint64_t)*(const unsigned int *)key)
<< (64 - TDB_TOPLEVEL_HASH_BITS - 1); << (64 - TDB_TOPLEVEL_HASH_BITS - 1);
} }
......
...@@ -30,8 +30,8 @@ int main(int argc, char *argv[]) ...@@ -30,8 +30,8 @@ int main(int argc, char *argv[])
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data = { (unsigned char *)"data", 4 }; struct tdb_data data = tdb_mkdata("data", 4);
failtest_init(argc, argv); failtest_init(argc, argv);
failtest_hook = suppress_failure; failtest_hook = suppress_failure;
......
...@@ -30,8 +30,8 @@ int main(int argc, char *argv[]) ...@@ -30,8 +30,8 @@ int main(int argc, char *argv[])
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data = { (unsigned char *)"data", 4 }; struct tdb_data data = tdb_mkdata("data", 4);
failtest_init(argc, argv); failtest_init(argc, argv);
failtest_hook = suppress_failure; failtest_hook = suppress_failure;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
/* We rig the hash so adjacent-numbered records always clash. */ /* We rig the hash so adjacent-numbered records always clash. */
static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv) static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv)
{ {
return ((uint64_t)*(unsigned int *)key) return ((uint64_t)*(const unsigned int *)key)
<< (64 - TDB_TOPLEVEL_HASH_BITS - 1); << (64 - TDB_TOPLEVEL_HASH_BITS - 1);
} }
......
...@@ -35,7 +35,7 @@ int main(int argc, char *argv[]) ...@@ -35,7 +35,7 @@ int main(int argc, char *argv[])
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data; struct tdb_data data;
buffer = malloc(MAX_SIZE); buffer = malloc(MAX_SIZE);
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
static uint64_t myhash(const void *key, size_t len, uint64_t seed, void *priv) static uint64_t myhash(const void *key, size_t len, uint64_t seed, void *priv)
{ {
return *(uint64_t *)key; return *(const uint64_t *)key;
} }
static void add_bits(uint64_t *val, unsigned new, unsigned new_bits, static void add_bits(uint64_t *val, unsigned new, unsigned new_bits,
......
...@@ -18,10 +18,8 @@ int main(int argc, char *argv[]) ...@@ -18,10 +18,8 @@ int main(int argc, char *argv[])
TDB_DATA key, data; TDB_DATA key, data;
plan_tests(11); plan_tests(11);
key.dptr = (unsigned char *)"Hello"; key = tdb_mkdata("Hello", 5);
data.dptr = (unsigned char *)"world"; data = tdb_mkdata("world", 5);
data.dsize = 5;
key.dsize = 5;
/* Create a TDB with three free tables. */ /* Create a TDB with three free tables. */
layout = new_tdb_layout(NULL); layout = new_tdb_layout(NULL);
......
...@@ -16,7 +16,7 @@ int main(int argc, char *argv[]) ...@@ -16,7 +16,7 @@ int main(int argc, char *argv[])
unsigned char *buffer; unsigned char *buffer;
int flags[] = { TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT }; TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data; struct tdb_data data;
buffer = malloc(1000); buffer = malloc(1000);
......
...@@ -160,10 +160,8 @@ int main(int argc, char *argv[]) ...@@ -160,10 +160,8 @@ int main(int argc, char *argv[])
opened = true; opened = true;
ok1(tdb_transaction_start(tdb) == 0); ok1(tdb_transaction_start(tdb) == 0);
key.dsize = strlen("hi"); key = tdb_mkdata("hi", strlen("hi"));
key.dptr = (void *)"hi"; data = tdb_mkdata("world", strlen("world"));
data.dptr = (void *)"world";
data.dsize = strlen("world");
ok1(tdb_store(tdb, key, data, TDB_INSERT) == 0); ok1(tdb_store(tdb, key, data, TDB_INSERT) == 0);
ok1(tdb_transaction_commit(tdb) == 0); ok1(tdb_transaction_commit(tdb) == 0);
......
...@@ -208,8 +208,7 @@ reset: ...@@ -208,8 +208,7 @@ reset:
} }
/* Put key for agent to fetch. */ /* Put key for agent to fetch. */
key.dsize = strlen(KEY_STRING); key = tdb_mkdata(KEY_STRING, strlen(KEY_STRING));
key.dptr = (void *)KEY_STRING;
if (tdb_store(tdb, key, key, TDB_INSERT) != 0) if (tdb_store(tdb, key, key, TDB_INSERT) != 0)
return false; return false;
......
...@@ -15,8 +15,8 @@ int main(int argc, char *argv[]) ...@@ -15,8 +15,8 @@ int main(int argc, char *argv[])
unsigned int i; unsigned int i;
struct tdb_context *tdb; struct tdb_context *tdb;
struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */ struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data = { (unsigned char *)"data", 4 }; struct tdb_data data = tdb_mkdata("data", 4);
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
......
...@@ -19,7 +19,7 @@ int main(int argc, char *argv[]) ...@@ -19,7 +19,7 @@ int main(int argc, char *argv[])
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data; struct tdb_data data;
data.dptr = malloc(MAX_SIZE); data.dptr = malloc(MAX_SIZE);
......
...@@ -40,7 +40,7 @@ int main(int argc, char *argv[]) ...@@ -40,7 +40,7 @@ int main(int argc, char *argv[])
unsigned int i; unsigned int i;
struct agent *agent; struct agent *agent;
struct tdb_context *tdb; struct tdb_context *tdb;
struct tdb_data d = { (unsigned char *)"hello", 5 }; struct tdb_data d = tdb_mkdata("hello", 5);
const char filename[] = "run-remap-in-read_traverse.tdb"; const char filename[] = "run-remap-in-read_traverse.tdb";
plan_tests(4); plan_tests(4);
......
...@@ -16,8 +16,8 @@ int main(int argc, char *argv[]) ...@@ -16,8 +16,8 @@ int main(int argc, char *argv[])
int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP, int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
TDB_NOMMAP|TDB_CONVERT }; TDB_NOMMAP|TDB_CONVERT };
struct tdb_data key = { (unsigned char *)"key", 3 }; struct tdb_data key = tdb_mkdata("key", 3);
struct tdb_data data = { (unsigned char *)"data", 4 }; struct tdb_data data = tdb_mkdata("data", 4);
plan_tests(sizeof(flags) / sizeof(flags[0]) * 7 + 1); plan_tests(sizeof(flags) / sizeof(flags[0]) * 7 + 1);
for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) { for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {
......
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