dbm.c revision f4c310fd2555c6faca1f980f00b161eadb089023
/*
** Copyright (C) 1998-2000 Greg Stein. All Rights Reserved.
**
** By using this file, you agree to the terms and conditions set forth in
** the LICENSE.html file which can be found at the top level of the mod_dav
** distribution or at http://www.webdav.org/mod_dav/license-1.html.
**
** Contact information:
** Greg Stein, PO Box 760, Palo Alto, CA, 94302
** gstein@lyra.org, http://www.webdav.org/mod_dav/
*/
/*
** DAV extension module for Apache 1.3.*
** - Database support using DBM-style databases,
** part of the filesystem repository implementation
**
** Written by Greg Stein, gstein@lyra.org, http://www.lyra.org/
*/
/*
** This implementation uses a SDBM or GDBM 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
** database is equivalent to the target filename, and is
** DAV_FS_STATE_FILE_FOR_DIR (.state_for_dir) for the directory itself.
*/
#ifdef DAV_USE_GDBM
#include <gdbm.h>
#else
#include <fcntl.h> /* for O_RDONLY, O_WRONLY */
#endif
#include "mod_dav.h"
#include "dav_fs_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_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 */
#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_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 {
};
{
char *work;
#ifndef DAV_USE_GDBM
#endif
#ifdef DAV_USE_GDBM
#else
{
int extension;
/* we know the extension is 4 characters -- len(DIRFEXT) */
}
#endif
}
{
int save_errno = errno;
int errcode;
const char *errstr;
#ifdef DAV_USE_GDBM
#else
/* There might not be a <db> if we had problems creating it. */
if (errcode)
errstr = "I/O error occurred.";
else
errstr = "No error.";
#endif
return err;
}
/* ensure that our state subdirectory is present */
/* ### does this belong here or in dav_fs_repos.c ?? */
{
/* ### do we need to deal with the umask? */
/* just try to make it, ignoring any resulting errors */
}
/* dav_dbm_open_direct: Opens a *dbm database specified by path.
* ro = boolean read-only flag.
*/
{
/* NOTE: stupid cast to get rid of "const" on the pathname */
#ifdef DAV_USE_GDBM
0,
NULL);
#else
#endif
/* we can't continue if we couldn't open the file and we need to write */
return dav_fs_dbm_error(NULL, p);
}
/* may be NULL if we tried to open a non-existent db as read-only */
/* we have an open database... return it */
}
return NULL;
}
{
const char *dirpath;
const char *fname;
const char *pathname;
/* Get directory and filename for resource */
/* If not opening read-only, ensure the state dir exists */
if (!ro) {
/* ### what are the perf implications of always checking this? */
}
pathname = ap_pstrcat(p,
NULL);
/* ### readers cannot open while a writer has this open; we should
### perform a few retries with random pauses. */
/* ### do we need to deal with the umask? */
}
{
}
{
/* we don't need the error; we have *pvalue to tell */
return NULL;
}
{
int rv;
/* ### fetch more specific error information? */
/* we don't need the error; we have rv to tell */
if (rv == -1) {
}
return NULL;
}
{
int rv;
/* ### fetch more specific error information? */
/* we don't need the error; we have rv to tell */
if (rv == -1) {
}
return NULL;
}
{
int exists;
#ifdef DAV_USE_GDBM
#else
{
}
#endif
return exists;
}
{
/* we don't need the error; we have *pkey to tell */
return NULL;
}
{
/* we don't need the error; we have *pkey to tell */
return NULL;
}
{
}
const dav_hooks_db dav_hooks_db_dbm =
{
};