helly Tue Nov 5 20:47:06 2002 EDT
Added files:
/php4/ext/dba/libdbm dbm.c dbm.h
Modified files:
/php4/ext/dba config.m4 dba_dbm.c
Log:
Incorporate rewritten version of dbm from db extension.
# currently locks are missing :-(
Index: php4/ext/dba/config.m4
diff -u php4/ext/dba/config.m4:1.24 php4/ext/dba/config.m4:1.25
--- php4/ext/dba/config.m4:1.24 Tue Nov 5 07:03:01 2002
+++ php4/ext/dba/config.m4 Tue Nov 5 20:47:06 2002
@@ -1,5 +1,5 @@
dnl
-dnl $Id: config.m4,v 1.24 2002/11/05 12:03:01 helly Exp $
+dnl $Id: config.m4,v 1.25 2002/11/06 01:47:06 helly Exp $
dnl
AC_DEFUN(PHP_TEMP_LDFLAGS,[
@@ -190,7 +190,13 @@
AC_ARG_WITH(dbm,
[ --with-dbm[=DIR] Include DBM support],[
- if test "$withval" != "no"; then
+ 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
for i in /usr/local /usr $withval; do
if test -f "$i/include/dbm.h" ; then
THIS_PREFIX=$i
@@ -245,7 +251,7 @@
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, $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 $dbm_sources, $ext_shared)
PHP_SUBST(DBA_SHARED_LIBADD)
else
AC_MSG_RESULT(no)
Index: php4/ext/dba/dba_dbm.c
diff -u php4/ext/dba/dba_dbm.c:1.17 php4/ext/dba/dba_dbm.c:1.18
--- php4/ext/dba/dba_dbm.c:1.17 Tue Nov 5 09:46:36 2002
+++ php4/ext/dba/dba_dbm.c Tue Nov 5 20:47:06 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dba_dbm.c,v 1.17 2002/11/05 14:46:36 helly Exp $ */
+/* $Id: dba_dbm.c,v 1.18 2002/11/06 01:47:06 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -27,13 +27,23 @@
#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
@@ -45,12 +55,41 @@
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 = "a+";
+ break;
+ case DBA_CREAT:
+ case DBA_TRUNC:
+ fmode = "w+";
+ 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;
@@ -84,24 +123,50 @@
return FAILURE;
}
return SUCCESS;
+#endif
}
DBA_CLOSE_FUNC(dbm)
{
- efree(info->dbf);
+ DBM_DATA;
+
+#ifdef DBA_DBM_BUILTIN
+ php_stream_close(dba->fp);
+ if (dba->nextkey.dptr)
+ efree(dba->nextkey.dptr);
+#else
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 = fetch(gkey);
+ gval = DBM_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;
}
@@ -114,7 +179,7 @@
gval.dptr = (char *) val;
gval.dsize = vallen;
- return (store(gkey, gval) == -1 ? FAILURE : SUCCESS);
+ return (DBM_STORE(gkey, gval) == -1 ? FAILURE : SUCCESS);
}
DBA_EXISTS_FUNC(dbm)
@@ -122,8 +187,11 @@
datum gval;
DBM_GKEY;
- gval = fetch(gkey);
+ gval = DBM_FETCH(gkey);
if(gval.dptr) {
+#ifdef DBA_DBM_BUILTIN
+ efree(gval.dptr);
+#endif
return SUCCESS;
}
return FAILURE;
@@ -132,41 +200,46 @@
DBA_DELETE_FUNC(dbm)
{
DBM_GKEY;
- return(delete(gkey) == -1 ? FAILURE : SUCCESS);
+ return(DBM_DELETE(gkey) == -1 ? FAILURE : SUCCESS);
}
DBA_FIRSTKEY_FUNC(dbm)
{
DBM_DATA;
- 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;
+#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;
}
DBA_NEXTKEY_FUNC(dbm)
{
DBM_DATA;
- datum gkey;
- char *nkey = NULL;
+ datum lkey;
- if(!dba->nextkey.dptr) return 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;
+ 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;
}
DBA_OPTIMIZE_FUNC(dbm)
@@ -177,6 +250,7 @@
DBA_SYNC_FUNC(dbm)
{
+ /* dummy */
return SUCCESS;
}
Index: php4/ext/dba/libdbm/dbm.c
+++ php4/ext/dba/libdbm/dbm.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: dbm.c,v 1.1 2002/11/06 01:47:06 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/libdbm/dbm.h
+++ php4/ext/dba/libdbm/dbm.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: dbm.h,v 1.1 2002/11/06 01:47:06 helly Exp $ */
#ifndef PHP_LIBDBM_H
#define PHP_LIBDBM_H
typedef struct {
char *dptr;
int dsize;
} datum;
typedef struct {
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
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php