Browse Source

implement a simple API in the case someone wants to define his/her own serialization stuff

experimental/newoperator
Sascha Schumann 27 years ago
parent
commit
1f02914005
  1. 28
      ext/session/php_session.h
  2. 56
      ext/session/session.c

28
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

56
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"));

Loading…
Cancel
Save