--- Makefile.orig 2004-07-19 16:47:57.000000000 +0800 +++ Makefile 2008-12-22 21:27:52.000000000 +0800 @@ -11,4 +11,6 @@ PKGNAMESUFFIX= -dba +CONFIGURE_ARGS= --with-dbm + .include "${MASTERDIR}/Makefile" --- work/php-5.2.8/ext/dba/config.m4.orig 2008-12-22 21:27:38.000000000 +0800 +++ work/php-5.2.8/ext/dba/config.m4 2008-12-22 21:27:52.000000000 +0800 @@ -477,39 +477,18 @@ if test "$HAVE_QDBM" = "1"; then PHP_DBA_STD_RESULT(dbm, dbm, [You cannot combine --with-dbm with --with-qdbm]) fi - for i in $PHP_DBM /usr/local /usr; do - if test -f "$i/include/dbm.h"; then - THIS_PREFIX=$i - THIS_INCLUDE=$i/include/dbm.h - break - elif test -f "$i/include/gdbm/dbm.h"; then - THIS_PREFIX=$i - THIS_INCLUDE=$i/include/gdbm/dbm.h - break - fi - done + echo "haha" + + THIS_PREFIX=/usr + THIS_INCLUDE=/usr/include/db.h + + AC_MSG_CHECKING(for DBM using FreeBSD C library) + AC_DEFINE_UNQUOTED(DBM_INCLUDE_FILE, "$THIS_INCLUDE", [ ]) + AC_DEFINE_UNQUOTED(DBM_VERSION, "DB", [ ]) + AC_DEFINE(DBA_DBM, 1, [ ]) + + THIS_LIBS=c - if test -n "$THIS_INCLUDE"; then - for LIB in dbm c gdbm; do - PHP_CHECK_LIBRARY($LIB, dbminit, [ - AC_MSG_CHECKING(for DBM using GDBM) - AC_DEFINE_UNQUOTED(DBM_INCLUDE_FILE, "$THIS_INCLUDE", [ ]) - if test "$LIB" = "gdbm"; then - AC_DEFINE_UNQUOTED(DBM_VERSION, "GDBM", [ ]) - AC_MSG_RESULT(yes) - else - AC_DEFINE_UNQUOTED(DBM_VERSION, "DBM", [ ]) - AC_MSG_RESULT(no) - fi - AC_DEFINE(DBA_DBM, 1, [ ]) - THIS_LIBS=$LIB - ], [], [-L$THIS_PREFIX/$PHP_LIBDIR]) - if test -n "$THIS_LIBS"; then - break - fi - done - fi - PHP_DBA_STD_ASSIGN PHP_DBA_STD_CHECK PHP_DBA_STD_ATTACH --- work/php-5.2.8/ext/dba/dba_dbm.c.orig 2007-12-31 15:20:05.000000000 +0800 +++ work/php-5.2.8/ext/dba/dba_dbm.c 2008-12-22 21:27:52.000000000 +0800 @@ -40,143 +40,137 @@ #include #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); - +#define DBM_GKEY DBT gkey = {0}; gkey.data = (char *) key; gkey.size = keylen typedef struct { - datum nextkey; + DB *db; } dba_dbm_data; DBA_OPEN_FUNC(dbm) { - int fd; + dba_dbm_data *dba; + DB *db; + + int gmode; int filemode = 0644; if(info->argc > 0) { convert_to_long_ex(info->argv[0]); filemode = Z_LVAL_PP(info->argv[0]); } - - if(info->mode == DBA_TRUNC) { - char buf[MAXPATHLEN]; - - /* dbm/ndbm original */ - TRUNC_IT(".pag", O_TRUNC); - TRUNC_IT(".dir", O_TRUNC); - } - - if(info->mode == DBA_CREAT) { - char buf[MAXPATHLEN]; - TRUNC_IT(".pag", 0); - TRUNC_IT(".dir", 0); + gmode = 0; + switch(info->mode) { + case DBA_READER: + gmode = O_RDONLY; + break; + case DBA_WRITER: + gmode = O_RDWR; + break; + case DBA_CREAT: + gmode = O_RDWR | O_CREAT; + break; + case DBA_TRUNC: + gmode = O_RDWR | O_CREAT | O_TRUNC; + break; + default: + return FAILURE; /* not possible */ } - if(dbminit((char *) info->path) == -1) { + db = dbopen((char *) info->path, gmode, filemode, DB_HASH, NULL); + if( db == NULL ) { return FAILURE; } - info->dbf = pemalloc(sizeof(dba_dbm_data), info->flags&DBA_PERSISTENT); - memset(info->dbf, 0, sizeof(dba_dbm_data)); + dba = pemalloc(sizeof(*dba), info->flags&DBA_PERSISTENT); + dba->db = db; + + info->dbf = dba; + return SUCCESS; } DBA_CLOSE_FUNC(dbm) { + DBM_DATA; + dba->db->close(dba->db); pefree(info->dbf, info->flags&DBA_PERSISTENT); - dbmclose(); } DBA_FETCH_FUNC(dbm) { - datum gval; + DBT gval = {0}; char *new = NULL; - + DBM_DATA; DBM_GKEY; - gval = fetch(gkey); - if(gval.dptr) { - if(newlen) *newlen = gval.dsize; - new = estrndup(gval.dptr, gval.dsize); + + if( dba->db->get(dba->db,&gkey,&gval,0) ) { + return(NULL); } - return new; + + if (newlen) *newlen = gval.size; + return estrndup(gval.data, gval.size); } DBA_UPDATE_FUNC(dbm) { - datum gval; - + DBT gval = {0}; + DBM_DATA; DBM_GKEY; - if (mode == 1) { /* insert */ - gval = fetch(gkey); - if(gval.dptr) { - return FAILURE; - } - } + gval.data = (char *) val; + gval.size = vallen; - gval.dptr = (char *) val; - gval.dsize = vallen; - - return (store(gkey, gval) == -1 ? FAILURE : SUCCESS); + if( dba->db->put( dba->db, &gkey, &gval, (mode == 1) ? R_NOOVERWRITE : 0 ) ) { + return FAILURE; + } + return SUCCESS; } DBA_EXISTS_FUNC(dbm) { - datum gval; + DBT gval = {0}; + DBM_DATA; DBM_GKEY; - - gval = fetch(gkey); - if(gval.dptr) { - return SUCCESS; + if( dba->db->get( dba->db, &gkey, &gval, 0) ) { + return FAILURE; } - return FAILURE; + return SUCCESS; } DBA_DELETE_FUNC(dbm) { + DBM_DATA; DBM_GKEY; - return(delete(gkey) == -1 ? FAILURE : SUCCESS); + return( dba->db->del(dba->db,&gkey,R_CURSOR) != 0 ? FAILURE : SUCCESS); } DBA_FIRSTKEY_FUNC(dbm) { - DBM_DATA; - datum gkey; + DBT gkey = {0}; + DBT gval = {0}; char *key = NULL; + DBM_DATA; - gkey = firstkey(); - if(gkey.dptr) { - if(newlen) *newlen = gkey.dsize; - key = estrndup(gkey.dptr, gkey.dsize); - dba->nextkey = gkey; - } else - dba->nextkey.dptr = NULL; + if( dba->db->seq( dba->db, &gkey, &gval, R_FIRST ) == 0 ) { + if(newlen) *newlen = gkey.size; + key = estrndup(gkey.data, gkey.size); + } return key; } DBA_NEXTKEY_FUNC(dbm) { + DBT gkey = {0}; + DBT gval = {0}; + char *key = NULL; DBM_DATA; - datum gkey; - char *nkey = NULL; - - if(!dba->nextkey.dptr) 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; + + if( dba->db->seq( dba->db, &gkey, &gval, R_NEXT ) == 0 ) { + if(newlen) *newlen = gkey.size; + key = estrndup(gkey.data, gkey.size); + } + return key; } DBA_OPTIMIZE_FUNC(dbm)