📄 apr_dbm.c
字号:
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */#include "apr.h"#include "apr_errno.h"#include "apr_pools.h"#include "apr_strings.h"#include "apu_select_dbm.h"#include "apr_dbm.h"/* this is used in a few places to define a noop "function". it is needed to stop "no effect" warnings from GCC. */#define NOOP_FUNCTION if (0) ; else/* some of the DBM functions take a POSIX mode for creating files. use this. */#define POSIX_FILEMODE 0660#if APU_USE_SDBM#include "apr_sdbm.h"typedef SDBM *real_file_t;typedef sdbm_datum *cvt_datum_t;#define CONVERT_DATUM(cvt, pinput) ((cvt) = (sdbm_datum *)(pinput))typedef sdbm_datum result_datum_t;#define RETURN_DATUM(poutput, rd) (*(poutput) = *(apr_datum_t *)&(rd))#define APR_DBM_CLOSE(f) sdbm_close(f)#define APR_DBM_FETCH(f, k, v) ((v) = sdbm_fetch(f, *(k)), APR_SUCCESS)#define APR_DBM_STORE(f, k, v) sdbm_store(f, *(k), *(v), SDBM_REPLACE)#define APR_DBM_DELETE(f, k) sdbm_delete(f, *(k))#define APR_DBM_FIRSTKEY(f, k) ((k) = sdbm_firstkey(f), APR_SUCCESS)#define APR_DBM_NEXTKEY(f, k, nk) ((nk) = sdbm_nextkey(f), APR_SUCCESS)#define APR_DBM_FREEDPTR(dptr) NOOP_FUNCTION#define APR_DBM_DBMODE_RO APR_READ#define APR_DBM_DBMODE_RW (APR_READ | APR_WRITE)#define APR_DBM_DBMODE_RWCREATE (APR_READ | APR_WRITE | APR_CREATE)#elif APU_USE_GDBM#include <gdbm.h>#include <stdlib.h> /* for free() */typedef GDBM_FILE real_file_t;typedef datum *cvt_datum_t;#define CONVERT_DATUM(cvt, pinput) ((cvt) = (datum *)(pinput))typedef datum result_datum_t;#define RETURN_DATUM(poutput, rd) (*(poutput) = *(apr_datum_t *)&(rd))#define APR_DBM_CLOSE(f) gdbm_close(f)#define APR_DBM_FETCH(f, k, v) ((v) = gdbm_fetch(f, *(k)), APR_SUCCESS)#define APR_DBM_STORE(f, k, v) g2s(gdbm_store(f, *(k), *(v), GDBM_REPLACE))#define APR_DBM_DELETE(f, k) g2s(gdbm_delete(f, *(k)))#define APR_DBM_FIRSTKEY(f, k) ((k) = gdbm_firstkey(f), APR_SUCCESS)#define APR_DBM_NEXTKEY(f, k, nk) ((nk) = gdbm_nextkey(f, *(k)), APR_SUCCESS)#define APR_DBM_FREEDPTR(dptr) ((dptr) ? free(dptr) : 0)#define NEEDS_CLEANUP#define APR_DBM_DBMODE_RO GDBM_READER#define APR_DBM_DBMODE_RW GDBM_WRITER#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT/* map a GDBM error to an apr_status_t */static apr_status_t g2s(int gerr){ if (gerr == -1) { /* ### need to fix this */ return APR_EGENERAL; } return APR_SUCCESS;}#elif APU_USE_DB/* * We pick up all varieties of Berkeley DB through db.h (included through * apu_select_dbm.h). This code has been compiled/tested against DB1, * DB_185, DB2, and DB3. */#if defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 3)#define DB_VER 3#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 2)#define DB_VER 2#else#define DB_VER 1#endiftypedef struct { DB *bdb;#if DB_VER != 1 DBC *curs;#endif} real_file_t;typedef DBT cvt_datum_t;#define CONVERT_DATUM(cvt, pinput) (memset(&(cvt), 0, sizeof(cvt)), \ (cvt).data = (pinput)->dptr, \ (cvt).size = (pinput)->dsize)typedef DBT result_datum_t;#define RETURN_DATUM(poutput, rd) ((poutput)->dptr = (rd).data, \ (poutput)->dsize = (rd).size)#if DB_VER == 1#define TXN_ARG#else#define TXN_ARG NULL,#endif#if DB_VER == 1#define APR_DBM_CLOSE(f) ((*(f).bdb->close)((f).bdb))#else#define APR_DBM_CLOSE(f) ((*(f).bdb->close)((f).bdb, 0))#endif#define do_fetch(f, k, v) ((*(f)->get)(f, TXN_ARG &(k), &(v), 0))#define APR_DBM_FETCH(f, k, v) db2s(do_fetch((f).bdb, k, v))#define APR_DBM_STORE(f, k, v) db2s((*(f).bdb->put)((f).bdb, TXN_ARG &(k), &(v), 0))#define APR_DBM_DELETE(f, k) db2s((*(f).bdb->del)((f).bdb, TXN_ARG &(k), 0))#define APR_DBM_FIRSTKEY(f, k) do_firstkey(&(f), &(k))#define APR_DBM_NEXTKEY(f, k, nk) do_nextkey(&(f), &(k), &(nk))#define APR_DBM_FREEDPTR(dptr) NOOP_FUNCTION#if DB_VER == 1#include <sys/fcntl.h>#define APR_DBM_DBMODE_RO O_RDONLY#define APR_DBM_DBMODE_RW O_RDWR#define APR_DBM_DBMODE_RWCREATE (O_CREAT | O_RDWR)#else#define APR_DBM_DBMODE_RO DB_RDONLY#define APR_DBM_DBMODE_RW 0#define APR_DBM_DBMODE_RWCREATE DB_CREATE#endif/* map a DB error to an apr_status_t */static apr_status_t db2s(int dberr){ if (dberr != 0) { /* ### need to fix this */ return APR_EGENERAL; } return APR_SUCCESS;}/* handle the FIRSTKEY functionality */static apr_status_t do_firstkey(real_file_t *f, DBT *pkey){ int dberr; DBT data;#if DB_VER == 1 dberr = (*f->bdb->seq)(f->bdb, pkey, &data, R_FIRST);#else if ((dberr = (*f->bdb->cursor)(f->bdb, NULL, &f->curs#if DB_VER == 3 , 0#endif )) == 0) { dberr = (*f->curs->c_get)(f->curs, pkey, &data, DB_FIRST); if (dberr == DB_NOTFOUND) { memset(pkey, 0, sizeof(*pkey)); (*f->curs->c_close)(f->curs); f->curs = NULL; return APR_SUCCESS; } }#endif return db2s(dberr);}/* handle the NEXTKEY functionality */static apr_status_t do_nextkey(real_file_t *f, DBT *pkey, DBT *pnext){ int dberr; DBT data;#if DB_VER == 1 dberr = (*f->bdb->seq)(f->bdb, pkey, &data, R_NEXT);#else if (f->curs == NULL) return APR_EINVAL; dberr = (*f->curs->c_get)(f->curs, pkey, &data, DB_NEXT); if (dberr == DB_NOTFOUND) { memset(pkey, 0, sizeof(*pkey)); (*f->curs->c_close)(f->curs); f->curs = NULL; return APR_SUCCESS; }#endif return db2s(dberr);}#else#error a DBM implementation was not specified#endifstruct apr_dbm_t{ apr_pool_t *pool; real_file_t file; int errcode; const char *errmsg;};#ifdef NEEDS_CLEANUPstatic apr_status_t datum_cleanup(void *dptr){ APR_DBM_FREEDPTR(dptr); return APR_SUCCESS;}#define REGISTER_CLEANUP(dbm, pdatum) \ if ((pdatum)->dptr) \ apr_pool_cleanup_register((dbm)->pool, (pdatum)->dptr, \ datum_cleanup, apr_pool_cleanup_null); \ else#else /* NEEDS_CLEANUP */#define REGISTER_CLEANUP(dbm, pdatum) NOOP_FUNCTION#endif /* NEEDS_CLEANUP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -