Skip to content

Commit 82a5f70

Browse files
committed
Merge branch 'master' of https://github.com/michael-grunder/phpredis into michael-grunder
2 parents d990b4c + 8b1a64b commit 82a5f70

File tree

4 files changed

+54
-21
lines changed

4 files changed

+54
-21
lines changed

library.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ redis_key_prefix(RedisSock *redis_sock, char **key, int *key_len TSRMLS_DC) {
13841384
*/
13851385

13861386
PHPAPI int
1387-
redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t *line_size) {
1387+
redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t *line_size TSRMLS_DC) {
13881388
// Handle EOF
13891389
if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) {
13901390
return -1;
@@ -1412,7 +1412,7 @@ redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t *line_siz
14121412
}
14131413

14141414
PHPAPI int
1415-
redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info) {
1415+
redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info TSRMLS_DC) {
14161416
// Make sure we haven't lost the connection, even trying to reconnect
14171417
if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) {
14181418
// Failure
@@ -1446,13 +1446,13 @@ redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *
14461446
* Read a single line response, having already consumed the reply-type byte
14471447
*/
14481448
PHPAPI int
1449-
redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret) {
1449+
redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret TSRMLS_DC) {
14501450
// Buffer to read our single line reply
14511451
char inbuf[1024];
14521452
size_t line_size;
14531453

14541454
// Attempt to read our single line reply
1455-
if(redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &line_size) < 0) {
1455+
if(redis_sock_gets(redis_sock, inbuf, sizeof(inbuf), &line_size TSRMLS_CC) < 0) {
14561456
return -1;
14571457
}
14581458

@@ -1476,9 +1476,9 @@ redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval
14761476
}
14771477

14781478
PHPAPI int
1479-
redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret) {
1479+
redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret TSRMLS_DC) {
14801480
// Attempt to read the bulk reply
1481-
char *bulk_resp = redis_sock_read_bulk_reply(redis_sock, size);
1481+
char *bulk_resp = redis_sock_read_bulk_reply(redis_sock, size TSRMLS_CC);
14821482

14831483
// Set our reply to FALSE on failure, and the string on success
14841484
if(bulk_resp == NULL) {
@@ -1491,15 +1491,15 @@ redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret) {
14911491
}
14921492

14931493
PHPAPI int
1494-
redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret) {
1494+
redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret TSRMLS_DC) {
14951495
int reply_info;
14961496
REDIS_REPLY_TYPE reply_type;
14971497
zval *z_subelem;
14981498

14991499
// Iterate while we have elements
15001500
while(elements > 0) {
15011501
// Attempt to read our reply type
1502-
if(redis_read_reply_type(redis_sock, &reply_type, &reply_info) < 0) {
1502+
if(redis_read_reply_type(redis_sock, &reply_type, &reply_info TSRMLS_CC) < 0) {
15031503
zend_throw_exception_ex(redis_exception_ce, 0 TSRMLS_CC, "protocol error, couldn't parse MULTI-BULK response\n", reply_type);
15041504
return -1;
15051505
}
@@ -1509,7 +1509,7 @@ redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret
15091509
case TYPE_ERR:
15101510
case TYPE_LINE:
15111511
ALLOC_INIT_ZVAL(z_subelem);
1512-
redis_read_variant_line(redis_sock, reply_type, &z_subelem);
1512+
redis_read_variant_line(redis_sock, reply_type, &z_subelem TSRMLS_CC);
15131513
add_next_index_zval(*z_ret, z_subelem);
15141514
break;
15151515
case TYPE_INT:
@@ -1519,15 +1519,15 @@ redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret
15191519
case TYPE_BULK:
15201520
// Init a zval for our bulk response, read and add it
15211521
ALLOC_INIT_ZVAL(z_subelem);
1522-
redis_read_variant_bulk(redis_sock, reply_info, &z_subelem);
1522+
redis_read_variant_bulk(redis_sock, reply_info, &z_subelem TSRMLS_CC);
15231523
add_next_index_zval(*z_ret, z_subelem);
15241524
break;
15251525
case TYPE_MULTIBULK:
15261526
// Construct an array for our sub element, and add it, and recurse
15271527
ALLOC_INIT_ZVAL(z_subelem);
15281528
array_init(z_subelem);
15291529
add_next_index_zval(*z_ret, z_subelem);
1530-
redis_read_multibulk_recursive(redis_sock, reply_info, &z_subelem);
1530+
redis_read_multibulk_recursive(redis_sock, reply_info, &z_subelem TSRMLS_CC);
15311531
break;
15321532
}
15331533

@@ -1547,7 +1547,7 @@ redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zv
15471547
zval *z_ret;
15481548

15491549
// Attempt to read our header
1550-
if(redis_read_reply_type(redis_sock, &reply_type, &reply_info) < 0) {
1550+
if(redis_read_reply_type(redis_sock, &reply_type, &reply_info TSRMLS_CC) < 0) {
15511551
return -1;
15521552
}
15531553

@@ -1558,21 +1558,21 @@ redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zv
15581558
switch(reply_type) {
15591559
case TYPE_ERR:
15601560
case TYPE_LINE:
1561-
redis_read_variant_line(redis_sock, reply_type, &z_ret);
1561+
redis_read_variant_line(redis_sock, reply_type, &z_ret TSRMLS_CC);
15621562
break;
15631563
case TYPE_INT:
15641564
ZVAL_LONG(z_ret, reply_info);
15651565
break;
15661566
case TYPE_BULK:
1567-
redis_read_variant_bulk(redis_sock, reply_info, &z_ret);
1567+
redis_read_variant_bulk(redis_sock, reply_info, &z_ret TSRMLS_CC);
15681568
break;
15691569
case TYPE_MULTIBULK:
15701570
// Initialize an array for our multi-bulk response
15711571
array_init(z_ret);
15721572

15731573
// If we've got more than zero elements, parse our multi bulk respoinse recursively
15741574
if(reply_info > -1) {
1575-
redis_read_multibulk_recursive(redis_sock, reply_info, &z_ret);
1575+
redis_read_multibulk_recursive(redis_sock, reply_info, &z_ret TSRMLS_CC);
15761576
}
15771577
break;
15781578
default:

library.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,8 @@ redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **re
5151
* Variant Read methods, mostly to implement eval
5252
*/
5353

54-
PHPAPI int redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info);
55-
PHPAPI int redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info);
56-
PHPAPI int redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret);
57-
PHPAPI int redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret);
58-
PHPAPI int redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret);
54+
PHPAPI int redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info TSRMLS_DC);
55+
PHPAPI int redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret TSRMLS_DC);
56+
PHPAPI int redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret TSRMLS_DC);
57+
PHPAPI int redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret TSRMLS_DC);
5958
PHPAPI int redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);

php_redis.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ PHP_METHOD(Redis, evalsha);
134134
PHP_METHOD(Redis, script);
135135
PHP_METHOD(Redis, dump);
136136
PHP_METHOD(Redis, restore);
137+
PHP_METHOD(Redis, migrate);
137138

138139
PHP_METHOD(Redis, getLastError);
139-
140140
PHP_METHOD(Redis, _prefix);
141141
PHP_METHOD(Redis, _unserialize);
142142

redis.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ static zend_function_entry redis_functions[] = {
162162
PHP_ME(Redis, script, NULL, ZEND_ACC_PUBLIC)
163163
PHP_ME(Redis, dump, NULL, ZEND_ACC_PUBLIC)
164164
PHP_ME(Redis, restore, NULL, ZEND_ACC_PUBLIC)
165+
PHP_ME(Redis, migrate, NULL, ZEND_ACC_PUBLIC)
165166

166167
PHP_ME(Redis, getLastError, NULL, ZEND_ACC_PUBLIC)
167168

@@ -6028,6 +6029,39 @@ PHP_METHOD(Redis, restore) {
60286029
REDIS_PROCESS_RESPONSE(redis_boolean_response);
60296030
}
60306031

6032+
/*
6033+
* {{{ proto Redis::migrate(host port key dest-db timeout)
6034+
*/
6035+
PHP_METHOD(Redis, migrate) {
6036+
zval *object;
6037+
RedisSock *redis_sock;
6038+
char *cmd, *host, *key;
6039+
int cmd_len, host_len, key_len, port, dest_db, timeout, key_free;
6040+
6041+
// Parse arguments
6042+
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oslsll", &object, redis_ce,
6043+
&host, &host_len, &port, &key, &key_len, &dest_db, &timeout) == FAILURE) {
6044+
RETURN_FALSE;
6045+
}
6046+
6047+
// Grabg our socket
6048+
if(redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
6049+
RETURN_FALSE;
6050+
}
6051+
6052+
// Prefix our key if we need to, build our command
6053+
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
6054+
cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsdd", host, host_len, port, key, key_len, dest_db, timeout);
6055+
if(key_free) efree(key);
6056+
6057+
// Kick off our MIGRATE request
6058+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
6059+
IF_ATOMIC() {
6060+
redis_boolean_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
6061+
}
6062+
REDIS_PROCESS_RESPONSE(redis_boolean_response);
6063+
}
6064+
60316065
/*
60326066
* {{{ proto Redis::_prefix(key)
60336067
*/

0 commit comments

Comments
 (0)