Skip to content

Commit c67e2dd

Browse files
committed
Re-added HMGET + doc & unit tests.
1 parent a8738d7 commit c67e2dd

File tree

7 files changed

+253
-104
lines changed

7 files changed

+253
-104
lines changed

README.markdown

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,3 +1780,19 @@ $redis->delete('user:1');
17801780
$redis->hMset('user:1', array('name' => 'Joe', 'salary' => 2000));
17811781
$redis->hIncrBy('user:1', 'salary', 100); // Joe earns 100 more now.
17821782
</pre>
1783+
1784+
## hMGet
1785+
##### Description
1786+
Retirieve the values associated to the specified fields in the hash.
1787+
##### Parameters
1788+
*key*
1789+
*memberKeys* Array
1790+
##### Return value
1791+
*Array* An array of elements, the values of the specified fields in the hash, with the hash keys as array keys.
1792+
##### Examples
1793+
<pre>
1794+
$redis->delete('h');
1795+
$redis->hSet('h', 'field1', 'value1');
1796+
$redis->hSet('h', 'field2', 'value2');
1797+
$redis->hmGet('h', array('field1', 'field2')); /* returns array('field1' => 'value1', 'field2' => 'value2') */
1798+
</pre>

common.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@
6767
RETURN_FALSE; \
6868
}
6969

70-
#define REDIS_SAVE_CALLBACK(callback) IF_MULTI_OR_PIPELINE() { \
70+
#define REDIS_SAVE_CALLBACK(callback, closure_context) IF_MULTI_OR_PIPELINE() { \
7171
fold_item *f1 = malloc(sizeof(fold_item)); \
7272
f1->fun = (void *)callback; \
73+
f1->ctx = closure_context; \
7374
f1->next = NULL; \
7475
fold_item *current = redis_sock->current;\
7576
if(current) current->next = f1; \
@@ -79,18 +80,18 @@
7980
}\
8081
}
8182

82-
#define REDIS_ELSE_IF_MULTI(function) \
83+
#define REDIS_ELSE_IF_MULTI(function, closure_context) \
8384
else if(redis_sock->mode == MULTI) { \
8485
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) {\
85-
REDIS_SAVE_CALLBACK(function); \
86+
REDIS_SAVE_CALLBACK(function, closure_context); \
8687
RETURN_ZVAL(getThis(), 1, 0);\
8788
} else {\
8889
RETURN_FALSE;\
8990
}\
9091
}
9192

92-
#define REDIS_ELSE_IF_PIPELINE(function) else IF_PIPELINE() { \
93-
REDIS_SAVE_CALLBACK(function); \
93+
#define REDIS_ELSE_IF_PIPELINE(function, closure_context) else IF_PIPELINE() { \
94+
REDIS_SAVE_CALLBACK(function, closure_context); \
9495
RETURN_ZVAL(getThis(), 1, 0);\
9596
}
9697

@@ -104,14 +105,17 @@ else if(redis_sock->mode == MULTI) { \
104105
efree(cmd); \
105106
}
106107

107-
#define REDIS_PROCESS_RESPONSE(function) \
108-
REDIS_ELSE_IF_MULTI(function) \
109-
REDIS_ELSE_IF_PIPELINE(function);
108+
#define REDIS_PROCESS_RESPONSE_CLOSURE(function, closure_context) \
109+
REDIS_ELSE_IF_MULTI(function, closure_context) \
110+
REDIS_ELSE_IF_PIPELINE(function, closure_context);
111+
112+
#define REDIS_PROCESS_RESPONSE(function) REDIS_PROCESS_RESPONSE_CLOSURE(function, NULL)
110113

111114
typedef enum {ATOMIC, MULTI, PIPELINE} redis_mode;
112115

113116
typedef struct fold_item {
114117
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, void *, ...);
118+
void *ctx;
115119
struct fold_item *next;
116120
} fold_item;
117121

library.c

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ redis_cmd_format(char **ret, char *format, ...) {
356356
}
357357
}
358358

359-
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
359+
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
360360

361361
char *response;
362362
int response_len;
@@ -375,7 +375,7 @@ PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
375375
}
376376
}
377377

378-
PHPAPI void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
378+
PHPAPI void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
379379
char *response;
380380
int response_len;
381381
char ret;
@@ -405,7 +405,7 @@ PHPAPI void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
405405
}
406406
}
407407

408-
PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
408+
PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
409409
char *response;
410410
int response_len;
411411
char ret;
@@ -475,7 +475,7 @@ PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
475475
}
476476
}
477477

478-
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
478+
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
479479

480480
char *response;
481481
int response_len;
@@ -507,7 +507,7 @@ PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redi
507507
}
508508
}
509509

510-
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval * z_tab) {
510+
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval * z_tab, void *ctx) {
511511

512512
char *response;
513513
int response_len;
@@ -575,16 +575,16 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
575575
return 0;
576576
}
577577

578-
PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
578+
PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
579579

580580
return redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, 1);
581581
}
582582

583-
PHPAPI int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
583+
PHPAPI int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
584584
return redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, 0);
585585
}
586586

587-
PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
587+
PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
588588

589589
char *response;
590590
int response_len;
@@ -616,7 +616,7 @@ PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock
616616
}
617617
}
618618

619-
PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
619+
PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
620620

621621
char *response;
622622
int response_len;
@@ -771,7 +771,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
771771
/**
772772
* redis_sock_read_multibulk_reply
773773
*/
774-
PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab)
774+
PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
775775
{
776776
char inbuf[1024], *response;
777777
int response_len;
@@ -821,6 +821,50 @@ redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
821821
return 0;
822822
}
823823

824+
/**
825+
* redis_sock_read_multibulk_reply_assoc
826+
*/
827+
PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
828+
{
829+
char inbuf[1024], *response;
830+
int response_len;
831+
832+
zval **z_keys = ctx;
833+
834+
redis_check_eof(redis_sock TSRMLS_CC);
835+
php_stream_gets(redis_sock->stream, inbuf, 1024);
836+
837+
if(inbuf[0] != '*') {
838+
return -1;
839+
}
840+
int i, numElems = atoi(inbuf+1);
841+
zval *z_multi_result;
842+
MAKE_STD_ZVAL(z_multi_result);
843+
array_init(z_multi_result); /* pre-allocate array for multi's results. */
844+
845+
for(i = 0; i < numElems; ++i) {
846+
response = redis_sock_read(redis_sock, &response_len TSRMLS_CC);
847+
if(response != NULL) {
848+
add_assoc_stringl_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), response, response_len, 1);
849+
} else {
850+
add_assoc_bool_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), 0);
851+
}
852+
zval_dtor(z_keys[i]);
853+
efree(z_keys[i]);
854+
}
855+
efree(z_keys);
856+
857+
zval *object = getThis();
858+
IF_MULTI_OR_PIPELINE() {
859+
add_next_index_zval(z_tab, z_multi_result);
860+
}
861+
862+
*return_value = *z_multi_result;
863+
//zval_copy_ctor(return_value);
864+
// efree(z_multi_result);
865+
return 0;
866+
}
867+
824868
/**
825869
* redis_sock_write
826870
*/

library.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,24 @@ int redis_cmd_format(char **ret, char *format, ...);
55

66
PHPAPI char * redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC);
77

8-
PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
9-
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab);
10-
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
11-
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
12-
PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
13-
PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
14-
PHPAPI void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
8+
PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
9+
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab, void *ctx);
10+
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
11+
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
12+
PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
13+
PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
14+
PHPAPI void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
1515
PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short port, long timeout);
1616
PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC);
1717
PHPAPI int redis_sock_server_open(RedisSock *redis_sock, int force_connect TSRMLS_DC);
1818
PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC);
1919
PHPAPI zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock);
2020
PHPAPI char *redis_sock_read_bulk_reply(RedisSock *redis_sock, int bytes);
21-
PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *_z_tab);
21+
PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *_z_tab, void *ctx);
2222
PHPAPI int redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int numElems);
23-
PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
24-
PHPAPI int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
23+
PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
24+
PHPAPI int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
25+
PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
2526
PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz);
2627
PHPAPI void redis_check_eof(RedisSock *redis_sock TSRMLS_DC);
2728
//PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC);

php_redis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ PHP_METHOD(Redis, hGetAll);
110110
PHP_METHOD(Redis, hExists);
111111
PHP_METHOD(Redis, hIncrBy);
112112
PHP_METHOD(Redis, hMset);
113+
PHP_METHOD(Redis, hMget);
113114

114115
PHP_METHOD(Redis, multi);
115116
PHP_METHOD(Redis, discard);

0 commit comments

Comments
 (0)