Skip to content

Commit b1142fe

Browse files
committed
Merge branch 'master' into serializer
Conflicts: library.c
2 parents 7c24786 + 322dd1d commit b1142fe

File tree

7 files changed

+236
-39
lines changed

7 files changed

+236
-39
lines changed

README.markdown

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,7 @@ $redis->append('key', 'value2'); /* 12 */
14091409
$redis->get('key'); /* 'value1value2' */
14101410
</pre>
14111411

1412-
## substr
1412+
## getRange (substr also supported but deprecated in redis)
14131413
##### *Description*
14141414
Return a substring of a larger string
14151415

@@ -1424,8 +1424,27 @@ Return a substring of a larger string
14241424
##### *Example*
14251425
<pre>
14261426
$redis->set('key', 'string value');
1427-
$redis->substr('key', 0, 5); /* 'string' */
1428-
$redis->substr('key', -5, -1); /* 'value' */
1427+
$redis->getRange('key', 0, 5); /* 'string' */
1428+
$redis->getRange('key', -5, -1); /* 'value' */
1429+
</pre>
1430+
1431+
## setRange
1432+
##### *Description*
1433+
Changes a substring of a larger string.
1434+
1435+
##### *Parameters*
1436+
*key*
1437+
*offset*
1438+
*value*
1439+
1440+
##### *Return value*
1441+
*STRING*: the length of the string after it was modified.
1442+
1443+
##### *Example*
1444+
<pre>
1445+
$redis->set('key', 'Hello world');
1446+
$redis->setRange('key', 6, "redis"); /* returns 11 */
1447+
$redis->get('key'); /* "Hello redis" */
14291448
</pre>
14301449

14311450
## strlen
@@ -1444,6 +1463,44 @@ $redis->set('key', 'value');
14441463
$redis->strlen('key'); /* 5 */
14451464
</pre>
14461465

1466+
## getBit
1467+
##### *Description*
1468+
Return a single bit out of a larger string
1469+
1470+
##### *Parameters*
1471+
*key*
1472+
*offset*
1473+
1474+
##### *Return value*
1475+
*LONG*: the bit value (0 or 1)
1476+
1477+
##### *Example*
1478+
<pre>
1479+
$redis->set('key', "\x7f"); // this is 0111 1111
1480+
$redis->getBit('key', 0); /* 0 */
1481+
$redis->getBit('key', 1); /* 1 */
1482+
</pre>
1483+
1484+
## setBit
1485+
##### *Description*
1486+
Changes a single bit of a string.
1487+
1488+
##### *Parameters*
1489+
*key*
1490+
*offset*
1491+
*value*: bool or int (1 or 0)
1492+
1493+
##### *Return value*
1494+
*LONG*: 0 or 1, the value of the bit before it was set.
1495+
1496+
##### *Example*
1497+
<pre>
1498+
$redis->set('key', "*"); // ord("*") = 42 = 0x2f = "0010 1010"
1499+
$redis->setBit('key', 5, 1); /* returns 0 */
1500+
$redis->setBit('key', 7, 1); /* returns 0 */
1501+
$redis->get('key'); /* chr(0x2f) = "/" = b("0010 1111") */
1502+
</pre>
1503+
14471504
## flushDB
14481505

14491506
##### *Description*

common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
redis_sock->pipeline_head = redis_sock->pipeline_current;\
7575
}
7676

77-
#define SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len) if(redis_sock_write(redis_sock, cmd, cmd_len) < 0) { \
77+
#define SOCKET_WRITE_COMMAND(redis_sock, cmd, cmd_len) if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) { \
7878
efree(cmd); \
7979
RETURN_FALSE; \
8080
}

library.c

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ extern zend_class_entry *redis_ce;
1616
extern zend_class_entry *redis_exception_ce;
1717
extern zend_class_entry *spl_ce_RuntimeException;
1818

19+
PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC) {
20+
if (!redis_sock->persistent) {
21+
php_stream_close(redis_sock->stream);
22+
} else {
23+
php_stream_pclose(redis_sock->stream);
24+
}
25+
}
26+
1927
PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
2028
{
2129

@@ -24,9 +32,7 @@ PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
2432
while(eof) {
2533
if(count++ == 10) { /* too many failures */
2634
if(redis_sock->stream) { /* close stream if still here */
27-
if (!redis_sock->persistent) { /* never ever close persistent streams by ourself */
28-
php_stream_close(redis_sock->stream);
29-
}
35+
redis_stream_close(redis_sock TSRMLS_CC);
3036
redis_sock->stream = NULL;
3137
redis_sock->mode = ATOMIC;
3238
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
@@ -35,9 +41,7 @@ PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
3541
return -1;
3642
}
3743
if(redis_sock->stream) { /* close existing stream before reconnecting */
38-
if (!redis_sock->persistent) {
39-
php_stream_close(redis_sock->stream);
40-
}
44+
redis_stream_close(redis_sock TSRMLS_CC);
4145
redis_sock->stream = NULL;
4246
redis_sock->mode = ATOMIC;
4347
}
@@ -57,9 +61,7 @@ PHPAPI zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS,
5761
}
5862

5963
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
60-
if (!redis_sock->persistent) {
61-
php_stream_close(redis_sock->stream);
62-
}
64+
redis_stream_close(redis_sock TSRMLS_CC);
6365
redis_sock->stream = NULL;
6466
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
6567
redis_sock->mode = ATOMIC;
@@ -129,9 +131,7 @@ PHPAPI char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC)
129131
}
130132

131133
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
132-
if (!redis_sock->persistent) {
133-
php_stream_close(redis_sock->stream);
134-
}
134+
redis_stream_close(redis_sock TSRMLS_CC);
135135
redis_sock->stream = NULL;
136136
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
137137
redis_sock->mode = ATOMIC;
@@ -615,9 +615,8 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
615615
return -1;
616616
}
617617
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
618-
if (!redis_sock->persistent) {
619-
php_stream_close(redis_sock->stream);
620-
}
618+
redis_stream_close(redis_sock TSRMLS_CC);
619+
redis_sock->stream = NULL;
621620
redis_sock->stream = NULL;
622621
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
623622
redis_sock->mode = ATOMIC;
@@ -903,9 +902,7 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
903902
return -1;
904903
}
905904
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
906-
if (!redis_sock->persistent) {
907-
php_stream_close(redis_sock->stream);
908-
}
905+
redis_stream_close(redis_sock TSRMLS_CC);
909906
redis_sock->stream = NULL;
910907
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
911908
redis_sock->mode = ATOMIC;
@@ -973,9 +970,7 @@ PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, R
973970
return -1;
974971
}
975972
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
976-
if (!redis_sock->persistent) {
977-
php_stream_close(redis_sock->stream);
978-
}
973+
redis_stream_close(redis_sock TSRMLS_CC);
979974
redis_sock->stream = NULL;
980975
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
981976
redis_sock->mode = ATOMIC;

library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS,
2626
PHPAPI int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
2727
PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
2828
PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz TSRMLS_DC);
29+
PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC);
2930
PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC);
3031
//PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC);
3132
PHPAPI void redis_free_socket(RedisSock *redis_sock);

php_redis.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ PHP_METHOD(Redis, decr);
4545
PHP_METHOD(Redis, decrBy);
4646
PHP_METHOD(Redis, type);
4747
PHP_METHOD(Redis, append);
48-
PHP_METHOD(Redis, substr);
48+
PHP_METHOD(Redis, getRange);
49+
PHP_METHOD(Redis, setRange);
50+
PHP_METHOD(Redis, getBit);
51+
PHP_METHOD(Redis, setBit);
4952
PHP_METHOD(Redis, strlen);
5053
PHP_METHOD(Redis, getKeys);
5154
PHP_METHOD(Redis, sort);

redis.c

Lines changed: 94 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ static zend_function_entry redis_functions[] = {
6969
PHP_ME(Redis, decrBy, NULL, ZEND_ACC_PUBLIC)
7070
PHP_ME(Redis, type, NULL, ZEND_ACC_PUBLIC)
7171
PHP_ME(Redis, append, NULL, ZEND_ACC_PUBLIC)
72-
PHP_ME(Redis, substr, NULL, ZEND_ACC_PUBLIC)
72+
PHP_ME(Redis, getRange, NULL, ZEND_ACC_PUBLIC)
73+
PHP_ME(Redis, setRange, NULL, ZEND_ACC_PUBLIC)
74+
PHP_ME(Redis, getBit, NULL, ZEND_ACC_PUBLIC)
75+
PHP_ME(Redis, setBit, NULL, ZEND_ACC_PUBLIC)
7376
PHP_ME(Redis, strlen, NULL, ZEND_ACC_PUBLIC)
7477
PHP_ME(Redis, getKeys, NULL, ZEND_ACC_PUBLIC)
7578
PHP_ME(Redis, sort, NULL, ZEND_ACC_PUBLIC)
@@ -183,6 +186,7 @@ static zend_function_entry redis_functions[] = {
183186
PHP_MALIAS(Redis, zRemove, zDelete, NULL, ZEND_ACC_PUBLIC)
184187
PHP_MALIAS(Redis, zRemoveRangeByScore, zDeleteRangeByScore, NULL, ZEND_ACC_PUBLIC)
185188
PHP_MALIAS(Redis, zSize, zCard, NULL, ZEND_ACC_PUBLIC)
189+
PHP_MALIAS(Redis, substr, getRange, NULL, ZEND_ACC_PUBLIC)
186190
{NULL, NULL, NULL}
187191
};
188192

@@ -1130,7 +1134,7 @@ PHP_METHOD(Redis, append)
11301134
REDIS_PROCESS_RESPONSE(redis_long_response);
11311135
}
11321136

1133-
PHP_METHOD(Redis, substr)
1137+
PHP_METHOD(Redis, getRange)
11341138
{
11351139
zval *object;
11361140
RedisSock *redis_sock;
@@ -1148,14 +1152,94 @@ PHP_METHOD(Redis, substr)
11481152
RETURN_FALSE;
11491153
}
11501154

1151-
cmd_len = redis_cmd_format_static(&cmd, "SUBSTR", "sdd", key, key_len, (int)start, (int)end);
1155+
cmd_len = redis_cmd_format_static(&cmd, "GETRANGE", "sdd", key, key_len, (int)start, (int)end);
11521156
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
11531157
IF_ATOMIC() {
11541158
redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
11551159
}
11561160
REDIS_PROCESS_RESPONSE(redis_string_response);
11571161
}
11581162

1163+
PHP_METHOD(Redis, setRange)
1164+
{
1165+
zval *object;
1166+
RedisSock *redis_sock;
1167+
char *key = NULL, *val, *cmd;
1168+
int key_len, val_len, cmd_len;
1169+
long offset;
1170+
1171+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osls",
1172+
&object, redis_ce, &key, &key_len,
1173+
&offset, &val, &val_len) == FAILURE) {
1174+
RETURN_FALSE;
1175+
}
1176+
1177+
if (redis_sock_get(object, &redis_sock TSRMLS_CC) < 0) {
1178+
RETURN_FALSE;
1179+
}
1180+
1181+
cmd_len = redis_cmd_format_static(&cmd, "SETRANGE", "sds", key, key_len, (int)offset, val, val_len);
1182+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
1183+
IF_ATOMIC() {
1184+
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
1185+
}
1186+
REDIS_PROCESS_RESPONSE(redis_long_response);
1187+
}
1188+
1189+
PHP_METHOD(Redis, getBit)
1190+
{
1191+
zval *object;
1192+
RedisSock *redis_sock;
1193+
char *key = NULL, *cmd;
1194+
int key_len, cmd_len;
1195+
long offset;
1196+
1197+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osl",
1198+
&object, redis_ce, &key, &key_len,
1199+
&offset) == FAILURE) {
1200+
RETURN_FALSE;
1201+
}
1202+
1203+
if (redis_sock_get(object, &redis_sock TSRMLS_CC) < 0) {
1204+
RETURN_FALSE;
1205+
}
1206+
1207+
cmd_len = redis_cmd_format_static(&cmd, "GETBIT", "sd", key, key_len, (int)offset);
1208+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
1209+
IF_ATOMIC() {
1210+
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
1211+
}
1212+
REDIS_PROCESS_RESPONSE(redis_long_response);
1213+
}
1214+
1215+
PHP_METHOD(Redis, setBit)
1216+
{
1217+
zval *object;
1218+
RedisSock *redis_sock;
1219+
char *key = NULL, *cmd;
1220+
int key_len, cmd_len;
1221+
long offset;
1222+
zend_bool val;
1223+
1224+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oslb",
1225+
&object, redis_ce, &key, &key_len,
1226+
&offset, &val) == FAILURE) {
1227+
RETURN_FALSE;
1228+
}
1229+
1230+
if (redis_sock_get(object, &redis_sock TSRMLS_CC) < 0) {
1231+
RETURN_FALSE;
1232+
}
1233+
1234+
cmd_len = redis_cmd_format_static(&cmd, "SETBIT", "sdd", key, key_len, (int)offset, (int)val);
1235+
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
1236+
IF_ATOMIC() {
1237+
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
1238+
}
1239+
REDIS_PROCESS_RESPONSE(redis_long_response);
1240+
}
1241+
1242+
11591243
PHP_METHOD(Redis, strlen)
11601244
{
11611245
zval *object;
@@ -4017,7 +4101,7 @@ PHP_METHOD(Redis, multi)
40174101
IF_MULTI() {
40184102
cmd_len = redis_cmd_format_static(&cmd, "MULTI", "");
40194103

4020-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4104+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
40214105
efree(cmd);
40224106
RETURN_FALSE;
40234107
}
@@ -4062,7 +4146,7 @@ PHP_METHOD(Redis, discard)
40624146

40634147
cmd_len = redis_cmd_format_static(&cmd, "DISCARD", "");
40644148

4065-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4149+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
40664150
efree(cmd);
40674151
RETURN_FALSE;
40684152
}
@@ -4176,7 +4260,7 @@ PHP_METHOD(Redis, exec)
41764260

41774261
cmd_len = redis_cmd_format_static(&cmd, "EXEC", "");
41784262

4179-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4263+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
41804264
efree(cmd);
41814265
RETURN_FALSE;
41824266
}
@@ -4213,7 +4297,7 @@ PHP_METHOD(Redis, exec)
42134297
}
42144298

42154299
if(request != NULL) {
4216-
if (redis_sock_write(redis_sock, request, total) < 0) {
4300+
if (redis_sock_write(redis_sock, request, total TSRMLS_CC) < 0) {
42174301
free(request);
42184302
free_reply_callbacks(object, redis_sock);
42194303
redis_sock->mode = ATOMIC;
@@ -4303,7 +4387,7 @@ PHP_METHOD(Redis, publish)
43034387

43044388
cmd_len = redis_cmd_format_static(&cmd, "PUBLISH", "ss", key, key_len, val, val_len);
43054389

4306-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4390+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
43074391
efree(cmd);
43084392
RETURN_FALSE;
43094393
}
@@ -4360,7 +4444,7 @@ PHP_METHOD(Redis, subscribe)
43604444
old_cmd = cmd;
43614445
cmd_len = spprintf(&cmd, 0, "SUBSCRIBE %s\r\n", cmd);
43624446
efree(old_cmd);
4363-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4447+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
43644448
efree(cmd);
43654449
RETURN_FALSE;
43664450
}
@@ -4523,7 +4607,7 @@ PHP_METHOD(Redis, unsubscribe)
45234607
cmd_len = spprintf(&cmd, 0, "UNSUBSCRIBE %s\r\n", cmd);
45244608
efree(old_cmd);
45254609

4526-
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
4610+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
45274611
efree(cmd);
45284612
RETURN_FALSE;
45294613
}

0 commit comments

Comments
 (0)