diff --git a/php_redis.h b/php_redis.h index 24f002150e..fd2be133fc 100644 --- a/php_redis.h +++ b/php_redis.h @@ -49,6 +49,7 @@ PHP_METHOD(Redis, decr); PHP_METHOD(Redis, decrBy); PHP_METHOD(Redis, type); PHP_METHOD(Redis, append); +PHP_METHOD(Redis, appendx); PHP_METHOD(Redis, getRange); PHP_METHOD(Redis, setRange); PHP_METHOD(Redis, getBit); @@ -157,6 +158,8 @@ PHP_METHOD(Redis, hKeys); PHP_METHOD(Redis, hVals); PHP_METHOD(Redis, hGetAll); PHP_METHOD(Redis, hExists); +PHP_METHOD(Redis, hAppend); +PHP_METHOD(Redis, hAppendX); PHP_METHOD(Redis, hIncrBy); PHP_METHOD(Redis, hIncrByFloat); PHP_METHOD(Redis, hMset); diff --git a/redis.c b/redis.c index bf92513edb..9f2ed0dd80 100644 --- a/redis.c +++ b/redis.c @@ -198,6 +198,11 @@ static zend_function_entry redis_functions[] = { PHP_ME(Redis, hMset, NULL, ZEND_ACC_PUBLIC) PHP_ME(Redis, hMget, NULL, ZEND_ACC_PUBLIC) + /* 1.8 */ + PHP_ME(Redis, appendx, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Redis, hAppend, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Redis, hAppendX, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Redis, multi, NULL, ZEND_ACC_PUBLIC) PHP_ME(Redis, discard, NULL, ZEND_ACC_PUBLIC) PHP_ME(Redis, exec, NULL, ZEND_ACC_PUBLIC) @@ -1529,6 +1534,35 @@ PHP_METHOD(Redis, type) } /* }}} */ +PHP_METHOD(Redis, appendx) +{ + zval *object; + RedisSock *redis_sock; + char *cmd; + int cmd_len, key_len, val_len, key_free; + char *key, *val; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oss", + &object, redis_ce, + &key, &key_len, &val, &val_len) == FAILURE) { + RETURN_NULL(); + } + + if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) { + RETURN_FALSE; + } + + key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC); + cmd_len = redis_cmd_format_static(&cmd, "APPENDX", "ss", key, key_len, val, val_len); + if(key_free) efree(key); + + REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len); + IF_ATOMIC() { + redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL); + } + REDIS_PROCESS_RESPONSE(redis_long_response); +} + PHP_METHOD(Redis, append) { zval *object; @@ -4595,6 +4629,50 @@ PHP_METHOD(Redis, hExists) } +PHPAPI void +generic_happend(INTERNAL_FUNCTION_PARAMETERS, char *kw, void (*fun)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *, zval *, void *)) { + zval *object; + RedisSock *redis_sock; + char *key = NULL, *cmd, *member, *val; + int key_len, member_len, cmd_len, val_len; + int val_free, key_free = 0; + zval *z_value; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ossz", + &object, redis_ce, + &key, &key_len, &member, &member_len, &z_value) == FAILURE) { + RETURN_FALSE; + } + + if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) { + RETURN_FALSE; + } + + val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC); + key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC); + cmd_len = redis_cmd_format_static(&cmd, kw, "sss", key, key_len, member, member_len, val, val_len); + if(val_free) efree(val); + if(key_free) efree(key); + + REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len); + IF_ATOMIC() { + fun(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL); + } + REDIS_PROCESS_RESPONSE(fun); +} +/* hAppend */ +PHP_METHOD(Redis, hAppend) +{ + generic_happend(INTERNAL_FUNCTION_PARAM_PASSTHRU, "HAPPEND", redis_long_response); +} +/* }}} */ +/* hAppendX */ +PHP_METHOD(Redis, hAppendX) +{ + generic_happend(INTERNAL_FUNCTION_PARAM_PASSTHRU, "HAPPENDX", redis_long_response); +} +/* }}} */ + PHPAPI RedisSock* generic_hash_command_1(INTERNAL_FUNCTION_PARAMETERS, char *keyword, int keyword_len) {