Skip to content

Commit 6c9ca25

Browse files
committed
More implementation of the protocool handler
1 parent 1d5408b commit 6c9ca25

File tree

4 files changed

+388
-27
lines changed

4 files changed

+388
-27
lines changed

php_memcached.c

Lines changed: 105 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,15 @@
4444
#include <ext/standard/php_var.h>
4545
#include <ext/standard/basic_functions.h>
4646

47+
#include "php_memcached_server.h"
4748
#include "php_memcached.h"
4849
#include "g_fmt.h"
4950

5051
#ifdef HAVE_MEMCACHED_SESSION
5152
# include "php_memcached_session.h"
5253
#endif
5354

54-
#include "php_memcached_server.h"
55+
5556

5657
#include "fastlz/fastlz.h"
5758
#include <zlib.h>
@@ -143,6 +144,7 @@ typedef unsigned long int uint32_t;
143144
****************************************/
144145
#define MEMC_GET_PRESERVE_ORDER (1<<0)
145146

147+
146148
/****************************************
147149
Helper macros
148150
****************************************/
@@ -212,6 +214,11 @@ typedef struct {
212214
int memc_errno;
213215
} php_memc_t;
214216

217+
typedef struct {
218+
zend_object zo;
219+
php_memc_proto_handler_t *handler;
220+
} php_memc_server_t;
221+
215222
enum {
216223
MEMC_OP_SET,
217224
MEMC_OP_TOUCH,
@@ -226,6 +233,7 @@ static zend_class_entry *memcached_server_ce = NULL;
226233
static zend_class_entry *memcached_exception_ce = NULL;
227234

228235
static zend_object_handlers memcached_object_handlers;
236+
static zend_object_handlers memcached_server_object_handlers;
229237

230238
struct callbackContext
231239
{
@@ -243,8 +251,8 @@ static zend_class_entry *spl_ce_RuntimeException = NULL;
243251
#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 3)
244252
const zend_fcall_info empty_fcall_info = { 0, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0 };
245253
#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[] = { \
248256
{ NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args },
249257
#endif
250258

@@ -2645,6 +2653,35 @@ zend_object_value php_memc_new(zend_class_entry *ce TSRMLS_DC)
26452653
return retval;
26462654
}
26472655

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+
26482685
ZEND_RSRC_DTOR_FUNC(php_memc_dtor)
26492686
{
26502687
if (rsrc->ptr) {
@@ -3381,24 +3418,43 @@ static int php_memc_do_result_callback(zval *zmemc_obj, zend_fcall_info *fci,
33813418
static
33823419
PHP_METHOD(MemcachedServer, run)
33833420
{
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);
33863425
}
33873426

3427+
33883428
static
33893429
PHP_METHOD(MemcachedServer, on)
33903430
{
3391-
char *event_name;
3392-
int event_name_len;
3431+
php_memc_server_t *intern;
3432+
3433+
long event;
33933434
zend_fcall_info fci;
33943435
zend_fcall_info_cache fci_cache;
3436+
zend_bool rc = 0;
33953437

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) {
33973439
return;
33983440
}
33993441

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+
}
34003447

3448+
if (fci.size > 0) {
3449+
MEMC_G(server_callbacks) [event].fci = fci;
3450+
MEMC_G(server_callbacks) [event].fci_cache = fci_cache;
34013451

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);
34023458
}
34033459

34043460

@@ -3776,7 +3832,8 @@ static
37763832
zend_function_entry memcached_server_class_methods[] = {
37773833
MEMC_SE_ME(run, NULL)
37783834
MEMC_SE_ME(on, NULL)
3779-
}
3835+
{ NULL, NULL, NULL }
3836+
};
37803837
#undef MEMC_SE_ME
37813838
/* }}} */
37823839

@@ -3982,6 +4039,42 @@ static void php_memc_register_constants(INIT_FUNC_ARGS)
39824039
*/
39834040
REGISTER_MEMC_CLASS_CONST_LONG(GET_PRESERVE_ORDER, MEMC_GET_PRESERVE_ORDER);
39844041

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+
39854078
#undef REGISTER_MEMC_CLASS_CONST_LONG
39864079

39874080
/*
@@ -4004,6 +4097,9 @@ PHP_MINIT_FUNCTION(memcached)
40044097
memcpy(&memcached_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
40054098
memcached_object_handlers.clone_obj = NULL;
40064099

4100+
memcpy(&memcached_server_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
4101+
memcached_server_object_handlers.clone_obj = NULL;
4102+
40074103
le_memc = zend_register_list_destructors_ex(NULL, php_memc_dtor, "Memcached persistent connection", module_number);
40084104
le_memc_sess = zend_register_list_destructors_ex(NULL, php_memc_sess_dtor, "Memcached Sessions persistent connection", module_number);
40094105

php_memcached.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,31 @@ enum memcached_serializer {
5858
# endif
5959
#endif
6060

61+
typedef enum {
62+
MEMC_SERVER_ON_MIN = -1,
63+
MEMC_SERVER_ON_ADD = 0,
64+
MEMC_SERVER_ON_APPEND = 1,
65+
MEMC_SERVER_ON_DECREMENT = 2,
66+
MEMC_SERVER_ON_DELETE = 3,
67+
MEMC_SERVER_ON_FLUSH = 4,
68+
MEMC_SERVER_ON_GET = 5,
69+
MEMC_SERVER_ON_INCREMENT = 6,
70+
MEMC_SERVER_ON_NOOP = 7,
71+
MEMC_SERVER_ON_PREPEND = 8,
72+
MEMC_SERVER_ON_QUIT = 9,
73+
MEMC_SERVER_ON_REPLACE = 10,
74+
MEMC_SERVER_ON_SET = 11,
75+
MEMC_SERVER_ON_STAT = 12,
76+
MEMC_SERVER_ON_VERSION = 13,
77+
MEMC_SERVER_ON_MAX
78+
} php_memc_event_t;
79+
80+
81+
typedef struct {
82+
zend_fcall_info fci;
83+
zend_fcall_info_cache fci_cache;
84+
} php_memc_server_cb_t;
85+
6186
ZEND_BEGIN_MODULE_GLOBALS(php_memcached)
6287
#ifdef HAVE_MEMCACHED_SESSION
6388
zend_bool sess_locking_enabled;
@@ -93,6 +118,8 @@ ZEND_BEGIN_MODULE_GLOBALS(php_memcached)
93118
#if HAVE_MEMCACHED_SASL
94119
bool use_sasl;
95120
#endif
121+
122+
php_memc_server_cb_t server_callbacks [14];
96123
ZEND_END_MODULE_GLOBALS(php_memcached)
97124

98125
PHP_MEMCACHED_API zend_class_entry *php_memc_get_ce(void);

0 commit comments

Comments
 (0)