diff options
author | Michael Cahill <michael.cahill@wiredtiger.com> | 2013-02-22 12:19:02 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@wiredtiger.com> | 2013-02-22 12:19:02 +1100 |
commit | 7afc6b1e88b548a174b06acbbad5c0977304b5ad (patch) | |
tree | c344d0ad43e5a716f6a5351dc92279ab1188caac /src/packing | |
parent | 77f22f56608b6bc5886584866434460421a95cf5 (diff) | |
download | mongo-7afc6b1e88b548a174b06acbbad5c0977304b5ad.tar.gz |
Add documentation and checking to pack streams, return the number of bytes (un)packed.
Diffstat (limited to 'src/packing')
-rw-r--r-- | src/packing/pack_stream.c | 166 |
1 files changed, 140 insertions, 26 deletions
diff --git a/src/packing/pack_stream.c b/src/packing/pack_stream.c index fcb4a10aabc..977f08749bb 100644 --- a/src/packing/pack_stream.c +++ b/src/packing/pack_stream.c @@ -14,9 +14,13 @@ */ struct __wt_pack_stream { WT_PACK pack; - uint8_t *end, *p; + uint8_t *end, *p, *start; }; +/* + * wiredtiger_pack_start -- + * Open a stream for packing. + */ int wiredtiger_pack_start(WT_SESSION *wt_session, const char *format, void *buffer, size_t len, WT_PACK_STREAM **psp) { @@ -27,31 +31,46 @@ wiredtiger_pack_start(WT_SESSION *wt_session, const char *format, void *buffer, session = (WT_SESSION_IMPL *)wt_session; WT_RET(__wt_calloc_def(session, 1, &ps)); WT_ERR(__pack_init(session, &ps->pack, format)); - ps->p = buffer; + ps->p = ps->start = buffer; ps->end = ps->p + len; *psp = ps; if (0) { -err: (void)wiredtiger_pack_close(ps); +err: (void)wiredtiger_pack_close(ps, NULL); } return (ret); } +/* + * wiredtiger_unpack_start -- + * Open a stream for unpacking. + */ int wiredtiger_unpack_start(WT_SESSION *wt_session, const char *format, const void *buffer, size_t size, WT_PACK_STREAM **psp) { return (wiredtiger_pack_start(wt_session, format, (void *)buffer, size, psp)); } +/* + * wiredtiger_pack_close -- + * Close a packing stream. + */ int -wiredtiger_pack_close(WT_PACK_STREAM *ps) +wiredtiger_pack_close(WT_PACK_STREAM *ps, size_t *usedp) { if (ps != NULL) __wt_free(ps->pack.session, ps); + if (usedp != NULL) + *usedp = WT_PTRDIFF(ps->p, ps->start); + return (0); } +/* + * wiredtiger_pack_item -- + * Pack an item. + */ int wiredtiger_pack_item(WT_PACK_STREAM *ps, WT_ITEM *item) { @@ -60,13 +79,23 @@ wiredtiger_pack_item(WT_PACK_STREAM *ps, WT_ITEM *item) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - pv.u.item.data = item->data; - pv.u.item.size = item->size; - WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + switch (pv.type) { + case 'U': + case 'u': + pv.u.item.data = item->data; + pv.u.item.size = item->size; + WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_pack_int -- + * Pack a signed integer. + */ int wiredtiger_pack_int(WT_PACK_STREAM *ps, int64_t i) { @@ -75,12 +104,25 @@ wiredtiger_pack_int(WT_PACK_STREAM *ps, int64_t i) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - pv.u.i = i; - WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + switch (pv.type) { + case 'b': + case 'h': + case 'i': + case 'l': + case 'q': + pv.u.i = i; + WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_pack_str -- + * Pack a string. + */ int wiredtiger_pack_str(WT_PACK_STREAM *ps, const char *s) { @@ -89,12 +131,22 @@ wiredtiger_pack_str(WT_PACK_STREAM *ps, const char *s) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - pv.u.s = s; - WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + switch (pv.type) { + case 'S': + case 's': + pv.u.s = s; + WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_pack_uint -- + * Pack an unsigned int. + */ int wiredtiger_pack_uint(WT_PACK_STREAM *ps, uint64_t u) { @@ -103,12 +155,28 @@ wiredtiger_pack_uint(WT_PACK_STREAM *ps, uint64_t u) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - pv.u.u = u; - WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + switch (pv.type) { + case 'B': + case 'H': + case 'I': + case 'L': + case 'Q': + case 'R': + case 'r': + case 't': + pv.u.u = u; + WT_RET(__pack_write(session, &pv, &ps->p, (size_t)(ps->end - ps->p))); + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_unpack_item -- + * Unpack an item. + */ int wiredtiger_unpack_item(WT_PACK_STREAM *ps, WT_ITEM *item) { @@ -117,13 +185,24 @@ wiredtiger_unpack_item(WT_PACK_STREAM *ps, WT_ITEM *item) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - WT_RET(__unpack_read(session, - &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); - item->data = pv.u.item.data; - item->size = pv.u.item.size; + switch (pv.type) { + case 'U': + case 'u': + WT_RET(__unpack_read(session, + &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); + item->data = pv.u.item.data; + item->size = pv.u.item.size; + break; + WT_ILLEGAL_VALUE(session); + } + return (0); } +/* + * wiredtiger_unpack_int -- + * Unpack a signed integer. + */ int wiredtiger_unpack_int(WT_PACK_STREAM *ps, int64_t *ip) { @@ -132,12 +211,25 @@ wiredtiger_unpack_int(WT_PACK_STREAM *ps, int64_t *ip) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - WT_RET(__unpack_read(session, - &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); - *ip = pv.u.i; + switch (pv.type) { + case 'b': + case 'h': + case 'i': + case 'l': + case 'q': + WT_RET(__unpack_read(session, + &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); + *ip = pv.u.i; + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_unpack_str -- + * Unpack a string. + */ int wiredtiger_unpack_str(WT_PACK_STREAM *ps, const char **sp) { @@ -146,12 +238,22 @@ wiredtiger_unpack_str(WT_PACK_STREAM *ps, const char **sp) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - WT_RET(__unpack_read(session, - &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); - *sp = pv.u.s; + switch (pv.type) { + case 'S': + case 's': + WT_RET(__unpack_read(session, + &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); + *sp = pv.u.s; + break; + WT_ILLEGAL_VALUE(session); + } return (0); } +/* + * wiredtiger_unpack_uint -- + * Unpack an unsigned integer. + */ int wiredtiger_unpack_uint(WT_PACK_STREAM *ps, uint64_t *up) { @@ -160,8 +262,20 @@ wiredtiger_unpack_uint(WT_PACK_STREAM *ps, uint64_t *up) session = ps->pack.session; WT_RET(__pack_next(&ps->pack, &pv)); - WT_RET(__unpack_read(session, - &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); - *up = pv.u.u; + switch (pv.type) { + case 'B': + case 'H': + case 'I': + case 'L': + case 'Q': + case 'R': + case 'r': + case 't': + WT_RET(__unpack_read(session, + &pv, (const uint8_t **)&ps->p, (size_t)(ps->end - ps->p))); + *up = pv.u.u; + break; + WT_ILLEGAL_VALUE(session); + } return (0); } |