/* Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ /* configure all options BEFORE including system stuff. */ #include "config.h" #ifdef DB_GDBMFILE #ifdef WIN32 #include "gdbm.h" #else #include <gdbm.h> #endif #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, S_IREAD | S_IWRITE, 0)) == (GDBM_FILE) 0) { log_printf ("db_init cannot dbm_open ", dbfile, " ", (char *) -1, "\n", (char *) 0); return (1); } db_initted = 1; return (0); } int dgdb_initted () { return (db_initted); } int dgdb_setfile (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) log_printf ("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) { log_printf ("db_put: can't allocate mem for object ", nam, " ", (char *) -1, "\n", (char *) 0); return (1); } if (oiftoSTRING (obj, dat.dptr, nam, dat.dsize)) { log_printf ("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)) { log_printf ("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)) { log_printf ("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) { log_printf ("attempt to backup unopened database\n", (char *) 0); return (1); } fd = open (file, O_WRONLY | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE); if (fd == -1) { log_printf ("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)) log_printf ("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