diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index bb1c13c4c81bedbd4d9cce49eb88b85aeae56951..4dda027c4610eabb4c268942fafa0a2efe52ca1b 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 ec02153900b5dd2147f809fe6cc56f17c34a3f28..1b9070e3a5af62bba724b9e0a412e55d5d36ba62 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 6791bdec1214687781e7c71916758647b756893f..bd1e0b430445cd872fc5870cbd1b281bdf239932 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 58e8a2d86e7f43696cf38ec4e98f22c36b86d3e2..52f6d24de887cec9c24e3f18a662295a48be3078 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 c0d8506a00c2ecdac131e975f32a33dd8118338e..678806eedb64886026ed989087a514ed8068a9fa 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 e2d67798a570584128fcd35ae1afce622202ea0b..0fe896f8dcbfbe8cd868e56d01273969fa1baa65 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 8f8515f4c2e652ee541958685f3ae0b46ce8e43d..a4f5c6e3065cb6c0f09b5a17dbc42f6d313fd72f 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 f772b5f0b49f7e25bc56a62570d34ee26018fdeb..25da667cdc5910ff24559b75c0c05052555f2188 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 a8fec800700813ca0b199f3dd2a6eb15bb86a990..a4b0567db196764ad5c7d9479efaeb0966478d14 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++;