You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gs...@locus.apache.org on 2000/07/13 13:02:40 UTC
cvs commit: apache-2.0/src/modules/dav/fs dbm.c
gstein 00/07/13 04:02:39
Modified: src/modules/dav/fs dbm.c
Log:
update for APR-ized SDBM interfaces
Submitted by: Joe Orton <jo...@orton.demon.co.uk>
Reviewed by: Greg Stein
Revision Changes Path
1.6 +36 -114 apache-2.0/src/modules/dav/fs/dbm.c
Index: dbm.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/dav/fs/dbm.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- dbm.c 2000/07/07 02:22:17 1.5
+++ dbm.c 2000/07/13 11:02:37 1.6
@@ -59,7 +59,7 @@
*/
/*
-** This implementation uses a SDBM or GDBM database per file and directory to
+** This implementation uses a SDBM database per file and directory to
** record the properties. These databases are kept in a subdirectory (of
** the directory in question or the directory that holds the file in
** question) named by the macro DAV_FS_STATE_DIR (.DAV). The filename of the
@@ -67,98 +67,39 @@
** DAV_FS_STATE_FILE_FOR_DIR (.state_for_dir) for the directory itself.
*/
-#ifdef DAV_USE_GDBM
-#include <gdbm.h>
-#else
-
-/* ### need to APR-ize */
-#include <fcntl.h> /* for O_RDONLY, O_WRONLY */
-#include <sys/stat.h> /* for S_IRUSR, etc */
-
#include "sdbm.h"
-/* ### this is still needed for sdbm_open()...
- * sdbm should be APR-ized really. */
-#ifndef WIN32
-
-#define DAV_FS_MODE_FILE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)
-
-#else /* WIN32 */
-
-#define DAV_FS_MODE_FILE (_S_IREAD | _S_IWRITE)
-
-#endif /* WIN32 */
-
-#endif
-
#include "mod_dav.h"
#include "repos.h"
-
-#ifdef DAV_USE_GDBM
-
-typedef GDBM_FILE dav_dbm_file;
-
-#define DAV_DBM_CLOSE(f) gdbm_close(f)
-#define DAV_DBM_FETCH(f, k) gdbm_fetch((f), (k))
-#define DAV_DBM_STORE(f, k, v) gdbm_store((f), (k), (v), GDBM_REPLACE)
-#define DAV_DBM_DELETE(f, k) gdbm_delete((f), (k))
-#define DAV_DBM_FIRSTKEY(f) gdbm_firstkey(f)
-#define DAV_DBM_NEXTKEY(f, k) gdbm_nextkey((f), (k))
-#define DAV_DBM_CLEARERR(f) if (0) ; else /* stop "no effect" warning */
-#define DAV_DBM_FREEDATUM(f, d) ((d).dptr ? free((d).dptr) : 0)
-
-#else
-
-typedef DBM *dav_dbm_file;
-
-#define DAV_DBM_CLOSE(f) sdbm_close(f)
-#define DAV_DBM_FETCH(f, k) sdbm_fetch((f), (k))
-#define DAV_DBM_STORE(f, k, v) sdbm_store((f), (k), (v), DBM_REPLACE)
-#define DAV_DBM_DELETE(f, k) sdbm_delete((f), (k))
-#define DAV_DBM_FIRSTKEY(f) sdbm_firstkey(f)
-#define DAV_DBM_NEXTKEY(f, k) sdbm_nextkey(f)
-#define DAV_DBM_CLEARERR(f) sdbm_clearerr(f)
-#define DAV_DBM_FREEDATUM(f, d) if (0) ; else /* stop "no effect" warning */
-
-#endif
-
struct dav_db {
ap_pool_t *pool;
- dav_dbm_file file;
+ SDBM *file;
};
-#define D2G(d) (*(datum*)&(d))
+#define D2G(d) (*(sdbm_datum*)&(d))
void dav_dbm_get_statefiles(ap_pool_t *p, const char *fname,
const char **state1, const char **state2)
{
char *work;
+ int extension;
if (fname == NULL)
fname = DAV_FS_STATE_FILE_FOR_DIR;
-#ifndef DAV_USE_GDBM
- fname = ap_pstrcat(p, fname, DIRFEXT, NULL);
-#endif
+ fname = ap_pstrcat(p, fname, SDBM_DIRFEXT, NULL);
*state1 = fname;
-#ifdef DAV_USE_GDBM
- *state2 = NULL;
-#else
- {
- int extension;
-
- work = ap_pstrdup(p, fname);
-
- /* we know the extension is 4 characters -- len(DIRFEXT) */
- extension = strlen(work) - 4;
- memcpy(&work[extension], PAGFEXT, 4);
- *state2 = work;
- }
-#endif
+ work = ap_pstrdup(p, fname);
+
+ /* we know the extension is 4 characters -- len(DIRFEXT) */
+ extension = strlen(work) - 4;
+ memcpy(&work[extension], SDBM_PAGFEXT, 4);
+ *state2 = work;
+
}
static dav_error * dav_fs_dbm_error(dav_db *db, ap_pool_t *p)
@@ -170,17 +111,12 @@
p = db ? db->pool : p;
-#ifdef DAV_USE_GDBM
- errcode = gdbm_errno;
- errstr = gdbm_strerror(gdbm_errno);
-#else
/* There might not be a <db> if we had problems creating it. */
errcode = !db || sdbm_error(db->file);
if (errcode)
errstr = "I/O error occurred.";
else
errstr = "No error.";
-#endif
err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, errcode, errstr);
err->save_errno = save_errno;
@@ -205,25 +141,16 @@
dav_error * dav_dbm_open_direct(ap_pool_t *p, const char *pathname, int ro,
dav_db **pdb)
{
- dav_dbm_file file;
+ SDBM *file;
*pdb = NULL;
/* NOTE: stupid cast to get rid of "const" on the pathname */
-#ifdef DAV_USE_GDBM
- file = gdbm_open((char *) pathname,
- 0,
- ro ? GDBM_READER : GDBM_WRCREAT,
- DAV_FS_MODE_FILE,
- NULL);
-#else
- file = sdbm_open((char *) pathname,
- ro ? O_RDONLY : (O_RDWR | O_CREAT),
- DAV_FS_MODE_FILE);
-#endif
-
- /* we can't continue if we couldn't open the file and we need to write */
- if (file == NULL && !ro) {
+ if (sdbm_open(&file, pathname,
+ APR_READ | (ro ? 0 : (APR_WRITE | APR_CREATE)),
+ APR_OS_DEFAULT, p) != APR_SUCCESS && !ro) {
+ /* we can't continue if we couldn't open the file
+ and we need to write */
return dav_fs_dbm_error(NULL, p);
}
@@ -270,31 +197,31 @@
static void dav_dbm_close(dav_db *db)
{
- DAV_DBM_CLOSE(db->file);
+ sdbm_close(db->file);
}
static dav_error * dav_dbm_fetch(dav_db *db, dav_datum key, dav_datum *pvalue)
{
- *(datum *) pvalue = DAV_DBM_FETCH(db->file, D2G(key));
+ *(sdbm_datum *) pvalue = sdbm_fetch(db->file, D2G(key));
/* we don't need the error; we have *pvalue to tell */
- DAV_DBM_CLEARERR(db->file);
+ sdbm_clearerr(db->file);
return NULL;
}
static dav_error * dav_dbm_store(dav_db *db, dav_datum key, dav_datum value)
{
- int rv;
+ ap_status_t status;
- rv = DAV_DBM_STORE(db->file, D2G(key), D2G(value));
+ status = sdbm_store(db->file, D2G(key), D2G(value), SDBM_REPLACE);
/* ### fetch more specific error information? */
/* we don't need the error; we have rv to tell */
- DAV_DBM_CLEARERR(db->file);
+ sdbm_clearerr(db->file);
- if (rv == -1) {
+ if (status != APR_SUCCESS) {
return dav_fs_dbm_error(db, NULL);
}
return NULL;
@@ -304,12 +231,12 @@
{
int rv;
- rv = DAV_DBM_DELETE(db->file, D2G(key));
+ rv = sdbm_delete(db->file, D2G(key));
/* ### fetch more specific error information? */
/* we don't need the error; we have rv to tell */
- DAV_DBM_CLEARERR(db->file);
+ sdbm_clearerr(db->file);
if (rv == -1) {
return dav_fs_dbm_error(db, NULL);
@@ -320,42 +247,37 @@
static int dav_dbm_exists(dav_db *db, dav_datum key)
{
int exists;
+ sdbm_datum value = sdbm_fetch(db->file, D2G(key));
-#ifdef DAV_USE_GDBM
- exists = gdbm_exists(db->file, D2G(key)) != 0;
-#else
- {
- datum value = sdbm_fetch(db->file, D2G(key));
- sdbm_clearerr(db->file); /* unneeded */
- exists = value.dptr != NULL;
- }
-#endif
+ sdbm_clearerr(db->file); /* unneeded */
+ exists = value.dptr != NULL;
+
return exists;
}
static dav_error * dav_dbm_firstkey(dav_db *db, dav_datum *pkey)
{
- *(datum *) pkey = DAV_DBM_FIRSTKEY(db->file);
+ *(sdbm_datum *) pkey = sdbm_firstkey(db->file);
/* we don't need the error; we have *pkey to tell */
- DAV_DBM_CLEARERR(db->file);
+ sdbm_clearerr(db->file);
return NULL;
}
static dav_error * dav_dbm_nextkey(dav_db *db, dav_datum *pkey)
{
- *(datum *) pkey = DAV_DBM_NEXTKEY(db->file, D2G(*pkey));
+ *(sdbm_datum *) pkey = sdbm_nextkey(db->file);
/* we don't need the error; we have *pkey to tell */
- DAV_DBM_CLEARERR(db->file);
+ sdbm_clearerr(db->file);
return NULL;
}
static void dav_dbm_freedatum(dav_db *db, dav_datum data)
{
- DAV_DBM_FREEDATUM(db, data);
+ /* nothing */
}
const dav_hooks_db dav_hooks_db_dbm =