mc_op_t mc_op_from_string(const char* str) { int i = 0; for (i = mc_op_unknown; i < mc_nops; ++i) { if (0 == strcmp(mc_op_to_string((mc_op_t)i), str)) { return (mc_op_t)i; } } return mc_op_unknown; }
static String HHVM_STATIC_METHOD(MCRouter, getOpName, int64_t op) { auto name = mc_op_to_string((mc_op_t)op); if (!name) { std::string msg = "Unknown mc_op_* value: "; msg += op; mcr_throwException(msg, (mc_op_t)op); } return name; }
void moduleInit() override { HHVM_ME(MCRouter, __construct); HHVM_NAMED_ME(MCRouter, get, mcr_str<mc_op_get>); HHVM_NAMED_ME(MCRouter, gets, mcr_str<mc_op_gets>); HHVM_NAMED_ME(MCRouter, add, mcr_set<mc_op_add>); HHVM_NAMED_ME(MCRouter, set, mcr_set<mc_op_set>); HHVM_NAMED_ME(MCRouter, replace, mcr_set<mc_op_replace>); HHVM_NAMED_ME(MCRouter, prepend, mcr_aprepend<mc_op_prepend>); HHVM_NAMED_ME(MCRouter, append, mcr_aprepend<mc_op_append>); HHVM_NAMED_ME(MCRouter, incr, mcr_str_delta<mc_op_incr>); HHVM_NAMED_ME(MCRouter, decr, mcr_str_delta<mc_op_decr>); HHVM_NAMED_ME(MCRouter, del, mcr_str<mc_op_delete>); HHVM_NAMED_ME(MCRouter, flushAll, mcr_int<mc_op_flushall>); HHVM_NAMED_ME(MCRouter, version, mcr_void<mc_op_version>); HHVM_ME(MCRouter, cas); Native::registerNativeDataInfo<MCRouter>(s_MCRouter.get()); HHVM_STATIC_ME(MCRouter, getOpName); HHVM_STATIC_ME(MCRouter, getResultName); std::string opname("mc_op_"); for (int i = 0; i < mc_nops; ++i) { std::string name; name = opname + mc_op_to_string((mc_op_t)i); // mcrouter defines op names as foo-bar, // but PHP wants constants like foo_bar for (int j = opname.size(); j < name.size(); ++j) { if (name[j] == '-') { name[j] = '_'; } } Native::registerClassConstant<KindOfInt64>( s_MCRouter.get(), makeStaticString(name), i); } for (int i = 0; i < mc_nres; ++i) { Native::registerClassConstant<KindOfInt64>( s_MCRouter.get(), makeStaticString(mc_res_to_string((mc_res_t)i)), i); } loadSystemlib(); }
// Store the important parts of the exception in non-thread vars // to bubble up during unserialize void setResultException(const mcr::mcrouter_msg_t* msg) { m_op = msg->req->op; m_replyCode = msg->reply.result(); m_exception = mc_op_to_string(m_op); m_exception += " failed with result "; m_exception += mc_res_to_string(m_replyCode); if (msg->reply.value().length() > 0) { m_exception += ": "; m_exception += std::string((char*)msg->reply.value().data(), msg->reply.value().length()); } m_key = std::string(msg->req->key.str, msg->req->key.len); }
std::string MessagePrinter::serializeMessageHeader(mc_op_t op, mc_res_t result, const std::string& key) { std::string out; if (op != mc_op_unknown) { out.append(mc_op_to_string(op)); } if (result != mc_res_unknown) { if (out.size() > 0) { out.push_back(' '); } out.append(mc_res_to_string(result)); } if (key.size()) { if (out.size() > 0) { out.push_back(' '); } out.append(folly::backslashify(key)); } return out; }
size_t mc_ascii_response_write_iovs(mc_ascii_response_buf_t* buf, const mc_msg_t* req, const mc_msg_t* reply, struct iovec* iovs, size_t max_niovs) { size_t niovs = 0; buf->offset = 0; if (mc_res_is_err(reply->result)) { if (reply->value.len > 0) { if (reply->result == mc_res_client_error) { IOV_WRITE_CONST_STR("CLIENT_ERROR "); } else { IOV_WRITE_CONST_STR("SERVER_ERROR "); } if (reply->err_code != 0) { IOV_FORMAT(buf, "%" PRIu32 " ", reply->err_code); } IOV_WRITE_NSTRING(reply->value); IOV_WRITE_CONST_STR("\r\n"); } else { IOV_WRITE_STR(mc_res_to_response_string(reply->result)); } return niovs; } switch (req->op) { case mc_op_incr: case mc_op_decr: switch (reply->result) { case mc_res_stored: IOV_FORMAT(buf, "%" PRIu64 "\r\n", reply->delta); break; case mc_res_notfound: IOV_WRITE_CONST_STR("NOT_FOUND\r\n"); break; default: goto UNEXPECTED; } break; case mc_op_set: case mc_op_lease_set: case mc_op_add: case mc_op_replace: case mc_op_append: case mc_op_prepend: case mc_op_cas: switch (reply->result) { case mc_res_ok: IOV_WRITE_STR(mc_res_to_response_string(mc_res_stored)); break; case mc_res_stored: case mc_res_stalestored: case mc_res_found: case mc_res_notstored: case mc_res_notfound: case mc_res_exists: IOV_WRITE_STR(mc_res_to_response_string(reply->result)); break; default: goto UNEXPECTED; } break; case mc_op_delete: switch (reply->result) { case mc_res_deleted: case mc_res_notfound: IOV_WRITE_STR(mc_res_to_response_string(reply->result)); break; default: goto UNEXPECTED; } break; case mc_op_get: case mc_op_lease_get: case mc_op_gets: switch (reply->result) { case mc_res_found: IOV_WRITE_CONST_STR("VALUE "); IOV_WRITE_NSTRING(req->key); IOV_FORMAT(buf, " %" PRIu64 " %lu", reply->flags, reply->value.len); if (req->op == mc_op_gets) { IOV_FORMAT(buf, " %" PRIu64, reply->cas); } IOV_WRITE_CONST_STR("\r\n"); IOV_WRITE_NSTRING(reply->value); IOV_WRITE_CONST_STR("\r\n"); break; case mc_res_notfound: if (req->op != mc_op_lease_get) { // misses should have been suppressed! goto UNEXPECTED; } // but lease-get always has a response IOV_WRITE_CONST_STR("LVALUE "); IOV_WRITE_NSTRING(req->key); IOV_FORMAT(buf, " %" PRIu64 " %"PRIu64 " %zu\r\n", reply->lease_id, reply->flags, reply->value.len); IOV_WRITE_NSTRING(reply->value); IOV_WRITE_CONST_STR("\r\n"); break; default: goto UNEXPECTED; } break; case mc_op_metaget: switch (reply->result) { case mc_res_found: /* (META key age: (unknown|\d+); exptime: \d+; from: (\d+\.\d+\.\d+\.\d+|unknown); is_transient: (1|0)\r\n) */ IOV_WRITE_CONST_STR("META "); IOV_WRITE_NSTRING(req->key); IOV_WRITE_CONST_STR(" age: "); if (reply->number == (uint32_t) -1) { IOV_WRITE_CONST_STR("unknown"); } else { IOV_FORMAT(buf, "%d", reply->number); } IOV_WRITE_CONST_STR("; exptime: "); IOV_FORMAT(buf, "%d", reply->exptime); IOV_WRITE_CONST_STR("; from: "); if (reply->ipv == 0) { IOV_WRITE_CONST_STR("unknown"); } else { IOV_WRITE_IP(buf, reply->ipv, &(reply->ip_addr)); } IOV_WRITE_CONST_STR("; is_transient: "); IOV_FORMAT(buf, "%" PRIu64, reply->flags); IOV_WRITE_CONST_STR("\r\n"); break; case mc_res_notfound: break; default: goto UNEXPECTED; } break; case mc_op_end: if (reply->result == mc_res_found) { IOV_WRITE_CONST_STR("END\r\n"); } else { IOV_WRITE_STR(mc_res_to_response_string(reply->result)); } break; case mc_op_stats: switch (reply->result) { case mc_res_ok: { size_t length = 0; char* stats; if (reply->stats) { /* TODO(agartrell) assert(!reply->value.str) * * The assert here can't be turned on until * mcrouter/stats.c:560 has been fixed to not set both * value and stats on the libmc reply */ stats = stats_reply_to_string(reply->stats, reply->number, &length); buf->stats = stats; } else { stats = reply->value.str; length = reply->value.len; } if (!stats) { return 0; } IOV_WRITE(stats, length); break; } default: goto UNEXPECTED; } break; case mc_op_flushall: case mc_op_flushre: IOV_WRITE_CONST_STR("OK\r\n"); break; case mc_op_version: IOV_WRITE_CONST_STR("VERSION "); IOV_WRITE_NSTRING(reply->value); IOV_WRITE_CONST_STR("\r\n"); break; case mc_op_shutdown: if (reply->result == mc_res_ok) { IOV_WRITE_CONST_STR("OK\r\n"); } else { goto UNEXPECTED; } break; case mc_op_exec: switch (reply->result) { case mc_res_ok: IOV_WRITE_NSTRING(reply->value); IOV_WRITE_CONST_STR("\r\n"); break; default: goto UNEXPECTED; } break; default: IOV_WRITE_CONST_STR("SERVER_ERROR unhandled token "); IOV_WRITE_STR(mc_op_to_string(req->op)); IOV_FORMAT(buf, " (%d)\r\n", (int)req->op); break; } return niovs; UNEXPECTED: FBI_ASSERT(niovs == 0); IOV_WRITE_CONST_STR("SERVER_ERROR unexpected result "); IOV_WRITE_STR(mc_res_to_string(reply->result)); IOV_FORMAT(buf, " (%d) for ", (int)reply->result); IOV_WRITE_STR(mc_op_to_string(req->op)); IOV_FORMAT(buf, " (%d)\r\n", (int)req->op); return niovs; }