13
13
#include "ext/session/php_session.h" /* for php_session_register_serializer */
14
14
#endif
15
15
16
+ #if defined(HAVE_APCU_SUPPORT )
17
+ #include "ext/apcu/apc_serializer.h"
18
+ #endif /* HAVE_APCU_SUPPORT */
19
+
16
20
#include "php_msgpack.h"
17
21
#include "msgpack_pack.h"
18
22
#include "msgpack_unpack.h"
@@ -57,6 +61,12 @@ PHP_INI_END()
57
61
PS_SERIALIZER_FUNCS (msgpack );
58
62
#endif
59
63
64
+ #if defined(HAVE_APCU_SUPPORT )
65
+ /** Apc serializer function prototypes */
66
+ static int APC_SERIALIZER_NAME (msgpack ) (APC_SERIALIZER_ARGS );
67
+ static int APC_UNSERIALIZER_NAME (msgpack ) (APC_UNSERIALIZER_ARGS );
68
+ #endif
69
+
60
70
static zend_function_entry msgpack_functions [] = {
61
71
ZEND_FE (msgpack_serialize , arginfo_msgpack_serialize )
62
72
ZEND_FE (msgpack_unserialize , arginfo_msgpack_unserialize )
@@ -92,6 +102,13 @@ static ZEND_MINIT_FUNCTION(msgpack) /* {{{ */ {
92
102
php_session_register_serializer ("msgpack" , PS_SERIALIZER_ENCODE_NAME (msgpack ), PS_SERIALIZER_DECODE_NAME (msgpack ));
93
103
#endif
94
104
105
+ #if defined(HAVE_APCU_SUPPORT )
106
+ apc_register_serializer ("msgpack" ,
107
+ APC_SERIALIZER_NAME (msgpack ),
108
+ APC_UNSERIALIZER_NAME (msgpack ),
109
+ NULL TSRMLS_CC );
110
+ #endif
111
+
95
112
msgpack_init_class ();
96
113
97
114
REGISTER_LONG_CONSTANT ("MESSAGEPACK_OPT_PHPONLY" ,
@@ -115,6 +132,9 @@ static ZEND_MINFO_FUNCTION(msgpack) /* {{{ */ {
115
132
php_info_print_table_row (2 , "MessagePack Support" , "enabled" );
116
133
#if HAVE_PHP_SESSION
117
134
php_info_print_table_row (2 , "Session Support" , "enabled" );
135
+ #endif
136
+ #if defined(HAVE_APCU_SUPPORT )
137
+ php_info_print_table_row (2 , "APCu Serializer Support" , "enabled" );
118
138
#endif
119
139
php_info_print_table_row (2 , "extension Version" , PHP_MSGPACK_VERSION );
120
140
php_info_print_table_row (2 , "header Version" , MSGPACK_VERSION );
@@ -306,6 +326,54 @@ static ZEND_FUNCTION(msgpack_unserialize) /* {{{ */ {
306
326
}
307
327
/* }}} */
308
328
329
+ #if defined(HAVE_APCU_SUPPORT )
330
+ /* {{{ apc_serialize function */
331
+ static int APC_SERIALIZER_NAME (msgpack ) ( APC_SERIALIZER_ARGS ) {
332
+ (void )config ;
333
+
334
+ smart_str res = {0 };
335
+ msgpack_serialize_data_t var_hash ;
336
+
337
+ msgpack_serialize_var_init (& var_hash );
338
+ msgpack_serialize_zval (& res , (zval * ) value , var_hash );
339
+ msgpack_serialize_var_destroy (& var_hash );
340
+
341
+ smart_str_0 (& res );
342
+
343
+ * buf = (unsigned char * ) estrndup (ZSTR_VAL (res .s ), ZSTR_LEN (res .s ));
344
+ * buf_len = ZSTR_LEN (res .s );
345
+
346
+ return 1 ;
347
+ }
348
+ /* }}} */
349
+ /* {{{ apc_unserialize function */
350
+ static int APC_UNSERIALIZER_NAME (msgpack ) ( APC_UNSERIALIZER_ARGS ) {
351
+ (void )config ;
352
+
353
+ int ret ;
354
+ msgpack_unpack_t mp ;
355
+ msgpack_unserialize_data_t var_hash ;
356
+ size_t off = 0 ;
357
+
358
+ template_init (& mp );
359
+
360
+ msgpack_unserialize_var_init (& var_hash );
361
+
362
+ mp .user .retval = value ;
363
+ mp .user .var_hash = & var_hash ;
364
+
365
+ ret = template_execute (& mp , (char * ) buf , buf_len , & off );
366
+ if (Z_TYPE_P (mp .user .retval ) == IS_REFERENCE ) {
367
+ ZVAL_DEREF (mp .user .retval );
368
+ }
369
+
370
+ msgpack_unserialize_var_destroy (& var_hash , 0 );
371
+
372
+ return ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS ;
373
+ }
374
+ /* }}} */
375
+ #endif
376
+
309
377
/*
310
378
* Local variables:
311
379
* tab-width: 4
0 commit comments