From 027f53e35bc57e0046bbb3c02f74e8504961b499 Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Thu, 11 Feb 2016 15:51:34 +0100 Subject: Added rudimentary support for chunks. This means that the implementation should be compatible with the specification. --- c_src/permdb.c | 25 ++++++++++++++++++++++--- test/listpermdb.erl | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/c_src/permdb.c b/c_src/permdb.c index c6ae1c9..624e1da 100644 --- a/c_src/permdb.c +++ b/c_src/permdb.c @@ -1087,6 +1087,16 @@ readnet32(void *ptr) return ntohl(data); } +static uint16_t +readnet16(void *ptr) +{ + uint16_t data; + + memcpy(&data, ptr, sizeof(data)); + + return ntohs(data); +} + static unsigned char * readdatakeyandlen(permdb_object *state, node_offset offset, size_t *datalen) { @@ -1100,7 +1110,11 @@ readdatakeyandlen(permdb_object *state, node_offset offset, size_t *datalen) return NULL; } unsigned char *result = memsub(data, sizeof(data_entry_cookie), keylen); - *datalen = readnet32(data+sizeof(data_entry_cookie)+keylen); + uint16_t nchunks = readnet16(data+sizeof(data_entry_cookie)+keylen); + *datalen = readnet16(data+sizeof(data_entry_cookie)+keylen+sizeof(uint16_t)); + if (nchunks != 1) { + errx(1, "number of chunks is %d, but only one chunk is supported right now", nchunks); + } free(data); return result; } @@ -1115,7 +1129,11 @@ readdata(permdb_object *state, node_offset offset, size_t datalen) static node_offset writedata(permdb_object *state, const unsigned char *key, const unsigned char *data, size_t datalength) { - uint32_t coded_datalength = htonl(datalength); + if (datalength > 65535) { + errx(1, "data length is %zu, but only < 64K lengths are supported right now", datalength); + } + uint16_t chunk_length = htons(datalength); + uint16_t nchunks = htons(1); node_offset offset = state->datafile.datasize; #if DEBUG_WRITE @@ -1123,7 +1141,8 @@ writedata(permdb_object *state, const unsigned char *key, const unsigned char *d #endif writebuffer_add(&state->datafile, &data_entry_cookie, sizeof(data_entry_cookie)); writebuffer_add(&state->datafile, key, keylen); - writebuffer_add(&state->datafile, &coded_datalength, 4); + writebuffer_add(&state->datafile, &nchunks, sizeof(uint16_t)); + writebuffer_add(&state->datafile, &chunk_length, sizeof(uint16_t)); writebuffer_add(&state->datafile, data, datalength); return offset; diff --git a/test/listpermdb.erl b/test/listpermdb.erl index 04acbfa..a12e5e4 100755 --- a/test/listpermdb.erl +++ b/test/listpermdb.erl @@ -101,7 +101,7 @@ printindex(<>, FileOffset) -> printdata(<<>>, FileOffset) -> {ok, FileOffset}; -printdata(<>, FileOffset) -> +printdata(<>, FileOffset) -> FileOffset2 = FileOffset + 8 + 32 + 4, io:format("data ~p key ~p length ~p~n", [FileOffset, Key, Length]), <> = Rest, -- cgit v1.1