10000 Fixed INFO, TYPE for MULTI/EXEC context. · DQPHP/phpredis@c6c0021 · GitHub
[go: up one dir, main page]

Skip to content

Commit c6c0021

Browse files
committed
Fixed INFO, TYPE for MULTI/EXEC context.
1 parent 09728b8 commit c6c0021

File tree

4 files changed

+132
-92
lines changed

4 files changed

+132
-92
lines changed

library.c

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,106 @@ 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) {
379+
char *response;
380+
int response_len;
381+
char ret;
382+
383+
zval *object = getThis();
384+
385+
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
386+
RETURN_FALSE;
387+
}
388+
389+
long l;
390+
if (strncmp(response, "+string", 7) == 0) {
391+
l = REDIS_STRING;
392+
} else if (strncmp(response, "+set", 4) == 0){
393+
l = REDIS_SET;
394+
} else if (strncmp(response, "+list", 5) == 0){
395+
l = REDIS_LIST;
396+
} else {
397+
l = REDIS_NOT_FOUND;
398+
}
399+
400+
efree(response);
401+
IF_MULTI_OR_PIPELINE() {
402+
add_next_index_long(z_tab, l);
403+
} else {
404+
RETURN_LONG(l);
405+
}
406+
}
407+
408+
PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
409+
char *response;
410+
int response_len;
411+
char ret;
412+
413+
zval *object = getThis();
414+
415+
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
416+
RETURN_FALSE;
417+
}
418+
419+
zval *z_multi_result;
420+
MAKE_STD_ZVAL(z_multi_result);
421+
array_init(z_multi_result); /* pre-allocate array for multi's results. */
422+
/* response :: [response_line]
423+
* response_line :: key ':' value CRLF
424+
*/
425+
426+
char *pos, *cur = response;
427+
while(1) {
428+
char *key, *value, *p;
429+
int is_numeric;
430+
/* key */
431+
pos = strchr(cur, ':');
432+
if(pos == NULL) {
433+
break;
434+
}
435+
key = emalloc(pos - cur + 1);
436+
memcpy(key, cur, pos-cur);
437+
key[pos-cur] = 0;
438+
439+
/* value */
440+
cur = pos + 1;
441+
pos = strchr(cur, '\r');
442+
if(pos == NULL) {
443+
break;
444+
}
445+
value = emalloc(pos - cur + 1);
446+
memcpy(value, cur, pos-cur);
447+
value[pos-cur] = 0;
448+
pos += 2; /* \r, \n */
449+
cur = pos;
450+
451+
is_numeric = 1;
452+
for(p = value; *p; ++p) {
453+
if(*p < '0' || *p > '9') {
454+
is_numeric = 0;
455+
break;
456+
}
457+
}
458+
459+
if(is_numeric == 1) {
460+
add_assoc_long(z_multi_result, key, atol(value));
461+
efree(value);
462+
} else {
463+
add_assoc_string(z_multi_result, key, value, 0);
464+
}
465+
efree(key);
466+
}
467+
efree(response);
468+
469+
IF_MULTI_OR_PIPELINE() {
470+
add_next_index_zval(z_tab, z_multi_result);
471+
} else {
472+
*return_value = *z_multi_result;
473+
zval_copy_ctor(return_value);
474+
efree(z_multi_result);
475+
}
476+
}
477+
378478
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
379479

380480
char *response;
@@ -472,7 +572,7 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
472572
efree(z_multi_result);
473573
}
474574

475-
return 0;
575+
return 0;
476576
}
477577

478578
PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {

library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
1010
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
1111
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
1212
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);
1315
PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short port, long timeout);
1416
PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC);
1517
PHPAPI int redis_sock_server_open(RedisSock *redis_sock, int force_connect TSRMLS_DC);

redis.c

Lines changed: 14 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -916,37 +916,11 @@ PHP_METHOD(Redis, type)
916916

917917
cmd_len = redis_cmd_format_static(&cmd, "TYPE", "s", key, key_len);
918918

919-
IF_MULTI_OR_ATOMIC() {
920-
SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len);
921-
}
922-
IF_PIPELINE() {
923-
PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len);
924-
}
925-
efree(cmd);
926-
927-
MULTI_RESPONSE(redis_long_response);
919+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
928920
IF_ATOMIC() {
929-
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
930-
RETURN_FALSE;
931-
}
932-
933-
long l;
934-
if (strncmp(response, "+string", 7) == 0) {
935-
l = REDIS_STRING;
936-
} else if (strncmp(response, "+set", 4) == 0){
937-
l = REDIS_SET;
938-
} else if (strncmp(response, "+list", 5) == 0){
939-
l = REDIS_LIST;
940-
} else {
941-
l = REDIS_NOT_FOUND;
942-
}
943-
efree(response);
944-
RETURN_LONG(l);
921+
redis_type_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL);
945922
}
946-
ELSE_IF_MULTI()
947-
ELSE_IF_PIPELINE();
948-
949-
923+
REDIS_PROCESS_RESPONSE(redis_type_response);
950924
}
951925
/* }}} */
952926

@@ -1592,8 +1566,6 @@ PHP_METHOD(Redis, sDiff) {
15921566
}
15931567
}
15941568
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply);
1595-
1596-
15971569
}
15981570
/* }}} */
15991571

@@ -1785,8 +1757,7 @@ PHP_METHOD(Redis, sort) {
17851757
/* complete with prefix */
17861758

17871759
old_cmd = cmd;
1788-
cmd_len = redis_cmd_format(&cmd, "*%d" _NL "%s",
1789-
elements, cmd, cmd_len);
1760+
cmd_len = redis_cmd_format(&cmd, "*%d" _NL "%s", elements, cmd, cmd_len);
17901761
efree(old_cmd);
17911762

17921763
/* run command */
@@ -2274,59 +2245,12 @@ PHP_METHOD(Redis, info) {
22742245
RETURN_FALSE;
22752246
}
22762247

2277-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
2278-
/* no efree(cmd) here, it's on the stack. */
2279-
RETURN_FALSE;
2280-
}
2281-
2282-
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
2283-
RETURN_FALSE;
2284-
}
2285-
2286-
array_init(return_value);
2287-
/* response :: [response_line]
2288-
* response_line :: key ':' value CRLF
2289-
*/
2290-
2291-
cur = response;
2292-
while(1) {
2293-
/* key */
2294-
pos = strchr(cur, ':');
2295-
if(pos == NULL) {
2296-
break;
2297-
}
2298-
key = emalloc(pos - cur + 1);
2299-
memcpy(key, cur, pos-cur);
2300-
key[pos-cur] = 0;
2301-
2302-
/* value */
2303-
cur = pos + 1;
2304-
pos = strchr(cur, '\r');
2305-
if(pos == NULL) {
2306-
break;
2307-
}
2308-
value = emalloc(pos - cur + 1);
2309-
memcpy(value, cur, pos-cur);
2310-
value[pos-cur] = 0;
2311-
pos += 2; /* \r, \n */
2312-
cur = pos;
2313-
2314-
is_numeric = 1;
2315-
for(p = value; *p; ++p) {
2316-
if(*p < '0' || *p > '9') {
2317-
is_numeric = 0;
2318-
break;
2319-
}
2320-
}
2248+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
2249+
IF_ATOMIC() {
2250+
redis_info_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL);
2251+
}
2252+
REDIS_PROCESS_RESPONSE(redis_info_response);
23212253

2322-
if(is_numeric == 1) {
2323-
add_assoc_long(return_value, key, atol(value));
2324-
efree(value);
2325-
} else {
2326-
add_assoc_string(return_value, key, value, 0);
2327-
}
2328-
efree(key);
2329-
}
23302254
}
23312255
/* }}} */
23322256

@@ -2414,7 +2338,7 @@ PHP_METHOD(Redis, mset) {
24142338
RETURN_FALSE;
24152339
}
24162340

2417-
cmd_len = redis_cmd_format(&cmd, "*%d\r\n$4\r\nMSET\r\n" 10000 , 1 + 2 * zend_hash_num_elements(Z_ARRVAL_P(z_array)));
2341+
cmd_len = redis_cmd_format(&cmd, "*%d" _NL "$4" _NL "MSET" _NL, 1 + 2 * zend_hash_num_elements(Z_ARRVAL_P(z_array)));
24182342

24192343
HashTable *keytable = Z_ARRVAL_P(z_array);
24202344
for(zend_hash_internal_pointer_reset(keytable);
@@ -2445,10 +2369,10 @@ PHP_METHOD(Redis, mset) {
24452369

24462370
cmd_len = redis_cmd_format(&cmd,
24472371
"%s"
2448-
"$%d" "\r\n" /* key_len */
2449-
"%s" "\r\n" /* key */
2450-
"$%d" "\r\n" /* val_len */
2451-
"%s" "\r\n" /* val */
2372+
"$%d" _NL /* key_len */
2373+
"%s" _NL /* key */
2374+
"$%d" _NL /* val_len */
2375+
"%s" _NL /* val */
24522376
, cmd, cmd_len
24532377
, key_len, key, key_len
24542378
, val_len, val, val_len);

tests/TestRedis.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1650,6 +1650,20 @@ public function testPipeline() {
16501650

16511651
protected function sequence($mode) {
16521652

1653+
$ret = $this->redis->multi($mode)
1654+
->set('x', 42)
1655+
->info()
1656+
->type('x')
1657+
->get('x')
1658+
->exec();
1659+
1660+
$this->assertTrue(is_array($ret));
1661+
$i = 0;
1662+
$this->assertTrue($ret[$i++] == TRUE);
1663+
$this->assertTrue(is_array($ret[$i++]));
1664+
$this->assertTrue($ret[$i++] === Redis::REDIS_STRING);
1665+
$this->assertTrue($ret[$i++] === '42');
1666+
16531667
$ret = $this->redis->multi($mode)
16541668
->delete('key1')
16551669
->set('key1', 'value1')
@@ -1673,7 +1687,7 @@ protected function sequence($mode) {
16731687

16741688
$this->assertTrue(is_array($ret));
16751689
$i = 0;
1676-
$this->assertTrue($ret[$i++] == TRUE);
1690+
$this->assertTrue(is_long($ret[$i++]));
16771691
$this->assertTrue($ret[$i++] == TRUE);
16781692
$this->assertTrue($ret[$i++] == 'value1');
16791693
$this->assertTrue($ret[$i++] == 'value1');

0 commit comments

Comments
 (0)
0