8000 ZEND_HASH_FOREACH_VAL macro · jrtkcoder/phpredis@e3ffc0a · GitHub
[go: up one dir, main page]

Skip to content

Commit e3ffc0a

Browse files
committed
ZEND_HASH_FOREACH_VAL macro
1 parent 1d8a393 commit e3ffc0a

File tree

8 files changed

+69
-116
lines changed

8 files changed

+69
-116
lines changed

common.h

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11
#include "php.h"
22
#include "php_ini.h"
3-
#include <ext/standard/php_smart_string.h>
43

54
#ifndef REDIS_COMMON_H
65
#define REDIS_COMMON_H
76

7+
#if (PHP_MAJOR_VERSION < 7)
8+
#include <ext/standard/php_smart_str.h>
9+
typedef smart_str smart_string;
10+
#define smart_string_0(x) smart_str_0(x)
11+
#define smart_string_appendc(dest, c) smart_str_appendc(dest, c)
12+
#define smart_string_append_long(dest, val) smart_str_append_long(dest, val)
13+
#define smart_string_appendl(dest, src, len) smart_str_appendl(dest, src, len)
14+
15+
#define ZEND_HASH_FOREACH_VAL(ht, _val) do { \
16+
HashPosition _hpos; \
17+
for (zend_hash_internal_pointer_reset_ex(ht, &_hpos); \
18+
zend_hash_get_current_data_ex(ht, (void **) &_val, &_hpos) == SUCCESS; \
19+
zend_hash_move_forward_ex(ht, &_hpos) \
20+
)
21+
22+
#define ZEND_HASH_FOREACH_END() } while(0)
23+
#else
24+
#include <ext/standard/php_smart_string.h>
25+
#endif
26+
827
/* NULL check so Eclipse doesn't go crazy */
928
#ifndef NULL
1029
#define NULL ((void *) 0)
@@ -101,7 +120,7 @@ typedef enum _PUBSUB_TYPE {
101120
#define IF_NOT_MULTI() if(redis_sock->mode != MULTI)
102121
#define IF_NOT_ATOMIC() if(redis_sock->mode != ATOMIC)
103122
#define IF_ATOMIC() if(redis_sock->mode == ATOMIC)
104-
#define ELSE_IF_MULTI() else if(redis_sock->mode == MULTI) { \
123+
#define ELSE_IF_MULTI() else IF_MULTI() { \
105124
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) { \
106125
RETURN_ZVAL(getThis(), 1, 0);\
107126
} else { \
@@ -161,7 +180,7 @@ typedef enum _PUBSUB_TYPE {
161180
}
162181

163182
#define REDIS_ELSE_IF_MULTI(function, closure_context) \
164-
else if(redis_sock->mode == MULTI) { \
183+
else IF_MULTI() { \
165184
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) {\
166185
REDIS_SAVE_CALLBACK(function, closure_context); \
167186
RETURN_ZVAL(getThis(), 1, 0);\
@@ -177,14 +196,12 @@ typedef enum _PUBSUB_TYPE {
177196
}
178197

179198
#define REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len) \
180-
IF_MULTI_OR_ATOMIC() { \
181-
SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len); \
182-
efree(cmd); \
183-
}\
184199
IF_PIPELINE() { \
185200
PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len); \
186-
efree(cmd); \
187-
}
201+
} else { \
202+
SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len); \
203+
} \
204+
efree(cmd);
188205

189206
#define REDIS_PROCESS_RESPONSE_CLOSURE(function, closure_context) \
190207
REDIS_ELSE_IF_MULTI(function, closure_context) \

library.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <netinet/tcp.h> /* TCP_NODELAY */
99
#include <sys/socket.h>
1010
#endif
11-
#include <ext/standard/php_smart_string.h>
1211
#include <ext/standard/php_var.h>
1312
#include <zend_smart_str.h>
1413
#ifdef HAVE_REDIS_IGBINARY

library.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@ redis_key_prefix(RedisSock *redis_sock, char **key, size_t *key_len);
7373
PHP_REDIS_API int
7474
redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval *return_value TSRMLS_DC);
7575

76-
PHP_REDIS_API void redis_free_socket(RedisSock *redis_sock);
77-
PHP_REDIS_API void redis_send_discard(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock);
78-
PHP_REDIS_API int redis_sock_set_err(RedisSock *redis_sock, const char *msg, int msg_len);
79-
80-
8176
/*
8277
* Variant Read methods, mostly to implement eval
8378
*/

redis.c

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include "ext/session/php_session.h"
3838
#endif
3939

40-
#include <ext/standard/php_smart_string.h>
4140
#include <ext/standard/php_var.h>
4241
#include <ext/standard/php_math.h>
4342

@@ -674,7 +673,7 @@ PHP_METHOD(Redis,__destruct) {
674673
}
675674

676675
// If we think we're in MULTI mode, send a discard
677-
if(redis_sock->mode == MULTI) {
676+
IF_MULTI() {
678677
// Discard any multi commands, and free any callbacks that have been
679678
// queued
680679
send_discard_static(redis_sock TSRMLS_CC);
@@ -952,7 +951,6 @@ PHP_METHOD(Redis, getMultiple)
952951
{
953952
zval *object, *z_args, *z_ele;
954953
HashTable *hash;
955-
HashPosition ptr;
956954
RedisSock *redis_sock;
957955
smart_string cmd = {0};
958956
int arg_count;
@@ -980,10 +978,7 @@ PHP_METHOD(Redis, getMultiple)
980978
redis_cmd_init_sstr(&cmd, arg_count, "MGET", 4);
981979

982980
/* Iterate through and grab our keys */
983-
for(zend_hash_internal_pointer_reset_ex(hash, &ptr);
984-
(z_ele = zend_hash_get_current_data_ex(hash, &ptr)) != NULL;
985-
zend_hash_move_forward_ex(hash, &ptr))
986-
{
981+
ZEND_HASH_FOREACH_VAL(hash, z_ele) {
987982
char *key;
988983
int key_free;
989984
size_t key_len;
@@ -1005,7 +1000,7 @@ PHP_METHOD(Redis, getMultiple)
10051000

10061001
/* Decrement refcount/free temporary string. */
10071002
zend_string_release(key_zstr);
1008-
}
1003+
} ZEND_HASH_FOREACH_END();
10091004

10101005
/* Kick off our command */
10111006
REDIS_PROCESS_REQUEST(redis_sock, cmd.c, cmd.len);
@@ -2518,7 +2513,6 @@ PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS,
25182513
{
25192514
zval *object, *array, *data;
25202515
HashTable *arr_hash;
2521-
HashPosition pointer;
25222516
RedisSock *redis_sock;
25232517
char *cmd = "", *old_cmd = NULL;
25242518
int cmd_len, array_count;
@@ -2541,10 +2535,7 @@ PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS,
25412535
RETURN_FALSE;
25422536
}
25432537

2544-
for (zend_hash_internal_pointer_reset_ex(arr_hash, &pointer);
2545-
(data = zend_hash_get_current_data_ex(arr_hash, &pointer)) != NULL;
2546-
zend_hash_move_forward_ex(arr_hash, &pointer)) {
2547-
2538+
ZEND_HASH_FOREACH_VAL(arr_hash, data) {
25482539
if (Z_TYPE_P(data) == IS_STRING) {
25492540
char *old_cmd = NULL;
25502541
if(*cmd) {
@@ -2555,7 +2546,7 @@ PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS,
25552546
efree(old_cmd);
25562547
}
25572548
}
2558-
}
2549+
} ZEND_HASH_FOREACH_END();
25592550

25602551
old_cmd = cmd;
25612552
cmd_len = spprintf(&cmd, 0, "%s %s\r\n", unsub_cmd, cmd);
@@ -2905,10 +2896,7 @@ redis_build_pubsub_cmd(RedisSock *redis_sock, char **ret, PUBSUB_TYPE type,
29052896
redis_cmd_append_sstr(&cmd, "NUMSUB", sizeof("NUMSUB")-1);
29062897

29072898
/* Iterate our elements */
2908-
for(zend_hash_internal_pointer_reset_ex(ht_chan, &ptr);
2909-
(z_ele = zend_hash_get_current_data_ex(ht_chan, &ptr)) != NULL;
2910-
zend_hash_move_forward_ex(ht_chan, &ptr))
2911-
{
2899+
ZEND_HASH_FOREACH_VAL(ht_chan, z_ele) {
29122900
char *key;
29132901
int key_free;
29142902
size_t key_len;
@@ -2928,7 +2916,7 @@ redis_build_pubsub_cmd(RedisSock *redis_sock, char **ret, PUBSUB_TYPE type,
29282916

29292917
/* Decrement reference count to temporary/underlying zend_string */
29302918
zend_string_release(key_zstr);
2931-
}
2919+
} ZEND_HASH_FOREACH_END();
29322920

29332921
/* Set return */
29342922
*ret = cmd.c;
@@ -3026,7 +3014,6 @@ redis_build_eval_cmd(RedisSock *redis_sock, char **ret, char *keyword,
30263014
{
30273015
zval *elem;
30283016
HashTable *args_hash;
3029-
HashPosition hash_pos;
30303017
int cmd_len, args_count = 0;
30313018
int eval_cmd_count = 2;
30323019

@@ -3049,10 +3036,7 @@ redis_build_eval_cmd(RedisSock *redis_sock, char **ret, char *keyword,
30493036
cmd_len = redis_cmd_append_int(ret, cmd_len, keys_count);
30503037

30513038
// Iterate the values in our "keys" array
3052-
for(zend_hash_internal_pointer_reset_ex(args_hash, &hash_pos);
3053-
(elem = zend_hash_get_current_data_ex(args_hash, &hash_pos)) != NULL;
3054-
zend_hash_move_forward_ex(args_hash, &hash_pos))
3055-
{
3039+
ZEND_HASH_FOREACH_VAL(args_hash, elem) {
30563040
char *key, *old_cmd;
30573041
int key_free;
30583042
size_t key_len;
@@ -3079,7 +3063,7 @@ redis_build_eval_cmd(RedisSock *redis_sock, char **ret, char *keyword,
30793063

30803064
// Free our temporary string if we created one (or decrement refcount)
30813065
zend_string_release(key_zstr);
3082-
}
3066+
} ZEND_HASH_FOREACH_END();
30833067
}
30843068
}
30853069

redis_array.c

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,6 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
340340
int i;
341341
zval *redis_inst;
342342
zval z_fun, *z_callargs;
343-
HashPosition pointer;
344343
HashTable *h_args;
345344

346345
int argc;
@@ -378,12 +377,11 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i
378377
z_callargs = emalloc(argc * sizeof(zval));
379378

380379
/* copy args to array */
381-
for (i = 0, zend_hash_internal_pointer_reset_ex(h_args, &pointer);
382-
(zp_tmp = zend_hash_get_current_data_ex(h_args, &pointer)) != NULL;
383-
++i, zend_hash_move_forward_ex(h_args, &pointer))
384-
{
380+
i = 0;
381+
ZEND_HASH_FOREACH_VAL(h_args, zp_tmp) {
385382
ZVAL_DUP(&z_callargs[i], zp_tmp);
386-
}
383+
i++;
384+
} ZEND_HASH_FOREACH_END();
387385

388386
/* multi/exec */
389387
if(ra->z_multi_exec) {
@@ -831,7 +829,6 @@ PHP_METHOD(RedisArray, mget)
831829
RedisArray *ra;
832830
int *pos, argc, *argc_each;
833831
HashTable *h_keys;
834-
HashPosition pointer;
835832
zval **redis_instances, **argv;
836833

837834
/* Multi/exec support */
@@ -861,10 +858,8 @@ PHP_METHOD(RedisArray, mget)
861858
memset(argc_each, 0, ra->count * sizeof(int));
862859

863860
/* associate each key to a redis node */
864-
for (i = 0, zend_hash_internal_pointer_reset_ex(h_keys, &pointer);
865-
(data = zend_hash_get_current_data_ex(h_keys, &pointer)) != NULL;
866-
zend_hash_move_forward_ex(h_keys, &pointer), ++i)
867-
{
861+
i = 0;
862+
ZEND_HASH_FOREACH_VAL(h_keys, data) {
868863
/* If we need to represent a long key as a string */
869864
unsigned int key_len;
870865
char kbuf[40], *key_lookup;
@@ -893,7 +888,8 @@ PHP_METHOD(RedisArray, mget)
893888

894889
argc_each[pos[i]]++; /* count number of keys per node */
895890
argv[i] = data;
896-
}
891+
i++;
892+
} ZEND_HASH_FOREACH_END();
897893

898894
/* prepare return value */
899895
array_init(return_value);
@@ -1113,7 +1109,6 @@ PHP_METHOD(RedisArray, del)
11131109
RedisArray *ra;
11141110
int *pos, argc, *argc_each;
11151111
HashTable *h_keys;
1116-
HashPosition pointer;
11171112
zval *redis_inst, **redis_instances, **argv;;
11181113
long total = 0;
11191114
int free_zkeys = 0;
@@ -1163,10 +1158,8 @@ PHP_METHOD(RedisArray, del)
11631158
memset(argc_each, 0, ra->count * sizeof(int));
11641159

11651160
/* associate each key to a redis node */
1166-
for (i = 0, zend_hash_internal_pointer_reset_ex(h_keys, &pointer);
1167-
(data = zend_hash_get_current_data_ex(h_keys, &pointer)) != NULL;
1168-
zend_hash_move_forward_ex(h_keys, &pointer), ++i) {
1169-
1161+
i = 0;
1162+
ZEND_HASH_FOREACH_VAL(h_keys, data) {
11701163
if (Z_TYPE_P(data) != IS_STRING) {
11711164
php_error_docref(NULL TSRMLS_CC, E_ERROR, "DEL: all keys must be string.");
11721165
efree(pos);
@@ -1176,7 +1169,8 @@ PHP_METHOD(RedisArray, del)
11761169
redis_instances[i] = ra_find_node(ra, Z_STRVAL_P(data), Z_STRLEN_P(data), &pos[i] TSRMLS_CC);
11771170
argc_each[pos[i]]++; /* count number of keys per node */
11781171
argv[i] = data;
1179-
}
1172+
i++;
1173+
} ZEND_HASH_FOREACH_END();
11801174

11811175
/* calls */
11821176
for(n = 0; n < ra->count; ++n) { /* for each node */

redis_array_impl.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -718,17 +718,16 @@ ra_rehash_scan(zval *z_redis, char ***keys, int **key_lens, const char *cmd, con
718718
*keys = emalloc(count * sizeof(char*));
719719
*key_lens = emalloc(count * sizeof(int));
720720

721-
for (i = 0, zend_hash_internal_pointer_reset_ex(h_keys, &pointer);
722-
(z_data_p = zend_hash_get_current_data_ex(h_keys, &pointer)) != NULL;
723-
zend_hash_move_forward_ex(h_keys, &pointer), ++i) {
724-
721+
i = 0;
722+
ZEND_HASH_FOREACH_VAL(h_keys, z_data_p) {
725723
key = Z_STRVAL_P(z_data_p);
726724
key_len = Z_STRLEN_P(z_data_p);
727725

728726
/* copy key and length */
729727
(*keys)[i] = estrndup(key, key_len);
730728
(*key_lens)[i] = key_len;
731-
}
729+
i++;
730+
} ZEND_HASH_FOREACH_END();
732731

733732
/* cleanup */
734733
zval_dtor(&z_fun_smembers);

redis_cluster.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,7 +1830,6 @@ static void cluster_eval_cmd(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
18301830
size_t lua_len, key_len;
18311831
zval *z_arr=NULL, *z_ele;
18321832
HashTable *ht_arr;
1833-
HashPosition ptr;
18341833
zend_long num_keys = 0;
18351834
short slot;
18361835
smart_string cmdstr = {0};
@@ -1855,10 +1854,7 @@ static void cluster_eval_cmd(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
18551854

18561855
// Iterate over our args if we have any
18571856
if(args_count > 0) {
1858-
for(zend_hash_internal_pointer_reset_ex(ht_arr, &ptr);
1859-
(z_ele = zend_hash_get_current_data_ex(ht_arr, &ptr)) != NULL;
1860-
zend_hash_move_forward_ex(ht_arr, &ptr))
1861-
{
1857+
ZEND 7A4D _HASH_FOREACH_VAL(ht_arr, z_ele) {
18621858
convert_to_string(z_ele);
18631859
key = Z_STRVAL_P(z_ele);
18641860
key_len = Z_STRLEN_P(z_ele);
@@ -1885,7 +1881,7 @@ static void cluster_eval_cmd(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
18851881

18861882
/* Free key if we prefixed */
18871883
if(key_free) efree(key);
1888-
}
1884+
} ZEND_HASH_FOREACH_END();
18891885
} else {
18901886
/* Pick a slot at random, we're being told there are no keys */
18911887
slot = rand() % REDIS_CLUSTER_MOD;

0 commit comments

Comments
 (0)
0