Example #1
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 #2
0
static mrb_value mrb_vedis_get(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 = mrb_str_to_cstr(mrb, 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, "GET %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);
    } else {
        const char *val = vedis_value_to_string(result, 0);
        return mrb_str_new_cstr(mrb, val);
    }
    return mrb_nil_value();
}
Example #3
0
void
ctteststrings(void)
{
  int rc;
  const char *str;
  vedis *store = NULL;
  vedis_value *res = NULL;

  rc = vedis_open(&store, NULL /* in memory */);
  assert(rc == VEDIS_OK);

  EXEC_CMD("GET misc");
  assert(vedis_value_is_null(res));

  EXEC_CMD("SET misc smthg");
  assert(vedis_value_is_bool(res));
  assert(vedis_value_to_bool(res));

  EXEC_CMD("GET misc");
  assert(vedis_value_is_string(res));
  assert(str = vedis_value_to_string(res, NULL));
  assert(!strcmp(str, "smthg"));

  vedis_close(store);
}
Example #4
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);
    }
}
Example #5
0
ZEND_METHOD(Vedis, hgetall)
{
    char *key;
    int key_len;
    VEDIS_ARGS_PARAM(HGETALL, 7, 1);

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
                              &key, &key_len) == FAILURE) {
        return;
    }

    VEDIS_SELF(intern);

    VEDIS_ARGS_STRING(key, key_len);

    VEDIS_ARGS_EXEC(RETURN_FALSE);

    array_init(return_value);

    if (vedis_value_is_array(result)) {
        int key_len = 0;
        const char *key;
        vedis_value *entry;
        while ((entry = vedis_array_next_elem(result)) != 0) {
            key = vedis_value_to_string(entry, &key_len);
            if ((entry = vedis_array_next_elem(result)) == 0) {
                break;
            }
            if (vedis_value_is_null(entry)) {
                add_assoc_null_ex(return_value, key, key_len + 1);
            } else {
                int len = 0;
                const char *str = vedis_value_to_string(entry, &len);
                add_assoc_stringl_ex(return_value,
                                     key, key_len + 1, (char *)str, len, 1);
            }
        }
    }
}
Example #6
0
ZEND_METHOD(Vedis, hmget)
{
    char *key;
    int key_len;
    zval **val, *fields;
    HashPosition pos;
    size_t n;
    VEDIS_PARAM(HMGET, 5);

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa",
                              &key, &key_len, &fields) == FAILURE) {
        return;
    }

    VEDIS_SELF(intern);

    n = zend_hash_num_elements(HASH_OF(fields));
    if (n == 0) {
        RETURN_FALSE;
    }

    VEDIS_ARGS_INIT(n + 1);

    VEDIS_ARGS_STRING(key, key_len);

    zend_hash_internal_pointer_reset_ex(HASH_OF(fields), &pos);
    while (zend_hash_get_current_data_ex(HASH_OF(fields),
                                         (void **)&val, &pos) == SUCCESS) {
        if (Z_TYPE_PP(val) != IS_STRING) {
            convert_to_string(*val);
        }
        VEDIS_ARGS_STRING(Z_STRVAL_PP(val), Z_STRLEN_PP(val));
        zend_hash_move_forward_ex(HASH_OF(fields), &pos);
    }

    VEDIS_ARGS_EXEC(RETURN_FALSE);

    array_init(return_value);

    if (vedis_value_is_array(result)) {
        vedis_value *entry;
        zend_hash_internal_pointer_reset_ex(HASH_OF(fields), &pos);
        while (1) {
            if (zend_hash_get_current_data_ex(HASH_OF(fields),
                                              (void **)&val, &pos) != SUCCESS) {
                break;
            }
            if ((entry = vedis_array_next_elem(result)) == 0) {
                break;
            }

            if (Z_TYPE_PP(val) != IS_STRING) {
                convert_to_string(*val);
            }

            if (Z_STRLEN_PP(val) > 0) {
                if (vedis_value_is_null(entry)) {
                    add_assoc_null_ex(return_value,
                                      Z_STRVAL_PP(val), Z_STRLEN_PP(val) + 1);
                } else {
                    int len = 0;
                    const char *str = vedis_value_to_string(entry, &len);
                    add_assoc_stringl_ex(return_value,
                                         Z_STRVAL_PP(val), Z_STRLEN_PP(val) + 1,
                                         (char *)str, len, 1);
                }
            }

            zend_hash_move_forward_ex(HASH_OF(fields), &pos);
        }
    }
}