summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c_src/permdb.c25
-rwxr-xr-xtest/listpermdb.erl2
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,