helly           Tue Nov  5 23:16:18 2002 EDT

  Added files:                 
    /php4/ext/dba       dba_flatile.c php_flatfile.h 
    /php4/ext/dba/libflatfile   .cvsignore flatfile.c flatfile.h 
    /php4/ext/dba/tests dba_flatfile.phpt 

  Removed files:               
    /php4/ext/dba/libdbm        dbm.c dbm.h 

  Modified files:              
    /php4/ext/dba       config.m4 dba.c dba_dbm.c 
  Log:
  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.
  
  
Index: php4/ext/dba/config.m4
diff -u php4/ext/dba/config.m4:1.25 php4/ext/dba/config.m4:1.26
--- php4/ext/dba/config.m4:1.25 Tue Nov  5 20:47:06 2002
+++ php4/ext/dba/config.m4      Tue Nov  5 23:16:17 2002
@@ -1,5 +1,5 @@
 dnl
-dnl $Id: config.m4,v 1.25 2002/11/06 01:47:06 helly Exp $
+dnl $Id: config.m4,v 1.26 2002/11/06 04:16:17 helly Exp $
 dnl
 
 AC_DEFUN(PHP_TEMP_LDFLAGS,[
@@ -190,13 +190,7 @@
 
 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_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: php4/ext/dba/dba.c
diff -u php4/ext/dba/dba.c:1.52 php4/ext/dba/dba.c:1.53
--- php4/ext/dba/dba.c:1.52     Tue Nov  5 10:01:20 2002
+++ php4/ext/dba/dba.c  Tue Nov  5 23:16:17 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dba.c,v 1.52 2002/11/05 15:01:20 helly Exp $ */
+/* $Id: dba.c,v 1.53 2002/11/06 04:16:17 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -184,6 +184,9 @@
 #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: php4/ext/dba/dba_dbm.c
diff -u php4/ext/dba/dba_dbm.c:1.20 php4/ext/dba/dba_dbm.c:1.21
--- php4/ext/dba/dba_dbm.c:1.20 Tue Nov  5 21:21:49 2002
+++ php4/ext/dba/dba_dbm.c      Tue Nov  5 23:16:17 2002
@@ -12,12 +12,11 @@
    | obtain it through the world-wide-web, please send a note to          |
    | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
    +----------------------------------------------------------------------+
-   | Authors: Sascha Schumann <[EMAIL PROTECTED]>                        |
-   |          Marcus Boerger <[EMAIL PROTECTED]>                              |
+   | Author: Sascha Schumann <[EMAIL PROTECTED]>                         |
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dba_dbm.c,v 1.20 2002/11/06 02:21:49 helly Exp $ */
+/* $Id: dba_dbm.c,v 1.21 2002/11/06 04:16:17 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -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 @@
        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 @@
                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 @@
        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 @@
        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_DELETE_FUNC(dbm)
 {
        DBM_GKEY;
-       return(DBM_DELETE(gkey) == -1 ? FAILURE : SUCCESS);
+       return(delete(gkey) == -1 ? FAILURE : SUCCESS);
 }
 
 DBA_FIRSTKEY_FUNC(dbm)
 {
        DBM_DATA;
+       datum gkey;
+       char *key = NULL;
 
-#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;
+       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_SYNC_FUNC(dbm)
 {
-       /* dummy */
        return SUCCESS;
 }
 

Index: php4/ext/dba/dba_flatile.c
+++ php4/ext/dba/dba_flatile.c
/*
   +----------------------------------------------------------------------+
   | 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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Marcus Boerger <[EMAIL PROTECTED]>                               |
   +----------------------------------------------------------------------+
 */

/* $Id: dba_flatile.c,v 1.1 2002/11/06 04:16:17 helly Exp $ */

#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
 */

Index: php4/ext/dba/php_flatfile.h
+++ php4/ext/dba/php_flatfile.h
#ifndef PHP_FLATFILE_H
#define PHP_FLATFILE_H

#if DBA_FLATFILE

#include "php_dba.h"

DBA_FUNCS(flatfile);

#endif

#endif

Index: php4/ext/dba/libflatfile/.cvsignore
+++ php4/ext/dba/libflatfile/.cvsignore
*.lo
*.la
deps
*.plg
*.opt
*.ncb
Release
Release_inline
Debug
Release_TS
Release_TSDbg
Release_TS_inline
Debug_TS

Index: php4/ext/dba/libflatfile/flatfile.c
+++ php4/ext/dba/libflatfile/flatfile.c
/*
   +----------------------------------------------------------------------+
   | 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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Authors: Marcus Boerger <[EMAIL PROTECTED]>                              |
   | based on ext/db/db.c by:                                             |
   |          Rasmus Lerdorf <[EMAIL PROTECTED]>                             |
   |          Jim Winstead <[EMAIL PROTECTED]>                                 |
   +----------------------------------------------------------------------+
 */

/* $Id: flatfile.c,v 1.1 2002/11/06 04:16:18 helly Exp $ */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "php_globals.h"
#include "safe_mode.h"

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif

#include "dbm.h"

/*
 * ret = -1 means that database was opened for read-only
 * ret = 0  success
 * ret = 1  key already exists - nothing done
 */

/* {{{ dbm_file_store
 */
PHPAPI int dbm_file_store(dba_dbm_data *dba, datum key_datum, datum value_datum, int 
mode TSRMLS_DC) {
        if (mode == DBM_INSERT) {
                if (dbm_file_findkey(dba, key_datum TSRMLS_CC)) {
                        return 1;
                }
                php_stream_seek(dba->fp, 0L, SEEK_END);
                php_stream_printf(dba->fp TSRMLS_CC, "%d\n", key_datum.dsize);
                php_stream_flush(dba->fp);
                if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < 
key_datum.dsize)
                        return -1;
                php_stream_printf(dba->fp TSRMLS_CC, "%d\n", value_datum.dsize);
                php_stream_flush(dba->fp);
                if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < 
value_datum.dsize)
                        return -1;
        } else { /* DBM_REPLACE */
                dbm_file_delete(dba, key_datum TSRMLS_CC);
                php_stream_printf(dba->fp TSRMLS_CC, "%d\n", key_datum.dsize);
                php_stream_flush(dba->fp);
                if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < 
key_datum.dsize)
                        return -1;
                php_stream_printf(dba->fp TSRMLS_CC, "%d\n", value_datum.dsize);
                if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < 
value_datum.dsize)
                        return -1;
        }

        return 0;
}
/* }}} */

/* {{{ dbm_file_fetch
 */
PHPAPI datum dbm_file_fetch(dba_dbm_data *dba, datum key_datum TSRMLS_DC) {
        datum value_datum = {NULL, 0};
        int num=0, buf_size=1024;
        char *buf;      

        if (dbm_file_findkey(dba, key_datum TSRMLS_CC)) {
                buf = emalloc((buf_size+1) * sizeof(char));
                if (php_stream_gets(dba->fp, buf, 15)) {
                        num = atoi(buf);
                        if (num > buf_size) {
                                buf_size+=num;
                                buf = erealloc(buf, (buf_size+1)*sizeof(char));
                        }
                        php_stream_read(dba->fp, buf, num);
                        value_datum.dptr = buf;
                        value_datum.dsize = num;
                } else {
                        value_datum.dptr = NULL;
                        value_datum.dsize = 0;
                        efree(buf);
                }
        }
        return value_datum;
}
/* }}} */

/* {{{ dbm_file_delete
 */
PHPAPI int dbm_file_delete(dba_dbm_data *dba, datum key_datum TSRMLS_DC) {
        char *key = key_datum.dptr;
        int size = key_datum.dsize;

        char *buf;
        int num, buf_size = 1024;
        long pos;

        php_stream_rewind(dba->fp);

        buf = emalloc((buf_size + 1)*sizeof(char));
        while(!php_stream_eof(dba->fp)) {
                /* read in the length of the key name */
                if (!php_stream_gets(dba->fp, buf, 15))
                        break;
                num = atoi(buf);
                if (num > buf_size) {
                        buf_size += num;
                        buf = erealloc(buf, (buf_size+1)*sizeof(char));
                }
                pos = php_stream_tell(dba->fp);

                /* read in the key name */
                num = php_stream_read(dba->fp, buf, sizeof(char)*num);
                if (num<0) 
                        break;
                *(buf+num) = '\0';

                if (size == num && !memcmp(buf, key, size)) {
                        php_stream_seek(dba->fp, pos, SEEK_SET);
                        php_stream_putc(dba->fp, 0);
                        php_stream_flush(dba->fp);
                        php_stream_seek(dba->fp, 0L, SEEK_END);
                        if (buf) 
                                efree(buf);
                        return SUCCESS;
                }       

                /* read in the length of the value */
                if (!php_stream_gets(dba->fp, buf, 15))
                        break;
                num = atoi(buf);
                if (num > buf_size) {
                        buf_size+=num;
                        buf = erealloc(buf, (buf_size+1)*sizeof(char));
                }
                /* read in the value */
                num = php_stream_read(dba->fp, buf, sizeof(char)*num);
                if (num<0)
                        break;
        }
        if (buf) 
                efree(buf);
        return FAILURE;
}       
/* }}} */

/* {{{ dbm_file_findkey
 */
PHPAPI int dbm_file_findkey(dba_dbm_data *dba, datum key_datum TSRMLS_DC) {
        char *buf = NULL;
        int num;
        int buf_size=1024;
        int ret=0;
        void *key = key_datum.dptr;
        int size = key_datum.dsize;

        php_stream_rewind(dba->fp);
        buf = emalloc((buf_size+1)*sizeof(char));
        while (!php_stream_eof(dba->fp)) {
                if (!php_stream_gets(dba->fp, buf, 15)) 
                        break;
                num = atoi(buf);
                if (num > buf_size) {
                        buf_size+=num;
                        buf = erealloc(buf, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf, sizeof(char)*num);
                if (num<0) break;
                *(buf+num) = '\0';
                if (size == num) {
                        if (!memcmp(buf, key, size)) {
                                ret = 1;
                                break;
                        }
                }       
                if (!php_stream_gets(dba->fp, buf, 15))
                        break;
                num = atoi(buf);
                if (num > buf_size) {
                        buf_size+=num;
                        buf = erealloc(buf, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf, sizeof(char)*num);
                if (num<0) 
                        break;
                *(buf+num) = '\0';
        }
        if (buf) 
                efree(buf);
        return(ret);
}
/* }}} */

/* {{{ dbm_file_firstkey
 */
PHPAPI datum dbm_file_firstkey(dba_dbm_data *dba TSRMLS_DC) {
        datum buf;
        int num;
        int buf_size=1024;

        php_stream_rewind(dba->fp);
        buf.dptr = emalloc((buf_size+1)*sizeof(char));
        while(!php_stream_eof(dba->fp)) {
                if (!php_stream_gets(dba->fp, buf.dptr, 15)) break;
                num = atoi(buf.dptr);
                if (num > buf_size) {
                        buf_size+=num;
                        buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf.dptr, num);
                if (num<0) 
                        break;
                buf.dsize = num;
                if (*(buf.dptr)!=0) {
                        dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
                        return(buf);
                }
                if (!php_stream_gets(dba->fp, buf.dptr, 15)) break;
                num = atoi(buf.dptr);
                if (num > buf_size) {
                        buf_size+=num;
                        buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf.dptr, num);
                if (num<0) 
                        break;
        }
        if (buf.dptr) 
                efree(buf.dptr);
        buf.dptr = NULL;
        return(buf);
}
/* }}} */

/* {{{ latfile_nextkey
 */
PHPAPI datum dbm_file_nextkey(dba_dbm_data *dba TSRMLS_DC) {
        datum buf;
        int num;
        int buf_size=1024;

        php_stream_seek(dba->fp, dba->CurrentFlatFilePos, SEEK_SET);
        buf.dptr = emalloc((buf_size+1)*sizeof(char));
        while(!php_stream_eof(dba->fp)) {
                if (!php_stream_gets(dba->fp, buf.dptr, 15)) break;
                num = atoi(buf.dptr);
                if (num > buf_size) {
                        buf_size+=num;
                        buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf.dptr, num);
                if (num<0) 
                        break;
                if (!php_stream_gets(dba->fp, buf.dptr, 15)) 
                        break;
                num = atoi(buf.dptr);
                if (num > buf_size) {
                        buf_size+=num;
                        buf.dptr = erealloc(buf.dptr, (buf_size+1)*sizeof(char));
                }
                num = php_stream_read(dba->fp, buf.dptr, num);
                if (num<0) 
                        break;
                buf.dsize = num;
                if (*(buf.dptr)!=0) {
                        dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
                        return(buf);
                }
        }
        if (buf.dptr) 
                efree(buf.dptr);
        buf.dptr = NULL;
        return(buf);
}       
/* }}} */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */

Index: php4/ext/dba/libflatfile/flatfile.h
+++ php4/ext/dba/libflatfile/flatfile.h
/*
   +----------------------------------------------------------------------+
   | 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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Marcus Boerger <[EMAIL PROTECTED]>                               |
   +----------------------------------------------------------------------+
 */

/* $Id: flatfile.h,v 1.1 2002/11/06 04:16:18 helly Exp $ */

#ifndef PHP_LIBDBM_H
#define PHP_LIBDBM_H

typedef struct {
        char *dptr;
        int dsize;
} datum;

typedef struct {
        char *lockfn;
        int lockfd;
        php_stream *fp;
        long CurrentFlatFilePos;
        datum nextkey;
} dba_dbm_data;

#define DBM_INSERT 0
#define DBM_REPLACE 1

PHPAPI int dbm_file_store(dba_dbm_data *dba, datum key_datum, datum value_datum, int 
mode TSRMLS_DC);
PHPAPI datum dbm_file_fetch(dba_dbm_data *dba, datum key_datum TSRMLS_DC);
PHPAPI int dbm_file_delete(dba_dbm_data *dba, datum key_datum TSRMLS_DC);
PHPAPI int dbm_file_findkey(dba_dbm_data *dba, datum key_datum TSRMLS_DC);
PHPAPI datum dbm_file_firstkey(dba_dbm_data *dba TSRMLS_DC);
PHPAPI datum dbm_file_nextkey(dba_dbm_data *dba TSRMLS_DC);

#endif

Index: php4/ext/dba/tests/dba_flatfile.phpt
+++ php4/ext/dba/tests/dba_flatfile.phpt
--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

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to