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