1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251876Speter * contributor license agreements. See the NOTICE file distributed with 3251876Speter * this work for additional information regarding copyright ownership. 4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251876Speter * (the "License"); you may not use this file except in compliance with 6251876Speter * the License. You may obtain a copy of the License at 7251876Speter * 8251876Speter * http://www.apache.org/licenses/LICENSE-2.0 9251876Speter * 10251876Speter * Unless required by applicable law or agreed to in writing, software 11251876Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251876Speter * See the License for the specific language governing permissions and 14251876Speter * limitations under the License. 15251876Speter */ 16251876Speter 17251876Speter#include "apr_strings.h" 18251876Speter#define APR_WANT_MEMFUNC 19251876Speter#define APR_WANT_STRFUNC 20251876Speter#include "apr_want.h" 21251876Speter 22251876Speter#include "apu_config.h" 23251876Speter#include "apu.h" 24251876Speter 25251876Speter#if APU_HAVE_SDBM 26251876Speter 27251876Speter#include "apr_dbm_private.h" 28251876Speter#include "apr_sdbm.h" 29251876Speter 30251876Speter#define APR_DBM_DBMODE_RO (APR_FOPEN_READ | APR_FOPEN_BUFFERED) 31251876Speter#define APR_DBM_DBMODE_RW (APR_FOPEN_READ | APR_FOPEN_WRITE) 32251876Speter#define APR_DBM_DBMODE_RWCREATE (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE) 33251876Speter#define APR_DBM_DBMODE_RWTRUNC (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE | \ 34251876Speter APR_FOPEN_TRUNCATE) 35251876Speter 36251876Speterstatic apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said) 37251876Speter{ 38251876Speter dbm->errcode = dbm_said; 39251876Speter 40251876Speter if (dbm_said != APR_SUCCESS) { 41251876Speter dbm->errmsg = apr_psprintf(dbm->pool, "%pm", &dbm_said); 42251876Speter } else { 43251876Speter dbm->errmsg = NULL; 44251876Speter } 45251876Speter 46251876Speter return dbm_said; 47251876Speter} 48251876Speter 49251876Speter/* -------------------------------------------------------------------------- 50251876Speter** 51251876Speter** DEFINE THE VTABLE FUNCTIONS FOR SDBM 52251876Speter*/ 53251876Speter 54251876Speterstatic apr_status_t vt_sdbm_open(apr_dbm_t **pdb, const char *pathname, 55251876Speter apr_int32_t mode, apr_fileperms_t perm, 56251876Speter apr_pool_t *pool) 57251876Speter{ 58251876Speter apr_sdbm_t *file; 59251876Speter int dbmode; 60251876Speter 61251876Speter *pdb = NULL; 62251876Speter 63251876Speter switch (mode) { 64251876Speter case APR_DBM_READONLY: 65251876Speter dbmode = APR_DBM_DBMODE_RO; 66251876Speter break; 67251876Speter case APR_DBM_READWRITE: 68251876Speter dbmode = APR_DBM_DBMODE_RW; 69251876Speter break; 70251876Speter case APR_DBM_RWCREATE: 71251876Speter dbmode = APR_DBM_DBMODE_RWCREATE; 72251876Speter break; 73251876Speter case APR_DBM_RWTRUNC: 74251876Speter dbmode = APR_DBM_DBMODE_RWTRUNC; 75251876Speter break; 76251876Speter default: 77251876Speter return APR_EINVAL; 78251876Speter } 79251876Speter 80251876Speter { 81251876Speter apr_status_t rv; 82251876Speter 83251876Speter rv = apr_sdbm_open(&file, pathname, dbmode, perm, pool); 84251876Speter if (rv != APR_SUCCESS) 85251876Speter return rv; 86251876Speter } 87251876Speter 88251876Speter /* we have an open database... return it */ 89251876Speter *pdb = apr_pcalloc(pool, sizeof(**pdb)); 90251876Speter (*pdb)->pool = pool; 91251876Speter (*pdb)->type = &apr_dbm_type_sdbm; 92251876Speter (*pdb)->file = file; 93251876Speter 94251876Speter /* ### register a cleanup to close the DBM? */ 95251876Speter 96251876Speter return APR_SUCCESS; 97251876Speter} 98251876Speter 99251876Speterstatic void vt_sdbm_close(apr_dbm_t *dbm) 100251876Speter{ 101251876Speter apr_sdbm_close(dbm->file); 102251876Speter} 103251876Speter 104251876Speterstatic apr_status_t vt_sdbm_fetch(apr_dbm_t *dbm, apr_datum_t key, 105251876Speter apr_datum_t *pvalue) 106251876Speter{ 107251876Speter apr_status_t rv; 108251876Speter apr_sdbm_datum_t kd, rd; 109251876Speter 110251876Speter kd.dptr = key.dptr; 111251876Speter kd.dsize = (int)key.dsize; 112251876Speter 113251876Speter rv = apr_sdbm_fetch(dbm->file, &rd, kd); 114251876Speter 115251876Speter pvalue->dptr = rd.dptr; 116251876Speter pvalue->dsize = rd.dsize; 117251876Speter 118251876Speter /* store the error info into DBM, and return a status code. Also, note 119251876Speter that *pvalue should have been cleared on error. */ 120251876Speter return set_error(dbm, rv); 121251876Speter} 122251876Speter 123251876Speterstatic apr_status_t vt_sdbm_store(apr_dbm_t *dbm, apr_datum_t key, 124251876Speter apr_datum_t value) 125251876Speter{ 126251876Speter apr_status_t rv; 127251876Speter apr_sdbm_datum_t kd, vd; 128251876Speter 129251876Speter kd.dptr = key.dptr; 130251876Speter kd.dsize = (int)key.dsize; 131251876Speter 132251876Speter vd.dptr = value.dptr; 133251876Speter vd.dsize = (int)value.dsize; 134251876Speter 135251876Speter rv = apr_sdbm_store(dbm->file, kd, vd, APR_SDBM_REPLACE); 136251876Speter 137251876Speter /* store any error info into DBM, and return a status code. */ 138251876Speter return set_error(dbm, rv); 139251876Speter} 140251876Speter 141251876Speterstatic apr_status_t vt_sdbm_del(apr_dbm_t *dbm, apr_datum_t key) 142251876Speter{ 143251876Speter apr_status_t rv; 144251876Speter apr_sdbm_datum_t kd; 145251876Speter 146251876Speter kd.dptr = key.dptr; 147251876Speter kd.dsize = (int)key.dsize; 148251876Speter 149251876Speter rv = apr_sdbm_delete(dbm->file, kd); 150251876Speter 151251876Speter /* store any error info into DBM, and return a status code. */ 152251876Speter return set_error(dbm, rv); 153251876Speter} 154251876Speter 155251876Speterstatic int vt_sdbm_exists(apr_dbm_t *dbm, apr_datum_t key) 156251876Speter{ 157251876Speter int exists; 158251876Speter apr_sdbm_datum_t vd, kd; 159251876Speter 160251876Speter kd.dptr = key.dptr; 161251876Speter kd.dsize = (int)key.dsize; 162251876Speter 163251876Speter if (apr_sdbm_fetch(dbm->file, &vd, kd) != APR_SUCCESS) 164251876Speter exists = 0; 165251876Speter else 166251876Speter exists = vd.dptr != NULL; 167251876Speter 168251876Speter return exists; 169251876Speter} 170251876Speter 171251876Speterstatic apr_status_t vt_sdbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey) 172251876Speter{ 173251876Speter apr_status_t rv; 174251876Speter apr_sdbm_datum_t rd; 175251876Speter 176251876Speter rv = apr_sdbm_firstkey(dbm->file, &rd); 177251876Speter 178251876Speter pkey->dptr = rd.dptr; 179251876Speter pkey->dsize = rd.dsize; 180251876Speter 181251876Speter /* store any error info into DBM, and return a status code. */ 182251876Speter return set_error(dbm, rv); 183251876Speter} 184251876Speter 185251876Speterstatic apr_status_t vt_sdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey) 186251876Speter{ 187251876Speter apr_sdbm_datum_t rd; 188251876Speter 189251876Speter (void)apr_sdbm_nextkey(dbm->file, &rd); 190251876Speter 191251876Speter pkey->dptr = rd.dptr; 192251876Speter pkey->dsize = rd.dsize; 193251876Speter 194251876Speter /* store any error info into DBM, and return a status code. */ 195251876Speter return set_error(dbm, APR_SUCCESS); 196251876Speter} 197251876Speter 198251876Speterstatic void vt_sdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data) 199251876Speter{ 200251876Speter} 201251876Speter 202251876Speterstatic void vt_sdbm_usednames(apr_pool_t *pool, const char *pathname, 203251876Speter const char **used1, const char **used2) 204251876Speter{ 205251876Speter *used1 = apr_pstrcat(pool, pathname, APR_SDBM_DIRFEXT, NULL); 206251876Speter *used2 = apr_pstrcat(pool, pathname, APR_SDBM_PAGFEXT, NULL); 207251876Speter} 208251876Speter 209251876SpeterAPU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_sdbm = { 210251876Speter "sdbm", 211251876Speter vt_sdbm_open, 212251876Speter vt_sdbm_close, 213251876Speter vt_sdbm_fetch, 214251876Speter vt_sdbm_store, 215251876Speter vt_sdbm_del, 216251876Speter vt_sdbm_exists, 217251876Speter vt_sdbm_firstkey, 218251876Speter vt_sdbm_nextkey, 219251876Speter vt_sdbm_freedatum, 220251876Speter vt_sdbm_usednames 221251876Speter}; 222251876Speter 223251876Speter#endif /* APU_HAVE_SDBM */ 224