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, 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); } } } }
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); } }
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); } } }