From: Sascha Schumann Date: Thu, 1 Jul 1999 05:45:48 +0000 (+0000) Subject: implement a simple API in the case someone wants to define his/her own serialization... X-Git-Tag: BEFORE_REMOVING_GC_STEP1~64 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1f02914005ed167c53bc6b53085a522d5b8378cf;p=php implement a simple API in the case someone wants to define his/her own serialization stuff --- diff --git a/ext/session/php_session.h b/ext/session/php_session.h index 7e946f101e..cb23a61cfb 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -30,6 +30,11 @@ #ifndef PHP_SESSION_H #define PHP_SESSION_H +/* + * some relict. ignore it, unless you want to build locking + * functionality into the session code + */ + typedef enum { LOCK, UNLOCK @@ -43,7 +48,7 @@ typedef enum { #define PS_GC_ARGS void **mod_data, int maxlifetime typedef struct ps_module_struct { - char *name; + const char *name; int (*open)(PS_OPEN_ARGS); int (*close)(PS_CLOSE_ARGS); int (*read)(PS_READ_ARGS); @@ -85,6 +90,7 @@ typedef struct { int nr_open_sessions; int gc_probability; int gc_maxlifetime; + const struct ps_serializer_struct *serializer; } php_ps_globals; extern zend_module_entry session_module_entry; @@ -118,5 +124,25 @@ PHP_FUNCTION(session_destroy); #define PSLS_FETCH() #endif +#define PS_SERIALIZER_ENCODE_ARGS char **newstr, int *newlen PSLS_DC +#define PS_SERIALIZER_DECODE_ARGS const char *val, int vallen PSLS_DC + +typedef struct ps_serializer_struct { + const char *name; + int (*encode)(PS_SERIALIZER_ENCODE_ARGS); + int (*decode)(PS_SERIALIZER_DECODE_ARGS); +} ps_serializer; + +#define PS_SERIALIZER_ENCODE_FUNC(x) \ + int _ps_srlzr_encode_##x(PS_SERIALIZER_ENCODE_ARGS) +#define PS_SERIALIZER_DECODE_FUNC(x) \ + int _ps_srlzr_decode_##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 } #endif diff --git a/ext/session/session.c b/ext/session/session.c index fcce572b2d..33facb1342 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -81,8 +81,15 @@ PHP_INI_BEGIN() PHP_INI_ENTRY("session_gc_probability", "1", PHP_INI_ALL, NULL) PHP_INI_ENTRY("session_gc_maxlifetime", "1440", PHP_INI_ALL, NULL) PHP_INI_ENTRY("session_lifetime", "0", PHP_INI_ALL, NULL) + PHP_INI_ENTRY("session_serializer", "php", PHP_INI_ALL, NULL) PHP_INI_END() +PS_SERIALIZER_FUNCS(php); + +const static ps_serializer ps_serializers[] = { + PS_SERIALIZER_ENTRY(php), + {0} +}; static int php_minit_session(INIT_FUNC_ARGS); static int php_rinit_session(INIT_FUNC_ARGS); @@ -117,12 +124,11 @@ zend_module_entry session_module_entry = { #define STD_FMT "%s|" #define NOTFOUND_FMT "!%s|" -static char *_php_session_encode(int *newlen PSLS_DC) +PS_SERIALIZER_ENCODE_FUNC(php) { pval *buf; pval **struc; char *key; - char *ret = NULL; char strbuf[MAX_STR + 1]; ELS_FETCH(); @@ -146,10 +152,10 @@ static char *_php_session_encode(int *newlen PSLS_DC) } if(newlen) *newlen = buf->value.str.len; - ret = buf->value.str.val; + *newstr = buf->value.str.val; efree(buf); - return ret; + return SUCCESS; } #define PS_ADD_VARL(name,namelen) \ @@ -158,16 +164,15 @@ static char *_php_session_encode(int *newlen PSLS_DC) #define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name)) #define PS_DEL_VARL(name,namelen) \ - zend_hash_del(&PS(vars), name, namelen); + zend_hash_del(&PS(vars), name, namelen + 1); #define PS_DEL_VAR(name) PS_DEL_VARL(name, strlen(name)) - -static void _php_session_decode(char *val, int vallen PSLS_DC) +PS_SERIALIZER_DECODE_FUNC(php) { - char *p, *q; + const char *p, *q; char *name; - char *endptr = val + vallen; + const char *endptr = val + vallen; pval *current; int namelen; int has_value; @@ -197,6 +202,22 @@ static void _php_session_decode(char *val, int vallen PSLS_DC) PS_ADD_VAR(name); efree(name); } + + return SUCCESS; +} + +static char *_php_session_encode(int *newlen PSLS_DC) +{ + char *ret = NULL; + + PS(serializer)->encode(&ret, newlen PSLS_CC); + + return ret; +} + +static void _php_session_decode(const char *val, int vallen PSLS_DC) +{ + PS(serializer)->decode(val, vallen PSLS_CC); } static char *_php_create_id(int *newlen) @@ -295,6 +316,21 @@ static ps_module *_php_find_ps_module(char *name PSLS_DC) return ret; } +static const ps_serializer *_php_find_ps_serializer(char *name PSLS_DC) +{ + const ps_serializer *ret = NULL; + const ps_serializer *mod; + + for(mod = ps_serializers; mod->name; mod++) { + if(!strcasecmp(name, mod->name)) { + ret = mod; + break; + } + } + + return ret; +} + static void _php_session_start(PSLS_D) { pval **ppid; @@ -565,6 +601,8 @@ PHP_FUNCTION(session_destroy) static void php_rinit_session_globals(PSLS_D) { PS(mod) = _php_find_ps_module(INI_STR("session_module_name") PSLS_CC); + PS(serializer) = \ + _php_find_ps_serializer(INI_STR("session_serializer") PSLS_CC); zend_hash_init(&PS(vars), 0, NULL, NULL, 0); PS(save_path) = estrdup(INI_STR("session_save_path"));