2525#include "php_redis.h"
2626#include "library.h"
2727#include "redis_commands.h"
28+ #include <ext/json/php_json.h>
2829#include <ext/standard/php_rand.h>
2930
3031#define UNSERIALIZE_NONE 0
@@ -2165,7 +2166,6 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, size_t *val_len
21652166 switch (redis_sock -> serializer ) {
21662167 case REDIS_SERIALIZER_NONE :
21672168 switch (Z_TYPE_P (z )) {
2168-
21692169 case IS_STRING :
21702170 * val = Z_STRVAL_P (z );
21712171 * val_len = Z_STRLEN_P (z );
@@ -2205,8 +2205,8 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, size_t *val_len
22052205 case REDIS_SERIALIZER_MSGPACK :
22062206#ifdef HAVE_REDIS_MSGPACK
22072207 php_msgpack_serialize (& sstr , z TSRMLS_CC );
2208- * val = estrndup (sstr .s -> val , sstr .s -> len );
2209- * val_len = sstr .s -> len ;
2208+ * val = estrndup (ZSTR_VAL ( sstr .s ), ZSTR_LEN ( sstr .s ) );
2209+ * val_len = ZSTR_LEN ( sstr .s ) ;
22102210 smart_str_free (& sstr );
22112211
22122212 return 1 ;
@@ -2221,6 +2221,13 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, size_t *val_len
22212221 }
22222222#endif
22232223 break ;
2224+ case REDIS_SERIALIZER_JSON :
2225+ php_json_encode (& sstr , z , PHP_JSON_OBJECT_AS_ARRAY );
2226+ * val = estrndup (ZSTR_VAL (sstr .s ), ZSTR_LEN (sstr .s ));
2227+ * val_len = ZSTR_LEN (sstr .s );
2228+ smart_str_free (& sstr );
2229+ return 1 ;
2230+ EMPTY_SWITCH_DEFAULT_CASE ()
22242231 }
22252232
22262233 return 0 ;
@@ -2235,6 +2242,9 @@ redis_unserialize(RedisSock* redis_sock, const char *val, int val_len,
22352242 int ret = 0 ;
22362243
22372244 switch (redis_sock -> serializer ) {
2245+ case REDIS_SERIALIZER_NONE :
2246+ /* Nothing to do */
2247+ break ;
22382248 case REDIS_SERIALIZER_PHP :
22392249 PHP_VAR_UNSERIALIZE_INIT (var_hash );
22402250
@@ -2280,6 +2290,10 @@ redis_unserialize(RedisSock* redis_sock, const char *val, int val_len,
22802290 ret = !igbinary_unserialize ((const uint8_t * )val , (size_t )val_len , z_ret TSRMLS_CC );
22812291#endif
22822292 break ;
2293+ case REDIS_SERIALIZER_JSON :
2294+ ret = !php_json_decode (z_ret , (char * )val , val_len , 1 , PHP_JSON_PARSER_DEFAULT_DEPTH );
2295+ break ;
2296+ EMPTY_SWITCH_DEFAULT_CASE ()
22832297 }
22842298
22852299 return ret ;
0 commit comments