cvs: pear /PECL/session_pgsql README session_pgsql.c session_pgsql.h

From: Date: Mon, 14 Jan 2002 14:50:17 +0000
Subject: cvs: pear /PECL/session_pgsql README session_pgsql.c session_pgsql.h
Groups: php.pear.cvs 
Request: Send a blank email to pear-cvs+get-1931@lists.php.net to get a copy of this message
yohgaki Mon Jan 14 09:50:17 2002 EDT Modified files: /pear/PECL/session_pgsql README session_pgsql.c session_pgsql.h Log: Added optional automatic table creation feature. Added session.pgsql_db ini entry for database connection string. (session.save_path is not used anymore) Added session.pgsql_serializable ini entry for people want to serializable transaction isolation. Addes session.pgsql_gc_interval ini entry for better performance. (gc_probability is not used anymore.) Changed to use async query for better performance. (Should improve responsiveness. Query result is checked at next request.) Changed session expire logic so that user can specify custom expiration time for each session. Code clean up & added stub for helper functions. # Code status is back to alpha :) # failover, loadbalance does not work yet. Lots of things are broken.

Index: pear/PECL/session_pgsql/README diff -u pear/PECL/session_pgsql/README:1.4 pear/PECL/session_pgsql/README:1.5 --- pear/PECL/session_pgsql/README:1.4 Fri Jan 11 20:06:12 2002 +++ pear/PECL/session_pgsql/README Mon Jan 14 09:50:17 2002 @@ -11,19 +11,20 @@ Session Table Definition CREATE TABLE php_session ( - sess_id char(32), - sess_name char(32), - sess_created integer, - sess_modified integer, - sess_data text, - sess_reserved1 integer, - sess_reserved2 integer, - sess_reserved3 integer, - sess_reserved4 integer, - sess_reserved5 integer, - sess_reserved6 integer, - sess_reserved7 integer, - sess_reserved8 integer + sess_id char(32), + sess_name char(32), + sess_data text, + sess_created integer, + sess_modified integer, + sess_expire integer, + sess_addr_created cidr, + sess_addr_modified cidr, + sess_error integer, + sess_warning integer, + sess_notice integer, + sess_err_message text, + sess_reserved7 integer, + sess_reserved8 integer ); CREATE INDEX php_session_idx ON php_session USING BTREE (sess_id); Index: pear/PECL/session_pgsql/session_pgsql.c diff -u pear/PECL/session_pgsql/session_pgsql.c:1.10 pear/PECL/session_pgsql/session_pgsql.c:1.11 --- pear/PECL/session_pgsql/session_pgsql.c:1.10 Fri Jan 11 20:19:15 2002 +++ pear/PECL/session_pgsql/session_pgsql.c Mon Jan 14 09:50:17 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: session_pgsql.c,v 1.10 2002/01/12 01:19:15 yohgaki Exp $ */ +/* $Id: session_pgsql.c,v 1.11 2002/01/14 14:50:17 yohgaki Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -50,6 +50,45 @@ #define ELOG( x ) #endif +function_entry ps_pgsql_functions[] = { + PHP_FE(session_pgsql_status, NULL) + PHP_FE(session_pgsql_add_error, NULL) + PHP_FE(session_pgsql_get_error, NULL) + { NULL, NULL, NULL } +}; + +static PHP_INI_MH(OnUpdate_ps_pgsql_db) +{ + PS_PGSQL(db) = new_value; + PS_PGSQL(connstr)[0] = new_value; + PS_PGSQL(servers) = 1; + + return SUCCESS; +} + +static PHP_INI_MH(OnUpdate_ps_pgsql_failorver) +{ + return SUCCESS; +} + +static PHP_INI_MH(OnUpdate_ps_pgsql_loadbalance) +{ + return SUCCESS; +} + + +/* {{{ PHP_INI + */ +PHP_INI_BEGIN() +STD_PHP_INI_ENTRY("session.pgsql_db", "host=localhost", PHP_INI_SYSTEM, OnUpdate_ps_pgsql_db, db, php_ps_pgsql_globals, ps_pgsql_globals) +STD_PHP_INI_ENTRY("session.pgsql_failover", "0", PHP_INI_SYSTEM, OnUpdateBool, failover, php_ps_pgsql_globals, ps_pgsql_globals) +STD_PHP_INI_ENTRY("session.pgsql_loadbalance", "0", PHP_INI_SYSTEM, OnUpdateBool, loadbalance, php_ps_pgsql_globals, ps_pgsql_globals) +STD_PHP_INI_ENTRY("session.pgsql_serializable","0", PHP_INI_ALL, OnUpdateBool, serializable, php_ps_pgsql_globals, ps_pgsql_globals) +STD_PHP_INI_ENTRY("session.pgsql_create_table","0", PHP_INI_ALL, OnUpdateBool, create_table, php_ps_pgsql_globals, ps_pgsql_globals) +STD_PHP_INI_ENTRY("session.pgsql_gc_interval", "3600", PHP_INI_ALL, OnUpdateInt, gc_interval, php_ps_pgsql_globals, ps_pgsql_globals) +PHP_INI_END() +/* }}} */ + PHP_MINIT_FUNCTION(ps_pgsql); PHP_MSHUTDOWN_FUNCTION(ps_pgsql); PHP_RSHUTDOWN_FUNCTION(ps_pgsql); @@ -60,7 +99,7 @@ zend_module_entry ps_pgsql_module_entry = { STANDARD_MODULE_HEADER, "session pgsql", - NULL, + ps_pgsql_functions, PHP_MINIT(ps_pgsql), PHP_MSHUTDOWN(ps_pgsql), NULL, PHP_RSHUTDOWN(ps_pgsql), PHP_MINFO(ps_pgsql), @@ -73,27 +112,98 @@ ZEND_GET_MODULE(ps_pgsql) #endif -/* {{{ php_pg_pgsql_connect +/* {{{ php_pg_pgsql_create_table */ -static int php_ps_pgsql_connect(const char *conn_str) +static int php_ps_pgsql_create_table(int id) { - ELOG("php_ps_pgsql_connect() is called"); - if (PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_OK) { - return SUCCESS; - } + PGresult *pg_result; + char *query = + "CREATE TABLE php_session ( " + "sess_id char(32), " + "sess_name char(32), " + "sess_data text, " + "sess_created integer, " + "sess_modified integer, " + "sess_expire integer, " + "sess_addr_created cidr, " + "sess_addr_modified cidr, " + "sess_error integer, " + "sess_warning integer, " + "sess_notice integer, " + "sess_err_message text, " + "sess_reserved1 integer, " + "sess_reserved2 integer); " + "CREATE INDEX php_session_idx ON php_session USING BTREE (sess_id);"; + int ret = SUCCESS; - if (PS_PGSQL(pgsql_link) == NULL) { - PS_PGSQL(pgsql_link) = PQconnectdb(conn_str); + pg_result = PQexec(PS_PGSQL(pgsql_link)[id], "SELECT count(relname) FROM pg_class WHERE relname = 'php_session';"); + if (!pg_result) { + ret = FAILURE; } - else if (PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - PQreset(PS_PGSQL(pgsql_link)); + else if (!PQntuples(pg_result)) { + PQclear(pg_result); + pg_result = PQexec(PS_PGSQL(pgsql_link)[id], query); + if (PQresultStatus(pg_result) != PGRES_COMMAND_OK) { + ret = FAILURE; + } + PQclear(pg_result); + } + else { + PS_PGSQL(table_exist)[id] = 1; } + return ret; +} +/* }}} */ - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - PQfinish(PS_PGSQL(pgsql_link)); - php_error(E_WARNING, "Session pgsql cannot connect to PostgreSQL server (%s)", conn_str); - return FAILURE; +/* {{{ php_pg_pgsql_get_link + */ +static PGconn *php_ps_pgsql_get_link(const char *key) +{ + int id; + + if (PS_PGSQL(servers) < 1) + id = -1; + else if (PS_PGSQL(servers) == 1 || !PS_PGSQL(loadbalance)) + id = 0; + else { + div_t tmp; + int i, sum = 0; + for(i=0; i<32; i++) sum += (int)key[i]; + if (PS_PGSQL(failover)) + tmp = div(sum, PS_PGSQL(servers) - 1); + else + tmp = div(sum, PS_PGSQL(servers)); + id = tmp.rem; + } + + if (id < 0 ) { + return NULL; + } + if (PS_PGSQL(pgsql_link)[id] == NULL) { + PS_PGSQL(pgsql_link)[id] = PQconnectdb(PS_PGSQL(connstr)[id]); } + if (PQstatus(PS_PGSQL(pgsql_link)[id]) == CONNECTION_BAD) { + PQreset(PS_PGSQL(pgsql_link)[id]); + } + if (PS_PGSQL(pgsql_link)[id] == NULL || PQstatus(PS_PGSQL(pgsql_link)[id]) == CONNECTION_BAD) { + if (PS_PGSQL(pgsql_link)[id]) + PQfinish(PS_PGSQL(pgsql_link)[id]); + php_error(E_WARNING, "Session pgsql cannot connect to PostgreSQL server (%s)", + PS_PGSQL(connstr)[id]); + return NULL; + } + if (!PS_PGSQL(table_exist[id]) && PS_PGSQL(create_table)) + php_ps_pgsql_create_table(id); + PQsetnonblocking(PS_PGSQL(pgsql_link)[id], 1); + return PS_PGSQL(pgsql_link)[id]; +} +/* }}} */ + + +/* {{{ php_pg_pgsql_close + */ +static int php_ps_pgsql_close(void) +{ return SUCCESS; } /* }}} */ @@ -104,28 +214,18 @@ { PGresult *pg_result; char query[QUERY_BUF_SIZE+1]; - char *query_update = "DELETE FROM php_session WHERE sess_modified < %d;"; - int ret = FAILURE; + char *query_update = "DELETE FROM php_session WHERE sess_expire < %d;"; + int id; ELOG("GC Called"); - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - php_error(E_NOTICE,"Sessin pgsql GC failed. Bad connection"); - return FAILURE; + sprintf(query, query_update, time(NULL)); + for (id = 0; id < PS_PGSQL(servers); id++) { + if (PS_PGSQL(pgsql_link)[id] == NULL || PQstatus(PS_PGSQL(pgsql_link)[id]) == CONNECTION_BAD) { + php_log_err("Sessin pgsql GC failed. Bad connection."); + } + PQsendQuery(PS_PGSQL(pgsql_link)[id], query); } - - sprintf(query, query_update, time(NULL) - PS_PGSQL(maxlifetime)); - pg_result = PQexec(PS_PGSQL(pgsql_link), "BEGIN;"); - PQclear(pg_result); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); - if (PQresultStatus(pg_result) == PGRES_TUPLES_OK) { -/* *nrdels = atoi(PQcmdTuples(pg_result)); */ - ret = SUCCESS; - } - PQclear(pg_result); - pg_result = PQexec(PS_PGSQL(pgsql_link), "END;"); - PQclear(pg_result); - - return ret; + return SUCCESS; } /* }}} */ @@ -133,6 +233,7 @@ */ PHP_MINIT_FUNCTION(ps_pgsql) { + REGISTER_INI_ENTRIES(); #ifdef ZTS php_ps_pgsql_globals *ps_pgsql_globals; @@ -141,6 +242,7 @@ #endif ELOG("MINIT Called"); + PS_PGSQL(last_gc) = time(NULL); php_session_register_module(&ps_mod_pgsql); return SUCCESS; } @@ -150,10 +252,14 @@ */ PHP_MSHUTDOWN_FUNCTION(ps_pgsql) { + int i; + /* link is closed at shutdown */ - ELOG("MSHUTDOWN Called"); - PQfinish(PS_PGSQL(pgsql_link)); - PS_PGSQL(pgsql_link) = NULL; + ELOG("MSHUTDOWN Called"); + for (i = 0; i < PS_PGSQL(servers); i++) { + PQfinish(PS_PGSQL(pgsql_link)[i]); + } + return SUCCESS; } /* }}} */ @@ -165,8 +271,7 @@ int ret = SUCCESS; ELOG("RSHUTDOWN Called"); - if (PS_PGSQL(gc)) { - PS_PGSQL(gc) = 0; + if (PS_PGSQL(last_gc) < time(NULL) - PS_PGSQL(gc_interval)) { ret = php_ps_pgsql_gc(); } return ret; @@ -180,6 +285,8 @@ php_info_print_table_start(); php_info_print_table_header(2, "pgsql session support", "enabled"); php_info_print_table_end(); + + DISPLAY_INI_ENTRIES(); } /* }}} */ @@ -213,26 +320,9 @@ */ PS_OPEN_FUNC(pgsql) { - int ret = SUCCESS; - PGresult *pg_result; - ELOG("OPEN CALLED"); - *mod_data = (void *)1; /* mod_data cannot be NULL */ - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - /* link is bad... Try again */ - if (php_ps_pgsql_connect(PS(save_path)) == FAILURE) { - php_error(E_NOTICE,"Session pgsql OPEN failed. Link is bad."); - ret = FAILURE; - } - } - pg_result = PQexec(PS_PGSQL(pgsql_link), "BEGIN;SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;"); - pg_result = PQexec(PS_PGSQL(pgsql_link), "BEGIN"); - if (PQresultStatus(pg_result) != PGRES_COMMAND_OK) { - php_error(E_NOTICE,"Session pgsql OPEN failed. Transaction cannot be started."); - ret = FAILURE; - } - PQclear(pg_result); - return ret; + *mod_data = (void *)1; /* mod_data cannot be NULL to make session save handler module work */ + return SUCCESS; } /* }}} */ @@ -240,23 +330,10 @@ */ PS_CLOSE_FUNC(pgsql) { - PGresult *pg_result; - int ret = SUCCESS; ELOG("CLOSE Called"); *mod_data = (void *)0; /* mod_data should be set to NULL to avoid additional close call */ - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - php_error(E_NOTICE,"Session pgsql CLOSE failed. Bad connection"); - return FAILURE; - } - - pg_result = PQexec(PS_PGSQL(pgsql_link), "END;"); - if (PQresultStatus(pg_result) != PGRES_COMMAND_OK) { - php_error(E_NOTICE,"Session pgsql CLOSE failed. Transaction cannot be finished."); - ret = FAILURE; - } - PQclear(pg_result); - return ret; + return SUCCESS; } /* }}} */ @@ -264,60 +341,89 @@ */ PS_READ_FUNC(pgsql) { + PGconn *pg_link; PGresult *pg_result; char query[QUERY_BUF_SIZE+1]; - char *query_tpl = "SELECT sess_modified, sess_data FROM php_session WHERE sess_id = '%s';"; - char *modified; - size_t exp; - size_t mod; + char *query_tpl = "SELECT sess_expire, sess_data FROM php_session WHERE sess_id = '%s';"; int ret = FAILURE; ExecStatusType status; ELOG("READ Called"); - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { - php_error(E_NOTICE,"Session pgsql READ failed. Bad connection"); - return FAILURE; + + pg_link = php_ps_pgsql_get_link(key); + if (pg_link == NULL || PQstatus(pg_link) == CONNECTION_BAD) { + ret = FAILURE; } - PS_PGSQL(sess_new) = 0; - PS_PGSQL(sess_del) = 0; - *vallen = 0; - if (ps_pgsql_valid_str(key)) { - snprintf(query, QUERY_BUF_SIZE, query_tpl, key); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); - status = PQresultStatus(pg_result); - if (PQresultStatus(pg_result) == PGRES_TUPLES_OK) { - if (PQntuples(pg_result) == 0) { - PS_PGSQL(sess_new) = 1; + else { + /* clean up & check last write */ + while ((pg_result = PQgetResult(pg_link))) { + status = PQresultStatus(pg_result); + switch(status) { + case PGRES_COMMAND_OK: + case PGRES_TUPLES_OK: + break; + default: + php_log_err("Session pgsql: There is an error during last session write.\n"); } - else { - exp = time(NULL) - PS(gc_maxlifetime); - modified = PQgetvalue(pg_result, 0, 0); - mod = (size_t)atoi(modified); - if ((mod < exp)) { + } + + /* start reading */ + if (PS_PGSQL(serializable)) { + pg_result = PQexec(pg_link, "BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;"); + } + else { + pg_result = PQexec(pg_link, "BEGIN;"); + } + if (PQresultStatus(pg_result) != PGRES_COMMAND_OK) { + php_error(E_NOTICE,"Session pgsql READ failed. %s", + PQresultErrorMessage(pg_result)); + ret = FAILURE; + } + PQclear(pg_result); + + PS_PGSQL(sess_new) = 0; + PS_PGSQL(sess_del) = 0; + *vallen = 0; + if (ps_pgsql_valid_str(key)) { + snprintf(query, QUERY_BUF_SIZE, query_tpl, key); + pg_result = PQexec(pg_link, query); + status = PQresultStatus(pg_result); + if (PQresultStatus(pg_result) == PGRES_TUPLES_OK) { + if (PQntuples(pg_result) == 0) { PS_PGSQL(sess_new) = 1; - PS_PGSQL(sess_del) = 1; } else { - /* PQgetvalue reuturns "" for NULL */ - *val = PQgetvalue(pg_result, 0, 1); - if (*val) { - *vallen = strlen(*val); - *val = safe_estrndup(*val, *vallen); + char *expire; + size_t exp; + + expire = PQgetvalue(pg_result, 0, 0); + exp = (size_t)atoi(expire); + if ((exp < time(NULL))) { + PS_PGSQL(sess_new) = 1; + PS_PGSQL(sess_del) = 1; + } + else { + /* PQgetvalue reuturns "" for NULL */ + *val = PQgetvalue(pg_result, 0, 1); + if (*val) { + *vallen = strlen(*val); + *val = safe_estrndup(*val, *vallen); + } } } + ret = SUCCESS; } - ret = SUCCESS; + else { + php_error(E_WARNING,"Session pgsql READ failed: %s (%s)", + PQresultErrorMessage(pg_result), query); + ret = FAILURE; + } + PQclear(pg_result); } - else { - php_error(E_WARNING,"Session pgsql READ failed: %s (%s)", - PQerrorMessage(PS_PGSQL(pgsql_link)), query); + if (*vallen == 0) { + *val = safe_estrndup("",0); } - PQclear(pg_result); - } - if (*vallen == 0) { - *val = safe_estrndup("",0); } - /* return ret; */ return SUCCESS; } @@ -327,21 +433,23 @@ */ PS_WRITE_FUNC(pgsql) { - PGresult *pg_result = NULL; + PGconn *pg_link; size_t query_len; + time_t now, exp; char *query; char *query_delete = "DELETE FROM php_session WHERE sess_id = '%s';"; char *query_insert = - "INSERT INTO php_session (sess_id, sess_created, sess_modified, sess_data) " - "VALUES ('%s', %d, %d, '%s');"; + "INSERT INTO php_session (sess_id, sess_created, sess_modified, sess_expire, sess_data) " + "VALUES ('%s', %d, %d, %d, '%s');"; char *query_update = - "UPDATE php_session SET sess_data = '%s', sess_modified = %d " + "UPDATE php_session SET sess_data = '%s', sess_modified = %d , sess_expire = %d " "WHERE sess_id = '%s';"; int ret = FAILURE; ELOG("WRITE Called"); - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { + pg_link = php_ps_pgsql_get_link(key); + if (pg_link == NULL || PQstatus(pg_link) == CONNECTION_BAD) { php_error(E_NOTICE,"Session pgsql WRITE failed. Bad connection"); return FAILURE; } @@ -349,36 +457,29 @@ query_len = strlen(query_delete)+strlen(key); query = emalloc(query_len+1); sprintf(query, query_delete, key); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); - PQclear(pg_result); + PQsendQuery(pg_link, query); efree(query); } + now = time(NULL); + exp = now + PS(gc_maxlifetime); if (PS_PGSQL(sess_new)) { /* INSERT */ - query_len = strlen(query_insert)+vallen+strlen(key)+100; + query_len = strlen(query_insert)+vallen+strlen(key)+120; query = emalloc(query_len+1); - sprintf(query, query_insert, key, time(NULL), time(NULL), val); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); + sprintf(query, query_insert, key, now, now, exp, val); + PQsendQuery(pg_link, query); } else { /* UPDATE */ - query_len = strlen(query_update)+strlen(key)+vallen+100; + query_len = strlen(query_update)+strlen(key)+vallen+120; query = emalloc(query_len+1); - sprintf(query, query_update, val, time(NULL), key); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); + sprintf(query, query_update, val, now, exp, key); + PQsendQuery(pg_link, query); } - if (pg_result && PQresultStatus(pg_result) == PGRES_COMMAND_OK) { - ret = SUCCESS; - } - else { - php_error(E_WARNING,"Session pgsql WRITE failed: %s (%s)", - PQerrorMessage(PS_PGSQL(pgsql_link)), query); - } - PQclear(pg_result); efree(query); - -/* return ret; */ + PQsendQuery(pg_link, "END;"); + return SUCCESS; } /* }}} */ @@ -387,6 +488,7 @@ */ PS_DESTROY_FUNC(pgsql) { + PGconn *pg_link; PGresult *pg_result; size_t query_len; char *query; @@ -394,7 +496,8 @@ int ret = FAILURE; ELOG("DESTROY Called"); - if (PS_PGSQL(pgsql_link) == NULL || PQstatus(PS_PGSQL(pgsql_link)) == CONNECTION_BAD) { + pg_link = php_ps_pgsql_get_link(key); + if (pg_link == NULL || PQstatus(pg_link) == CONNECTION_BAD) { php_error(E_NOTICE,"Session pgsql DESTROY failed. Bad connection"); return FAILURE; } @@ -403,7 +506,7 @@ query_len = strlen(query_update)+strlen(key); query = (char *)emalloc(query_len+1); snprintf(query, query_len, key); - pg_result = PQexec(PS_PGSQL(pgsql_link), query); + pg_result = PQexec(pg_link, query); if (PQresultStatus(pg_result) == PGRES_TUPLES_OK) { ret = SUCCESS; } @@ -419,11 +522,35 @@ */ PS_GC_FUNC(pgsql) { - PS_PGSQL(maxlifetime) = maxlifetime; - PS_PGSQL(gc) = 1; + /* this module does not use probablity for gc, but gc_interval */ *nrdels = 0; return SUCCESS; } +/* }}} */ + +/* {{{ proto int session_pgsql_status(void) + Returns current pgsql save handler status */ +PHP_FUNCTION(session_pgsql_status) +{ + +} +/* }}} */ + +/* {{{ proto bool session_pgsql_add_error(int error_level [[, string error_message], string session_id]) + Increments error counts and sets last error message */ +PHP_FUNCTION(session_pgsql_add_error) +{ + +} +/* }}} */ + +/* {{{ proto array session_pgsql_get_error([string session_id]) + Returns number of errors and last error message */ +PHP_FUNCTION(session_pgsql_get_error) +{ + +} +/* }}} */ #endif Index: pear/PECL/session_pgsql/session_pgsql.h diff -u pear/PECL/session_pgsql/session_pgsql.h:1.4 pear/PECL/session_pgsql/session_pgsql.h:1.5 --- pear/PECL/session_pgsql/session_pgsql.h:1.4 Fri Jan 11 20:06:12 2002 +++ pear/PECL/session_pgsql/session_pgsql.h Mon Jan 14 09:50:17 2002 @@ -36,13 +36,30 @@ PS_FUNCS(pgsql); +#define MAX_PGSQL_SERVERS 16 + typedef struct _php_ps_pgsql_globals { - PGconn *pgsql_link; + char *db; + int failover; + int loadbalance; + int serializable; + int create_table; + PGconn *pgsql_link[MAX_PGSQL_SERVERS]; + char *connstr[MAX_PGSQL_SERVERS]; + int table_exist[MAX_PGSQL_SERVERS]; + int servers; int sess_new; int sess_del; - int gc; + int gc_interval; + time_t last_gc; int maxlifetime; + int failovered; } php_ps_pgsql_globals; + +/* php function registration */ +PHP_FUNCTION(session_pgsql_status); +PHP_FUNCTION(session_pgsql_add_error); +PHP_FUNCTION(session_pgsql_get_error); #ifdef ZTS extern int ps_pgsql_globals_id;
« previous php.pear.cvs (#1931) next »