cvs: php-src /ext/msession README config.m4 msession-test.php msession.c msessionapi.h php_msession.h reqclient.h

From: Date: Mon, 30 Jan 2006 16:18:39 +0000
Subject: cvs: php-src /ext/msession README config.m4 msession-test.php msession.c msessionapi.h php_msession.h reqclient.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-36675@lists.php.net to get a copy of this message
mlwmohawk Mon Jan 30 16:18:39 2006 UTC Added files: /php-src/ext/msession msessionapi.h Modified files: /php-src/ext/msession README config.m4 msession-test.php msession.c php_msession.h reqclient.h Log: MSession now works with the new MCache server

http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/README?r1=1.6&r2=1.7&diff_format=u Index: php-src/ext/msession/README diff -u php-src/ext/msession/README:1.6 php-src/ext/msession/README:1.7 --- php-src/ext/msession/README:1.6 Mon Jan 20 03:16:22 2003 +++ php-src/ext/msession/README Mon Jan 30 16:18:39 2006 @@ -1,8 +1,8 @@ This is msession, it is an interface to a stand-alone session management system. The msession daemon can be found at -Mohawk Software's web site. +Mohawk Software's web site, under Project Phoenix -http://www.mohawksoft.com +http://www.mohawksoft.com/phoenix.html Requirements: Mohawk Software's Phoenix library. http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/config.m4?r1=1.9&r2=1.10&diff_format=u Index: php-src/ext/msession/config.m4 diff -u php-src/ext/msession/config.m4:1.9 php-src/ext/msession/config.m4:1.10 --- php-src/ext/msession/config.m4:1.9 Wed Feb 12 18:34:20 2003 +++ php-src/ext/msession/config.m4 Mon Jan 30 16:18:39 2006 @@ -1,17 +1,17 @@ dnl -dnl $Id: config.m4,v 1.9 2003/02/12 18:34:20 mlwmohawk Exp $ +dnl $Id: config.m4,v 1.10 2006/01/30 16:18:39 mlwmohawk Exp $ dnl PHP_ARG_WITH(msession, for msession support, [ --with-msession[=DIR] Include msession support]) if test "$PHP_MSESSION" != "no"; then - if test -r $PHP_MSESSION/lib/libphoenix.a; then + if test -r $PHP_MSESSION/lib/libphoenix.so; then PHOENIX_DIR=$PHP_MSESSION else AC_MSG_CHECKING(for msession in default path) - for i in /usr/local/phoenix /usr/local /usr; do - if test -r $i/lib/libphoenix.a; then + for i in /opt/mohawk /usr/local/phoenix /usr/local /usr; do + if test -r $i/lib/libphoenix.so; then PHOENIX_DIR=$i AC_MSG_RESULT(found in $i) fi @@ -23,14 +23,13 @@ AC_MSG_ERROR(Please reinstall the Phoenix / msession distribution) fi - AC_DEFINE(HAVE_MSESSION, 1, [ ]) PHP_ADD_LIBRARY_WITH_PATH(phoenix, "$PHOENIX_DIR/lib", PHOENIX_LIB) - PHOENIX_INCLUDE="-I$PHOENIX_DIR" + PHOENIX_INCLUDE="-I$PHOENIX_DIR/src" PHP_SUBST(PHOENIX_LIB) - PHP_REQUIRE_CXX + PHP_REQUIRE_CXX PHP_NEW_EXTENSION(msession, msession.c, $ext_shared) - PHP_ADD_LIBRARY(stdc++) + PHP_ADD_LIBRARY(stdc++) fi http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/msession-test.php?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/msession/msession-test.php diff -u php-src/ext/msession/msession-test.php:1.1 php-src/ext/msession/msession-test.php:1.2 --- php-src/ext/msession/msession-test.php:1.1 Sun Dec 23 19:57:59 2001 +++ php-src/ext/msession/msession-test.php Mon Jan 30 16:18:39 2006 @@ -15,50 +15,45 @@ # Start sessions, this will set a cookie. session_start(); +msession_connect('localhost','8086'); + # Now, optional, use msession_uniq() to create a guarenteed # uniq session name. # -if(!$HTTP_COOKIE_VARS["PHPSESSID"]) -{ - # Use uniq to create the session. This is guarenteed to be - # uniq in the server. - $sid = msession_uniq(32); - setcookie ("PHPSESSID", $sid); - session_id($sid); - $HTTP_COOKIE_VARS["PHPSESSID"] = $sid; - # New session, set some variables - if(0) // One at a time - { - echo "Set Variable: " . msession_set($sid, 'time',time()) ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name1','test1') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name2','test2') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name3','test3') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name4','test4') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name5','test5') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name6','test6') ."<p>\n"; - echo "Set Variable: " . msession_set($sid, 'name7','test7') ."<p>\n"; - } - else // All at once in an array - { - $setarray = array(); - $setarray['time']=time(); - $setarray['name1'] = 'test1'; - $setarray['name2'] = 'test2'; - $setarray['name3'] = 'test3'; - $setarray['name4'] = 'test4'; - $setarray['name5'] = 'test5'; - $setarray['name6'] = 'test6'; - $setarray['name7'] = 'test7'; - msession_set_array($sid, $setarray); - } -} -else -{ +# Use uniq to create the session. This is guarenteed to be +# uniq in the server. + +if($HTTP_COOKIE_VARS["PHPSESSID"]) $sid = $HTTP_COOKIE_VARS["PHPSESSID"]; -} +else + $sid = msession_uniq(32, "phpsession"); +setcookie ("PHPSESSID", $sid); +session_id($sid); +$HTTP_COOKIE_VARS["PHPSESSID"] = $sid; +# New session, set some variables +echo "Set Variable: " . msession_set($sid, 'time',time()) ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name1','test1') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name2','test2') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name3','test3') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name4','test4') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name5','test5') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name6','test6') ."<p>\n"; +echo "Set Variable: " . msession_set($sid, 'name7','test7') ."<p>\n"; + + $setarray = array(); + $setarray['time']=time(); + $setarray['name1'] = 'test1'; + $setarray['name2'] = 'test2'; + $setarray['name3'] = 'test3'; + $setarray['name4'] = 'test4'; + $setarray['name5'] = 'test5'; + $setarray['name6'] = 'test6'; + $setarray['name7'] = 'test7'; + msession_set_array($sid, $setarray); #This makes a link between the variable $count and the # session variable "count" + session_register("count"); $count ++; @@ -77,6 +72,12 @@ # newer versions create it by default) echo "Global Count: " . msession_inc(globals, "counter") . "<br>\n"; + +# Thread safe functions + +echo "Local Count: " . msession_add($sid, "counter", 2) . "<br>\n"; +echo "Muldiv counter * 2 / 3 :" . msession_muldiv($sid, "counter", "2", "3") . "<br>\n"; + # This gets a count of active sessions. echo "Total active sessions: " . msession_count() . "<br>\n"; http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/msession.c?r1=1.50&r2=1.51&diff_format=u Index: php-src/ext/msession/msession.c diff -u php-src/ext/msession/msession.c:1.50 php-src/ext/msession/msession.c:1.51 --- php-src/ext/msession/msession.c:1.50 Sun Jan 1 13:09:51 2006 +++ php-src/ext/msession/msession.c Mon Jan 30 16:18:39 2006 @@ -1,13 +1,13 @@ /* +----------------------------------------------------------------------+ - | msession 1.0 | + | msession 1.0 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2006 The PHP Group | + | Copyright (c) 1997-2003 The PHP Group | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | + | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | @@ -16,7 +16,6 @@ | Portions copyright the PHP group. | +----------------------------------------------------------------------+ */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -24,11 +23,10 @@ #include "php.h" #include "php_ini.h" #include "php_msession.h" -#include "reqclient.h" +#include "msessionapi.h" #include "ext/standard/info.h" #include "ext/session/php_session.h" - /* Macros and such */ #ifndef TRUE #define TRUE 1 @@ -40,26 +38,43 @@ #define SID_LEN 32 #endif - /* Uncomment to get debugging messages */ -/* #define ERR_DEBUG */ +// #define ERR_DEBUG #ifdef ERR_DEBUG -#define ELOG( str ) php_log_err( str ) +#define ELOG( str ) php_log_err( (char *)(str) ) #else #define ELOG( str ) #endif /* Test if system is OK fror use. */ /* Macros may be ugly, but I can globaly add debuging when needed. */ -#define IFCONNECT_BEGIN if(s_reqb && s_conn) { -#define IFCONNECT_ENDVAL(V) } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Msession not initialized"); return V; } -#define IFCONNECT_END } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Msession not initialized"); RETURN_FALSE; } +#define IFCONNECT_BEGIN { void *t_conn; REQB t_reqb; if(MSessionGetBuffers(&t_conn, &t_reqb TSRMLS_CC)) { + +/* End IFCONNECT block with return FALSE */ +#define IFCONNECT_END MSessionReleaseBuffers(t_conn, &t_reqb TSRMLS_CC);} else { php_error(E_WARNING, s_szNoInit, get_active_function_name(TSRMLS_C)); RETURN_FALSE; }} + +/* End IFCONNECT block without return */ +#define IFCONNECT_ENDNR MSessionReleaseBuffers(t_conn, &t_reqb TSRMLS_CC);} else { php_error(E_WARNING, s_szNoInit, get_active_function_name(TSRMLS_C)); }} #ifndef HAVE_PHP_SESSION #error HAVE_PHP_SESSION not defined #endif +static int msession_split_host_port(char *host, int cbhost, char *save_path, int def_port); +static int MSessionGetBuffers(void **pconn, REQB *preq TSRMLS_DC); +static void MSessionReleaseBuffers(void *pconn, REQB *preq TSRMLS_DC); +static void msession_logf(char *fmt, ...); +static void php_msession_init_globals(zend_msession_globals *msession_globals); +static int PHPDoRequest(void **pconn, REQB *preq TSRMLS_DC); +static void *PHPMSessionConnect(const char *szhost, int nport TSRMLS_DC); +static void PHPMSessionDisconnect(TSRMLS_DC); +static char * PHPMSessionGetString(int req, const char *session, char *name, char *value, int param TSRMLS_DC); +static int PHPMSessionGetInt(int req, char *session, char *name, char *value, int param TSRMLS_DC); +static int PHPMSessionGetArray(zval *return_value, int req, char *session, char *name, char *value, int param TSRMLS_DC); +static int PHPMSessionGetArrayPairs(zval *return_value, int req, char *session, char *name, char *value, int param TSRMLS_DC); +static int PHPMSessionExec(int req, char *session, char *name, char *value, int param TSRMLS_DC); + /* Test if session module contains custom sesson ID patch */ #ifdef PHP_SESSION_API #if (PHP_SESSION_API >= 20020330) @@ -80,9 +95,6 @@ #warning Backward compatible msession extension requires PHP sessions. If PHP compiles and links, you can ignore this warning. #elif (ZEND_MODULE_API_NO >= 20010901) #define PHP_4_1 -#else -#warning ZEND_MODULE_API_NO not defined -#define PHP_4_1 #endif /* @@ -113,14 +125,19 @@ #endif #endif +ZEND_DECLARE_MODULE_GLOBALS(msession) + +/* Static strings */ +static char s_szNoInit[]="%s(): MSession not initialized"; +static char s_szErrFmt[]="%s(): %s"; + /* Per-process variables need by msession */ static char s_szdefhost[]="localhost"; -static char * s_szhost=s_szdefhost; -static int s_port=8086; -static void * s_conn=NULL; -static REQB * s_reqb=NULL; -zend_function_entry msession_functions[] = { +#define MAX_HOST 1024 +#define DEF_PORT 8086 + +function_entry msession_functions[] = { PHP_FE(msession_connect,NULL) PHP_FE(msession_disconnect,NULL) PHP_FE(msession_lock,NULL) @@ -132,11 +149,15 @@ PHP_FE(msession_get,NULL) PHP_FE(msession_find,NULL) PHP_FE(msession_get_array,NULL) + PHP_FE(msession_save_object,NULL) + PHP_FE(msession_get_object,NULL) PHP_FE(msession_set_array,NULL) PHP_FE(msession_timeout,NULL) PHP_FE(msession_inc,NULL) - PHP_FE(msession_set_data,NULL) - PHP_FE(msession_get_data,NULL) + PHP_FE(msession_add,NULL) + PHP_FE(msession_muldiv,NULL) + PHP_FE(msession_setdata,NULL) + PHP_FE(msession_getdata,NULL) PHP_FE(msession_listvar,NULL) PHP_FE(msession_list,NULL) PHP_FE(msession_uniq,NULL) @@ -144,8 +165,6 @@ PHP_FE(msession_plugin,NULL) PHP_FE(msession_call,NULL) PHP_FE(msession_ctl,NULL) - PHP_FE(msession_exec,NULL) - PHP_FE(msession_ping,NULL) {NULL, NULL, NULL} }; @@ -156,236 +175,413 @@ "msession", msession_functions, PHP_MINIT(msession), - NULL, - NULL, - NULL, + PHP_MSHUTDOWN(msession), + NULL, /* PHP_RINIT(msession),*/ + NULL, /* PHP_RSHUTDOWN(msession), */ PHP_MINFO(msession), #ifdef PHP_4_1 NO_VERSION_YET, #endif STANDARD_MODULE_PROPERTIES }; - #ifdef COMPILE_DL_MSESSION ZEND_GET_MODULE(msession) #endif +// Split host port syntax: host:port +// Warning, make sure buffer is big enough! +static int msession_split_host_port(char *host, int cbhost, char *save_path, int def_port) +{ + int port; + char * szport; + strncpy(host, save_path, cbhost); + szport = strchr(host, ':'); + if(szport) + { + *szport++=0; + port = atoi(szport); + } + else + { + port = def_port; + } + return port; +} +// Called by internal functions to get buffers and connection +static int MSessionGetBuffers(void **pconn, REQB *preqb TSRMLS_DC) +{ + *pconn = (void *)MSESSION_G(conn); + AllocateRequestBuffer(preqb,2048); + if(!*pconn) + *pconn = PHPMSessionConnect(MSESSION_G(host), MSESSION_G(port) TSRMLS_CC); + return (int) *pconn; +} + +// Called after GetBuffers, updates preqb if nessisary. +// The syntax of this function, along with allows for +// flexibility of the nature of the interface changes. +static void MSessionReleaseBuffers(void *pconn, REQB *preqb TSRMLS_DC) +{ + MSESSION_G(conn) = pconn; + FreeRequestBuffer(preqb); +} +/* Uses printf syntax to write to php_log_err + * Must remain in ERR_DEBUG ifdef to ensure it + * does not get compiled into release code + */ +static void msession_logf(char *fmt, ...) +{ + va_list arglist; + char buffer[2048]; + va_start(arglist, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, arglist); + va_end(arglist); + php_log_err(buffer); +} + +// Initialize global structure +static void php_msession_init_globals(zend_msession_globals *msession_globals) +{ + char host[MAX_HOST]; + int global_variable; + char *init = INI_STR("session.save_path"); + msession_globals->conn = NULL; + msession_globals->reqb = NULL; + + if(!init) + { + ELOG("Could not get session.save_path from INI_STR"); + msession_globals->host = pestrdup(s_szdefhost,1); + msession_globals->port = DEF_PORT; + } + else + { + msession_globals->port = msession_split_host_port(host, sizeof(host), init, DEF_PORT); + msession_globals->host = pestrdup(host,1); + } +} + PHP_MINIT_FUNCTION(msession) { - s_conn = NULL; - s_szhost = s_szdefhost; - + ZEND_INIT_MODULE_GLOBALS(msession, php_msession_init_globals, NULL); #ifdef HAVE_PHP_SESSION php_session_register_module(&ps_mod_msession); #endif return SUCCESS; } -PHP_MINFO_FUNCTION(msession) +PHP_MSHUTDOWN_FUNCTION(msession) { - php_info_print_table_start(); - php_info_print_table_header(2, "msession support", "enabled"); - php_info_print_table_end(); + return SUCCESS; } -#define RPT_CONN_ERR -#ifdef ERR_DEBUG -#undef RPT_CONN_ERR -#define RPT_CONN_ERR if(s_reqb->req.stat == REQ_ERR && (result == REQE_BADCONN || result == REQE_NOSEND)) \ - ELOG("Socket reports closed"); \ - else if(s_reqb->req.stat == REQ_ERR)\ - ELOG("MSession call failed");\ -#else -#endif - -#define CONN_ERR(reqb)\ - (reqb->req.stat == REQ_ERR) && (reqb->req.param == REQE_BADCONN || reqb->req.param == REQE_NOSEND) -int PHPExecRequest(int req, char *session, char *d1, char *d2,int param) +PHP_RINIT_FUNCTION(msession) { - int result; - FormatRequest(&s_reqb, req, session, d1, d2, param); - result = DoRequest(s_conn, &s_reqb); + return SUCCESS; +} - /* Server closed the connection! */ - if(CONN_ERR(s_reqb)) - { - ELOG("Connection was closed by server"); - if(ReopenReqConn(s_conn)) - { - FormatRequest(&s_reqb, req, session, d1, d2, param); - result = DoRequest(s_conn, &s_reqb); - } +PHP_RSHUTDOWN_FUNCTION(msession) +{ + TSRMLS_FETCH(); + void *t_conn = (void *)MSESSION_G(conn); + if(t_conn) + { + MSESSION_G(conn) = NULL; + CloseReqConn(t_conn); + t_conn = NULL; } - RPT_CONN_ERR - return result; + return SUCCESS; } -int PHPExecRequestMulti(int req, char *session, int n, char **pairs, int param) + +PHP_MINFO_FUNCTION(msession) { - int result; - FormatRequestMulti(&s_reqb, req, session, n, pairs, param); - result = DoRequest(s_conn, &s_reqb); + ELOG("PHP_MINFO"); + php_info_print_table_start(); + php_info_print_table_header(2, "msession support", "enabled"); + php_info_print_table_end(); +} +/* The PHP Version of DoRequest */ +/* Manages connections that have been disconnected */ +static int PHPDoRequest(void **pconn, REQB *preq TSRMLS_DC) +{ + int stat = preq->req->stat; + int param = preq->req->param; + int result = DoRequest(*pconn, preq); + ELOG("PHPDoRequest"); /* Server closed the connection! */ - if(CONN_ERR(s_reqb)) + if(preq->req->stat == MREQ_ERR && (result == REQE_BADCONN || result == REQE_NOSEND)) { + /* In the case of a bad socket, this should be */ + /* all that changs! */ + preq->req->stat = stat; + preq->req->param = param; ELOG("Connection was closed by server"); - if(ReopenReqConn(s_conn)) - { - FormatRequestMulti(&s_reqb, req, session, n, pairs, param); - result = DoRequest(s_conn, &s_reqb); - } + if(ReopenReqConn(*pconn)) + result = DoRequest(*pconn, preq); } - RPT_CONN_ERR +#ifdef ERR_DEBUG + if(preq->req->stat == MREQ_ERR && (result == REQE_BADCONN || result == REQE_NOSEND)) + ELOG("Socket reports closed"); +#endif return result; } -int PHPExecRequestStrings(int req, char *session, int n, char **strings) +static void *PHPMSessionConnect(const char *szhost, int nport TSRMLS_DC) { - int result; - FormatRequestStrings(&s_reqb, req, session, n, strings); - result = DoRequest(s_conn, &s_reqb); - /* Server closed the connection! */ - if(CONN_ERR(s_reqb)) - { - ELOG("Connection was closed by server"); - if(ReopenReqConn(s_conn)) - { - FormatRequestStrings(&s_reqb, req, session, n, strings); - result = DoRequest(s_conn, &s_reqb); - } - } - RPT_CONN_ERR - return result; -} + int fNewHost=FALSE; + int fNewPort=FALSE; + int fResult=FALSE; + void *t_conn; + REQB *preqb; + TSRMLS_FETCH(); + ELOG("PHPMSessionConnect"); -int PHPMsessionConnect(const char *szhost, int nport) -{ - int fNewHost=FALSE; - - if(!s_reqb) - s_reqb = AllocateRequestBuffer(2048); + t_conn = (void *)MSESSION_G(conn); - if(!s_reqb) /* no buffer, it won't work! */ - return 0; + char *gszhost = MSESSION_G(host); + int gport = MSESSION_G(port); - if(strcmp(s_szhost, szhost)) + if(nport == 0) + nport = DEF_PORT; + + if(strcmp(gszhost, szhost)) { - if(s_szhost != s_szdefhost) - free(s_szhost); - s_szhost = strdup(szhost); + if(gszhost != s_szdefhost) + free(gszhost); + gszhost = strdup(szhost); + MSESSION_G(host) = gszhost; fNewHost = TRUE; } - if(nport && nport != s_port) + if(nport != gport) { - fNewHost = TRUE; - s_port = nport; + fNewPort = TRUE; + gport = nport; + MSESSION_G(port) = gport; } + if(!fNewHost && !fNewPort && t_conn) + return t_conn; // Nothing to do, already there - ELOG("PHPMsessionConnect:new"); - if(s_conn && fNewHost) + if(t_conn) { - ELOG("Closing old connection, opening new"); - CloseReqConn(s_conn); - s_conn = NULL; + MSESSION_G(conn) = NULL; + CloseReqConn(t_conn); + php_log_err("Call to PHPMSessionConnect with non-null t_conn" TSRMLS_CC); + t_conn = NULL; } - if(!s_conn) - s_conn = OpenReqConn(s_szhost, s_port); -#ifdef ERR_DEBUG - else + + t_conn = OpenReqConn(gszhost, gport); + + MSESSION_G(conn) = t_conn; + return t_conn; +} + +static void PHPMSessionDisconnect(TSRMLS_DC) +{ + TSRMLS_FETCH(); + void *t_conn = (void *)MSESSION_G(conn); + if(t_conn) { - ELOG("Reusing old connection"); + CloseReqConn(t_conn); + MSESSION_G(conn) = NULL; + t_conn = NULL; } -#endif +} + +static char * PHPMSessionGetString(int req, const char *session, char *name, char *value, int param TSRMLS_DC) +{ + char *szvalue = NULL; + TSRMLS_FETCH(); + ELOG("PHPMSessionGetString"); + + IFCONNECT_BEGIN + FormatRequest(&t_reqb, req, (char *)session, name, value, param); + PHPDoRequest(&t_conn, &t_reqb); + if(t_reqb.req->stat == MREQ_OK && t_reqb.req->datum[0]) + szvalue = safe_estrdup(t_reqb.req->datum); + else + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + IFCONNECT_ENDNR #ifdef ERR_DEBUG -{ - char buffer[256]; - sprintf(buffer,"Connect: %s [%d] = %d (%X)\n", - s_szhost, s_port, (s_conn != NULL), (unsigned)s_conn); - php_log_err(buffer); -} + if(szvalue) + ELOG(szvalue); + else + ELOG("GetString returned NULL"); #endif - return (s_conn) ? 1 : 0; + return szvalue; } -void PHPMsessionDisconnect() +static int PHPMSessionGetInt(int req, char *session, char *name, char *value, int param TSRMLS_DC) { -} + TSRMLS_FETCH(); + ELOG("PHPMSessionGetInt"); + IFCONNECT_BEGIN + FormatRequest(&t_reqb, req, session, name, value, param); + PHPDoRequest(&t_conn, &t_reqb); -char *PHPMsessionGetData(char *session TSRMLS_DC) -{ - char *ret = NULL; - ELOG("PHPMsessionGetData"); + param = t_reqb.req->param; + + if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + IFCONNECT_ENDNR + return param; +} +static int StringsToFixedArray(char *strings, char **array, int ceArray) +{ + int i; + char *p = strings; + int term=ceArray-1; + for(i=0; i < term; i++) + { + if(!*p) + break; + array[i] = p; + p += strlen(p)+1; + } + array[i]=0; + return i; +} +static int PHPMSessionGetArray(zval *return_value, int req, char *session, char *name, char *value, int param TSRMLS_DC) +{ + int stat=0; + TSRMLS_FETCH(); + ELOG("PHPMSessionGetArray"); IFCONNECT_BEGIN + FormatRequest(&t_reqb, req, session, name, value, param); + PHPDoRequest(&t_conn,&t_reqb); - PHPExecRequest(REQ_DATAGET, (char *)session,"","",0); + if(t_reqb.cmd==MREQ_OK && t_reqb.param) + { + int i=0; + int term = 0; + int string_count = t_reqb.param + 4; + char ** strings = (char **)emalloc(sizeof(char *) * (t_reqb.param + 4)); + term = StringsToFixedArray(t_reqb.req->datum, strings, string_count); - if(s_reqb->req.stat==REQ_OK) - ret = safe_estrdup(s_reqb->req.datum); - IFCONNECT_ENDVAL(0) - - return ret; + array_init(return_value); + for(i=0; i < term; i++) + { + ELOG(strings[i]); + add_index_string(return_value, i, safe_estrdup(strings[i]), 0); + } + efree(strings); + } + else if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + + stat = t_reqb.req->stat; + + IFCONNECT_ENDNR + return stat; } -int PHPMsessionSetData(char *session, char *data TSRMLS_DC) + +static int PHPMSessionGetArrayPairs(zval *return_value, int req, char *session, char *name, char *value, int param TSRMLS_DC) { - ELOG("PHPMsessionSetData"); + int stat=0; + TSRMLS_FETCH(); + ELOG("PHPMSessionGetArrayPairs"); IFCONNECT_BEGIN - int ret=0; + FormatRequest(&t_reqb, req, session, name, value, param); + PHPDoRequest(&t_conn,&t_reqb); - PHPExecRequest(REQ_DATASET, session,"",data,0); - ret = (s_reqb->req.stat==REQ_OK); - if(s_reqb->req.stat!=REQ_OK) - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); + if(t_reqb.cmd==MREQ_OK && t_reqb.param) + { + int ndx=0; + int term = 0; + int string_count = t_reqb.param + 4; + char ** strings = (char **)emalloc(sizeof(char *) * (t_reqb.param + 4)); + term = StringsToFixedArray(t_reqb.req->datum, strings, string_count); + array_init(return_value); + if(req == MREQ_GETOBJECT) + { + ELOG("Using MREQ_GETOBJECT classname and classdata"); + add_assoc_string(return_value, safe_estrdup("classname"), safe_estrdup(strings[ndx]), 0); + ELOG(strings[ndx]); + ndx++; + add_assoc_string(return_value, safe_estrdup("classdata"), safe_estrdup(strings[ndx]), 0); + ELOG(strings[ndx]); + ndx++; + } + for(; ndx < term; ndx+=2) + { + ELOG(strings[ndx]); + ELOG(strings[ndx+1]); + add_assoc_string(return_value, safe_estrdup(strings[ndx]), + safe_estrdup(strings[ndx+1]), 0); + } - return ret; + efree(strings); + } + else + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); - IFCONNECT_ENDVAL(0) + stat = t_reqb.req->stat; + IFCONNECT_ENDNR + + return stat; } -int PHPMsessionDestroy(char *session TSRMLS_DC) +static int PHPMSessionExec(int req, char *session, char *name, char *value, int param TSRMLS_DC) { - ELOG("PHPMsessionDestroy"); + int stat=0; + TSRMLS_FETCH(); + ELOG("PHPMSessionExec"); IFCONNECT_BEGIN + FormatRequest(&t_reqb, req, session, name, value, param); + PHPDoRequest(&t_conn, &t_reqb); - int ret=0; - PHPExecRequest( REQ_DROP, session, "","",0); - ret = (s_reqb->req.stat==REQ_OK); - if(s_reqb->req.stat!=REQ_OK) - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - return ret; - - IFCONNECT_ENDVAL(0) + stat = t_reqb.req->stat; + + if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + + IFCONNECT_ENDNR + return stat; } +static int PHPMSessionExecData(int req, char *session, char *name, char *value, void *data, int cb, int param TSRMLS_DC) +{ + int stat=0; + TSRMLS_FETCH(); + ELOG("PHPMSessionExec"); + IFCONNECT_BEGIN + FormatRequestData(&t_reqb, req, session, name, value, data, cb, param); + PHPDoRequest(&t_conn, &t_reqb); + stat = t_reqb.req->stat; + + if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + + IFCONNECT_ENDNR + return stat; +} /* {{{ proto bool msession_connect(string host, string port) Connect to msession sever */ PHP_FUNCTION(msession_connect) { char *szhost; int nport; - zval **zhost; zval **zport; - + ELOG("msession_connect"); if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &zhost, &zport) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(zhost); convert_to_string_ex(zport); - szhost = Z_STRVAL_PP(zhost); nport = atoi(Z_STRVAL_PP(zport)); - if(PHPMsessionConnect(szhost,nport)) + if(PHPMSessionConnect(szhost,nport)) { RETURN_TRUE; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "MSession connect failed"); + php_error(E_WARNING, "%s(): MSession connect failed", get_active_function_name(TSRMLS_C)); RETURN_FALSE; } } @@ -395,7 +591,8 @@ Disconnect from msession server */ PHP_FUNCTION(msession_disconnect) { - PHPMsessionDisconnect(); + ELOG("msession_disconnect"); + PHPMSessionDisconnect(); RETURN_NULL(); } /* }}} */ @@ -404,62 +601,199 @@ Get session count */ PHP_FUNCTION(msession_count) { - IFCONNECT_BEGIN - - int count; - PHPExecRequest( REQ_COUNT, "", "","",0); - - count = (s_reqb->req.stat == REQ_OK) ? s_reqb->req.param : 0; - + int count=0; + ELOG("msession_count"); + count = PHPMSessionGetInt(MREQ_COUNT, "","","",0 TSRMLS_CC); RETURN_LONG(count); - - IFCONNECT_END } /* }}} */ -/* {{{ proto bool msession_create(string session) - Create a session */ +/* {{{ proto bool msession_create(string session[,string classname][,string data]) + Create a session cacheid */ PHP_FUNCTION(msession_create) { - IFCONNECT_BEGIN -/* int stat; */ + int stat=0; + int ret; char *szsession; zval **session; - - if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) + zval **zclassname; + zval **zdata; + char *classname="phpsession"; + char *data = NULL; + int nargs = ZEND_NUM_ARGS(); + + ELOG("msession_create"); + if(nargs < 1) { WRONG_PARAM_COUNT; } - convert_to_string_ex(session); - szsession = Z_STRVAL_PP(session); - PHPExecRequest( REQ_CREATE, szsession, "","",0); - if(s_reqb->req.stat==REQ_OK) + + if(nargs == 2) + { + ret = zend_get_parameters_ex(2, &session, &zclassname); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + } + else if(nargs == 3) + { + ret = zend_get_parameters_ex(3, &session, &zclassname, &zdata); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + convert_to_string_ex(zdata); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + data = Z_STRVAL_PP(zdata); + } + if(ret = FAILURE) + { + WRONG_PARAM_COUNT; + } + + stat = PHPMSessionExec(MREQ_CREATE, szsession,classname ,data,0 TSRMLS_CC); + + if(stat==MREQ_OK) { RETURN_TRUE; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_FALSE; } - IFCONNECT_END } /* }}} */ +/* {{{ proto bool msession_save_object(string session, string data[, array tuples[,string classname]]) + Create a session cacheid + This function really needs to be written to handle objects and not arrays. +*/ +PHP_FUNCTION(msession_save_object) +{ + zval **session=NULL; + zval **zdata=NULL; + zval **tuples=NULL; + zval **zclassname=NULL; + HashPosition pos; + zval **entry; + char *key; + uint keylen; + ulong numndx; + int ndx=0; + char **pairs; + HashTable *htTuples; + int i; + int nargs = ZEND_NUM_ARGS(); + int res; + int countpair; + TSRMLS_FETCH(); + char *szsession; + char *classname; + char *data; + int ret; + + ELOG("msession_save_object"); + if(nargs < 2 ) + { + WRONG_PARAM_COUNT; + } + if(nargs == 2) + { + ret = zend_get_parameters_ex(2, &session, &zdata); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + } + else if(nargs == 3) + { + ret = zend_get_parameters_ex(3, &session, &zdata, &tuples); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + convert_to_string_ex(zdata); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + data = Z_STRVAL_PP(zdata); + } + else if(nargs == 4) + { + ret = zend_get_parameters_ex(4, &session, &zdata, &tuples, &zclassname); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + convert_to_string_ex(zdata); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + data = Z_STRVAL_PP(zdata); + } + + htTuples = Z_ARRVAL_PP(tuples); + + countpair = zend_hash_num_elements(htTuples); + + pairs = (char **)emalloc(sizeof(char *) * (countpair+1) * 2); + + if(!pairs) + { + ELOG("no pairs"); + RETURN_FALSE; + } + ELOG("have pairs"); + + /* Initializes pos */ + zend_hash_internal_pointer_reset_ex(htTuples, &pos); + + ELOG("reset pointer"); + + for(i=0; i < countpair; i++) + { + if(zend_hash_get_current_data_ex(htTuples, (void **)&entry, &pos) != SUCCESS) + break; + + if(entry) + { + char *szentry; + convert_to_string_ex(entry); + szentry = Z_STRVAL_PP(entry); + + if(zend_hash_get_current_key_ex(htTuples,&key,&keylen,&numndx,0,&pos)== HASH_KEY_IS_STRING) + { + pairs[ndx++] = key; + pairs[ndx++] = szentry; + } + } + zend_hash_move_forward_ex(htTuples, &pos); + } + + IFCONNECT_BEGIN + ELOG("FormatMulti"); + FormatRequestStrings(&t_reqb, MREQ_CREATE | MSTAT_TYPE_OBJECT, + szsession, classname, data, ndx, pairs); + PHPDoRequest(&t_conn,&t_reqb); + + if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + efree((void *)pairs); + + IFCONNECT_END + + RETURN_TRUE; + +} +/* }}} */ /* {{{ proto bool msession_destroy(string name) Destroy a session */ PHP_FUNCTION(msession_destroy) { char *szsession; zval **session; + ELOG("msession_destroy"); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(session); szsession = Z_STRVAL_PP(session); - PHPMsessionDestroy(szsession TSRMLS_CC); - + PHPMSessionExec(MREQ_DROP, szsession, "", "", 0 TSRMLS_CC); RETURN_TRUE; } /* }}} */ @@ -468,33 +802,27 @@ Lock a session */ PHP_FUNCTION(msession_lock) { - IFCONNECT_BEGIN + int stat; + int param; + char *szsession; zval **session; + ELOG("msession_lock"); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(session); szsession = Z_STRVAL_PP(session); - PHPExecRequest( REQ_SLOCK, szsession, "","",0); - if(s_reqb->req.stat==REQ_OK) - { - RETURN_LONG(s_reqb->req.param); - } - else - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_FALSE; - } - - IFCONNECT_END + param = PHPMSessionGetInt(MREQ_SLOCK, szsession, "","",0 TSRMLS_CC); + RETURN_LONG(param); } /* }}} */ -/* {{{ proto int msession_ctl(string name) + +/* {{{ proto int msession_stat(string name) Lock a session */ PHP_FUNCTION(msession_ctl) { @@ -508,25 +836,25 @@ "NOW", NULL }; - IFCONNECT_BEGIN + int stat = 0; + int param; + char *szsession; zval **session; zval **which; - int fn = REQ_STAT_EXIST; - + int fn = MREQ_CTL_EXIST; int n = ZEND_NUM_ARGS(); + ELOG("msession_ctl"); if(n != 1 && n != 2) { WRONG_PARAM_COUNT; } - if(zend_get_parameters_ex(n,&session,&which) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(session); szsession = Z_STRVAL_PP(session); @@ -540,44 +868,28 @@ { if(strcasecmp(parray[i], szwhich) == 0) { - ELOG(szwhich); - fn = i; break; } } } - - PHPExecRequest( REQ_CTL, szsession, "","",fn); - - if(s_reqb->req.stat==REQ_OK) - { -#ifdef ERR_DEBUG - char buffer[128]; - sprintf(buffer, "ret:%s", s_reqb->req.datum); - ELOG(buffer); -#endif - s_reqb->req.param = atoi(s_reqb->req.datum); - RETURN_LONG(s_reqb->req.param); - } - else - { - ELOG("msession_ctl failed"); - RETURN_FALSE; - } - IFCONNECT_END + param = PHPMSessionGetInt(MREQ_CTL, szsession, "", "", fn TSRMLS_CC); + RETURN_LONG(param); } /* {{{ proto int msession_unlock(string session, int key) Unlock a session */ PHP_FUNCTION(msession_unlock) { - IFCONNECT_BEGIN + int stat; + int param; + char *szsession; long lkey; zval **session; zval **key; + ELOG("msession_unlock"); if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &key) == FAILURE) { WRONG_PARAM_COUNT; @@ -586,18 +898,9 @@ szsession = Z_STRVAL_PP(session); convert_to_long_ex(key); lkey = Z_LVAL_PP(key); - PHPExecRequest( REQ_SUNLOCK, szsession, "","",lkey); - if(s_reqb->req.stat==REQ_OK) - { - RETURN_LONG(s_reqb->req.param); - } - else - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_FALSE; - } - IFCONNECT_END + param = PHPMSessionGetInt(MREQ_SUNLOCK, szsession, "", "", lkey TSRMLS_CC); + RETURN_LONG(param); } /* }}} */ @@ -605,14 +908,14 @@ Set value in session */ PHP_FUNCTION(msession_set) { - IFCONNECT_BEGIN - + int stat; char *szsession; char *szname; char *szvalue; zval **session; zval **name; zval **value; + ELOG("msession_get"); if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3,&session,&name,&value) == FAILURE) { @@ -626,18 +929,16 @@ szname = Z_STRVAL_PP(name); szvalue = Z_STRVAL_PP(value); - PHPExecRequest( REQ_SETVAL, szsession, szname, szvalue, 0); + stat = PHPMSessionExec(MREQ_SETVAL, szsession, szname, szvalue, 0 TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK) + if(stat==MREQ_OK) { RETURN_TRUE; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_FALSE; } - IFCONNECT_END } /* }}} */ @@ -645,13 +946,14 @@ Get value from session */ PHP_FUNCTION(msession_get) { - IFCONNECT_BEGIN + int stat; + char *szvalue=NULL; char *szsession; char *szname; - char *szvalue; zval **session; zval **name; zval **value; + ELOG("msession_get"); if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3,&session,&name,&value) == FAILURE) { @@ -664,52 +966,79 @@ szname = Z_STRVAL_PP(name); szvalue = Z_STRVAL_PP(value); - PHPExecRequest( REQ_GETVAL, szsession, szname, szvalue,0); + szvalue = PHPMSessionGetString(MREQ_GETVAL, szsession,szname, szvalue, 0 TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK) + if(szvalue) { - szvalue = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(szvalue, 0) + RETURN_STRING(szvalue,0) } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_NULL(); } - IFCONNECT_END } /* }}} */ -/* {{{ proto string msession_uniq(int num_chars) +/* {{{ proto string msession_uniq(int num_chars[, string classname[, string data]]) Get uniq id */ PHP_FUNCTION(msession_uniq) { - IFCONNECT_BEGIN + int stat=0; + int ret = FAILURE; + int cbname; + zval **session; + zval **zclassname; + zval **zdata; + char *szsession; + char *classname="phpsession"; + char *data = NULL; + int nargs = ZEND_NUM_ARGS(); - long val; - zval **param; - - if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1,&param) == FAILURE) + ELOG("msession_uniq"); + if(nargs < 1) { WRONG_PARAM_COUNT; } - convert_to_long_ex(param); - val = Z_LVAL_PP(param); + if(nargs == 1) + { + ret = zend_get_parameters_ex(1, &session); + convert_to_string_ex(session); + szsession = Z_STRVAL_PP(session); + } + else if(nargs == 2) + { + ret = zend_get_parameters_ex(2, &session, &zclassname); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + } + else if(nargs == 3) + { + ret = zend_get_parameters_ex(3, &session, &zclassname, &zdata); + convert_to_string_ex(session); + convert_to_string_ex(zclassname); + convert_to_string_ex(zdata); + szsession = Z_STRVAL_PP(session); + classname = Z_STRVAL_PP(zclassname); + data = Z_STRVAL_PP(zdata); + } + else + { + WRONG_PARAM_COUNT; + } - PHPExecRequest( REQ_UNIQ,"", "", "",val); + cbname = atoi(szsession); + szsession = PHPMSessionGetString(MREQ_UNIQ, NULL, classname, data,MPARM_CREATE(0,cbname) TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK) + if(szsession) { - char *szval = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(szval, 0) + RETURN_STRING(szsession,0) } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_NULL(); } - IFCONNECT_END - } /* }}} */ @@ -717,9 +1046,11 @@ Get random string */ PHP_FUNCTION(msession_randstr) { - IFCONNECT_BEGIN + int stat; + char *szvalue=NULL; long val; zval **param; + ELOG("msession_randstr"); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1,&param) == FAILURE) { @@ -728,19 +1059,16 @@ convert_to_long_ex(param); val = Z_LVAL_PP(param); - PHPExecRequest( REQ_RANDSTR,"", "", "",val); + szvalue = PHPMSessionGetString(MREQ_RANDSTR, "","","",val TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK) + if(szvalue) { - char *szval = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(szval, 0) + RETURN_STRING(szvalue,0) } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_NULL(); } - IFCONNECT_END } /* }}} */ @@ -748,12 +1076,12 @@ Find all sessions with name and value */ PHP_FUNCTION(msession_find) { - IFCONNECT_BEGIN - + int stat; char *szname; char *szvalue; zval **name; zval **value; + ELOG("msession_find"); if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &name, &value) == FAILURE) { @@ -764,28 +1092,8 @@ szname = Z_STRVAL_PP(name); szvalue = Z_STRVAL_PP(value); - PHPExecRequest( REQ_FIND, "", szname, szvalue,0); + stat = PHPMSessionGetArray(return_value, MREQ_FIND, "", szname, szvalue, 0 TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK && s_reqb->req.param) - { - int i; - char *str = s_reqb->req.datum; - array_init(return_value); - - for(i=0; i < s_reqb->req.param; i++) - { - int cbstr = strlen(str); - char *data = safe_estrdup(str); - add_index_string(return_value, i, data, 0); - str += (cbstr+1); - } - } - else if(s_reqb->req.stat != REQ_OK) - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_NULL(); - } - IFCONNECT_END } /* }}} */ @@ -793,31 +1101,8 @@ List all sessions */ PHP_FUNCTION(msession_list) { - IFCONNECT_BEGIN - PHPExecRequest( REQ_LIST, "", "", "",0); - - if(s_reqb->req.stat==REQ_OK && s_reqb->req.param) - { - int i; - char *str = s_reqb->req.datum; - array_init(return_value); - - for(i=0; i < s_reqb->req.param; i++) - { - int cbstr = strlen(str); - char *data = safe_estrdup(str); - add_index_string(return_value, i, data, 0); - str += (cbstr+1); - } - } - else if(s_reqb->req.stat != REQ_OK) - { - /* May this should be an error? */ - if(s_reqb->req.param != REQE_NOSESSION) - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_NULL(); - } - IFCONNECT_END + ELOG("msession_list"); + int stat = PHPMSessionGetArray(return_value, MREQ_LIST, "", "","", 0 TSRMLS_CC); } /* }}} */ @@ -825,57 +1110,42 @@ Get array of msession variables */ PHP_FUNCTION(msession_get_array) { - IFCONNECT_BEGIN + int stat; char *szsession; zval **session; + ELOG("msession_getarray"); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) { WRONG_PARAM_COUNT; - } + } convert_to_string_ex(session); szsession = Z_STRVAL_PP(session); - PHPExecRequest( REQ_GETALL, szsession, "", "",0); - - array_init(return_value); - if(s_reqb->req.stat == REQ_OK) - { - int i; - char *str = s_reqb->req.datum; - int num = s_reqb->req.param*2; - - for(i=0; i < num; i+=2) - { - int cbvalue; - int cbname; - char *szvalue; - char *szname; - - cbname = strlen(str); - szname = safe_estrndup(str,cbname); - str += (cbname+1); - - cbvalue = strlen(str); - szvalue = safe_estrndup(str,cbvalue); - str += (cbvalue+1); - add_assoc_string(return_value, szname, szvalue, 0); - } - } - else - { - if(s_reqb->req.param != REQE_NOSESSION) - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_NULL(); - } - IFCONNECT_END + stat = PHPMSessionGetArrayPairs(return_value, MREQ_GETALL, szsession, "","", 0 TSRMLS_CC); } /* }}} */ +/* {{{ proto object msession_get_object(string object) + Get msession variable object */ +PHP_FUNCTION(msession_get_object) +{ +// FIXME FIXME FIXME + int stat; + char *szsession; + zval **session; + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) + { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(session); + szsession = Z_STRVAL_PP(session); + stat = PHPMSessionGetArrayPairs(return_value, MREQ_GETOBJECT, szsession, NULL, NULL, 0 TSRMLS_CC); +} +/* }}} */ /* {{{ proto bool msession_set_array(string session, array tuples) Set msession variables from an array*/ PHP_FUNCTION(msession_set_array) { - IFCONNECT_BEGIN zval **session; zval **tuples; HashPosition pos; @@ -892,8 +1162,10 @@ char **pairs; HashTable *htTuples; int i; - int countpair; + + ELOG("msession_set_array"); + TSRMLS_FETCH(); if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &tuples) == FAILURE) { @@ -903,7 +1175,13 @@ countpair = zend_hash_num_elements(htTuples); - pairs = (char **)safe_emalloc(sizeof(char *), countpair * 2, 0); + pairs = (char **)emalloc(sizeof(char *) * countpair * 2); + + if(!pairs) + { + ELOG("no pairs"); + RETURN_FALSE; + } ELOG("have pairs"); @@ -939,12 +1217,16 @@ zend_hash_move_forward_ex(htTuples, &pos); } - PHPExecRequestMulti(REQ_SETVAL, Z_STRVAL_PP(session), countpair, pairs,0); + IFCONNECT_BEGIN + ELOG("FormatMulti"); + FormatRequestStrings(&t_reqb, MREQ_SETVAL, Z_STRVAL_PP(session), NULL, NULL, ndx, pairs); + PHPDoRequest(&t_conn,&t_reqb); - if(s_reqb->req.stat != REQ_OK) - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); + if(t_reqb.req->stat != MREQ_OK) + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); efree((void *)pairs); IFCONNECT_END + } /* }}} */ @@ -952,46 +1234,15 @@ return associative array of value:session for all sessions with a variable named 'name' */ PHP_FUNCTION(msession_listvar) { - IFCONNECT_BEGIN + int stat; zval **name; if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &name) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(name); - PHPExecRequest( REQ_LISTVAR, "", Z_STRVAL_PP(name), "",0); - - array_init(return_value); - - if(s_reqb->req.stat == REQ_OK) - { - int i; - char *str = s_reqb->req.datum; - int num = s_reqb->req.param*2; - for(i=0; i < num; i+=2) - { - int cbvalue; - int cbname; - char *szvalue; - char *szname; - - cbname= strlen(str); - szname= safe_estrndup(str,cbname); - str += (cbname+1); - - cbvalue = strlen(str); - szvalue = safe_estrndup(str,cbvalue); - str += (cbvalue+1); - add_assoc_string(return_value, szname, szvalue, 0); - } - } - else - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_NULL(); - } - IFCONNECT_END + stat = PHPMSessionGetArrayPairs(return_value, MREQ_LISTVAR, "", Z_STRVAL_PP(name),"",0 TSRMLS_CC); } /* }}} */ @@ -999,11 +1250,13 @@ Set/get session timeout */ PHP_FUNCTION(msession_timeout) { - IFCONNECT_BEGIN + int stat; + int param; zval **session; int ac = ZEND_NUM_ARGS(); int zstat = FAILURE; int timeout = 0; + ELOG("msession_timeout"); if(ac == 1) { zstat = zend_get_parameters_ex(1, &session); @@ -1020,60 +1273,127 @@ WRONG_PARAM_COUNT; } convert_to_string_ex(session); - PHPExecRequest( REQ_TIMEOUT, Z_STRVAL_PP(session), "","",timeout); - if(s_reqb->req.stat == REQ_OK) + param = PHPMSessionGetInt(MREQ_TIMEOUT, Z_STRVAL_PP(session),"","",timeout TSRMLS_CC); + + RETURN_LONG(param); +} +/* }}} */ + +/* {{{ proto string msession_inc(string session, string name) + Increment value in session */ +PHP_FUNCTION(msession_inc) +{ + int stat; + char *szvalue; + zval **session; + zval **name; + + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &name) == FAILURE) + { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(session); + convert_to_string_ex(name); + + szvalue = PHPMSessionGetString(MREQ_ADD, Z_STRVAL_PP(session), Z_STRVAL_PP(name),"1",0 TSRMLS_CC); + + if(szvalue) { - RETURN_LONG( s_reqb->req.param); + RETURN_STRING(szvalue,0) } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_NULL(); } - IFCONNECT_END } /* }}} */ +/* {{{ proto string msession_add(string session, string name, string value) + Increment value in session */ +PHP_FUNCTION(msession_add) +{ + int stat; + char *szvalue; + zval **session; + zval **name; + zval **value; + ELOG("msession_add"); + + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &session, &name, &value) == FAILURE) + { + WRONG_PARAM_COUNT; + } + convert_to_string_ex(session); + convert_to_string_ex(name); + convert_to_string_ex(value); -/* {{{ proto string msession_inc(string session, string name) + szvalue = PHPMSessionGetString(MREQ_ADD, Z_STRVAL_PP(session), Z_STRVAL_PP(name),Z_STRVAL_PP(value),0 TSRMLS_CC); + + if(szvalue) + { + RETURN_STRING(szvalue,0) + } + else + { + RETURN_NULL(); + } +} +/* }}} */ +/* {{{ proto string msession_muldiv(string session, string name, string mul, string div) Increment value in session */ -PHP_FUNCTION(msession_inc) +PHP_FUNCTION(msession_muldiv) { - IFCONNECT_BEGIN - char *val; + int stat; + char *szvalue=NULL; zval **session; zval **name; + zval **mul; + zval **div; + char *pdata; + ELOG("msession_muldiv"); - if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &name) == FAILURE) + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_ex(4, &session, &name, &mul, &div) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(session); convert_to_string_ex(name); + convert_to_string_ex(mul); + convert_to_string_ex(div); - PHPExecRequest( REQ_INC, Z_STRVAL_PP(session), Z_STRVAL_PP(name),0,0); + pdata = Z_STRVAL_PP(div); - if(s_reqb->req.stat==REQ_OK) + IFCONNECT_BEGIN + FormatRequestData(&t_reqb, MREQ_MULDIV, + Z_STRVAL_PP(session), Z_STRVAL_PP(name), Z_STRVAL_PP(mul), pdata, strlen(pdata)+1, 0); + + PHPDoRequest(&t_conn, &t_reqb); + + if(t_reqb.req->stat == MREQ_OK) + szvalue = safe_estrdup(t_reqb.req->datum); + else + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); + + IFCONNECT_ENDNR + + if(szvalue) { - val = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(val, 0) + RETURN_STRING(szvalue,0) } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_FALSE; + RETURN_NULL(); } - IFCONNECT_END } /* }}} */ -/* {{{ proto string msession_get_data(string session) +/* {{{ proto string msession_getdata(string session) Get data session unstructured data. (PHP sessions use this) */ -PHP_FUNCTION(msession_get_data) +PHP_FUNCTION(msession_getdata) { - IFCONNECT_BEGIN char *val; zval **session; + ELOG("msession_getdata"); if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &session) == FAILURE) { @@ -1081,7 +1401,7 @@ } convert_to_string_ex(session); - val = PHPMsessionGetData(Z_STRVAL_PP(session) TSRMLS_CC); + val = PHPMSessionGetString(MREQ_DATAGET, Z_STRVAL_PP(session), "", "", 0 TSRMLS_CC); if(val) { @@ -1091,17 +1411,17 @@ { RETURN_NULL(); } - IFCONNECT_END } /* }}} */ -/* {{{ proto bool msession_set_data(string session, string value) +/* {{{ proto bool msession_setdata(string session, string value) Set data session unstructured data. (PHP sessions use this) */ -PHP_FUNCTION(msession_set_data) +PHP_FUNCTION(msession_setdata) { - IFCONNECT_BEGIN + int stat; zval **session; zval **value; + ELOG("msession_setdata"); if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &session, &value) == FAILURE) { @@ -1109,8 +1429,10 @@ } convert_to_string_ex(session); convert_to_string_ex(value); + char *szdata = Z_STRVAL_PP(value); - if(PHPMsessionSetData(Z_STRVAL_PP(session), Z_STRVAL_PP(value) TSRMLS_CC)) + stat = PHPMSessionExecData(MREQ_DATASET, Z_STRVAL_PP(session),NULL,NULL,szdata,strlen(szdata),0 TSRMLS_CC); + if(stat==MREQ_OK) { RETURN_TRUE; } @@ -1118,7 +1440,6 @@ { RETURN_FALSE; } - IFCONNECT_END } /* }}} */ @@ -1126,13 +1447,14 @@ Call the personality plugin escape function */ PHP_FUNCTION(msession_plugin) { - IFCONNECT_BEGIN int ret; - char *retval; + char *retval=NULL; zval **session; zval **val; zval **param=NULL; + char *szparam; + ELOG("msession_plugin"); if(ZEND_NUM_ARGS() == 3) { ret = zend_get_parameters_ex(3, &session, &val, &param); @@ -1154,45 +1476,43 @@ convert_to_string_ex(val); ret = atoi(Z_STRVAL_PP(val)); + szparam = (param) ? Z_STRVAL_PP(param) : ""; - PHPExecRequest( REQ_PLUGIN, Z_STRVAL_PP(session), Z_STRVAL_PP(val), param ? Z_STRVAL_PP(param) : "",ret); + retval =PHPMSessionGetString(MREQ_PLUGIN, Z_STRVAL_PP(session), Z_STRVAL_PP(val), szparam, ret TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK && s_reqb->req.len) - { - retval = safe_estrdup(s_reqb->req.datum); + if(retval) + { RETURN_STRING(retval, 0) } - else if(s_reqb->req.stat != REQ_OK) + else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_FALSE; - } - IFCONNECT_END } /* }}} */ -#define MAX_EXT_VAL 5 +#define MAX_EXT_VAL 6 /* {{{ proto string msession_call(string fn_name, [, string param1 ], ... [,string param4]) Call the plugin function named fn_name */ PHP_FUNCTION(msession_call) { - IFCONNECT_BEGIN int n; int i; int ret; - char *retval; + char *retval=NULL; zval **val[MAX_EXT_VAL]; char *strings[MAX_EXT_VAL+1]; /* zval **param=NULL; */ + TSRMLS_FETCH(); n = ZEND_NUM_ARGS(); + ELOG("msession_call"); if((n < 1) || (n > MAX_EXT_VAL)) { WRONG_PARAM_COUNT; } - ret = zend_get_parameters_ex(ZEND_NUM_ARGS(), &val[0],&val[1],&val[2],&val[3],&val[4]); + ret = zend_get_parameters_ex(n, &val[0],&val[1],&val[2],&val[3],&val[4],&val[5],&val[6]); if(ret == FAILURE) { @@ -1203,69 +1523,27 @@ convert_to_string_ex(val[i]); strings[i] = Z_STRVAL_PP(val[i]); } + strings[i]=0; - PHPExecRequestStrings(REQ_CALL, NULL , n, strings); - - if(s_reqb->req.stat==REQ_OK && s_reqb->req.len) - { - retval = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(retval, 0) - } - else if(s_reqb->req.stat != REQ_OK) - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_FALSE; - } - IFCONNECT_END -} -/* }}} */ -/* {{{ proto string msession_exec(string cmdline) - executes a program on msession system */ -PHP_FUNCTION(msession_exec) -{ IFCONNECT_BEGIN - char *val; - zval **cmdline; - - if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &cmdline) == FAILURE) - { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(cmdline); - - PHPExecRequest( REQ_EXEC, Z_STRVAL_PP(cmdline), "","",0); + FormatRequestStrings(&t_reqb, MREQ_CALL, NULL , strings[0], NULL, n-1, (n>1) ? &strings[1] : NULL); + PHPDoRequest(&t_conn, &t_reqb); - if(s_reqb->req.stat == REQ_OK) - { - val = safe_estrdup(s_reqb->req.datum); - RETURN_STRING(val, 0) - } + if(t_reqb.req->stat==MREQ_OK && t_reqb.req->len) + retval = safe_estrdup(t_reqb.req->datum); else - { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - RETURN_NULL(); - } - IFCONNECT_END -} -/* }}} */ -/* {{{ proto bool msession_ping(void) - returns non-zero if msession is alive*/ -PHP_FUNCTION(msession_ping) -{ - IFCONNECT_BEGIN + php_error(E_WARNING, s_szErrFmt, get_active_function_name(TSRMLS_C), ReqbErr(&t_reqb)); - PHPExecRequest(REQ_PING,"","","", 0); + IFCONNECT_ENDNR - if(s_reqb->req.stat==REQ_OK) - { - RETURN_TRUE; + if(retval) + { + RETURN_STRING(retval, 0) } - else + else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); RETURN_FALSE; } - IFCONNECT_END } /* }}} */ @@ -1273,32 +1551,19 @@ PS_OPEN_FUNC(msession) { - int port; - int len = strlen(save_path)+1; - char * path = emalloc(len); - char * szport; - - strcpy(path, save_path); + char *szport; + char host[MAX_HOST]; + int port = msession_split_host_port(host, sizeof(host), (char *)save_path, DEF_PORT); - szport = strchr(path, ':'); + ELOG("PS_OPEN_FUNC"); - if(szport) - { - *szport++=0; - port = atoi(szport); - } - else - { - port = s_port; - } - ELOG( "ps_open_msession"); PS_SET_MOD_DATA((void *)1); /* session.c needs a non-zero here! */ - if (PHPMsessionConnect(path, port)) { - efree(path); + if (PHPMSessionConnect(host, port)) { + ELOG("Success"); return SUCCESS; } else { - efree(path); + ELOG("Failure"); return FAILURE; } } @@ -1306,18 +1571,20 @@ PS_CLOSE_FUNC(msession) { ELOG( "ps_close_msession"); - PHPMsessionDisconnect(); + PHPMSessionDisconnect(); + PS_SET_MOD_DATA((void *)0); return SUCCESS; } PS_READ_FUNC(msession) { ELOG( "ps_read_msession"); - *val = PHPMsessionGetData((char *)key TSRMLS_CC); + *val = PHPMSessionGetString(MREQ_DATAGET, (char *)key, "", "", 0 TSRMLS_CC); if(*val) - { - *vallen = strlen(*val); - } + { + *vallen = strlen(*val); + ELOG( *val ); + } else { *val = emalloc(1); @@ -1329,14 +1596,18 @@ PS_WRITE_FUNC(msession) { - ELOG( "ps_write_msession"); - return (PHPMsessionSetData((char *)key, (char *)val TSRMLS_CC)) ? SUCCESS : FAILURE; + ELOG("PS_WRITE_FUNC"); + ELOG(key); + ELOG(val); + int stat = PHPMSessionExecData(MREQ_DATASET, key, NULL, NULL, val, strlen(val), 0 TSRMLS_CC); + return (stat == MREQ_OK) ? SUCCESS : FAILURE; } PS_DESTROY_FUNC(msession) { ELOG( "ps_destroy_msession"); - return (PHPMsessionDestroy((char *)key TSRMLS_CC)) ? SUCCESS : FAILURE; + int stat = PHPMSessionExec(MREQ_DROP, (char *)key, "", "", 0 TSRMLS_CC); + return (stat == MREQ_OK) ? SUCCESS : FAILURE; } PS_GC_FUNC(msession) @@ -1348,26 +1619,19 @@ #ifdef HAVE_PHP_SESSION_CREATESID PS_CREATE_SID_FUNC(msession) { - if(s_reqb && s_conn) - { - ELOG("Should create a new session"); - PHPExecRequest( REQ_UNIQ,"", "", "",SID_LEN); + ELOG("PS_CREATE_SID_FUNCx"); + char * sessid = PHPMSessionGetString(MREQ_UNIQ, "","phpsess","",MPARM_CREATE(0,SID_LEN) TSRMLS_CC); - if(s_reqb->req.stat==REQ_OK) - { - ELOG("Reports UNIQ success"); - if(newlen) - *newlen = SID_LEN; - return safe_estrdup(s_reqb->req.datum); - } - else - { - ELOG("Reports that UNIQ failed"); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ReqbErr(s_reqb)); - } - } - ELOG("Yikes, could not get sid from msession 2003"); - return php_session_create_id(mod_data, newlen TSRMLS_CC); + if(!sessid || !strlen(sessid)) + ELOG("No SID returned from UNIQ"); + else + ELOG(sessid); + + if(!sessid) + sessid = php_session_create_id(mod_data, newlen TSRMLS_CC); + + ELOG(sessid); + return sessid; } #endif /* HAVE_PHP_SESSION_CREATESID */ #endif /* HAVE_PHP_SESSION */ http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/php_msession.h?r1=1.15&r2=1.16&diff_format=u Index: php-src/ext/msession/php_msession.h diff -u php-src/ext/msession/php_msession.h:1.15 php-src/ext/msession/php_msession.h:1.16 --- php-src/ext/msession/php_msession.h:1.15 Sun Jan 1 13:09:51 2006 +++ php-src/ext/msession/php_msession.h Mon Jan 30 16:18:39 2006 @@ -2,12 +2,12 @@ +----------------------------------------------------------------------+ | msession 1.0 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2006 The PHP Group | + | Copyright (c) 1997-2003 The PHP Group | +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | + | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | @@ -35,6 +35,9 @@ #endif PHP_MINIT_FUNCTION(msession); +PHP_MSHUTDOWN_FUNCTION(msession); +PHP_RINIT_FUNCTION(msession); +PHP_RSHUTDOWN_FUNCTION(msession); PHP_MINFO_FUNCTION(msession); PHP_FUNCTION(msession_connect); @@ -45,50 +48,41 @@ PHP_FUNCTION(msession_count); PHP_FUNCTION(msession_create); PHP_FUNCTION(msession_destroy); -PHP_FUNCTION(msession_exec); PHP_FUNCTION(msession_set); PHP_FUNCTION(msession_get); PHP_FUNCTION(msession_find); PHP_FUNCTION(msession_get_array); +PHP_FUNCTION(msession_save_object); +PHP_FUNCTION(msession_get_object); PHP_FUNCTION(msession_set_array); PHP_FUNCTION(msession_timeout); PHP_FUNCTION(msession_inc); -PHP_FUNCTION(msession_set_data); -PHP_FUNCTION(msession_get_data); +PHP_FUNCTION(msession_add); +PHP_FUNCTION(msession_muldiv); +PHP_FUNCTION(msession_setdata); +PHP_FUNCTION(msession_getdata); PHP_FUNCTION(msession_listvar); PHP_FUNCTION(msession_list); PHP_FUNCTION(msession_uniq); PHP_FUNCTION(msession_randstr); PHP_FUNCTION(msession_plugin); PHP_FUNCTION(msession_call); -PHP_FUNCTION(msession_ping); - -/* - Declare any global variables you may need between the BEGIN - and END macros here: +PHP_FUNCTION(msession_find_cacheid); +PHP_FUNCTION(msession_set_cacheid); ZEND_BEGIN_MODULE_GLOBALS(msession) - int global_variable; - void *conn; + int port; char *host; + void *conn; + void *reqb; ZEND_END_MODULE_GLOBALS(msession) -*/ -/* In every function that needs to use variables in php_msession_globals, - do call MSESSIONLS_FETCH(); after declaring other variables used by - that function, and always refer to them as MSESSIONG(variable). - You are encouraged to rename these macros something shorter, see - examples in any other php module directory. -*/ #ifdef ZTS -#define MSESSIONG(v) (msession_globals->v) -#define MSESSIONLS_FETCH() php_msession_globals *msession_globals = ts_resource(msession_globals_id) +#define MSESSION_G(v) TSRMG(msession_globals_id, zend_msession_globals *, v) #else -#define MSESSIONG(v) (msession_globals.v) -#define MSESSIONLS_FETCH() +#define MSESSION_G(v) (msession_globals.v) #endif - #else #define phpext_msession_ptr NULL http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/reqclient.h?r1=1.16&r2=1.17&diff_format=u Index: php-src/ext/msession/reqclient.h diff -u php-src/ext/msession/reqclient.h:1.16 php-src/ext/msession/reqclient.h:1.17 --- php-src/ext/msession/reqclient.h:1.16 Sun Jan 1 13:09:51 2006 +++ php-src/ext/msession/reqclient.h Mon Jan 30 16:18:39 2006 @@ -1,76 +1,45 @@ /* - +----------------------------------------------------------------------+ - | msession 1.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2006 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Mark Woodward <markw@mohawksoft.com> | - | Portions copyright the PHP group. | - +----------------------------------------------------------------------+ - */ - -/* --------------------------------------------------------------------------- - These are definitions are pulled from Phoenix. - It would probably be easier to maintain one file, - but some phoenix header files conflict with other - project header files common to PHP. Besides, this - allows this header to be PHP license and Phoenix to - be LGPL with no conflicts. - - MAKE NO CHANGES TO THIS FILE IT. MUST REMAIN CONSTANT - WITH PHOENIX OR IT WILL NOT WORK. --------------------------------------------------------------------------- -*/ -/* Required to use the new version of Phoenix 1.2 */ + Mohawk Software Framework by Mohawk Software + Copyright (C) 1998-2001 Mark L. Woodward + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + + If you want support or to professionally license this library, the author + can be reached at info@mohawksoft.com +*/ +#ifndef _REQCLIENT_ +#define _REQCLIENT_ #ifndef REQCLIENT_VER -#define REQCLIENT_VER 030113 +#define REQCLIENT_VER 051222 #endif -enum REQ_TYPES -{ - REQ_ERR, - REQ_OK, - REQ_CTL, - REQ_SETVAL, - REQ_GETVAL, - REQ_CREATE, - REQ_DROP, - REQ_GETALL, - REQ_FIND, - REQ_COUNT, - REQ_FLUSH, - REQ_SLOCK, - REQ_SUNLOCK, - REQ_TIMEOUT, - REQ_INC, - REQ_DATAGET, - REQ_DATASET, - REQ_LIST, - REQ_LISTVAR, - REQ_UNIQ, - REQ_RANDSTR, - REQ_PLUGIN, - REQ_CALL, - REQ_SERIALIZE, - REQ_RESTORE, - REQ_EXEC, - REQ_LAST, - REQ_INTERNAL_BEGIN=1023, - REQ_INTERNALLAST, -}; +#ifndef _PHOENIX_ +typedef unsigned char Boolean; +#endif + +#if defined (__cplusplus) +extern "C" { +#endif + +// Standard request transport errors. enum REQ_ERRORS { REQE_NOERROR=0, + REQE_ERR, REQE_NOSESSION, REQE_DUPSESSION, REQE_NOWLOCK, @@ -85,14 +54,47 @@ REQE_BUFFER, REQE_DENIED, REQE_NOFN, - REQE_UNKNOWN + REQE_UNKNOWN, + REQE_PLUGIN1, + REQE_PLUGIN2, + REQE_PLUGIN3, + REQE_PLUGIN4 }; +#define REQ_OK 0 +#define REQ_ERR 1 +#define REQ_UNHANDLED 3 + +#define REQ_INTERNAL_BEGIN 1024 +#define REQ_POPEN 1024 +#define REQ_PCLOSE 1025 +#define REQ_PING 1026 +#define REQ_INTERNAL_END 2048 + +/** Packet version */ +#define REQV_VERSION 0x42 +#define REQV_VERMASK 0xFF + +/** Packet has array of strings */ +#define REQVF_STRINGS 0x0200 +/** Packet has binary information */ +#define REQVF_BVAL 0x0400 + + +#define REQV_ISVER(V) (((V) & REQV_VERMASK) == REQV_VERSION) +#define REQVF_TEST(V,F) (((V) & (F)) == (F)) +#define REQVSZ_VERSION "MV42" +#define REQVSZ_STRINGS "MS42" +#define REQVSZ_BVAL "MB42" + +#define REQFMT_BINARY 0 +#define REQFMT_ASCII 1 -#define REQ_POPEN 1024 -#define REQ_PCLOSE 1025 -#define REQ_PING 1026 +// An application can use this to change the default +extern unsigned int g_defReqFmt; +/** Binary request packet */ +/** If sizeof(int) > 4 this will need to be fixed. */ typedef struct _requestPacket { int version; @@ -102,70 +104,106 @@ int name; int value; int param; + int data; char datum[0]; }REQ; +/*** Ascii string version of request packet */ +typedef struct _REQSZ +{ + char version[4]; + char stat[4]; + char len[4]; + char session[4]; + char name[4]; + char value[4]; + char param[4]; + char misc[4]; + char datum[0]; +}REQSZ; typedef struct _requestBuf { - unsigned int type; /* Type of packet, dynamic/static */ - unsigned int size; /* size of memory block */ + unsigned int type; // Type of packet, dynamic/static + unsigned int size; // size of memory block #if (REQCLIENT_VER >= 030113) - unsigned int fmt; /* format, binary/ascii */ - unsigned int reserved; /* Just in case */ + unsigned int fmt; // format, binary/ascii + unsigned int reserved; // Just in case #else -#warning You are using an old Phoenix definition, this will have problems with a newer version +#warning You are using an old Phoenix definition (pre 030113), this will have problems with a newer version +#endif +#if (REQCLIENT_VER >= 051222) + int cmd; + int param; + char * session; + char * name; + char * value; + char * data; + int cbdata; + + // To be used by library layer for bookeeping + int cb; + int count; #endif - REQ req; + REQ *req; }REQB; +typedef struct ListWalkDataStruct +{ + REQB *reqb; + char *Key; + char *Data; + int cb; + int count; +}ListWalkData; + #define MAX_REQ 16384 #define REQB_STATIC 1 #define REQB_DYNAMIC 2 -#define REQ_STAT_EXIST 0 -#define REQ_STAT_TTL 1 -#define REQ_STAT_AGE 2 -#define REQ_STAT_TLA 3 -#define REQ_STAT_CTIM 4 -#define REQ_STAT_TOUCH 5 -#define REQ_STAT_NOW 6 - #define STATIC_REQB( len ) \ char buffer [ len ]; \ REQB *preq = StaticRequestBuffer(buffer, len); -#if defined (__cplusplus) -extern "C" { -#endif +#define ASCII_REQB(reqb) (REQB)->fmt = REQFMT_ASCII +#define BINARY_REQB(reqb) (REQB)->fmt = REQFMT_BINARY -#define SIZEREQB(REQB,SIZE) (((REQB)->size >= (unsigned int) SIZE) ? REQB : SizeRequestBuffer(REQB,SIZE)) -REQB *AllocateRequestBuffer(unsigned size); +REQB *AllocateRequestBuffer(REQB *reqb, unsigned size); void FreeRequestBuffer(REQB *req); REQB *SizeRequestBuffer(REQB *req, unsigned int size); REQB *StaticRequestBuffer(char *buffer, unsigned int cb); -int FormatRequest(REQB **buffer, int stat, const char *session, const char *name, const char *value, int param); -int FormatRequestMulti(REQB **buffer, int stat, char *session, int n, char **pairs, int param); -int FormatRequestStrings(REQB **ppreq, int stat, char *session, int n, char **strings); -int DoSingleRequest(char *hostname, int port, REQB **preq); +int FilterRequest(REQB *preq); +int FormatRequest(REQB *preq, int stat, char *session, char *name, char *value, int param); +int FormatRequestData(REQB *preq, int stat, char *session, char *name, char *value, void *data, int cbdata, int param); +int FormatRequestStrings(REQB *preq, int stat, char *session, char *name, char *value, int n, char **strings); +int FormatRequestf(REQB *preq, int stat, char *session, char *name, char *value, int param, char *fmt, ...); + +void *GetReqbDatumPtr(REQB *preq); + +int DoSingleRequest(char *hostname, int port, REQB *preq); void *OpenReqConn(char *hostname, int port); +Boolean ReopenReqConn(void *conn); void CloseReqConn(void *conn); -void DeleteReqConn(void *conn); -unsigned char ReopenReqConn(void *conn); -int DoRequest(void *conn, REQB **preq); +int DoRequest(void *conn, REQB *preq); char *ReqbErr(REQB *reqb); +int LWDaddNameVal(ListWalkData *plw, char *name, char *value); +int LWDaddValue(ListWalkData *plw, char *value); + #define ASSERT_STAT(PREQ) if(PREQ->stat != REQ_OK) \ {fprintf(stderr, "Error in Request %s %d %s\n", \ __FILE__,__LINE__, ReqErr(PREQ->param)); exit(-1); } #if defined (__cplusplus) - /* C API but with class definitions */ - int ReadRequestTimeout(REQB **ppreq, MSock *sock, int timeout); - int ReadRequest(REQB **preq, MSock *sock); - int WriteRequest(REQB *preq, MSock *sock); + // C API but with class definitions + int ReadRequestTimeout(REQB *preq, MSock *sock, int timeout); + int ReadRequest(REQB *reqb, MSock *sock); + int WriteRequest(REQB *reqb, MSock *sock); + Boolean OpenReqSock(REQB *reqb, MSock *sock, char *hostname); + void CloseReqSock(REQB *reqb, MSock *sock); } -#endif +#endif +#endif http://cvs.php.net/viewcvs.cgi/php-src/ext/msession/msessionapi.h?view=markup&rev=1.1 Index: php-src/ext/msession/msessionapi.h +++ php-src/ext/msession/msessionapi.h /* Mohawk Software Framework by Mohawk Software Copyright (C) 1998-2001 Mark L. Woodward This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA If you want support or to professionally license this library, the author can be reached at info@mohawksoft.com When used as part of the PHP project this file, as present in the PHP CVS and original source distribution is to be considered part of the PHP package and subject to version 2.02 of the PHP license. http://www.php.net/license/2_02.txt. */ #ifndef _MCACHE_API_ #define _MCACHE_API_ #include "reqclient.h" #ifdef timeout #undef timeout #endif #ifdef __cplusplus class MCache_conn : public MSock { protected: REQB m_reqb; int m_errno; public: MCache_conn(char *host, int port); ~MCache_conn(); int Request(int stat, char *session, char *name, char *value, int param=0); int RequestData(int stat, char *session, char *name, char *value, char *data, int cbdata, int param=0); int RequestStrings(int stat, char *session, char *name, char *value, int n, char **strings); char * ResultToStr(); char ** ResultToArray(); char ** ResultToPairs(); Boolean create(char *session, char *classname, char *strdata); Boolean create_pairs(char *session, char *classname, char *strdata, int count, char **pairs); Boolean destroy(char *session); int set(char *session, char *name, char *value); int set_array(char *session, int count, char **pairs); int get_int(char *session, char *name, int def); char *get_text(char *session, char *name, char *def); char * uniq(int cbstr, char *classname, char *strdata); char * randstr(int cbstr); char **get_array(char *session); char **get_object(char *session); char **listvar(char *name); char **find(char *name, char *value); char **list(); int count(); int lock(char *session); int unlock(char *session, int key); Boolean timeout(char *session, int timeout); int inc_int(char *session, char *name); char *inc_text(char *session, char *name); int setdata(char *session, char *data); char *getdata(char *session); int setdata(char *session, char *data, int len); char *getdata(char *session, int *len); int call_int(char *fn,int n, char **strings); char *call_text(char *fn,int n, char **strings); int ctl(char *session,int type); int plugin_int(char *session, char *nparam, char *sparam, int param); char *plugin_text(char *session, char *nparam, char *sparam, int param); int Sessionflush(int seconds); int admin(int fn, char *opt); int serialize(char *szparam); char *exec(char *szcommand); char *add(char *session, char *name, char *value); char *muldiv(char *session, char *name, char *mul, char *div); int ping(void); static void free(void *result); static int ctl_type(char *str); inline Boolean StatOK(void) {return (m_reqb.req->stat == REQ_OK) ? TRUE : FALSE; } inline int param() {return m_reqb.param; } inline int merrno() {return m_errno;} inline char *errtext() {return ReqbErr(&m_reqb); } inline char *reqtext(void) {return (m_reqb.req->len > 1) ? m_reqb.req->datum : NULL; } }; typedef MCache_conn *MSCONN; extern "C" { #else typedef void * MSCONN; #endif #define MAX_REQ_STRINGS 1024 #define MREQ_TOPHANDLER -42 enum REQ_TYPES { MREQ_CTL=2, MREQ_SETVAL, MREQ_GETVAL, MREQ_CREATE, MREQ_DROP, MREQ_GETALL, MREQ_FIND, MREQ_COUNT, MREQ_FLUSH, MREQ_SLOCK, MREQ_SUNLOCK, MREQ_TIMEOUT, MREQ_ADD, MREQ_DATAGET, MREQ_DATASET, MREQ_LIST, MREQ_LISTVAR, MREQ_UNIQ, MREQ_RANDSTR, MREQ_PLUGIN, MREQ_CALL, MREQ_SERIALIZE, MREQ_RESTORE, MREQ_EXEC, MREQ_FIND_CACHEID, MREQ_SET_CACHEID, MREQ_RENAME, MREQ_GETOBJECT, MREQ_MULDIV, MREQ_LAST, // These are handled by the server, not the library. MREQ_ADMIN = REQ_INTERNAL_END, }; #define MREQ_OK REQ_OK #define MREQ_ERR REQ_ERR #ifdef PLUGMSG_START enum MREQ_PLUGIN_MSG { MREQ_PLUGIN_PULSE=PLUGMSG_START, MREQ_PLUGIN_SESSION_FLUSH, MREQ_PLUGIN_SESSION_CREATE, MREQ_PLUGIN_SESSION_INIT, MREQ_PLUGIN_SESSION_DESTROY, MREQ_PLUGIN_ESCAPE, MREQ_PLUGIN_RELAY, MREQ_PLUGIN_SERIALIZE, MREQ_PLUGIN_RESTORE, MREQ_PLUGIN_SESSION_SETDATA, MREQ_PLUGIN_SESSION_SETVALUE, MREQ_PLUGIN_SESSION_SETBLOB, MREQ_PLUGIN_SESSION_RENAME, MREQ_PLUGIN_LAST }; #define MREQ_SESSION_INIT_FAILED -1 #define MREQ_SESSION_INIT_HANDLED 1 #define MREQ_SESSION_INIT_NOTHANDLED 0 #endif enum MCACHE_ADMIN { MADMIN_SHUTDOWN, MADMIN_LOADDLL, MADMIN_SETSERIAL, MADMIN_SETVERBOSE, MADMIN_SETMAXTHREADS, MADMIN_SERIALIZE, MADMIN_AUTOSAVE, MADMIN_AUTODROP, MADMIN_STATUS }; #define MREQ_CTL_EXIST 0 #define MREQ_CTL_TTL 1 #define MREQ_CTL_AGE 2 #define MREQ_CTL_TLA 3 #define MREQ_CTL_CTIM 4 #define MREQ_CTL_TOUCH 5 #define MREQ_CTL_NOW 6 #define MPARM_TIME_MASK 0x0000FFFF #define MPARM_TIME_FIXED 0x0000FFFF #define MPARAM_CBSTR_MASK 0x00FF0000 #define MPARM_TIME(parm) ((parm)&MPARM_TIME_MASK) #define MPARM_CBSTR(parm) (((parm) >> 16) & 0xFF) #define MPARM_CREATE(TIME, CBSTR) \ ((TIME) | (CBSTR << 16)) /* Added for MCache objects */ #define MSTAT_TYPE_SESSION 0x00000000 #define MSTAT_TYPE_OBJECT 0x00100000 #define MSTAT_TYPE_FAST 0x00200000 #define MSTAT_TYPE_FIXED 0x00400000 #define MSTAT_TYPE_MASK 0x00F00000 #define MSTAT_CMD_MASK 0x000FFFFF #define MSTAT_TYPE_TEST(stat, TY) (((stat) & MSTAT_TYPE_MASK)==(TY)) #define MSTAT_CMD(stat) ((stat) & (MSTAT_CMD_MASK)) // Private session flags #define MCACHE_FIXED MSTAT_TYPE_FIXED // Fixed object, no expiration #define MCACHE_NORMAL MSTAT_TYPE_SESSION #define MCACHE_OBJECT MSTAT_TYPE_OBJECT #define MCACHE_FAST MSTAT_TYPE_FAST #ifdef WIN32 #define EXTAPI extern "C" __declspec(dllexport) #else #define EXTAPI extern "C" #endif #ifndef MCACHEAPI_INTERNAL MSCONN mcache_connect(char *host, int port); /** Disconnects a session from an mcache daemon. Returns nothing. */ void mcache_disconnect(MSCONN conn); /** Creates a new session. Returns TRUE is successful, or FALSE if an error occured. An error occurs if the session already exists. mcache_errno() will return REQE_DUPSESSION if the session exists */ Boolean mcache_create(MSCONN conn, char *session, char *classname, char *strdata); /** Behaves exactly like mcache_create, except that initial data is passed to populate the session. "pairs" is an array of string data. pairs[0] contains a name, pairs[1] contains its value, pairs[2] contains the second name, pairs[3] containes the second value, and so on. */ Boolean mcache_create_pairs(MSCONN conn, char *session, char *classname, char *strdata, int count, char **pairs); /** Destroys a session. Returns TRUE on success, FALSE on error. */ Boolean mcache_destroy(MSCONN conn, char *session); /** Sets a value in a session. Returns TRUE on success, FALSE on error */ int mcache_set(MSCONN conn, char *session, char *name, char *value); int mcache_set_array(MSCONN conn, char *session, int count, char **pairs); /** Gets a value in a session as an integer. Returns the value from the session, or def from the argument list, if no value was found. */ int mcache_get_int(MSCONN conn, char *session, char *name, int def); /** Gets a value in a session as a string. Returns the value from the session, or def from the argument list, if no value was found. */ char * mcache_get_text(MSCONN conn, char *session, char *name, char *def); /** Create a new session with a guaranteed unique name. Returns a string of the name */ char * mcache_uniq(MSCONN conn, int cbstr, char *classname, char *strdata); /** Create a pseudo-random alphanumeric string */ char * mcache_randstr(MSCONN conn, int cbstr); /** Gets all the name/value pairs from a session into a character array. The array is formatted as an array of string data. array[0] contains a name, array[1] contains its value, array[2] contains the second name, array[3] containes the second value, and so on. Returns NULL on error. */ char ** mcache_get_array(MSCONN conn, char *session); char **mcache_get_object(MSCONN conn, char *session); /** Finds sessions which have the particular name/value property. Returns NULL if none were found. */ char ** mcache_find(MSCONN conn, char *name, char *value); int mcache_inc_int(MSCONN conn, char *session, char *name); char *mcache_inc_text(MSCONN conn, char *session, char *name); char *mcache_add(MSCONN conn, char *session, char *name, char *value); char *mcache_muldiv(MSCONN conn,char *sn,char *nam,char *mul,char *div); /** Lists all active sessions. */ char ** mcache_list(MSCONN conn); /** Returns an associative array of session:var for all sessions which have a setting of name. */ char **mcache_listvar(MSCONN conn, char *name); /** Returns the number of active sessions */ int mcache_count(MSCONN conn); /** Locks a session. Returns an integer key for the lock. Locks remain exclusive for 30 seconds, after which someone else can lock the session. Locks are coperative, no enforcement is attempted. */ int mcache_lock(MSCONN conn, char *session); /** Unlocks a session */ int mcache_unlock(MSCONN conn, char *session, int key); /** Sets the timeout of a session. * timeout = 0 means never timeout * timeout > 0 sets session expire time in seconds * timeout < 0 resets to default timeout */ Boolean mcache_timeout(MSCONN conn, char *session, int timeout); /** Sets the session data string, creates a session if one does not exist */ int mcache_setdata(MSCONN conn, char *session, char *data); /** Gets the session data string from a session */ char *mcache_getdata(MSCONN conn, char *session); /** Returns the last error. */ int mcache_errno(MSCONN conn); /** Call a function plugin, return an int */ int mcache_call_int(MSCONN conn, char *fn,int n, char **strings); /** Call a function plugin, return a char */ char *mcache_call_text(MSCONN conn, char *fn,int n, char **strings); /** Call to get info about a session */ int mcache_ctl(MSCONN conn, char *session, int type); /** Convert a string ctl to a type for mcache_ctl */ int mcache_ctl_type(char *str); /** Call the personality plugin escape function, return int */ int mcache_plugin_int(MSCONN conn, char *session, char *nparam, char *sparam, int param); /** Call the personality plugin escape function, return char * */ char *mcache_plugin_text(MSCONN conn, char *session, char *nparam, char *sparam, int param); int mcache_flush(MSCONN conn, int seconds); int mcache_loaddll(MSCONN conn, char *dll); int mcache_shutdown(MSCONN conn, char *timeout); int mcache_serialize(MSCONN conn, char *szparam); char * mcache_exec(MSCONN conn, char *szparam); int mcache_setserial(MSCONN conn, char *serialize); int mcache_setmaxthreads(MSCONN conn, char *maxt); int mcache_setverbose(MSCONN conn, char *verbose); int mcache_setautosave(MSCONN conn, char *autsave); int mcache_setautodrop(MSCONN conn, char *autdrop); int mcache_ping(MSCONN conn); int mcache_status(MSCONN conn); Boolean mcache_statok(MSCONN conn); char *mcache_text(MSCONN conn); /** Returns a static character string describing an error. */ char * mcache_errtext(MSCONN conn); #endif #ifdef __cplusplus } #endif #endif
« previous php.cvs (#36675) next »