/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
#ifndef lint
static char RCSid[] = "$Header: /home/mjr/hacks/umud/DB/RCS/gdbmchunk.c,v 1.1 92/02/09 22:59:30 mjr Exp $";
#endif
/* configure all options BEFORE including system stuff. */
#include "config.h"
#ifdef DB_GDBMFILE
#include <gdbm.h>
#include <sys/file.h>
#include "mud.h"
/*
gdbm-based object storage routines. Just store the objects in the gdbm
database with their name as the key.
*/
static char *dbfile = DEFAULT_GDBMCHUNKFILE;
static int db_initted = 0;
static GDBM_FILE dbp = (GDBM_FILE)0;
int
dgdb_init()
{
if((dbp = gdbm_open(dbfile,0,GDBM_WRCREAT,0600,0)) == (GDBM_FILE)0) {
logf("db_init cannot dbm_open ",dbfile," ",(char *)-1,"\n",(char *)0);
return(1);
}
db_initted = 1;
return(0);
}
dgdb_initted()
{
return(db_initted);
}
dgdb_setfile(fil)
char *fil;
{
char *xp;
if(db_initted)
return(1);
/* KNOWN memory leak. can't help it. it's small */
xp = malloc((unsigned)strlen(fil) + 1);
if(xp == (char *)0)
return(1);
(void)strcpy(xp,fil);
dbfile = xp;
return(0);
}
int
dgdb_close()
{
if(dbp != (GDBM_FILE)0) {
gdbm_close(dbp);
dbp = (GDBM_FILE)0;
}
db_initted = 0;
return(0);
}
Obj *
dgdb_get(nam)
char *nam;
{
Obj *ret;
datum key, dat;
if(!db_initted)
return((Obj *)0);
key.dptr = nam;
key.dsize = strlen(nam) + 1;
dat = gdbm_fetch(dbp,key);
if(dat.dptr == (char *)0)
return((Obj *)0);
/* if the string is badly formatted, ret == Obj * 0 */
if((ret = oiffromSTRING((char *)dat.dptr,(char *)0)) == (Obj *)0)
logf("db_get: cannot decode ",nam,"\n",(char *)0);
free((mall_t)dat.dptr);
return(ret);
}
int
dgdb_put(obj,nam)
Obj *obj;
char *nam;
{
datum key;
datum dat;
if(!db_initted)
return(1);
key.dptr = nam;
key.dsize = strlen(nam) + 1;
dat.dsize = oif_objsiz(obj,nam) + 1;
dat.dptr = malloc((unsigned)dat.dsize);
if( !dat.dptr ) {
logf("db_put: can't allocate mem for object ",nam," ",(char *)-1,"\n",(char *)0);
return(1);
}
if( oiftoSTRING(obj,dat.dptr,nam,dat.dsize) ) {
logf("db_put: can't convert ",nam," to OIF",(char *)-1,"\n",(char *)0);
free((mall_t)dat.dptr);
return(1);
}
if(gdbm_store(dbp,key,dat,GDBM_REPLACE)) {
logf("db_put: can't gdbm_store ",nam," ",(char *)-1,"\n",(char *)0);
free((mall_t)dat.dptr);
return(1);
}
free((mall_t)dat.dptr);
return(0);
}
int
dgdb_check(nam)
char *nam;
{
datum key, dat;
if(!db_initted)
return(0);
key.dptr = nam;
key.dsize = strlen(nam) + 1;
dat = gdbm_fetch(dbp,key);
if(dat.dptr == (char *)0)
return(0);
free((mall_t)dat.dptr);
return(1);
}
int
dgdb_del(nam,flg)
char *nam;
int flg;
{
datum key, dat;
if(!db_initted)
return(-1);
key.dptr = nam;
key.dsize = strlen(nam) + 1;
dat = gdbm_fetch(dbp,key);
if(dat.dptr == (char *)0)
return(0);
free((mall_t)dat.dptr);
if( gdbm_delete(dbp,key) ) {
logf("db_del: can't gdbm_delete ",nam," ",(char *)-1,"\n",(char *)0);
return(1);
}
return(0);
}
static int startrav = 0;
int
dgdb_travstart()
{
startrav = 0;
return(0);
}
int
dgdb_traverse(obuf)
char *obuf;
{
char *dp;
static datum key;
if(!db_initted)
return(0);
if(!startrav) {
key = gdbm_firstkey(dbp);
startrav = 1;
} else {
dp = key.dptr;
key = gdbm_nextkey(dbp,key);
free((mall_t)dp);
}
if(key.dptr == (char *)0)
return(0);
strncpy(obuf,(char *)key.dptr,MAXOID);
return(1);
}
int
dgdb_travend()
{
startrav = 0;
return(0);
}
int
dgdb_backup(file)
char *file;
{
int fd;
datum key, dat;
char *dp;
if(!db_initted) {
logf("attempt to backup unopened database\n",(char *)0);
return(1);
}
fd = open( file, O_WRONLY|O_TRUNC|O_CREAT, 0600 );
if(fd == -1) {
logf("Cannot open backup file ",file,"\n",(char *)0);
return(1);
}
key = gdbm_firstkey(dbp);
while(key.dptr != (char *)0) {
dat = gdbm_fetch(dbp,key);
if(write(fd,dat.dptr,dat.dsize-1) != (dat.dsize-1))
logf("backup couldn't write object ",key.dptr,
"to ",file,"\n",(char *)0);
free((mall_t)dat.dptr);
dp = key.dptr;
key = gdbm_nextkey(dbp,key);
free((mall_t)dp);
}
close(fd);
return(0);
}
#endif DB_GDBMFILE