Example #1
0
static mrb_value mrb_vedis_strlen(mrb_state *mrb, mrb_value self)
{
    int ret;
    vedis *vstore = DATA_PTR(self);
    mrb_value key_obj;
    vedis_value *result;
    const char *key = NULL;

    mrb_get_args(mrb, "o", &key_obj);
    switch (mrb_type(key_obj)) {
        case MRB_TT_STRING:
            key = RSTRING_PTR(key_obj);
            break;
        case MRB_TT_SYMBOL:
            key = mrb_sym2name(mrb, mrb_obj_to_sym(mrb, key_obj));
            break;
        default:
            mrb_raise(mrb, E_RUNTIME_ERROR, "vedis key type is string or symbol");
    }
    ret = vedis_exec_fmt(vstore, "STRLEN %s", key);
    if (ret != VEDIS_OK) {
        return mrb_nil_value();
    }
    ret = vedis_exec_result(vstore, &result);
    if (ret != VEDIS_OK) {
        mrb_vedis_error(mrb, vstore, 0);
        return mrb_nil_value();
    } else {
        return mrb_fixnum_value(vedis_value_to_int(result));
    }
}
Example #2
0
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();
}
Example #3
0
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);
    }
}