]> granicus.if.org Git - php/commitdiff
move newly introduced flatfile support from dbm to new flatfile handler
authorMarcus Boerger <helly@php.net>
Wed, 6 Nov 2002 04:16:18 +0000 (04:16 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 6 Nov 2002 04:16:18 +0000 (04:16 +0000)
# do not make the same mistake as with ext/db where it was not clear
# which format was used.

ext/dba/config.m4
ext/dba/dba.c
ext/dba/dba_dbm.c
ext/dba/dba_flatile.c [new file with mode: 0644]
ext/dba/libflatfile/flatfile.c [moved from ext/dba/libdbm/dbm.c with 100% similarity]
ext/dba/libflatfile/flatfile.h [moved from ext/dba/libdbm/dbm.h with 98% similarity]
ext/dba/php_flatfile.h [new file with mode: 0644]
ext/dba/tests/dba_flatfile.phpt [new file with mode: 0644]

index 9ecd88904311db72334b090c6306cad340f91c37..8be65698201b9b9daa4d454f7a029d21c6434a49 100644 (file)
@@ -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)
index 4705c26e3e600f22f2f5b67bc5ca83e7b7cf90f0..337cfa40e2445ad6ba593c81243f914d9fcb405a 100644 (file)
@@ -184,6 +184,9 @@ static dba_handler handler[] = {
 #endif
 #if DBA_DB3
        DBA_HND(db3)
+#endif
+#if DBA_FLATFILE
+       DBA_HND(flatfile)
 #endif
        { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
 };
index 343affa0acc62e34997090ab0c79980f330d5b2f..5763fad41eb5a576a80b9491f32c039b24efa7b0 100644 (file)
@@ -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>                         |
    +----------------------------------------------------------------------+
  */
 
 #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 (file)
index 0000000..aac535b
--- /dev/null
@@ -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
+ */
similarity index 98%
rename from ext/dba/libdbm/dbm.h
rename to ext/dba/libflatfile/flatfile.h
index 739a927ceb825e40b9a518311a8983feefd00884..6582d717674f27901a98d8799fea1122e37967f5 100644 (file)
@@ -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 (file)
index 0000000..afa9f6d
--- /dev/null
@@ -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 (file)
index 0000000..33304e7
--- /dev/null
@@ -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