static mrb_value mrb_vedis_exec(mrb_state *mrb, mrb_value self) { int ret; vedis *vstore = DATA_PTR(self); vedis_value *result; vedis_value *entry; mrb_value ary; const char *cmd = NULL; mrb_get_args(mrb, "z", &cmd); ret = vedis_exec(vstore, cmd, -1); if (ret != VEDIS_OK) { return mrb_nil_value(); } ret = vedis_exec_result(vstore, &result); if (ret != VEDIS_OK) { return mrb_nil_value(); } else { if (vedis_value_is_string(result)) { return mrb_str_new_cstr(mrb, vedis_value_to_string(result, 0)); } else if (vedis_value_is_array(result)) { ary = mrb_ary_new(mrb); while ((entry = vedis_array_next_elem(result)) != 0) { mrb_ary_push(mrb, ary, mrb_str_new_cstr(mrb, vedis_value_to_string(entry, 0))); } return ary; } } return mrb_nil_value(); }
ZEND_METHOD(Vedis, eval) { char *cmd; int cmd_len; int rc; php_vedis_object_t *intern; vedis_value *result = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &cmd, &cmd_len) == FAILURE) { return; } VEDIS_SELF(intern); if (vedis_exec(intern->vedis->store, cmd, cmd_len) != VEDIS_OK) { php_vedis_error(intern, E_WARNING TSRMLS_CC); RETURN_FALSE; } vedis_exec_result(intern->vedis->store, &result); if (!result) { php_vedis_error(intern, E_WARNING TSRMLS_CC); RETURN_FALSE; } if (vedis_value_is_array(result)) { vedis_value *entry; array_init(return_value); while ((entry = vedis_array_next_elem(result)) != 0) { if (vedis_value_is_null(entry)) { add_next_index_null(return_value); } else { int len = 0; const char *str = vedis_value_to_string(entry, &len); add_next_index_stringl(return_value, str, len, 1); } } } else if (vedis_value_is_int(result)) { RETURN_LONG(vedis_value_to_int64(result)); } else { int len = 0; const char *str = vedis_value_to_string(result, &len); RETURN_STRINGL(str, len, 1); } }