sas             Thu Sep 19 00:18:21 2002 EDT

  Added files:                 
    /php4/ext/dba       install_cdb.sh 

  Modified files:              
    /php4/ext/dba       config.m4 dba_cdb.c 
  Log:
  Add support for cdb-0.75
  
  The install_cdb.sh script fills the gap of installing header files and
  creating a cdb library which programs can link against.
  
  
Index: php4/ext/dba/config.m4
diff -u php4/ext/dba/config.m4:1.21 php4/ext/dba/config.m4:1.22
--- php4/ext/dba/config.m4:1.21 Wed Sep 11 12:17:33 2002
+++ php4/ext/dba/config.m4      Thu Sep 19 00:18:20 2002
@@ -1,5 +1,5 @@
 dnl
-dnl $Id: config.m4,v 1.21 2002/09/11 16:17:33 sander Exp $
+dnl $Id: config.m4,v 1.22 2002/09/19 04:18:20 sas Exp $
 dnl
 
 AC_DEFUN(PHP_TEMP_LDFLAGS,[
@@ -222,7 +222,7 @@
 
     for LIB in cdb c; do
       PHP_TEMP_LDFLAGS(-L$THIS_PREFIX/lib,[
-      AC_CHECK_LIB($LIB, cdb_bread, [AC_DEFINE(DBA_CDB,1,[ ]) THIS_LIBS=$LIB])
+      AC_CHECK_LIB($LIB, cdb_read, [AC_DEFINE(DBA_CDB,1,[ ]) THIS_LIBS=$LIB])
       ])
     done
     
Index: php4/ext/dba/dba_cdb.c
diff -u php4/ext/dba/dba_cdb.c:1.13 php4/ext/dba/dba_cdb.c:1.14
--- php4/ext/dba/dba_cdb.c:1.13 Thu Apr 18 08:30:18 2002
+++ php4/ext/dba/dba_cdb.c      Thu Sep 19 00:18:20 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: dba_cdb.c,v 1.13 2002/04/18 12:30:18 derick Exp $ */
+/* $Id: dba_cdb.c,v 1.14 2002/09/19 04:18:20 sas Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -32,12 +32,13 @@
 #include <fcntl.h>
 
 #include <cdb.h>
-#include <cdbmake.h>
+#include <uint32.h>
 
 #define CDB_INFO \
        dba_cdb *cdb = (dba_cdb *) info->dbf
 
 typedef struct {
+       struct cdb c;
        int fd;
        uint32 eod; /* size of constant database */
        uint32 pos; /* current position for traversing */
@@ -46,10 +47,11 @@
 DBA_OPEN_FUNC(cdb)
 {
        int gmode = 0;
+       int fd;
        dba_cdb *cdb;
        dba_info *pinfo = (dba_info *) info;
 
-       switch(info->mode) {
+       switch (info->mode) {
                case DBA_READER: 
                        gmode = O_RDONLY; break;
                /* currently not supported: */
@@ -61,14 +63,16 @@
                        return FAILURE;
        }
 
+       fd = VCWD_OPEN(info->path, gmode);
+       if (fd < 0) {
+               return FAILURE;
+       }
+       
        cdb = malloc(sizeof *cdb);
        memset(cdb, 0, sizeof *cdb);
 
-       cdb->fd = VCWD_OPEN(info->path, gmode);
-       if(cdb->fd < 0) {
-               free(cdb);
-               return FAILURE;
-       }
+       cdb_init(&cdb->c, fd);
+       cdb->fd = fd;
        
        pinfo->dbf = cdb;
        return SUCCESS;
@@ -78,6 +82,8 @@
 {
        CDB_INFO;
 
+       /* cdb_free does not close associated fd */
+       cdb_free(&cdb->c);
        close(cdb->fd);
        free(cdb);
 }
@@ -85,16 +91,23 @@
 DBA_FETCH_FUNC(cdb)
 {
        CDB_INFO;
-       int len;
-       char *new = NULL;
+       unsigned int len;
+       char *new_entry = NULL;
        
-       if(cdb_seek(cdb->fd, key, keylen, &len) == 1) {
-               new = emalloc(len);
-               read(cdb->fd, new, len);
-               if(newlen) *newlen = len;
+       if (cdb_find(&cdb->c, key, keylen) == 1) {
+               len = cdb_datalen(&cdb->c);
+               new_entry = emalloc(len);
+               
+               if (cdb_read(&cdb->c, new_entry, len, cdb_datapos(&cdb->c)) == -1) {
+                       free(new_entry);
+                       return NULL;
+               }
+               
+               if (newlen) 
+                       *newlen = len;
        }
        
-       return new;
+       return new_entry;
 }
 
 DBA_UPDATE_FUNC(cdb)
@@ -106,9 +119,8 @@
 DBA_EXISTS_FUNC(cdb)
 {
        CDB_INFO;
-       int len;
 
-       if(cdb_seek(cdb->fd, key, keylen, &len) == 1)
+       if (cdb_find(&cdb->c, key, keylen) == 1)
                return SUCCESS;
        return FAILURE;
 }
@@ -119,35 +131,48 @@
 }
 
 
-#define CREAD(n) if(read(cdb->fd, buf, n) < n) return NULL
-#define CSEEK(n) \
-       if(n >= cdb->eod) return NULL; \
-       if(lseek(cdb->fd, (off_t)n, SEEK_SET) != (off_t) n) return NULL
+#define CREAD(n) do { \
+       if (read(cdb->fd, buf, n) < n) return NULL; \
+} while (0)
+
+#define CSEEK(n) do { \
+       if (n >= cdb->eod) return NULL; \
+       if (lseek(cdb->fd, (off_t)n, SEEK_SET) != (off_t) n) return NULL; \
+} while (0)
+
 
 DBA_FIRSTKEY_FUNC(cdb)
 {
        CDB_INFO;
-       uint32 len;
+       uint32 klen, dlen;
        char buf[8];
        char *key;
 
        cdb->eod = -1;
        CSEEK(0);
        CREAD(4);
-       cdb->eod = cdb_unpack(buf);
+       
+       /* Total length of file in bytes */
+       uint32_unpack(buf, &cdb->eod);
        
        CSEEK(2048);
        CREAD(8);
-       len = cdb_unpack(buf);
+       
+       /* The first four bytes contain the length of the key */
+       uint32_unpack(buf, &klen);
+       uint32_unpack(buf + 4, &dlen);
 
-       key = emalloc(len + 1);
-       if(read(cdb->fd, key, len) < len) {
+       key = emalloc(klen + 1);
+       if (read(cdb->fd, key, klen) < klen) {
                efree(key);
                key = NULL;
-       } else
-               key[len] = '\0';
+       } else {
+               key[klen] = '\0';
+               if (newlen) *newlen = klen;
+       }
+
        /*       header + klenlen + dlenlen + klen + dlen */
-       cdb->pos = 2048 + 4       + 4       + len  + cdb_unpack(buf + 4);
+       cdb->pos = 2048 + 4       + 4       + klen + dlen;
                
        return key;
 }
@@ -155,48 +180,27 @@
 DBA_NEXTKEY_FUNC(cdb)
 {
        CDB_INFO;
-       uint32 len;
+       uint32 klen, dlen;
        char buf[8];
-       char *nkey;
+       char *key;
 
        CSEEK(cdb->pos);
        CREAD(8);
-       len = cdb_unpack(buf);
+       uint32_unpack(buf, &klen);
+       uint32_unpack(buf + 4, &dlen);
        
-       nkey = emalloc(len + 1);
-       if(read(cdb->fd, nkey, len) < len) {
-               efree(nkey);
-               return NULL;
+       key = emalloc(klen + 1);
+       if (read(cdb->fd, key, klen) < klen) {
+               efree(key);
+               key = NULL;
+       } else {
+               key[klen] = '\0';
+               if (newlen) *newlen = klen;
        }
-       nkey[len] = '\0';
-       if(newlen) *newlen = len;
        
-       cdb->pos += 8 + len + cdb_unpack(buf + 4);
+       cdb->pos += 8 + klen + dlen;
        
-       return nkey;
-#if 0
-       /* this code cdb_seeks and is thus slower than directly seeking
-          in the file */
-       CDB_INFO;
-       char *nkey = NULL;
-       uint32 len;
-       char buf[8];
-       
-       if(cdb_seek(cdb->fd, key, keylen, &len) == 1) {
-               if(lseek(cdb->fd, (off_t) len, SEEK_CUR) >= (off_t) cdb->eod) 
-                       return NULL;
-               CREAD(8);
-               len = cdb_unpack(buf);
-
-               nkey = emalloc(len + 1);
-               if(read(cdb->fd, nkey, len) < len) {
-                       efree(nkey);
-                       nkey = NULL;
-               } else
-                       nkey[len] = '\0';
-       }
-       return nkey;
-#endif
+       return key;
 }
 
 DBA_OPTIMIZE_FUNC(cdb)

Index: php4/ext/dba/install_cdb.sh
+++ php4/ext/dba/install_cdb.sh
#! /bin/sh

# cdb-0.75 lacks support for installing header files and creating a 
# library which programs can link against.  This shell script fills
# the gap.
#
# $Id: install_cdb.sh,v 1.1 2002/09/19 04:18:20 sas Exp $

if test -r "cdb.a" && test -r "auto-str.c" && test -r "byte.a"; then
  :
else
  echo "Please execute this script in the cdb-0.75 source directory after 'make'"
  exit 1
fi

prefix=$1

if test -z "$prefix"; then
  prefix=/usr/local
fi

echo "Using prefix $prefix"

if mkdir -p "$prefix/include" "$prefix/lib"; then
  :
else
  echo "Creating directories failed. Please become superuser."
  exit 1
fi

mkdir -p tmp || exit 1
cd tmp
ar x ../cdb.a
ar x ../byte.a
ar x ../unix.a
ar x ../byte.a
ar x ../buffer.a
cp ../error.o .

# not really portable
ar r "$prefix/lib/libcdb.a" *
ranlib "$prefix/lib/libcdb.a"
cd ..

rm -rf tmp

cp cdb.h uint32.h "$prefix/include"

echo "done"



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

Reply via email to