summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2002-11-06 04:16:18 +0000
committerMarcus Boerger <helly@php.net>2002-11-06 04:16:18 +0000
commit4be50925ad2077cb8ea77495204a92aabb7ff93f (patch)
treeae78c5aa7bfa65c35a37e0f04845b8da8f2ecbbb
parent5d9563df567405bd60a314591274f2cbb466c116 (diff)
downloadphp-git-4be50925ad2077cb8ea77495204a92aabb7ff93f.tar.gz
move newly introduced flatfile support from dbm to new flatfile handler
# do not make the same mistake as with ext/db where it was not clear # which format was used.
-rw-r--r--ext/dba/config.m422
-rw-r--r--ext/dba/dba.c3
-rw-r--r--ext/dba/dba_dbm.c141
-rw-r--r--ext/dba/dba_flatile.c288
-rw-r--r--ext/dba/libflatfile/flatfile.c (renamed from ext/dba/libdbm/dbm.c)0
-rw-r--r--ext/dba/libflatfile/flatfile.h (renamed from ext/dba/libdbm/dbm.h)2
-rw-r--r--ext/dba/php_flatfile.h12
-rw-r--r--ext/dba/tests/dba_flatfile.phpt18
8 files changed, 369 insertions, 117 deletions
diff --git a/ext/dba/config.m4 b/ext/dba/config.m4
index 9ecd889043..8be6569820 100644
--- a/ext/dba/config.m4
+++ b/ext/dba/config.m4
@@ -190,13 +190,7 @@ AC_DBA_STD_RESULT
AC_ARG_WITH(dbm,
[ --with-dbm[=DIR] Include DBM support],[
- if test "$withval" = "yes"; then
- PHP_ADD_BUILD_DIR($ext_builddir/libdbm)
- AC_DEFINE(DBA_DBM_BUILTIN, 1, [ ])
- AC_DEFINE(DBA_DBM, 1, [ ])
- dbm_sources="libdbm/dbm.c"
- THIS_RESULT="builtin"
- elif test "$withval" != "no"; then
+ if test "$withval" != "no"; then
for i in /usr/local /usr $withval; do
if test -f "$i/include/dbm.h" ; then
THIS_PREFIX=$i
@@ -247,11 +241,23 @@ AC_ARG_WITH(cdb,
AC_MSG_CHECKING(for CDB support)
AC_DBA_STD_RESULT
+AC_ARG_WITH(flatfile,
+[ --with-flatfile[=DIR] Include FlatFile support],[
+ if test "$withval" = "yes"; then
+ PHP_ADD_BUILD_DIR($ext_builddir/libflatfile)
+ AC_DEFINE(DBA_FLATFILE, 1, [ ])
+ flat_sources="php_flatfile.c libflatfile/flatfile.c"
+ THIS_RESULT="builtin"
+ fi
+])
+AC_MSG_CHECKING(for FlatFile support)
+AC_DBA_STD_RESULT
+
AC_MSG_CHECKING(whether to enable DBA interface)
if test "$HAVE_DBA" = "1"; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DBA, 1, [ ])
- PHP_NEW_EXTENSION(dba, dba.c dba_cdb.c dba_db2.c dba_dbm.c dba_gdbm.c dba_ndbm.c dba_db3.c $cdb_sources $dbm_sources, $ext_shared)
+ PHP_NEW_EXTENSION(dba, dba.c dba_cdb.c dba_db2.c dba_dbm.c dba_gdbm.c dba_ndbm.c dba_db3.c $cdb_sources $flat_sources, $ext_shared)
PHP_SUBST(DBA_SHARED_LIBADD)
else
AC_MSG_RESULT(no)
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index 4705c26e3e..337cfa40e2 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -185,6 +185,9 @@ static dba_handler handler[] = {
#if DBA_DB3
DBA_HND(db3)
#endif
+#if DBA_FLATFILE
+ DBA_HND(flatfile)
+#endif
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};
diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c
index 343affa0ac..5763fad41e 100644
--- a/ext/dba/dba_dbm.c
+++ b/ext/dba/dba_dbm.c
@@ -12,8 +12,7 @@
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Sascha Schumann <sascha@schumann.cx> |
- | Marcus Boerger <helly@php.net> |
+ | Author: Sascha Schumann <sascha@schumann.cx> |
+----------------------------------------------------------------------+
*/
@@ -28,23 +27,13 @@
#if DBA_DBM
#include "php_dbm.h"
-#ifdef DBA_DBM_BUILTIN
-#include "libdbm/dbm.h"
-#else
#include <dbm.h>
-#endif
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-#ifndef DBA_DBM_BUILTIN
-typedef struct {
- datum nextkey;
-} dba_dbm_data;
-#endif
-
#define DBM_DATA dba_dbm_data *dba = info->dbf
#define DBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
@@ -56,43 +45,12 @@ typedef struct {
close(fd);
+typedef struct {
+ datum nextkey;
+} dba_dbm_data;
+
DBA_OPEN_FUNC(dbm)
{
-#ifdef DBA_DBM_BUILTIN
- char *fmode;
- php_stream *fp;
-
- info->dbf = ecalloc(sizeof(dba_dbm_data), 1);
- if (!info->dbf) {
- *error = "Out of memory";
- return FAILURE;
- }
-
- switch(info->mode) {
- case DBA_READER:
- fmode = "r";
- break;
- case DBA_WRITER:
- fmode = "r+b";
- break;
- case DBA_CREAT:
- fmode = "a+b";
- break;
- case DBA_TRUNC:
- fmode = "w+b";
- break;
- default:
- return FAILURE; /* not possible */
- }
- fp = php_stream_open_wrapper(info->path, fmode, STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
- if (!fp) {
- *error = "Unable to open file";
- return FAILURE;
- }
-
- ((dba_dbm_data*)info->dbf)->fp = fp;
- return SUCCESS;
-#else
int fd;
int filemode = 0644;
@@ -126,50 +84,24 @@ DBA_OPEN_FUNC(dbm)
return FAILURE;
}
return SUCCESS;
-#endif
}
DBA_CLOSE_FUNC(dbm)
{
- DBM_DATA;
-
-#ifdef DBA_DBM_BUILTIN
- php_stream_close(dba->fp);
- if (dba->nextkey.dptr)
- efree(dba->nextkey.dptr);
-#else
+ efree(info->dbf);
dbmclose();
-#endif
- efree(dba);
}
-#ifdef DBA_DBM_BUILTIN
-#define DBM_FETCH(gkey) dbm_file_fetch((dba_dbm_data*)info->dbf, gkey TSRMLS_CC)
-#define DBM_STORE(gkey, gval) dbm_file_store((dba_dbm_data*)info->dbf, gkey, gval, DBM_REPLACE TSRMLS_CC)
-#define DBM_DELETE(gkey) dbm_file_delete((dba_dbm_data*)info->dbf, gkey TSRMLS_CC)
-#define DBM_FIRSTKEY() dbm_file_firstkey((dba_dbm_data*)info->dbf TSRMLS_CC)
-#define DBM_NEXTKEY(gkey) dbm_file_nextkey((dba_dbm_data*)info->dbf TSRMLS_CC)
-#else
-#define DBM_FETCH(gkey) fetch(gkey)
-#define DBM_STORE(gkey, gval) store(gkey, gval)
-#define DBM_DELETE(gkey) delete(gkey)
-#define DBM_FIRSTKEY() firstkey()
-#define DBM_NEXTKEY(gkey) nextkey(gkey)
-#endif
-
DBA_FETCH_FUNC(dbm)
{
datum gval;
char *new = NULL;
DBM_GKEY;
- gval = DBM_FETCH(gkey);
+ gval = fetch(gkey);
if(gval.dptr) {
if(newlen) *newlen = gval.dsize;
new = estrndup(gval.dptr, gval.dsize);
-#ifdef DBA_DBM_BUILTIN
- efree(gval.dptr);
-#endif
}
return new;
}
@@ -182,7 +114,7 @@ DBA_UPDATE_FUNC(dbm)
gval.dptr = (char *) val;
gval.dsize = vallen;
- return (DBM_STORE(gkey, gval) == -1 ? FAILURE : SUCCESS);
+ return (store(gkey, gval) == -1 ? FAILURE : SUCCESS);
}
DBA_EXISTS_FUNC(dbm)
@@ -190,11 +122,8 @@ DBA_EXISTS_FUNC(dbm)
datum gval;
DBM_GKEY;
- gval = DBM_FETCH(gkey);
+ gval = fetch(gkey);
if(gval.dptr) {
-#ifdef DBA_DBM_BUILTIN
- efree(gval.dptr);
-#endif
return SUCCESS;
}
return FAILURE;
@@ -203,46 +132,41 @@ DBA_EXISTS_FUNC(dbm)
DBA_DELETE_FUNC(dbm)
{
DBM_GKEY;
- return(DBM_DELETE(gkey) == -1 ? FAILURE : SUCCESS);
+ return(delete(gkey) == -1 ? FAILURE : SUCCESS);
}
DBA_FIRSTKEY_FUNC(dbm)
{
DBM_DATA;
-
-#ifdef DBA_DBM_BUILTIN
- if (dba->nextkey.dptr)
- efree(dba->nextkey.dptr);
-#endif
- dba->nextkey = DBM_FIRSTKEY();
- if(dba->nextkey.dptr) {
- if(newlen)
- *newlen = dba->nextkey.dsize;
- return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
- }
- return NULL;
+ datum gkey;
+ char *key = NULL;
+
+ gkey = firstkey();
+ if(gkey.dptr) {
+ if(newlen) *newlen = gkey.dsize;
+ key = estrndup(gkey.dptr, gkey.dsize);
+ dba->nextkey = gkey;
+ } else
+ dba->nextkey.dptr = NULL;
+ return key;
}
DBA_NEXTKEY_FUNC(dbm)
{
DBM_DATA;
- datum lkey;
+ datum gkey;
+ char *nkey = NULL;
- if(!dba->nextkey.dptr)
- return NULL;
+ if(!dba->nextkey.dptr) return NULL;
- lkey = dba->nextkey;
- dba->nextkey = DBM_NEXTKEY(lkey);
-#ifdef DBA_DBM_BUILTIN
- if (lkey.dptr)
- efree(lkey.dptr);
-#endif
- if(dba->nextkey.dptr) {
- if(newlen)
- *newlen = dba->nextkey.dsize;
- return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
- }
- return NULL;
+ gkey = nextkey(dba->nextkey);
+ if(gkey.dptr) {
+ if(newlen) *newlen = gkey.dsize;
+ nkey = estrndup(gkey.dptr, gkey.dsize);
+ dba->nextkey = gkey;
+ } else
+ dba->nextkey.dptr = NULL;
+ return nkey;
}
DBA_OPTIMIZE_FUNC(dbm)
@@ -253,7 +177,6 @@ DBA_OPTIMIZE_FUNC(dbm)
DBA_SYNC_FUNC(dbm)
{
- /* dummy */
return SUCCESS;
}
diff --git a/ext/dba/dba_flatile.c b/ext/dba/dba_flatile.c
new file mode 100644
index 0000000000..aac535be5a
--- /dev/null
+++ b/ext/dba/dba_flatile.c
@@ -0,0 +1,288 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 4 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2002 The PHP Group |
+ +----------------------------------------------------------------------+
+ | 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 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. |
+ +----------------------------------------------------------------------+
+ | Author: Marcus Boerger <helly@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+
+#if DBA_FLATFILE
+#include "php_flatfile.h"
+
+#include "libflatfile/flatfile.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef PHP_31
+#include "os/nt/flock.h"
+#else
+#ifdef PHP_WIN32
+#include "win32/flock.h"
+#else
+#include <sys/file.h>
+#endif
+#endif
+
+typedef struct {
+ datum nextkey;
+} dba_dbm_data;
+
+#define DBM_DATA dba_dbm_data *dba = info->dbf
+#define DBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
+
+#define TRUNC_IT(extension, mode) \
+ snprintf(buf, MAXPATHLEN, "%s" extension, info->path); \
+ buf[MAXPATHLEN-1] = '\0'; \
+ if((fd = VCWD_OPEN_MODE(buf, O_CREAT | mode | O_WRONLY, filemode)) == -1) \
+ return FAILURE; \
+ close(fd);
+
+
+DBA_OPEN_FUNC(dbm)
+{
+ char *fmode;
+ php_stream *fp;
+ int lock;
+ char *lockfn = NULL;
+ int lockfd = 0;
+#if NFS_HACK
+ int last_try = 0;
+ struct stat sb;
+ int retries = 0;
+#endif
+
+ info->dbf = ecalloc(sizeof(dba_dbm_data), 1);
+ if (!info->dbf) {
+ *error = "Out of memory";
+ return FAILURE;
+ }
+
+ switch(info->mode) {
+ case DBA_READER:
+ fmode = "r";
+ lock = 0;
+ break;
+ case DBA_WRITER:
+ fmode = "r+b";
+ lock = 1;
+ break;
+ case DBA_CREAT:
+ fmode = "a+b";
+ lock = 1;
+ break;
+ case DBA_TRUNC:
+ fmode = "w+b";
+ lock = 1;
+ break;
+ default:
+ efree(info->dbf);
+ return FAILURE; /* not possible */
+ }
+
+ if (lock) {
+ spprintf(&lockfn, 0, "%s.lck", info->path);
+
+#if NFS_HACK
+ while((last_try = VCWD_STAT(lockfn, &sb))==0) {
+ retries++;
+ php_sleep(1);
+ if (retries>30)
+ break;
+ }
+ if (last_try!=0) {
+ lockfd = open(lockfn, O_RDWR|O_CREAT, 0644);
+ close(lockfd);
+ } else {
+ *error = "File appears to be locked";
+ efree(lockfn);
+ efree(info->dbf);
+ return FAILURE;
+ }
+#else /* NFS_HACK */
+ lockfd = VCWD_OPEN_MODE(lockfn, O_RDWR|O_CREAT, 0644);
+
+ if (!lockfd || flock(lockfd, LOCK_EX)) {
+ if (lockfd)
+ close(lockfd);
+ efree(lockfn);
+ efree(info->dbf);
+ *error = "Unable to establish lock";
+ return FAILURE;
+ }
+#endif /* else NFS_HACK */
+ }
+
+ fp = php_stream_open_wrapper(info->path, fmode, STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
+ if (!fp) {
+ *error = "Unable to open file";
+#if NFS_HACK
+ VCWD_UNLINK(lockfn);
+#else
+ if (lockfn) {
+ lockfd = VCWD_OPEN_MODE(lockfn, O_RDWR, 0644);
+ flock(lockfd, LOCK_UN);
+ close(lockfd);
+ }
+#endif
+ efree(lockfn);
+ efree(info->dbf);
+ return FAILURE;
+ }
+
+ ((dba_dbm_data*)info->dbf)->fp = fp;
+ ((dba_dbm_data*)info->dbf)->lockfn = lockfn;
+ ((dba_dbm_data*)info->dbf)->lockfd = lockfd;
+
+ return SUCCESS;
+}
+
+DBA_CLOSE_FUNC(dbm)
+{
+ DBM_DATA;
+
+#if NFS_HACK
+ VCWD_UNLINK(dba->lockfn);
+#else
+ if (dba->lockfn) {
+ /*dba->lockfd = VCWD_OPEN_MODE(dba->lockfn, O_RDWR, 0644);*/
+ flock(dba->lockfd, LOCK_UN);
+ close(dba->lockfd);
+ }
+#endif
+ efree(dba->lockfn);
+
+ php_stream_close(dba->fp);
+ if (dba->nextkey.dptr)
+ efree(dba->nextkey.dptr);
+ efree(dba);
+}
+
+#define DBM_FETCH(gkey) dbm_file_fetch((dba_dbm_data*)info->dbf, gkey TSRMLS_CC)
+#define DBM_STORE(gkey, gval) dbm_file_store((dba_dbm_data*)info->dbf, gkey, gval, DBM_REPLACE TSRMLS_CC)
+#define DBM_DELETE(gkey) dbm_file_delete((dba_dbm_data*)info->dbf, gkey TSRMLS_CC)
+#define DBM_FIRSTKEY() dbm_file_firstkey((dba_dbm_data*)info->dbf TSRMLS_CC)
+#define DBM_NEXTKEY(gkey) dbm_file_nextkey((dba_dbm_data*)info->dbf TSRMLS_CC)
+
+DBA_FETCH_FUNC(dbm)
+{
+ datum gval;
+ char *new = NULL;
+
+ DBM_GKEY;
+ gval = DBM_FETCH(gkey);
+ if(gval.dptr) {
+ if(newlen) *newlen = gval.dsize;
+ new = estrndup(gval.dptr, gval.dsize);
+ efree(gval.dptr);
+ }
+ return new;
+}
+
+DBA_UPDATE_FUNC(dbm)
+{
+ datum gval;
+
+ DBM_GKEY;
+ gval.dptr = (char *) val;
+ gval.dsize = vallen;
+
+ return (DBM_STORE(gkey, gval) == -1 ? FAILURE : SUCCESS);
+}
+
+DBA_EXISTS_FUNC(dbm)
+{
+ datum gval;
+ DBM_GKEY;
+
+ gval = DBM_FETCH(gkey);
+ if(gval.dptr) {
+ efree(gval.dptr);
+ return SUCCESS;
+ }
+ return FAILURE;
+}
+
+DBA_DELETE_FUNC(dbm)
+{
+ DBM_GKEY;
+ return(DBM_DELETE(gkey) == -1 ? FAILURE : SUCCESS);
+}
+
+DBA_FIRSTKEY_FUNC(dbm)
+{
+ DBM_DATA;
+
+ if (dba->nextkey.dptr)
+ efree(dba->nextkey.dptr);
+ dba->nextkey = DBM_FIRSTKEY();
+ if(dba->nextkey.dptr) {
+ if(newlen)
+ *newlen = dba->nextkey.dsize;
+ return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
+ }
+ return NULL;
+}
+
+DBA_NEXTKEY_FUNC(dbm)
+{
+ DBM_DATA;
+ datum lkey;
+
+ if(!dba->nextkey.dptr)
+ return NULL;
+
+ lkey = dba->nextkey;
+ dba->nextkey = DBM_NEXTKEY(lkey);
+ if (lkey.dptr)
+ efree(lkey.dptr);
+ if(dba->nextkey.dptr) {
+ if(newlen)
+ *newlen = dba->nextkey.dsize;
+ return estrndup(dba->nextkey.dptr, dba->nextkey.dsize);
+ }
+ return NULL;
+}
+
+DBA_OPTIMIZE_FUNC(dbm)
+{
+ /* dummy */
+ return SUCCESS;
+}
+
+DBA_SYNC_FUNC(dbm)
+{
+ /* dummy */
+ return SUCCESS;
+}
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/dba/libdbm/dbm.c b/ext/dba/libflatfile/flatfile.c
index fe86f467d5..fe86f467d5 100644
--- a/ext/dba/libdbm/dbm.c
+++ b/ext/dba/libflatfile/flatfile.c
diff --git a/ext/dba/libdbm/dbm.h b/ext/dba/libflatfile/flatfile.h
index 739a927ceb..6582d71767 100644
--- a/ext/dba/libdbm/dbm.h
+++ b/ext/dba/libflatfile/flatfile.h
@@ -27,6 +27,8 @@ typedef struct {
} datum;
typedef struct {
+ char *lockfn;
+ int lockfd;
php_stream *fp;
long CurrentFlatFilePos;
datum nextkey;
diff --git a/ext/dba/php_flatfile.h b/ext/dba/php_flatfile.h
new file mode 100644
index 0000000000..afa9f6d5d3
--- /dev/null
+++ b/ext/dba/php_flatfile.h
@@ -0,0 +1,12 @@
+#ifndef PHP_FLATFILE_H
+#define PHP_FLATFILE_H
+
+#if DBA_FLATFILE
+
+#include "php_dba.h"
+
+DBA_FUNCS(flatfile);
+
+#endif
+
+#endif
diff --git a/ext/dba/tests/dba_flatfile.phpt b/ext/dba/tests/dba_flatfile.phpt
new file mode 100644
index 0000000000..33304e72fb
--- /dev/null
+++ b/ext/dba/tests/dba_flatfile.phpt
@@ -0,0 +1,18 @@
+--TEST--
+DBA FlatFile handler test
+--SKIPIF--
+<?php
+ require_once('skipif.inc');
+ if (!in_array('flatfile', dba_handlers())) die('skip FlatFile handler not available');
+?>
+--FILE--
+<?php
+ require_once('test.inc');
+ $handler = 'flatfile';
+ require_once('dba_handler.inc');
+?>
+--EXPECT--
+database handler: flatfile
+3NYNYY
+Content String 2
+Content 2 replaced