summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2001-05-01 17:01:51 +0000
committerAndrei Zmievski <andrei@php.net>2001-05-01 17:01:51 +0000
commitea563184955b48e4576f77fbb9f5edfe6b879459 (patch)
tree042cb775ae65a32eb8ea9450b2f19363b32a896c
parentab9a7a5f5f3153adc27952d7b9e7d4cf093593d1 (diff)
downloadphp-git-ea563184955b48e4576f77fbb9f5edfe6b879459.tar.gz
Patch from Sascha that abstracts session serializers. WDDX extension
now implements the encode/decode functions and registers them with the session module.
-rw-r--r--ext/session/php_session.h56
-rw-r--r--ext/session/session.c158
-rw-r--r--ext/wddx/php_wddx_api.h4
-rw-r--r--ext/wddx/wddx.c77
4 files changed, 164 insertions, 131 deletions
diff --git a/ext/session/php_session.h b/ext/session/php_session.h
index 1d052279b8..874d5e2714 100644
--- a/ext/session/php_session.h
+++ b/ext/session/php_session.h
@@ -143,17 +143,20 @@ typedef struct ps_serializer_struct {
int (*decode)(PS_SERIALIZER_DECODE_ARGS);
} ps_serializer;
+#define PS_SERIALIZER_ENCODE_NAME(x) ps_srlzr_encode_##x
+#define PS_SERIALIZER_DECODE_NAME(x) ps_srlzr_decode_##x
+
#define PS_SERIALIZER_ENCODE_FUNC(x) \
- int ps_srlzr_encode_##x(PS_SERIALIZER_ENCODE_ARGS)
+ int PS_SERIALIZER_ENCODE_NAME(x)(PS_SERIALIZER_ENCODE_ARGS)
#define PS_SERIALIZER_DECODE_FUNC(x) \
- int ps_srlzr_decode_##x(PS_SERIALIZER_DECODE_ARGS)
+ int PS_SERIALIZER_DECODE_NAME(x)(PS_SERIALIZER_DECODE_ARGS)
#define PS_SERIALIZER_FUNCS(x) \
PS_SERIALIZER_ENCODE_FUNC(x); \
PS_SERIALIZER_DECODE_FUNC(x)
#define PS_SERIALIZER_ENTRY(x) \
- { #x,ps_srlzr_encode_##x, ps_srlzr_decode_##x }
+ { #x, PS_SERIALIZER_ENCODE_NAME(x), PS_SERIALIZER_DECODE_NAME(x) }
#ifdef TRANS_SID
void session_adapt_uris(const char *, size_t, char **, size_t *);
@@ -163,12 +166,49 @@ void session_adapt_url(const char *, size_t, char **, size_t *);
#define session_adapt_url(a,b,c,d)
#endif
-void php_session_auto_start(void *data);
-void php_session_shutdown(void *data);
+void php_set_session_var(char *name, size_t namelen, zval *state_val PSLS_DC);
+int php_get_session_var(char *name, size_t namelen, zval ***state_var PLS_DC PSLS_DC ELS_DC);
+
+int php_session_register_serializer(const char *name,
+ int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
+ int (*decode)(PS_SERIALIZER_DECODE_ARGS));
+
+#define PS_ADD_VARL(name,namelen) \
+ zend_hash_update(&PS(vars), name, namelen + 1, 0, 0, NULL)
+
+#define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name))
+
+#define PS_DEL_VARL(name,namelen) \
+ zend_hash_del(&PS(vars), name, namelen + 1);
+
+#define PS_DEL_VAR(name) PS_DEL_VARL(name, strlen(name))
-#if HAVE_WDDX
-#define WDDX_SERIALIZER
-#include "ext/wddx/php_wddx_api.h"
+#define PS_ENCODE_VARS \
+ char *key; \
+ ulong key_length; \
+ ulong num_key; \
+ zval **struc; \
+ ELS_FETCH(); \
+ PLS_FETCH()
+
+#define PS_ENCODE_LOOP(code) \
+ for (zend_hash_internal_pointer_reset(&PS(vars)); \
+ zend_hash_get_current_key_ex(&PS(vars), &key, &key_length, &num_key, 0, NULL) == HASH_KEY_IS_STRING; \
+ zend_hash_move_forward(&PS(vars))) { \
+ key_length--; \
+ if (php_get_session_var(key, key_length, &struc PLS_CC PSLS_CC ELS_CC) == SUCCESS) { \
+ code; \
+ } \
+ }
+
+#ifdef ZTS
+extern int ps_globals_id;
+#else
+extern php_ps_globals ps_globals;
#endif
+
+void php_session_auto_start(void *data);
+void php_session_shutdown(void *data);
+
#endif
diff --git a/ext/session/session.c b/ext/session/session.c
index 5fad364eaf..f9e2c4d3ae 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -40,12 +40,6 @@
#include "ext/standard/php_rand.h" /* for RAND_MAX */
#include "ext/standard/info.h"
-#ifdef ZTS
-int ps_globals_id;
-#else
-static php_ps_globals ps_globals;
-#endif
-
#include "modules.c"
#include "ext/standard/php_smart_str.h"
@@ -71,6 +65,12 @@ function_entry session_functions[] = {
{0}
};
+#ifdef ZTS
+int ps_globals_id;
+#else
+php_ps_globals ps_globals;
+#endif
+
static ps_module *_php_find_ps_module(char *name PSLS_DC);
static const ps_serializer *_php_find_ps_serializer(char *name PSLS_DC);
@@ -123,20 +123,36 @@ PHP_INI_END()
PS_SERIALIZER_FUNCS(php);
PS_SERIALIZER_FUNCS(php_binary);
-#ifdef WDDX_SERIALIZER
-PS_SERIALIZER_FUNCS(wddx);
-#endif
+#define MAX_SERIALIZERS 10
-const static ps_serializer ps_serializers[] = {
-#ifdef WDDX_SERIALIZER
- PS_SERIALIZER_ENTRY(wddx),
-#endif
+static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = {
PS_SERIALIZER_ENTRY(php),
- PS_SERIALIZER_ENTRY(php_binary),
- {0}
+ PS_SERIALIZER_ENTRY(php_binary)
};
+int php_session_register_serializer(const char *name,
+ int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
+ int (*decode)(PS_SERIALIZER_DECODE_ARGS))
+{
+ int ret = -1;
+ int i;
+
+ for (i = 0; i < MAX_SERIALIZERS; i++) {
+ if (ps_serializers[i].name == NULL) {
+ ps_serializers[i].name = name;
+ ps_serializers[i].encode = encode;
+ ps_serializers[i].decode = decode;
+ ps_serializers[i + 1].name = NULL;
+ ret = 0;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+
PHP_MINIT_FUNCTION(session);
PHP_RINIT_FUNCTION(session);
PHP_MSHUTDOWN_FUNCTION(session);
@@ -182,36 +198,7 @@ typedef struct {
#define MAX_STR 512
-#define PS_ADD_VARL(name,namelen) \
- zend_hash_update(&PS(vars), name, namelen + 1, 0, 0, NULL)
-
-#define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name))
-
-#define PS_DEL_VARL(name,namelen) \
- zend_hash_del(&PS(vars), name, namelen + 1);
-
-#define PS_DEL_VAR(name) PS_DEL_VARL(name, strlen(name))
-
-#define ENCODE_VARS \
- char *key; \
- ulong key_length; \
- ulong num_key; \
- zval **struc; \
- ELS_FETCH(); \
- PLS_FETCH()
-
-#define ENCODE_LOOP(code) \
- for (zend_hash_internal_pointer_reset(&PS(vars)); \
- zend_hash_get_current_key_ex(&PS(vars), &key, &key_length, &num_key, 0, NULL) == HASH_KEY_IS_STRING; \
- zend_hash_move_forward(&PS(vars))) { \
- key_length--; \
- if (php_get_session_var(key, key_length, &struc PLS_CC PSLS_CC ELS_CC) == SUCCESS) { \
- code; \
- } \
- }
-
-static void php_set_session_var(char *name, size_t namelen,
- zval *state_val PSLS_DC)
+void php_set_session_var(char *name, size_t namelen, zval *state_val PSLS_DC)
{
zval *state_val_copy;
PLS_FETCH();
@@ -244,7 +231,7 @@ static void php_set_session_var(char *name, size_t namelen,
}
}
-static int php_get_session_var(char *name, size_t namelen, zval ***state_var PLS_DC PSLS_DC ELS_DC)
+int php_get_session_var(char *name, size_t namelen, zval ***state_var PLS_DC PSLS_DC ELS_DC)
{
HashTable *ht = &EG(symbol_table);
@@ -263,7 +250,7 @@ PS_SERIALIZER_ENCODE_FUNC(php_binary)
zval *buf;
char strbuf[MAX_STR + 1];
php_serialize_data_t var_hash;
- ENCODE_VARS;
+ PS_ENCODE_VARS;
buf = ecalloc(sizeof(*buf), 1);
Z_TYPE_P(buf) = IS_STRING;
@@ -271,7 +258,7 @@ PS_SERIALIZER_ENCODE_FUNC(php_binary)
PHP_VAR_SERIALIZE_INIT(var_hash);
- ENCODE_LOOP(
+ PS_ENCODE_LOOP(
if (key_length > PS_BIN_MAX) continue;
strbuf[0] = key_length;
memcpy(strbuf + 1, key, key_length);
@@ -338,7 +325,7 @@ PS_SERIALIZER_ENCODE_FUNC(php)
zval *buf;
char strbuf[MAX_STR + 1];
php_serialize_data_t var_hash;
- ENCODE_VARS;
+ PS_ENCODE_VARS;
buf = ecalloc(sizeof(*buf), 1);
Z_TYPE_P(buf) = IS_STRING;
@@ -346,7 +333,7 @@ PS_SERIALIZER_ENCODE_FUNC(php)
PHP_VAR_SERIALIZE_INIT(var_hash);
- ENCODE_LOOP(
+ PS_ENCODE_LOOP(
if (key_length + 1 > MAX_STR) continue;
memcpy(strbuf, key, key_length);
strbuf[key_length] = PS_DELIMITER;
@@ -410,77 +397,6 @@ PS_SERIALIZER_DECODE_FUNC(php)
return SUCCESS;
}
-#ifdef WDDX_SERIALIZER
-
-PS_SERIALIZER_ENCODE_FUNC(wddx)
-{
- wddx_packet *packet;
- ENCODE_VARS;
-
- packet = php_wddx_constructor();
- if (!packet)
- return FAILURE;
-
- php_wddx_packet_start(packet, NULL, 0);
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
-
- ENCODE_LOOP(
- php_wddx_serialize_var(packet, *struc, key, key_length);
- );
-
- php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);
- php_wddx_packet_end(packet);
- *newstr = php_wddx_gather(packet);
- php_wddx_destructor(packet);
-
- if (newlen)
- *newlen = strlen(*newstr);
-
- return SUCCESS;
-}
-
-PS_SERIALIZER_DECODE_FUNC(wddx)
-{
- zval *retval;
- zval **ent;
- char *key;
- ulong key_length;
- char tmp[128];
- ulong idx;
- int hash_type;
- int ret;
-
- if (vallen == 0)
- return SUCCESS;
-
- MAKE_STD_ZVAL(retval);
-
- if ((ret = php_wddx_deserialize_ex((char *)val, vallen, retval)) == SUCCESS) {
-
- for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(retval));
- zend_hash_get_current_data(Z_ARRVAL_P(retval), (void **) &ent) == SUCCESS;
- zend_hash_move_forward(Z_ARRVAL_P(retval))) {
- hash_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(retval), &key, &key_length, &idx, 0, NULL);
-
- switch (hash_type) {
- case HASH_KEY_IS_LONG:
- sprintf(tmp, "%ld", idx);
- key = tmp;
- /* fallthru */
- case HASH_KEY_IS_STRING:
- php_set_session_var(key, key_length-1, *ent PSLS_CC);
- PS_ADD_VAR(key);
- }
- }
- }
-
- zval_ptr_dtor(&retval);
-
- return ret;
-}
-
-#endif
-
static void php_session_track_init(void)
{
zval **old_vars = NULL;
diff --git a/ext/wddx/php_wddx_api.h b/ext/wddx/php_wddx_api.h
index 0d7318059b..bc546ae190 100644
--- a/ext/wddx/php_wddx_api.h
+++ b/ext/wddx/php_wddx_api.h
@@ -53,8 +53,8 @@
typedef smart_str wddx_packet;
-wddx_packet *php_wddx_constructor(void);
-#define php_wddx_destructor(packet) smart_str_free(packet)
+wddx_packet* php_wddx_constructor(void);
+void php_wddx_destructor(wddx_packet *packet);
void php_wddx_packet_start(wddx_packet *packet, char *comment, int comment_len);
void php_wddx_packet_end(wddx_packet *packet);
diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c
index 97021f763f..f188b535b0 100644
--- a/ext/wddx/wddx.c
+++ b/ext/wddx/wddx.c
@@ -203,10 +203,81 @@ static void release_wddx_packet_rsrc(zend_rsrc_list_entry *rsrc)
efree(str);
}
+#include "ext/session/php_session.h"
+
+PS_SERIALIZER_ENCODE_FUNC(wddx)
+{
+ wddx_packet *packet;
+ PS_ENCODE_VARS;
+
+ packet = php_wddx_constructor();
+ if (!packet)
+ return FAILURE;
+
+ php_wddx_packet_start(packet, NULL, 0);
+ php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);
+
+ PS_ENCODE_LOOP(
+ php_wddx_serialize_var(packet, *struc, key, key_length);
+ );
+
+ php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);
+ php_wddx_packet_end(packet);
+ *newstr = php_wddx_gather(packet);
+ php_wddx_destructor(packet);
+
+ if (newlen)
+ *newlen = strlen(*newstr);
+
+ return SUCCESS;
+}
+
+PS_SERIALIZER_DECODE_FUNC(wddx)
+{
+ zval *retval;
+ zval **ent;
+ char *key;
+ ulong key_length;
+ char tmp[128];
+ ulong idx;
+ int hash_type;
+ int ret;
+
+ if (vallen == 0)
+ return SUCCESS;
+
+ MAKE_STD_ZVAL(retval);
+
+ if ((ret = php_wddx_deserialize_ex((char *)val, vallen, retval)) == SUCCESS) {
+
+ for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(retval));
+ zend_hash_get_current_data(Z_ARRVAL_P(retval), (void **) &ent) == SUCCESS;
+ zend_hash_move_forward(Z_ARRVAL_P(retval))) {
+ hash_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(retval), &key, &key_length, &idx, 0, NULL);
+
+ switch (hash_type) {
+ case HASH_KEY_IS_LONG:
+ sprintf(tmp, "%ld", idx);
+ key = tmp;
+ /* fallthru */
+ case HASH_KEY_IS_STRING:
+ php_set_session_var(key, key_length-1, *ent PSLS_CC);
+ PS_ADD_VAR(key);
+ }
+ }
+ }
+
+ zval_ptr_dtor(&retval);
+
+ return ret;
+}
PHP_MINIT_FUNCTION(wddx)
{
le_wddx = zend_register_list_destructors_ex(release_wddx_packet_rsrc, NULL, "wddx", module_number);
+ php_session_register_serializer("wddx",
+ PS_SERIALIZER_ENCODE_NAME(wddx),
+ PS_SERIALIZER_DECODE_NAME(wddx));
return SUCCESS;
}
@@ -956,6 +1027,12 @@ wddx_packet *php_wddx_constructor(void)
return packet;
}
+void php_wddx_destructor(wddx_packet *packet)
+{
+ smart_str_free(packet);
+ efree(packet);
+}
+
/* {{{ proto int wddx_packet_start([string comment])
Starts a WDDX packet with optional comment and returns the packet id */
PHP_FUNCTION(wddx_packet_start)