| 228 | }; |
| 229 | |
| 230 | void |
| 231 | hstcpcli::request_buf_exec_generic(size_t pst_id, const string_ref& op, |
| 232 | const string_ref *kvs, size_t kvslen, uint32_t limit, uint32_t skip, |
| 233 | const string_ref& mod_op, const string_ref *mvs, size_t mvslen, |
| 234 | const hstcpcli_filter *fils, size_t filslen, int invalues_keypart, |
| 235 | const string_ref *invalues, size_t invalueslen) |
| 236 | { |
| 237 | if (num_req_sent > 0 || num_req_rcvd > 0) { |
| 238 | close(); |
| 239 | set_error(-1, "request_buf_exec_generic: protocol out of sync"); |
| 240 | return; |
| 241 | } |
| 242 | append_uint32(writebuf, pst_id); // FIXME size_t ? |
| 243 | writebuf.append_literal("\t"); |
| 244 | writebuf.append(op.begin(), op.end()); |
| 245 | writebuf.append_literal("\t"); |
| 246 | append_uint32(writebuf, kvslen); // FIXME size_t ? |
| 247 | for (size_t i = 0; i < kvslen; ++i) { |
| 248 | const string_ref& kv = kvs[i]; |
| 249 | append_delim_value(writebuf, kv.begin(), kv.end()); |
| 250 | } |
| 251 | if (limit != 0 || skip != 0 || invalues_keypart >= 0 || |
| 252 | mod_op.size() != 0 || filslen != 0) { |
| 253 | /* has more option */ |
| 254 | writebuf.append_literal("\t"); |
| 255 | append_uint32(writebuf, limit); // FIXME size_t ? |
| 256 | if (skip != 0 || invalues_keypart >= 0 || |
| 257 | mod_op.size() != 0 || filslen != 0) { |
| 258 | writebuf.append_literal("\t"); |
| 259 | append_uint32(writebuf, skip); // FIXME size_t ? |
| 260 | } |
| 261 | if (invalues_keypart >= 0) { |
| 262 | writebuf.append_literal("\t@\t"); |
| 263 | append_uint32(writebuf, invalues_keypart); |
| 264 | writebuf.append_literal("\t"); |
| 265 | append_uint32(writebuf, invalueslen); |
| 266 | for (size_t i = 0; i < invalueslen; ++i) { |
| 267 | const string_ref& s = invalues[i]; |
| 268 | append_delim_value(writebuf, s.begin(), s.end()); |
| 269 | } |
| 270 | } |
| 271 | for (size_t i = 0; i < filslen; ++i) { |
| 272 | const hstcpcli_filter& f = fils[i]; |
| 273 | writebuf.append_literal("\t"); |
| 274 | writebuf.append(f.filter_type.begin(), f.filter_type.end()); |
| 275 | writebuf.append_literal("\t"); |
| 276 | writebuf.append(f.op.begin(), f.op.end()); |
| 277 | writebuf.append_literal("\t"); |
| 278 | append_uint32(writebuf, f.ff_offset); |
| 279 | append_delim_value(writebuf, f.val.begin(), f.val.end()); |
| 280 | } |
| 281 | if (mod_op.size() != 0) { |
| 282 | writebuf.append_literal("\t"); |
| 283 | writebuf.append(mod_op.begin(), mod_op.end()); |
| 284 | for (size_t i = 0; i < mvslen; ++i) { |
| 285 | const string_ref& mv = mvs[i]; |
| 286 | append_delim_value(writebuf, mv.begin(), mv.end()); |
| 287 | } |