44
44
#include <ext/standard/php_var.h>
45
45
#include <ext/standard/basic_functions.h>
46
46
47
+ #include "php_memcached_server.h"
47
48
#include "php_memcached.h"
48
49
#include "g_fmt.h"
49
50
50
51
#ifdef HAVE_MEMCACHED_SESSION
51
52
# include "php_memcached_session.h"
52
53
#endif
53
54
54
- #include "php_memcached_server.h"
55
+
55
56
56
57
#include "fastlz/fastlz.h"
57
58
#include <zlib.h>
@@ -143,6 +144,7 @@ typedef unsigned long int uint32_t;
143
144
****************************************/
144
145
#define MEMC_GET_PRESERVE_ORDER (1<<0)
145
146
147
+
146
148
/****************************************
147
149
Helper macros
148
150
****************************************/
@@ -212,6 +214,11 @@ typedef struct {
212
214
int memc_errno ;
213
215
} php_memc_t ;
214
216
217
+ typedef struct {
218
+ zend_object zo ;
219
+ php_memc_proto_handler_t * handler ;
220
+ } php_memc_server_t ;
221
+
215
222
enum {
216
223
MEMC_OP_SET ,
217
224
MEMC_OP_TOUCH ,
@@ -226,6 +233,7 @@ static zend_class_entry *memcached_server_ce = NULL;
226
233
static zend_class_entry * memcached_exception_ce = NULL ;
227
234
228
235
static zend_object_handlers memcached_object_handlers ;
236
+ static zend_object_handlers memcached_server_object_handlers ;
229
237
230
238
struct callbackContext
231
239
{
@@ -243,8 +251,8 @@ static zend_class_entry *spl_ce_RuntimeException = NULL;
243
251
#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3 )
244
252
const zend_fcall_info empty_fcall_info = { 0 , NULL , NULL , NULL , NULL , 0 , NULL , NULL , 0 };
245
253
#undef ZEND_BEGIN_ARG_INFO_EX
246
- #define ZEND_BEGIN_ARG_INFO_EX (name , pass_rest_by_reference , return_reference , required_num_args ) \
247
- static zend_arg_info name[] = { \
254
+ #define ZEND_BEGIN_ARG_INFO_EX (name , pass_rest_by_reference , return_reference , required_num_args ) \
255
+ static zend_arg_info name[] = { \
248
256
{ NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },
249
257
#endif
250
258
@@ -2645,6 +2653,35 @@ zend_object_value php_memc_new(zend_class_entry *ce TSRMLS_DC)
2645
2653
return retval ;
2646
2654
}
2647
2655
2656
+ static
2657
+ void php_memc_server_free_storage (php_memc_server_t * intern TSRMLS_DC )
2658
+ {
2659
+ zend_object_std_dtor (& intern -> zo TSRMLS_CC );
2660
+ efree (intern );
2661
+ }
2662
+
2663
+ zend_object_value php_memc_server_new (zend_class_entry * ce TSRMLS_DC )
2664
+ {
2665
+ zend_object_value retval ;
2666
+ php_memc_server_t * intern ;
2667
+ zval * tmp ;
2668
+
2669
+ intern = ecalloc (1 , sizeof (php_memc_server_t ));
2670
+ zend_object_std_init (& intern -> zo , ce TSRMLS_CC );
2671
+ #if PHP_VERSION_ID >= 50400
2672
+ object_properties_init ( (zend_object * ) intern , ce );
2673
+ #else
2674
+ zend_hash_copy (intern -> zo .properties , & ce -> default_properties , (copy_ctor_func_t ) zval_add_ref , (void * ) & tmp , sizeof (zval * ));
2675
+ #endif
2676
+
2677
+ intern -> handler = php_memc_proto_handler_new ();
2678
+
2679
+ retval .handle = zend_objects_store_put (intern , (zend_objects_store_dtor_t )zend_objects_destroy_object , (zend_objects_free_object_storage_t )php_memc_server_free_storage , NULL TSRMLS_CC );
2680
+ retval .handlers = & memcached_server_object_handlers ;
2681
+
2682
+ return retval ;
2683
+ }
2684
+
2648
2685
ZEND_RSRC_DTOR_FUNC (php_memc_dtor )
2649
2686
{
2650
2687
if (rsrc -> ptr ) {
@@ -3381,24 +3418,43 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci,
3381
3418
static
3382
3419
PHP_METHOD (MemcachedServer , run )
3383
3420
{
3384
- php_memc_proto_handler_t * h = php_memc_proto_handler_new ();
3385
- my_run (h );
3421
+ php_memc_server_t * intern ;
3422
+ intern = (php_memc_server_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
3423
+
3424
+ php_memc_proto_handler_run (intern -> handler );
3386
3425
}
3387
3426
3427
+
3388
3428
static
3389
3429
PHP_METHOD (MemcachedServer , on )
3390
3430
{
3391
- char * event_name ;
3392
- int event_name_len ;
3431
+ php_memc_server_t * intern ;
3432
+
3433
+ long event ;
3393
3434
zend_fcall_info fci ;
3394
3435
zend_fcall_info_cache fci_cache ;
3436
+ zend_bool rc = 0 ;
3395
3437
3396
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "sf " , & event_name , & event_name_len , & fci , & fci_cache ) == FAILURE ) {
3438
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "lf! " , & event , & fci , & fci_cache ) == FAILURE ) {
3397
3439
return ;
3398
3440
}
3399
3441
3442
+ intern = (php_memc_server_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
3443
+
3444
+ if (event <= MEMC_SERVER_ON_MIN || event >= MEMC_SERVER_ON_MAX ) {
3445
+ RETURN_FALSE ;
3446
+ }
3400
3447
3448
+ if (fci .size > 0 ) {
3449
+ MEMC_G (server_callbacks ) [event ].fci = fci ;
3450
+ MEMC_G (server_callbacks ) [event ].fci_cache = fci_cache ;
3401
3451
3452
+ Z_ADDREF_P (fci .function_name );
3453
+ if (fci .object_ptr ) {
3454
+ Z_ADDREF_P (fci .object_ptr );
3455
+ }
3456
+ }
3457
+ RETURN_BOOL (rc );
3402
3458
}
3403
3459
3404
3460
@@ -3776,7 +3832,8 @@ static
3776
3832
zend_function_entry memcached_server_class_methods [] = {
3777
3833
MEMC_SE_ME (run , NULL )
3778
3834
MEMC_SE_ME (on , NULL )
3779
- }
3835
+ { NULL , NULL , NULL }
3836
+ };
3780
3837
#undef MEMC_SE_ME
3781
3838
/* }}} */
3782
3839
@@ -3982,6 +4039,42 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
3982
4039
*/
3983
4040
REGISTER_MEMC_CLASS_CONST_LONG (GET_PRESERVE_ORDER , MEMC_GET_PRESERVE_ORDER );
3984
4041
4042
+ /*
4043
+ * Server callbacks
4044
+ */
4045
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_ADD , MEMC_SERVER_ON_ADD );
4046
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_APPEND , MEMC_SERVER_ON_APPEND );
4047
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_DECREMENT , MEMC_SERVER_ON_DECREMENT );
4048
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_DELETE , MEMC_SERVER_ON_DELETE );
4049
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_FLUSH , MEMC_SERVER_ON_FLUSH );
4050
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_GET , MEMC_SERVER_ON_GET );
4051
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_INCREMENT , MEMC_SERVER_ON_INCREMENT );
4052
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_NOOP , MEMC_SERVER_ON_NOOP );
4053
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_PREPEND , MEMC_SERVER_ON_PREPEND );
4054
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_QUIT , MEMC_SERVER_ON_QUIT );
4055
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_REPLACE , MEMC_SERVER_ON_REPLACE );
4056
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_SET , MEMC_SERVER_ON_SET );
4057
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_STAT , MEMC_SERVER_ON_STAT );
4058
+ REGISTER_MEMC_CLASS_CONST_LONG (ON_VERSION , MEMC_SERVER_ON_VERSION );
4059
+
4060
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_SUCCESS , PROTOCOL_BINARY_RESPONSE_SUCCESS );
4061
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_KEY_ENOENT , PROTOCOL_BINARY_RESPONSE_KEY_ENOENT );
4062
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_KEY_EEXISTS , PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS );
4063
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_E2BIG , PROTOCOL_BINARY_RESPONSE_E2BIG );
4064
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_EINVAL , PROTOCOL_BINARY_RESPONSE_EINVAL );
4065
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_NOT_STORED , PROTOCOL_BINARY_RESPONSE_NOT_STORED );
4066
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_DELTA_BADVAL , PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL );
4067
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_NOT_MY_VBUCKET , PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET );
4068
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_AUTH_ERROR , PROTOCOL_BINARY_RESPONSE_AUTH_ERROR );
4069
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_AUTH_CONTINUE , PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE );
4070
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_UNKNOWN_COMMAND , PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND );
4071
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_ENOMEM , PROTOCOL_BINARY_RESPONSE_ENOMEM );
4072
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_NOT_SUPPORTED , PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED );
4073
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_EINTERNAL , PROTOCOL_BINARY_RESPONSE_EINTERNAL );
4074
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_EBUSY , PROTOCOL_BINARY_RESPONSE_EBUSY );
4075
+ REGISTER_MEMC_CLASS_CONST_LONG (RESPONSE_ETMPFAIL , PROTOCOL_BINARY_RESPONSE_ETMPFAIL );
4076
+
4077
+
3985
4078
#undef REGISTER_MEMC_CLASS_CONST_LONG
3986
4079
3987
4080
/*
@@ -4004,6 +4097,9 @@ PHP_MINIT_FUNCTION(memcached)
4004
4097
memcpy (& memcached_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
4005
4098
memcached_object_handlers .clone_obj = NULL ;
4006
4099
4100
+ memcpy (& memcached_server_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
4101
+ memcached_server_object_handlers .clone_obj = NULL ;
4102
+
4007
4103
le_memc = zend_register_list_destructors_ex (NULL , php_memc_dtor , "Memcached persistent connection" , module_number );
4008
4104
le_memc_sess = zend_register_list_destructors_ex (NULL , php_memc_sess_dtor , "Memcached Sessions persistent connection" , module_number );
4009
4105
0 commit comments