diff options
-rw-r--r-- | c_src/permdb.c | 25 | ||||
-rwxr-xr-x | 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(<<Unknown:16/binary, _Rest/binary>>, FileOffset) -> printdata(<<>>, FileOffset) -> {ok, FileOffset}; -printdata(<<?DATA_ENTRY_COOKIE:64, Key:32/binary, Length:32, Rest/binary>>, FileOffset) -> +printdata(<<?DATA_ENTRY_COOKIE:64, Key:32/binary, 1:16, Length:16, Rest/binary>>, FileOffset) -> FileOffset2 = FileOffset + 8 + 32 + 4, io:format("data ~p key ~p length ~p~n", [FileOffset, Key, Length]), <<Data:Length/binary, Rest2/binary>> = Rest, |