cvs: php4(PHP_4_3) /ext/dba dba.c php_dba.h /ext/dba/tests dba_cdb.phpt dba_db2.phpt dba_db3.phpt dba_dbm.phpt dba_flatfile.phpt dba_gdbm.phpt
dba_handler.inc dba_ndbm.phpt

From: Date: Thu, 14 Nov 2002 14:40:43 +0000
Subject: cvs: php4(PHP_4_3) /ext/dba dba.c php_dba.h /ext/dba/tests dba_cdb.phpt dba_db2.phpt dba_db3.phpt dba_dbm.phpt dba_flatfile.phpt dba_gdbm.phpt
dba_handler.inc dba_ndbm.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-16146@lists.php.net to get a copy of this message
helly Thu Nov 14 09:40:43 2002 EDT Modified files: (Branch: PHP_4_3) /php4/ext/dba dba.c php_dba.h /php4/ext/dba/tests dba_cdb.phpt dba_db2.phpt dba_db3.phpt dba_dbm.phpt dba_flatfile.phpt dba_gdbm.phpt dba_handler.inc dba_ndbm.phpt Log: MFH: Fix locking behaviour: On some systems read during write is permitted but most libraries are not capable of that. GDBM is system dependant so there we only test that we do not deadlock. Index: php4/ext/dba/dba.c diff -u php4/ext/dba/dba.c:1.61 php4/ext/dba/dba.c:1.61.2.1 --- php4/ext/dba/dba.c:1.61 Mon Nov 11 15:53:41 2002 +++ php4/ext/dba/dba.c Thu Nov 14 09:40:42 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba.c,v 1.61 2002/11/11 20:53:41 helly Exp $ */ +/* $Id: dba.c,v 1.61.2.1 2002/11/14 14:40:42 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -302,6 +302,31 @@ #define FREENOW if(args) efree(args); if(key) efree(key) +/* {{{ php_find_dbm + */ +dba_info *php_dba_find(const char* path TSRMLS_DC) +{ + list_entry *le; + dba_info *info; + int numitems, i; + + numitems = zend_hash_next_free_element(&EG(regular_list)); + for (i=1; i<numitems; i++) { + if (zend_hash_index_find(&EG(regular_list), i, (void **) &le)==FAILURE) { + continue; + } + if (Z_TYPE_P(le) == le_db || Z_TYPE_P(le) == le_pdb) { + info = (dba_info *)(le->ptr); + if (!strcmp(info->path, path)) { + return (dba_info *)(le->ptr); + } + } + } + + return NULL; +} +/* }}} */ + /* {{{ php_dba_open */ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) @@ -309,7 +334,7 @@ zval ***args = (zval ***) NULL; int ac = ZEND_NUM_ARGS(); dba_mode_t modenr; - dba_info *info; + dba_info *info, *other; dba_handler *hptr; char *key = NULL, *error = NULL; int keylen = 0; @@ -451,8 +476,24 @@ info->mode = modenr; info->argc = ac - 3; info->argv = args + 3; + info->flags = (hptr->flags & ~DBA_LOCK_ALL) | (lock_flag & DBA_LOCK_ALL); + info->lock.mode = lock_mode; + + /* if any open call is a locking call: + * check if we already habe a locking call open that should block this call + * the problem is some systems would allow read during write + */ + if (hptr->flags & DBA_LOCK_ALL) { + if ((other = php_dba_find(info->path TSRMLS_CC)) != NULL) { + if ( ( (lock_mode&LOCK_EX) && (other->lock.mode&(LOCK_EX|LOCK_SH)) ) + || ( (other->lock.mode&LOCK_EX) && (lock_mode&(LOCK_EX|LOCK_SH)) ) + ) { + error = "Unable to establish lock (database file already open)"; /* force failure exit */ + } + } + } - if (lock_mode) { + if (!error && lock_mode) { if (lock_dbf) { info->lock.name = estrdup(info->path); lock_file_mode = file_mode; Index: php4/ext/dba/php_dba.h diff -u php4/ext/dba/php_dba.h:1.19 php4/ext/dba/php_dba.h:1.19.2.1 --- php4/ext/dba/php_dba.h:1.19 Sun Nov 10 12:58:46 2002 +++ php4/ext/dba/php_dba.h Thu Nov 14 09:40:42 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dba.h,v 1.19 2002/11/10 17:58:46 helly Exp $ */ +/* $Id: php_dba.h,v 1.19.2.1 2002/11/14 14:40:42 helly Exp $ */ #ifndef PHP_DBA_H #define PHP_DBA_H @@ -35,6 +35,7 @@ php_stream *fp; int fd; char *name; + int mode; /* LOCK_EX,LOCK_SH */ } dba_lock; typedef struct dba_info { @@ -47,6 +48,7 @@ int argc; zval ***argv; /* private */ + int flags; /* whether and how dba did locking and other flags*/ struct dba_handler *hnd; dba_lock lock; } dba_info; Index: php4/ext/dba/tests/dba_cdb.phpt diff -u php4/ext/dba/tests/dba_cdb.phpt:1.4 php4/ext/dba/tests/dba_cdb.phpt:1.4.2.1 --- php4/ext/dba/tests/dba_cdb.phpt:1.4 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_cdb.phpt Thu Nov 14 09:40:43 2002 @@ -17,7 +17,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_db2.phpt diff -u php4/ext/dba/tests/dba_db2.phpt:1.2 php4/ext/dba/tests/dba_db2.phpt:1.2.2.1 --- php4/ext/dba/tests/dba_db2.phpt:1.2 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_db2.phpt Thu Nov 14 09:40:43 2002 @@ -16,7 +16,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_db3.phpt diff -u php4/ext/dba/tests/dba_db3.phpt:1.2 php4/ext/dba/tests/dba_db3.phpt:1.2.2.1 --- php4/ext/dba/tests/dba_db3.phpt:1.2 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_db3.phpt Thu Nov 14 09:40:43 2002 @@ -16,7 +16,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_dbm.phpt diff -u php4/ext/dba/tests/dba_dbm.phpt:1.2 php4/ext/dba/tests/dba_dbm.phpt:1.2.2.1 --- php4/ext/dba/tests/dba_dbm.phpt:1.2 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_dbm.phpt Thu Nov 14 09:40:43 2002 @@ -16,7 +16,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_flatfile.phpt diff -u php4/ext/dba/tests/dba_flatfile.phpt:1.2 php4/ext/dba/tests/dba_flatfile.phpt:1.2.2.1 --- php4/ext/dba/tests/dba_flatfile.phpt:1.2 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_flatfile.phpt Thu Nov 14 09:40:43 2002 @@ -16,7 +16,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_gdbm.phpt diff -u php4/ext/dba/tests/dba_gdbm.phpt:1.3 php4/ext/dba/tests/dba_gdbm.phpt:1.3.2.1 --- php4/ext/dba/tests/dba_gdbm.phpt:1.3 Sun Nov 10 17:56:29 2002 +++ php4/ext/dba/tests/dba_gdbm.phpt Thu Nov 14 09:40:43 2002 @@ -11,13 +11,15 @@ $handler = 'gdbm'; $lock_flag = ''; // lock in library require_once('dba_handler.inc'); + + // Read during write is system dependant. Important is that there is no deadlock ?> ---EXPECT-- +--EXPECTF-- database handler: gdbm 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write:%sallowed Content 2 replaced 2nd time The 6th value array(3) { Index: php4/ext/dba/tests/dba_handler.inc diff -u php4/ext/dba/tests/dba_handler.inc:1.7 php4/ext/dba/tests/dba_handler.inc:1.7.2.1 --- php4/ext/dba/tests/dba_handler.inc:1.7 Mon Nov 11 07:00:58 2002 +++ php4/ext/dba/tests/dba_handler.inc Thu Nov 14 09:40:43 2002 @@ -28,9 +28,9 @@ } $db_writer = dba_open($db_filename, 'w'.$lock_flag, $handler); if (($dba_reader = @dba_open($db_filename, 'r'.$lock_flag.($lock_flag ? 't' : ''), $handler))===false) { - echo "Cannot read during write operation\n"; + echo "Read during write: not allowed\n"; } else { - echo "Read during write permitted\n"; + echo "Read during write: allowed\n"; } if ($db_writer!==FALSE) { dba_insert("key number 6", "The 6th value", $db_writer); Index: php4/ext/dba/tests/dba_ndbm.phpt diff -u php4/ext/dba/tests/dba_ndbm.phpt:1.2 php4/ext/dba/tests/dba_ndbm.phpt:1.2.2.1 --- php4/ext/dba/tests/dba_ndbm.phpt:1.2 Wed Nov 6 06:18:00 2002 +++ php4/ext/dba/tests/dba_ndbm.phpt Thu Nov 14 09:40:43 2002 @@ -16,7 +16,7 @@ 3NYNYY Content String 2 Content 2 replaced -Read during write permitted +Read during write: not allowed Content 2 replaced 2nd time The 6th value array(3) {

« previous php.cvs (#16146) next »