From af4164fb0e5f69d4107364c6cc7fd1862e00572b Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Tue, 18 Jun 2013 23:19:18 +0400 Subject: [PATCH] tuple-access: code review fixes Two significant changes (both arguable, since this patch is about taste by a large measure): 1) Split tuple_seek() into two: tuple_rewind() and tuple_seek(). tuple_rewind() simply initializes the iterator and sets it to 'before-first' position. tuple_seek() returns a field, and sets the iterator to the position after the returned field. Previosly there was only tuple_seek(), which required tuple_next() to get the field, and it was confusing whether or not tuple_next() after tuple_seek() is required. Indeed, the very code I chagned sometimes would call tuple_next() after tuple_seek() and sometimes would not. 2) Move the return value of the iterator outside of iteration state. The advantage of "binding" the out parameters of the iterator to iterator state is that you bind once, and don't need to supply out parameters into every call to tuple_next() function. It also makes it easy to add extra out parameters for bind in the future (field data type, flags, etc). This makes "binding" technique popular in database driver APIs. Binding makes API more stable, which is also important in drivers. In this case, however, binding adds for extra lines of code and (possibly) few extra instructions. Plus, since this is an internal API which we can change any day, its stability is not as important. So it seems that for now we're better of with an API which is a bit more concise/efficient, and can switch to using binding later, if needed. --- cmake/compiler.cmake | 1 - src/box/bitset_index.cc | 11 +- src/box/box_lua.cc | 55 +++-- src/box/space.cc | 16 +- src/box/tuple.cc | 139 ++++------- src/box/tuple.h | 67 ++--- src/memcached-grammar.cc | 515 ++++++++++++++++++++------------------- src/memcached-grammar.rl | 21 +- src/memcached.cc | 28 +-- 9 files changed, 417 insertions(+), 436 deletions(-) diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index bb1c13c4c8..4dda027c46 100644 --- a/cmake/compiler.cmake +++ b/cmake/compiler.cmake @@ -99,7 +99,6 @@ macro(enable_tnt_compile_flags) "-Wextra" "-Wno-sign-compare" "-Wno-strict-aliasing" - "-Wno-error=deprecated-declarations" ) if (CMAKE_COMPILER_IS_GNUCXX) diff --git a/src/box/bitset_index.cc b/src/box/bitset_index.cc index ec02153900..1b9070e3a5 100644 --- a/src/box/bitset_index.cc +++ b/src/box/bitset_index.cc @@ -219,14 +219,13 @@ BitsetIndex::replace(struct tuple *old_tuple, struct tuple *new_tuple, } if (new_tuple != NULL) { - const char *fb, *fe; - tuple_field(new_tuple, key_def->parts[0].fieldno, &fb, &fe); - size_t bitset_key_size = fe - fb; - const char *bitset_key = fb; + uint32_t len; + const char *field; + field = tuple_field(new_tuple, key_def->parts[0].fieldno, + &len); size_t value = tuple_to_value(new_tuple); - if (bitset_index_insert(&index, bitset_key, - bitset_key_size, value) < 0) { + if (bitset_index_insert(&index, field, len, value) < 0) { tnt_raise(ClientError, ER_MEMORY_ISSUE, 0, "BitsetIndex", "insert"); } diff --git a/src/box/box_lua.cc b/src/box/box_lua.cc index 6791bdec12..bd1e0b4304 100644 --- a/src/box/box_lua.cc +++ b/src/box/box_lua.cc @@ -167,14 +167,17 @@ lbox_tuple_slice(struct lua_State *L) u32 stop = end - 1; struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, tuple, 0, &fb, &fe); - for (uint32_t field_no = 0; tuple_next(&it); field_no++) { + tuple_rewind(&it, tuple); + const char *field; + uint32_t len; + uint32_t field_no = 0; + while ((field = tuple_next(&it, &len))) { if (field_no >= start) { - lua_pushlstring(L, fb, fe - fb); + lua_pushlstring(L, field, len); if (field_no == stop) break; } + ++field_no; } return end - start; } @@ -327,15 +330,13 @@ tuple_find(struct lua_State *L, struct tuple *tuple, size_t offset, { int top = lua_gettop(L); int idx = offset; - if (idx >= tuple->field_count) - return 0; struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, tuple, idx, &fb, &fe); - while (tuple_next(&it)) { - uint32_t len = fe - fb; - if (len == key_size && (memcmp(fb, key, len) == 0)) { + tuple_rewind(&it, tuple); + uint32_t len; + const char *field = tuple_seek(&it, idx, &len); + for (; field; field = tuple_next(&it, &len)) { + if (len == key_size && (memcmp(field, key, len) == 0)) { lua_pushinteger(L, idx); if (!all) break; @@ -401,11 +402,12 @@ lbox_tuple_unpack(struct lua_State *L) struct tuple *tuple = lua_checktuple(L, 1); struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, tuple, 0, &fb, &fe); - while (tuple_next(&it)) { - lua_pushlstring(L, fb, fe - fb); - } + tuple_rewind(&it, tuple); + const char *field; + uint32_t len; + while ((field = tuple_next(&it, &len))) + lua_pushlstring(L, field, len); + assert(lua_gettop(L) == tuple->field_count + 1); return tuple->field_count; } @@ -418,11 +420,12 @@ lbox_tuple_totable(struct lua_State *L) int index = 1; struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, tuple, 0, &fb, &fe); - while (tuple_next(&it)) { + tuple_rewind(&it, tuple); + const char *field; + uint32_t len; + while ((field = tuple_next(&it, &len))) { lua_pushnumber(L, index++); - lua_pushlstring(L, fb, fe - fb); + lua_pushlstring(L, field, len); lua_rawset(L, -3); } return 1; @@ -445,9 +448,9 @@ lbox_tuple_index(struct lua_State *L) if (i >= tuple->field_count) luaL_error(L, "%s: index %d is out of bounds (0..%d)", tuplelib_name, i, tuple->field_count-1); - const char *fb, *fe; - tuple_field(tuple, i, &fb, &fe); - lua_pushlstring(L, fb, fe - fb); + uint32_t len; + const char *field = tuple_field(tuple, i, &len); + lua_pushlstring(L, field, len); return 1; } /* If we got a string, try to find a method for it. */ @@ -507,10 +510,10 @@ lbox_tuple_next(struct lua_State *L) return 1; } - const char *fb, *fe; - tuple_field(tuple, field_no, &fb, &fe); + uint32_t len; + const char *field = tuple_field(tuple, field_no, &len); lua_pushinteger(L, field_no + 1); - lua_pushlstring(L, fb, fe - fb); + lua_pushlstring(L, field, len); return 2; } diff --git a/src/box/space.cc b/src/box/space.cc index 58e8a2d86e..52f6d24de8 100644 --- a/src/box/space.cc +++ b/src/box/space.cc @@ -176,23 +176,27 @@ space_validate_tuple(struct space *sp, struct tuple *new_tuple) /* Sweep through the tuple and check the field sizes. */ struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, new_tuple, 0, &fb, &fe); - for (uint32_t f = 0; f < sp->max_fieldno && tuple_next(&it); f++) { + tuple_rewind(&it, new_tuple); + const char *field; + uint32_t len; + uint32_t fieldno = 0; + while ((field = tuple_next(&it, &len))) { + if (fieldno == sp->max_fieldno) + break; /* * Check fixed size fields (NUM and NUM64) and * skip undefined size fields (STRING and UNKNOWN). */ - uint32_t len = fe - fb; - if (sp->field_types[f] == NUM) { + if (sp->field_types[fieldno] == NUM) { if (len != sizeof(u32)) tnt_raise(ClientError, ER_KEY_FIELD_TYPE, "u32"); - } else if (sp->field_types[f] == NUM64) { + } else if (sp->field_types[fieldno] == NUM64) { if (len != sizeof(u64)) tnt_raise(ClientError, ER_KEY_FIELD_TYPE, "u64"); } + fieldno++; } } diff --git a/src/box/tuple.cc b/src/box/tuple.cc index c0d8506a00..678806eedb 100644 --- a/src/box/tuple.cc +++ b/src/box/tuple.cc @@ -75,119 +75,84 @@ tuple_ref(struct tuple *tuple, int count) tuple_free(tuple); } -/** Get the next field from a tuple */ -static const char * -next_field(const char *f) -{ - u32 size = load_varint32(&f); - return f + size; -} - /** * Get a field from tuple. * + * @pre field < tuple->field_count. * @returns field data if field exists or NULL */ const char * tuple_field_old(struct tuple *tuple, u32 i) { const char *field = tuple->data; - - if (i >= tuple->field_count) - return NULL; - - while (i-- > 0) - field = next_field(field); - - return field; + const char *tuple_end = tuple->data + tuple->bsize; + + while (field < tuple_end) { + if (i == 0) + return field; + uint32_t len = load_varint32(&field); + field += len; + i--; + } + return tuple_end; } -void -tuple_field(const struct tuple *tuple, uint32_t field_no, - const char **begin, const char **end) +const char * +tuple_field(const struct tuple *tuple, uint32_t field_no, uint32_t *len) { - const char *data = tuple->data; - - if (field_no >= tuple->field_count) - tnt_raise(IllegalParams, "field_no is out of range"); - - while (field_no-- > 0) - data = next_field(data); - - uint32_t len = load_varint32(&data); - *begin = data; - *end = data + len; + const char *field = tuple_field_old((struct tuple *) tuple, field_no); + if (field < tuple->data + tuple->bsize) { + *len = load_varint32(&field); + return field; + } + return NULL; } -void -tuple_seek(struct tuple_iterator *it, const struct tuple *tuple, - uint32_t field_no, const char **begin, const char **end) +const char * +tuple_seek(struct tuple_iterator *it, uint32_t field_no, uint32_t *len) { - const char *data = tuple->data; - - if (field_no >= tuple->field_count) - tnt_raise(IllegalParams, "field_no is out of range"); - - while (field_no-- > 0) - data = next_field(data); - - it->tuple = tuple; - it->cur = data; - it->begin = begin; - it->end = end; - *it->begin = NULL; - *it->end = NULL; + it->pos = tuple_field_old((struct tuple *) it->tuple, field_no); + return tuple_next(it, len); } -struct tuple_iterator * -tuple_next(struct tuple_iterator *it) +const char * +tuple_next(struct tuple_iterator *it, uint32_t *len) { - if (it->cur == it->tuple->data + it->tuple->bsize) { - /* No more fields in the tuple*/ - it->cur = NULL; - return NULL; - } else if (it->cur == NULL) { - /* Sanity check: second call to next() is invalid */ - tnt_raise(IllegalParams, "field_no is out of range"); - } - - uint32_t len = load_varint32(&it->cur); - *it->begin = it->cur; - *it->end = it->cur + len; - it->cur += len; - - if (it->cur <= it->tuple->data + it->tuple->bsize) { - return it; - } else /* it->cur > it->tuple->data + it->tuple->bsize */ { - tnt_raise(IllegalParams, "invalid tuple"); + const char *tuple_end = it->tuple->data + it->tuple->bsize; + if (it->pos < tuple_end) { + *len = load_varint32(&it->pos); + const char *field = it->pos; + it->pos += *len; + assert(it->pos <= tuple_end); + return field; } + return NULL; } - /** print field to tbuf */ static void -print_field(struct tbuf *buf, const char *f, const char *end) +print_field(struct tbuf *buf, const char *field, uint32_t len) { - uint32_t size = (end - f); - switch (size) { + switch (len) { case 2: - tbuf_printf(buf, "%hu", *(u16 *)f); + tbuf_printf(buf, "%hu", *(u16 *)field); break; case 4: - tbuf_printf(buf, "%u", *(u32 *)f); + tbuf_printf(buf, "%u", *(u32 *)field); break; case 8: - tbuf_printf(buf, "%" PRIu64, *(u64 *)f); + tbuf_printf(buf, "%" PRIu64, *(u64 *)field); break; default: tbuf_printf(buf, "'"); - while (size-- > 0) { - if (0x20 <= *(u8 *)f && *(u8 *)f < 0x7f) { - tbuf_printf(buf, "%c", *(u8 *) f); + const char *field_end = field + len; + while (field < field_end) { + if (0x20 <= *(u8 *)field && *(u8 *)field < 0x7f) { + tbuf_printf(buf, "%c", *(u8 *) field); } else { - tbuf_printf(buf, "\\x%02X", *(u8 *)f); + tbuf_printf(buf, "\\x%02X", *(u8 *)field); } - f++; + field++; } tbuf_printf(buf, "'"); break; @@ -207,18 +172,18 @@ tuple_print(struct tbuf *buf, const struct tuple *tuple) } struct tuple_iterator it; - const char *fb, *fe; - tuple_seek(&it, tuple, 0, &fb, &fe); - tuple_next(&it); - print_field(buf, fb, fe); + const char *field; + uint32_t len; + tuple_rewind(&it, tuple); + field = tuple_next(&it, &len); + print_field(buf, field, len); tbuf_printf(buf, ": {"); uint32_t field_no = 1; - for (; tuple_next(&it); field_no++) { - print_field(buf, fb, fe); - if (likely(field_no + 1 < tuple->field_count)) { + while ((field = tuple_next(&it, &len))) { + print_field(buf, field, len); + if (likely(++field_no < tuple->field_count)) tbuf_printf(buf, ", "); - } } assert (field_no == tuple->field_count); diff --git a/src/box/tuple.h b/src/box/tuple.h index e2d67798a5..0fe896f8dc 100644 --- a/src/box/tuple.h +++ b/src/box/tuple.h @@ -76,69 +76,72 @@ tuple_ref(struct tuple *tuple, int count); * * @returns field data if the field exists, or NULL */ -__attribute__((deprecated)) const char * +const char * tuple_field_old(struct tuple *tuple, u32 i); /** * @brief Return field data of the field * @param tuple tuple * @param field_no field number - * @param begin pointer where the start of field data will be stored - * @param end pointer where the end of field data + 1 will be stored + * @param field pointer where the start of field data will be stored + * @param len pointer where the len of the field will be stored * @throws IllegalParams if \a field_no is out of range */ -void -tuple_field(const struct tuple *tuple, uint32_t field_no, - const char **begin, const char **end); +const char * +tuple_field(const struct tuple *tuple, uint32_t field_no, uint32_t *len); /** * @brief Tuple Interator */ struct tuple_iterator { /** @cond false **/ - /* Result */ - const char **begin; - const char **end; /* State */ const struct tuple *tuple; - const char *cur; + /** Always points to the beginning of the next field. */ + const char *pos; /** @endcond **/ }; /** - * @brief Seek tuple iterator to position \a field_no + * @brief Initialize an iterator over tuple fields * * A workflow example: * @code * struct tuple_iterator it; - * const char *fb, *fe; - * tuple_seek(&it, tuple, 0, &fb, &fe); - * while (tuple_next(&it)) { - * // field_data = fb - * // field_size = fe-fb - * lua_pushlstring(L, fb, fe - fb); - * } + * tuple_rewind(&it, tuple); + * const char *field; + * uint32_t len; + * while ((field = tuple_next(&it, &len))) + * lua_pushlstring(L, field, len); + * * @endcode * - * @param it tuple iterator - * @param tuple tuple - * @param field_no a field number to seek - * @param begin pointer where the start of field data will be stored - * @param end pointer where the end of field data + 1 will be stored + * @param[out] it tuple iterator + * @param[in] tuple tuple */ -void -tuple_seek(struct tuple_iterator *it, const struct tuple *tuple, - uint32_t field_no, const char **begin, const char **end); +static inline void +tuple_rewind(struct tuple_iterator *it, const struct tuple *tuple) +{ + it->tuple = tuple; + it->pos = tuple->data; +} + +/** + * @brief Position the iterator at a given field no. + * + * @retval field if the iterator has the requested field + * @retval NULL otherwise (iteration is out of range) + */ +const char * +tuple_seek(struct tuple_iterator *it, uint32_t field_no, uint32_t *len); /** - * @brief Iterate to the next position + * @brief Iterate to the next field * @param it tuple iterator - * @retval \a it if the iterator has tuple - * @retval NULL if where is no more tuples (values of \a begin \a end - * are not specifed in this case) + * @return next field or NULL if the iteration is out of range */ -struct tuple_iterator * -tuple_next(struct tuple_iterator *it); +const char * +tuple_next(struct tuple_iterator *it, uint32_t *len); /** * @brief Print a tuple in yaml-compatible mode to tbuf: diff --git a/src/memcached-grammar.cc b/src/memcached-grammar.cc index 8f8515f4c2..a4f5c6e306 100644 --- a/src/memcached-grammar.cc +++ b/src/memcached-grammar.cc @@ -146,7 +146,7 @@ case 5: goto st0; goto tr15; tr15: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -176,7 +176,7 @@ case 7: goto tr17; goto st0; tr17: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st8; st8: @@ -190,7 +190,7 @@ case 8: goto st8; goto st0; tr18: -#line 241 "src/memcached-grammar.rl" +#line 244 "src/memcached-grammar.rl" {flags = memcached_natoq(fstart, p);} goto st9; st9: @@ -204,7 +204,7 @@ case 9: goto tr21; goto st0; tr21: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st10; st10: @@ -218,7 +218,7 @@ case 10: goto st10; goto st0; tr22: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -236,7 +236,7 @@ case 11: goto tr25; goto st0; tr25: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st12; st12: @@ -253,11 +253,11 @@ case 12: goto st12; goto st0; tr26: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -280,7 +280,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -297,9 +297,9 @@ case 12: } goto st197; tr30: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -322,7 +322,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -339,11 +339,11 @@ case 12: } goto st197; tr39: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -366,7 +366,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -383,11 +383,11 @@ case 12: } goto st197; tr58: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -410,7 +410,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -419,33 +419,34 @@ case 12: #line 97 "src/memcached-grammar.rl" { struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); if (tuple == NULL) { obuf_dup(out, "NOT_STORED\r\n", 12); } else { - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); b = tbuf_new(fiber->gc_pool); if (append) { - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); tbuf_append(b, data, bytes); } else { tbuf_append(b, data, bytes); - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); } - bytes += (fe - fb); + bytes += field_len; data = b->data; STORE; } } goto st197; tr62: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -468,7 +469,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -477,35 +478,36 @@ case 12: #line 97 "src/memcached-grammar.rl" { struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); if (tuple == NULL) { obuf_dup(out, "NOT_STORED\r\n", 12); } else { - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); b = tbuf_new(fiber->gc_pool); if (append) { - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); tbuf_append(b, data, bytes); } else { tbuf_append(b, data, bytes); - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); } - bytes += (fe - fb); + bytes += field_len; data = b->data; STORE; } } goto st197; tr71: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -528,7 +530,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -537,35 +539,36 @@ case 12: #line 97 "src/memcached-grammar.rl" { struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); if (tuple == NULL) { obuf_dup(out, "NOT_STORED\r\n", 12); } else { - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); b = tbuf_new(fiber->gc_pool); if (append) { - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); tbuf_append(b, data, bytes); } else { tbuf_append(b, data, bytes); - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); } - bytes += (fe - fb); + bytes += field_len; data = b->data; STORE; } } goto st197; tr91: -#line 243 "src/memcached-grammar.rl" +#line 246 "src/memcached-grammar.rl" {cas = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -588,7 +591,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -607,9 +610,9 @@ case 12: } goto st197; tr95: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -632,7 +635,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -651,11 +654,11 @@ case 12: } goto st197; tr105: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -678,7 +681,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -697,21 +700,22 @@ case 12: } goto st197; tr118: -#line 244 "src/memcached-grammar.rl" +#line 247 "src/memcached-grammar.rl" {incr = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 122 "src/memcached-grammar.rl" +#line 123 "src/memcached-grammar.rl" { struct meta *m; struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; u64 value; key = tbuf_read_field(keys); @@ -720,10 +724,11 @@ case 12: obuf_dup(out, "NOT_FOUND\r\n", 11); } else { m = memcached_meta(tuple); - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); - if (memcached_is_numeric(fb, fe - fb)) { - value = memcached_natoq(fb, fe); + if (memcached_is_numeric(field, field_len)) { + value = memcached_natoq(field, + field + field_len); if (incr_sign > 0) { value += incr; @@ -761,19 +766,20 @@ case 12: } goto st197; tr122: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 122 "src/memcached-grammar.rl" +#line 123 "src/memcached-grammar.rl" { struct meta *m; struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; u64 value; key = tbuf_read_field(keys); @@ -782,10 +788,11 @@ case 12: obuf_dup(out, "NOT_FOUND\r\n", 11); } else { m = memcached_meta(tuple); - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); - if (memcached_is_numeric(fb, fe - fb)) { - value = memcached_natoq(fb, fe); + if (memcached_is_numeric(field, field_len)) { + value = memcached_natoq(field, + field + field_len); if (incr_sign > 0) { value += incr; @@ -823,21 +830,22 @@ case 12: } goto st197; tr132: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 122 "src/memcached-grammar.rl" +#line 123 "src/memcached-grammar.rl" { struct meta *m; struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; u64 value; key = tbuf_read_field(keys); @@ -846,10 +854,11 @@ case 12: obuf_dup(out, "NOT_FOUND\r\n", 11); } else { m = memcached_meta(tuple); - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); - if (memcached_is_numeric(fb, fe - fb)) { - value = memcached_natoq(fb, fe); + if (memcached_is_numeric(field, field_len)) { + value = memcached_natoq(field, + field + field_len); if (incr_sign > 0) { value += incr; @@ -887,15 +896,15 @@ case 12: } goto st197; tr141: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 174 "src/memcached-grammar.rl" +#line 177 "src/memcached-grammar.rl" { key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); @@ -915,21 +924,21 @@ case 12: } goto st197; tr146: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) exptime = exptime + ev_now(); } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 174 "src/memcached-grammar.rl" +#line 177 "src/memcached-grammar.rl" { key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); @@ -949,17 +958,17 @@ case 12: } goto st197; tr157: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 174 "src/memcached-grammar.rl" +#line 177 "src/memcached-grammar.rl" { key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); @@ -979,15 +988,15 @@ case 12: } goto st197; tr169: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 203 "src/memcached-grammar.rl" +#line 206 "src/memcached-grammar.rl" { struct fiber *f = fiber_new("flush_all", memcached_flush_all); @@ -996,17 +1005,17 @@ case 12: } goto st197; tr174: -#line 245 "src/memcached-grammar.rl" +#line 248 "src/memcached-grammar.rl" {flush_delay = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 203 "src/memcached-grammar.rl" +#line 206 "src/memcached-grammar.rl" { struct fiber *f = fiber_new("flush_all", memcached_flush_all); @@ -1015,17 +1024,17 @@ case 12: } goto st197; tr185: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 203 "src/memcached-grammar.rl" +#line 206 "src/memcached-grammar.rl" { struct fiber *f = fiber_new("flush_all", memcached_flush_all); @@ -1034,15 +1043,15 @@ case 12: } goto st197; tr195: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 192 "src/memcached-grammar.rl" +#line 195 "src/memcached-grammar.rl" { try { memcached_get(out, keys_count, keys, show_cas); @@ -1055,25 +1064,25 @@ case 12: } goto st197; tr213: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 214 "src/memcached-grammar.rl" +#line 217 "src/memcached-grammar.rl" { return -1; } goto st197; tr233: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1096,7 +1105,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1113,9 +1122,9 @@ case 12: } goto st197; tr237: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1138,7 +1147,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1155,11 +1164,11 @@ case 12: } goto st197; tr246: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1182,7 +1191,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1199,11 +1208,11 @@ case 12: } goto st197; tr263: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1226,7 +1235,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1239,9 +1248,9 @@ case 12: } goto st197; tr267: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1264,7 +1273,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1277,11 +1286,11 @@ case 12: } goto st197; tr276: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 247 "src/memcached-grammar.rl" +#line 250 "src/memcached-grammar.rl" { size_t parsed = p - in->pos; while (ibuf_size(in) - parsed < bytes + 2) { @@ -1304,7 +1313,7 @@ case 12: goto exit; } } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; @@ -1317,15 +1326,15 @@ case 12: } goto st197; tr281: -#line 276 "src/memcached-grammar.rl" +#line 279 "src/memcached-grammar.rl" { p++; } -#line 270 "src/memcached-grammar.rl" +#line 273 "src/memcached-grammar.rl" { done = true; stats.bytes_read += p - in->pos; in->pos = p; } -#line 210 "src/memcached-grammar.rl" +#line 213 "src/memcached-grammar.rl" { memcached_print_stats(out); } @@ -1334,33 +1343,33 @@ case 12: if ( ++p == pe ) goto _test_eof197; case 197: -#line 1338 "src/memcached-grammar.cc" +#line 1347 "src/memcached-grammar.cc" goto st0; tr27: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st13; tr40: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st13; st13: if ( ++p == pe ) goto _test_eof13; case 13: -#line 1352 "src/memcached-grammar.cc" +#line 1361 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr30; goto st0; tr28: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st14; st14: if ( ++p == pe ) goto _test_eof14; case 14: -#line 1364 "src/memcached-grammar.cc" +#line 1373 "src/memcached-grammar.cc" switch( (*p) ) { case 32: goto st14; case 78: goto st15; @@ -1474,18 +1483,18 @@ case 26: goto tr45; goto st0; tr45: -#line 284 "src/memcached-grammar.rl" +#line 287 "src/memcached-grammar.rl" {append = true; } goto st27; tr209: -#line 285 "src/memcached-grammar.rl" +#line 288 "src/memcached-grammar.rl" {append = false;} goto st27; st27: if ( ++p == pe ) goto _test_eof27; case 27: -#line 1489 "src/memcached-grammar.cc" +#line 1498 "src/memcached-grammar.cc" switch( (*p) ) { case 13: goto st0; case 32: goto st27; @@ -1494,7 +1503,7 @@ case 27: goto st0; goto tr46; tr46: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -1510,7 +1519,7 @@ case 27: if ( ++p == pe ) goto _test_eof28; case 28: -#line 1514 "src/memcached-grammar.cc" +#line 1523 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st29; goto st0; @@ -1524,49 +1533,49 @@ case 29: goto tr49; goto st0; tr49: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st30; st30: if ( ++p == pe ) goto _test_eof30; case 30: -#line 1535 "src/memcached-grammar.cc" +#line 1544 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr50; if ( 48 <= (*p) && (*p) <= 57 ) goto st30; goto st0; tr50: -#line 241 "src/memcached-grammar.rl" +#line 244 "src/memcached-grammar.rl" {flags = memcached_natoq(fstart, p);} goto st31; st31: if ( ++p == pe ) goto _test_eof31; case 31: -#line 1549 "src/memcached-grammar.cc" +#line 1558 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st31; if ( 48 <= (*p) && (*p) <= 57 ) goto tr53; goto st0; tr53: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st32; st32: if ( ++p == pe ) goto _test_eof32; case 32: -#line 1563 "src/memcached-grammar.cc" +#line 1572 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr54; if ( 48 <= (*p) && (*p) <= 57 ) goto st32; goto st0; tr54: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -1577,21 +1586,21 @@ case 32: if ( ++p == pe ) goto _test_eof33; case 33: -#line 1581 "src/memcached-grammar.cc" +#line 1590 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st33; if ( 48 <= (*p) && (*p) <= 57 ) goto tr57; goto st0; tr57: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st34; st34: if ( ++p == pe ) goto _test_eof34; case 34: -#line 1595 "src/memcached-grammar.cc" +#line 1604 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr58; case 13: goto tr59; @@ -1601,30 +1610,30 @@ case 34: goto st34; goto st0; tr59: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st35; tr72: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st35; st35: if ( ++p == pe ) goto _test_eof35; case 35: -#line 1616 "src/memcached-grammar.cc" +#line 1625 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr62; goto st0; tr60: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st36; st36: if ( ++p == pe ) goto _test_eof36; case 36: -#line 1628 "src/memcached-grammar.cc" +#line 1637 "src/memcached-grammar.cc" switch( (*p) ) { case 32: goto st36; case 78: goto st37; @@ -1731,7 +1740,7 @@ case 47: goto st0; goto tr76; tr76: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -1747,7 +1756,7 @@ case 47: if ( ++p == pe ) goto _test_eof48; case 48: -#line 1751 "src/memcached-grammar.cc" +#line 1760 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st49; goto st0; @@ -1761,49 +1770,49 @@ case 49: goto tr78; goto st0; tr78: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st50; st50: if ( ++p == pe ) goto _test_eof50; case 50: -#line 1772 "src/memcached-grammar.cc" +#line 1781 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr79; if ( 48 <= (*p) && (*p) <= 57 ) goto st50; goto st0; tr79: -#line 241 "src/memcached-grammar.rl" +#line 244 "src/memcached-grammar.rl" {flags = memcached_natoq(fstart, p);} goto st51; st51: if ( ++p == pe ) goto _test_eof51; case 51: -#line 1786 "src/memcached-grammar.cc" +#line 1795 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st51; if ( 48 <= (*p) && (*p) <= 57 ) goto tr82; goto st0; tr82: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st52; st52: if ( ++p == pe ) goto _test_eof52; case 52: -#line 1800 "src/memcached-grammar.cc" +#line 1809 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr83; if ( 48 <= (*p) && (*p) <= 57 ) goto st52; goto st0; tr83: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -1814,49 +1823,49 @@ case 52: if ( ++p == pe ) goto _test_eof53; case 53: -#line 1818 "src/memcached-grammar.cc" +#line 1827 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st53; if ( 48 <= (*p) && (*p) <= 57 ) goto tr86; goto st0; tr86: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st54; st54: if ( ++p == pe ) goto _test_eof54; case 54: -#line 1832 "src/memcached-grammar.cc" +#line 1841 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr87; if ( 48 <= (*p) && (*p) <= 57 ) goto st54; goto st0; tr87: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st55; st55: if ( ++p == pe ) goto _test_eof55; case 55: -#line 1846 "src/memcached-grammar.cc" +#line 1855 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st55; if ( 48 <= (*p) && (*p) <= 57 ) goto tr90; goto st0; tr90: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st56; st56: if ( ++p == pe ) goto _test_eof56; case 56: -#line 1860 "src/memcached-grammar.cc" +#line 1869 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr91; case 13: goto tr92; @@ -1866,30 +1875,30 @@ case 56: goto st56; goto st0; tr106: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st57; tr92: -#line 243 "src/memcached-grammar.rl" +#line 246 "src/memcached-grammar.rl" {cas = memcached_natoq(fstart, p);} goto st57; st57: if ( ++p == pe ) goto _test_eof57; case 57: -#line 1881 "src/memcached-grammar.cc" +#line 1890 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr95; goto st0; tr93: -#line 243 "src/memcached-grammar.rl" +#line 246 "src/memcached-grammar.rl" {cas = memcached_natoq(fstart, p);} goto st58; st58: if ( ++p == pe ) goto _test_eof58; case 58: -#line 1893 "src/memcached-grammar.cc" +#line 1902 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr95; case 13: goto st57; @@ -1963,14 +1972,14 @@ case 65: } goto st0; tr107: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st66; st66: if ( ++p == pe ) goto _test_eof66; case 66: -#line 1974 "src/memcached-grammar.cc" +#line 1983 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr95; case 13: goto st57; @@ -2014,18 +2023,18 @@ case 70: goto tr113; goto st0; tr113: -#line 293 "src/memcached-grammar.rl" +#line 296 "src/memcached-grammar.rl" {incr_sign = -1;} goto st71; tr202: -#line 292 "src/memcached-grammar.rl" +#line 295 "src/memcached-grammar.rl" {incr_sign = 1; } goto st71; st71: if ( ++p == pe ) goto _test_eof71; case 71: -#line 2029 "src/memcached-grammar.cc" +#line 2038 "src/memcached-grammar.cc" switch( (*p) ) { case 13: goto st0; case 32: goto st71; @@ -2034,7 +2043,7 @@ case 71: goto st0; goto tr114; tr114: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -2050,7 +2059,7 @@ case 71: if ( ++p == pe ) goto _test_eof72; case 72: -#line 2054 "src/memcached-grammar.cc" +#line 2063 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st73; goto st0; @@ -2064,14 +2073,14 @@ case 73: goto tr117; goto st0; tr117: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st74; st74: if ( ++p == pe ) goto _test_eof74; case 74: -#line 2075 "src/memcached-grammar.cc" +#line 2084 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr118; case 13: goto tr119; @@ -2081,30 +2090,30 @@ case 74: goto st74; goto st0; tr133: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st75; tr119: -#line 244 "src/memcached-grammar.rl" +#line 247 "src/memcached-grammar.rl" {incr = memcached_natoq(fstart, p);} goto st75; st75: if ( ++p == pe ) goto _test_eof75; case 75: -#line 2096 "src/memcached-grammar.cc" +#line 2105 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr122; goto st0; tr120: -#line 244 "src/memcached-grammar.rl" +#line 247 "src/memcached-grammar.rl" {incr = memcached_natoq(fstart, p);} goto st76; st76: if ( ++p == pe ) goto _test_eof76; case 76: -#line 2108 "src/memcached-grammar.cc" +#line 2117 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr122; case 13: goto st75; @@ -2178,14 +2187,14 @@ case 83: } goto st0; tr134: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st84; st84: if ( ++p == pe ) goto _test_eof84; case 84: -#line 2189 "src/memcached-grammar.cc" +#line 2198 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr122; case 13: goto st75; @@ -2238,7 +2247,7 @@ case 89: goto st0; goto tr140; tr140: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -2254,7 +2263,7 @@ case 89: if ( ++p == pe ) goto _test_eof90; case 90: -#line 2258 "src/memcached-grammar.cc" +#line 2267 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr141; case 13: goto st91; @@ -2262,7 +2271,7 @@ case 90: } goto st0; tr147: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -2270,14 +2279,14 @@ case 90: } goto st91; tr158: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st91; st91: if ( ++p == pe ) goto _test_eof91; case 91: -#line 2281 "src/memcached-grammar.cc" +#line 2290 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr141; goto st0; @@ -2296,14 +2305,14 @@ case 92: goto tr144; goto st0; tr144: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st93; st93: if ( ++p == pe ) goto _test_eof93; case 93: -#line 2307 "src/memcached-grammar.cc" +#line 2316 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr146; case 13: goto tr147; @@ -2313,7 +2322,7 @@ case 93: goto st93; goto st0; tr148: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -2324,7 +2333,7 @@ case 93: if ( ++p == pe ) goto _test_eof94; case 94: -#line 2328 "src/memcached-grammar.cc" +#line 2337 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr141; case 13: goto st91; @@ -2398,14 +2407,14 @@ case 101: } goto st0; tr159: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st102; st102: if ( ++p == pe ) goto _test_eof102; case 102: -#line 2409 "src/memcached-grammar.cc" +#line 2418 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr141; case 13: goto st91; @@ -2493,18 +2502,18 @@ case 111: } goto st0; tr186: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st112; tr175: -#line 245 "src/memcached-grammar.rl" +#line 248 "src/memcached-grammar.rl" {flush_delay = memcached_natoq(fstart, p);} goto st112; st112: if ( ++p == pe ) goto _test_eof112; case 112: -#line 2508 "src/memcached-grammar.cc" +#line 2517 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr169; goto st0; @@ -2523,14 +2532,14 @@ case 113: goto tr172; goto st0; tr172: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st114; st114: if ( ++p == pe ) goto _test_eof114; case 114: -#line 2534 "src/memcached-grammar.cc" +#line 2543 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr174; case 13: goto tr175; @@ -2540,14 +2549,14 @@ case 114: goto st114; goto st0; tr176: -#line 245 "src/memcached-grammar.rl" +#line 248 "src/memcached-grammar.rl" {flush_delay = memcached_natoq(fstart, p);} goto st115; st115: if ( ++p == pe ) goto _test_eof115; case 115: -#line 2551 "src/memcached-grammar.cc" +#line 2560 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr169; case 13: goto st112; @@ -2621,14 +2630,14 @@ case 122: } goto st0; tr187: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st123; st123: if ( ++p == pe ) goto _test_eof123; case 123: -#line 2632 "src/memcached-grammar.cc" +#line 2641 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr169; case 13: goto st112; @@ -2664,18 +2673,18 @@ case 126: } goto st0; tr191: -#line 289 "src/memcached-grammar.rl" +#line 292 "src/memcached-grammar.rl" {show_cas = false;} goto st127; tr198: -#line 290 "src/memcached-grammar.rl" +#line 293 "src/memcached-grammar.rl" {show_cas = true;} goto st127; st127: if ( ++p == pe ) goto _test_eof127; case 127: -#line 2679 "src/memcached-grammar.cc" +#line 2688 "src/memcached-grammar.cc" switch( (*p) ) { case 13: goto st0; case 32: goto st127; @@ -2684,7 +2693,7 @@ case 127: goto st0; goto tr193; tr193: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -2700,7 +2709,7 @@ case 127: if ( ++p == pe ) goto _test_eof128; case 128: -#line 2704 "src/memcached-grammar.cc" +#line 2713 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr195; case 13: goto st129; @@ -2943,7 +2952,7 @@ case 155: goto st0; goto tr222; tr222: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -2959,7 +2968,7 @@ case 155: if ( ++p == pe ) goto _test_eof156; case 156: -#line 2963 "src/memcached-grammar.cc" +#line 2972 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st157; goto st0; @@ -2973,49 +2982,49 @@ case 157: goto tr224; goto st0; tr224: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st158; st158: if ( ++p == pe ) goto _test_eof158; case 158: -#line 2984 "src/memcached-grammar.cc" +#line 2993 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr225; if ( 48 <= (*p) && (*p) <= 57 ) goto st158; goto st0; tr225: -#line 241 "src/memcached-grammar.rl" +#line 244 "src/memcached-grammar.rl" {flags = memcached_natoq(fstart, p);} goto st159; st159: if ( ++p == pe ) goto _test_eof159; case 159: -#line 2998 "src/memcached-grammar.cc" +#line 3007 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st159; if ( 48 <= (*p) && (*p) <= 57 ) goto tr228; goto st0; tr228: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st160; st160: if ( ++p == pe ) goto _test_eof160; case 160: -#line 3012 "src/memcached-grammar.cc" +#line 3021 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr229; if ( 48 <= (*p) && (*p) <= 57 ) goto st160; goto st0; tr229: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -3026,21 +3035,21 @@ case 160: if ( ++p == pe ) goto _test_eof161; case 161: -#line 3030 "src/memcached-grammar.cc" +#line 3039 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st161; if ( 48 <= (*p) && (*p) <= 57 ) goto tr232; goto st0; tr232: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st162; st162: if ( ++p == pe ) goto _test_eof162; case 162: -#line 3044 "src/memcached-grammar.cc" +#line 3053 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr233; case 13: goto tr234; @@ -3050,30 +3059,30 @@ case 162: goto st162; goto st0; tr234: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st163; tr247: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st163; st163: if ( ++p == pe ) goto _test_eof163; case 163: -#line 3065 "src/memcached-grammar.cc" +#line 3074 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr237; goto st0; tr235: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st164; st164: if ( ++p == pe ) goto _test_eof164; case 164: -#line 3077 "src/memcached-grammar.cc" +#line 3086 "src/memcached-grammar.cc" switch( (*p) ) { case 32: goto st164; case 78: goto st165; @@ -3182,7 +3191,7 @@ case 175: goto st0; goto tr252; tr252: -#line 219 "src/memcached-grammar.rl" +#line 222 "src/memcached-grammar.rl" { fstart = p; for (; p < pe && *p != ' ' && *p != '\r' && *p != '\n'; p++); @@ -3198,7 +3207,7 @@ case 175: if ( ++p == pe ) goto _test_eof176; case 176: -#line 3202 "src/memcached-grammar.cc" +#line 3211 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st177; goto st0; @@ -3212,49 +3221,49 @@ case 177: goto tr254; goto st0; tr254: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st178; st178: if ( ++p == pe ) goto _test_eof178; case 178: -#line 3223 "src/memcached-grammar.cc" +#line 3232 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr255; if ( 48 <= (*p) && (*p) <= 57 ) goto st178; goto st0; tr255: -#line 241 "src/memcached-grammar.rl" +#line 244 "src/memcached-grammar.rl" {flags = memcached_natoq(fstart, p);} goto st179; st179: if ( ++p == pe ) goto _test_eof179; case 179: -#line 3237 "src/memcached-grammar.cc" +#line 3246 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st179; if ( 48 <= (*p) && (*p) <= 57 ) goto tr258; goto st0; tr258: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st180; st180: if ( ++p == pe ) goto _test_eof180; case 180: -#line 3251 "src/memcached-grammar.cc" +#line 3260 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto tr259; if ( 48 <= (*p) && (*p) <= 57 ) goto st180; goto st0; tr259: -#line 234 "src/memcached-grammar.rl" +#line 237 "src/memcached-grammar.rl" { exptime = memcached_natoq(fstart, p); if (exptime > 0 && exptime <= 60*60*24*30) @@ -3265,21 +3274,21 @@ case 180: if ( ++p == pe ) goto _test_eof181; case 181: -#line 3269 "src/memcached-grammar.cc" +#line 3278 "src/memcached-grammar.cc" if ( (*p) == 32 ) goto st181; if ( 48 <= (*p) && (*p) <= 57 ) goto tr262; goto st0; tr262: -#line 218 "src/memcached-grammar.rl" +#line 221 "src/memcached-grammar.rl" { fstart = p; } goto st182; st182: if ( ++p == pe ) goto _test_eof182; case 182: -#line 3283 "src/memcached-grammar.cc" +#line 3292 "src/memcached-grammar.cc" switch( (*p) ) { case 10: goto tr263; case 13: goto tr264; @@ -3289,30 +3298,30 @@ case 182: goto st182; goto st0; tr264: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st183; tr277: -#line 278 "src/memcached-grammar.rl" +#line 281 "src/memcached-grammar.rl" { noreply = true; } goto st183; st183: if ( ++p == pe ) goto _test_eof183; case 183: -#line 3304 "src/memcached-grammar.cc" +#line 3313 "src/memcached-grammar.cc" if ( (*p) == 10 ) goto tr267; goto st0; tr265: -#line 242 "src/memcached-grammar.rl" +#line 245 "src/memcached-grammar.rl" {bytes = memcached_natoq(fstart, p);} goto st184; st184: if ( ++p == pe ) goto _test_eof184; case 184: -#line 3316 "src/memcached-grammar.cc" +#line 3325 "src/memcached-grammar.cc" switch( (*p) ) { case 32: goto st184; case 78: goto st185; @@ -3627,7 +3636,7 @@ case 196: _out: {} } -#line 303 "src/memcached-grammar.rl" +#line 306 "src/memcached-grammar.rl" if (!done) { diff --git a/src/memcached-grammar.rl b/src/memcached-grammar.rl index f772b5f0b4..25da667cdc 100644 --- a/src/memcached-grammar.rl +++ b/src/memcached-grammar.rl @@ -96,24 +96,25 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf) action append_prepend { struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; key = tbuf_read_field(keys); struct tuple *tuple = memcached_find(key); if (tuple == NULL) { obuf_dup(out, "NOT_STORED\r\n", 12); } else { - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); b = tbuf_new(fiber->gc_pool); if (append) { - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); tbuf_append(b, data, bytes); } else { tbuf_append(b, data, bytes); - tbuf_append(b, fb, fe - fb); + tbuf_append(b, field, field_len); } - bytes += (fe - fb); + bytes += field_len; data = b->data; STORE; } @@ -122,7 +123,8 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf) action incr_decr { struct meta *m; struct tbuf *b; - const char *fb, *fe; + const char *field; + uint32_t field_len; u64 value; key = tbuf_read_field(keys); @@ -131,10 +133,11 @@ memcached_dispatch(struct ev_io *coio, struct iobuf *iobuf) obuf_dup(out, "NOT_FOUND\r\n", 11); } else { m = memcached_meta(tuple); - tuple_field(tuple, 3, &fb, &fe); + field = tuple_field(tuple, 3, &field_len); - if (memcached_is_numeric(fb, fe - fb)) { - value = memcached_natoq(fb, fe); + if (memcached_is_numeric(field, field_len)) { + value = memcached_natoq(field, + field + field_len); if (incr_sign > 0) { value += incr; diff --git a/src/memcached.cc b/src/memcached.cc index a8fec80070..a4b0567db1 100644 --- a/src/memcached.cc +++ b/src/memcached.cc @@ -180,10 +180,10 @@ memcached_find(const char *key) static struct meta * memcached_meta(struct tuple *tuple) { - const char *fb, *fe; - tuple_field(tuple, 1, &fb, &fe); - assert (fb + sizeof(struct meta) <= fe); - return (struct meta *) fb; + uint32_t len; + const char *field = tuple_field(tuple, 1, &len); + assert (sizeof(struct meta) <= len); + return (struct meta *) field; } static bool @@ -288,27 +288,23 @@ void memcached_get(struct obuf *out, size_t keys_count, struct tbuf *keys, continue; } - const char *fb, *fe; + uint32_t len; struct tuple_iterator it; + tuple_rewind(&it, tuple); /* skip key */ - tuple_seek(&it, tuple, 1, &fb, &fe); + (void) tuple_next(&it, &len); /* metainfo */ - tuple_next(&it); - m = (const struct meta *) fb; - assert (fb + sizeof(struct meta *) < fe); + m = (const struct meta *) tuple_next(&it, &len); + assert(sizeof(struct meta) <= len); /* suffix */ - tuple_next(&it); - suffix_len = fe - fb; - suffix = fb; + suffix = tuple_next(&it, &suffix_len); /* value */ - tuple_next(&it); - value_len = fe - fb; - value = fb; + value = tuple_next(&it, &value_len); - assert (!tuple_next(&it)); + assert(tuple_next(&it, &len) == NULL); if (m->exptime > 0 && m->exptime < ev_now()) { stats.get_misses++; -- GitLab