/* * __wt_struct_unpackv -- * Unpack a byte string (va_list version). */ int __wt_struct_unpackv(WT_SESSION_IMPL *session, const void *buffer, size_t size, const char *fmt, va_list ap) { WT_DECL_RET; WT_PACK pack; WT_PACK_VALUE pv; const uint8_t *p, *end; WT_RET(__pack_init(session, &pack, fmt)); p = buffer; end = p + size; WT_CLEAR(pv.u.item); /* GCC 4.6 lint */ while ((ret = __pack_next(&pack, &pv)) == 0) { WT_RET(__unpack_read(session, &pv, &p, (size_t)(end - p))); WT_UNPACK_PUT(session, pv, ap); } WT_ASSERT(session, p <= end); if (ret != WT_NOTFOUND) return (ret); return (0); }
/* * __wt_schema_project_out -- * Given list of cursors and a projection, read columns from the * dependent cursors and return them to the application. */ int __wt_schema_project_out(WT_SESSION_IMPL *session, WT_CURSOR **cp, const char *proj_arg, va_list ap) { WT_CURSOR *c; WT_DECL_PACK(pack); WT_DECL_PACK_VALUE(pv); u_long arg; char *proj; uint8_t *p, *end; p = end = NULL; /* -Wuninitialized */ for (proj = (char *)proj_arg; *proj != '\0'; proj++) { arg = strtoul(proj, &proj, 10); switch (*proj) { case WT_PROJ_KEY: c = cp[arg]; if (WT_CURSOR_RECNO(c)) { c->key.data = &c->recno; c->key.size = sizeof(c->recno); WT_RET(__pack_init(session, &pack, "R")); } else WT_RET(__pack_init( session, &pack, c->key_format)); p = (uint8_t *)c->key.data; end = p + c->key.size; continue; case WT_PROJ_VALUE: c = cp[arg]; WT_RET(__pack_init(session, &pack, c->value_format)); p = (uint8_t *)c->value.data; end = p + c->value.size; continue; } /* * Otherwise, the argument is a count, where a missing * count means a count of 1. */ for (arg = (arg == 0) ? 1 : arg; arg > 0; arg--) { switch (*proj) { case WT_PROJ_NEXT: case WT_PROJ_SKIP: case WT_PROJ_REUSE: WT_RET(__pack_next(&pack, &pv)); WT_RET(__unpack_read(session, &pv, (const uint8_t **)&p, (size_t)(end - p))); /* Only copy the value out once. */ if (*proj != WT_PROJ_NEXT) break; WT_UNPACK_PUT(session, pv, ap); break; } } } return (0); }