new file mode 100644
--- /dev/null
+++ b/src/database.c
@@ -0,0 +1,150 @@
+/**
+ * $Id: database.c 108 2008-04-17 01:01:52Z mbroeker $
+ * $URL: http://localhost/svn/c/mcbot/trunk/src/database.c $
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gdbm.h>
+
+#include <database.h>
+
+char *db_insert (char *file_name, char *name, char *msg, int mode)
+{
+ GDBM_FILE dbf;
+ datum key;
+ datum content;
+ int ret;
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_WRCREAT, 0644, 0)) == NULL)
+ return "db_insert error";
+
+ key.dptr = name;
+ key.dsize = strlen (name) + 1;
+
+ content.dptr = msg;
+ content.dsize = strlen (msg) + 1;
+
+ if (mode)
+ ret = gdbm_store (dbf, key, content, GDBM_REPLACE);
+ else
+ ret = gdbm_store (dbf, key, content, GDBM_INSERT);
+
+ gdbm_close (dbf);
+
+ if (!ret)
+ return "Key added";
+
+ return "error: key not added";
+}
+
+char *db_remove (char *file_name, char *name)
+{
+ GDBM_FILE dbf;
+ datum key;
+ int ret;
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_WRITER, 0, 0)) == NULL)
+ return "db_remove error";
+
+ key.dptr = name;
+ key.dsize = strlen (name) + 1;
+
+ ret = gdbm_delete (dbf, key);
+
+ gdbm_close (dbf);
+
+ if (!ret)
+ return "Key removed";
+ return "error: key not removed";
+}
+
+char *db_lookup (char *file_name, char *entry)
+{
+ GDBM_FILE dbf;
+ datum content;
+ datum key;
+ static char msg[513];
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_READER, 0, 0)) == NULL)
+ return "db_lookup error";
+
+ key.dptr = entry;
+ key.dsize = strlen (entry) + 1;
+
+ content = gdbm_fetch (dbf, key);
+ if (content.dptr != NULL)
+ snprintf (msg, 512, "%s", content.dptr);
+ else
+ snprintf (msg, 512, "I haven't heard anything about %s.", entry);
+
+ gdbm_close (dbf);
+ return msg;
+}
+
+char *db_elements (char *file_name)
+{
+ GDBM_FILE dbf;
+ datum key;
+ int count;
+ static char msg[81];
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_READER, 0, 0)) == NULL)
+ return "db_lookup error";
+
+ key = gdbm_firstkey (dbf);
+
+ count = 0;
+ while (key.dptr != NULL) {
+ key = gdbm_nextkey (dbf, key);
+ count++;
+ }
+
+ gdbm_close (dbf);
+ snprintf (msg, 80, "I am holding %d %s in my database.", count, (count > 0) ? "rows" : "row");
+ return msg;
+}
+
+char *db_list (char *file_name)
+{
+ GDBM_FILE dbf;
+ datum content;
+ datum key;
+ static char msg[81];
+ int count;
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_READER, 0, 0)) == NULL)
+ return "db_list error";
+
+ key = gdbm_firstkey (dbf);
+
+ count = 0;
+ while (key.dptr) {
+ content = gdbm_fetch (dbf, key);
+ printf ("%11s: %s\n", key.dptr, content.dptr);
+ free (content.dptr);
+ key = gdbm_nextkey (dbf, key);
+ count++;
+ }
+
+ gdbm_close (dbf);
+ snprintf (msg, 80, "I am holding %d %s in my database.", count, (count > 0) ? "rows" : "row");
+ return msg;
+}
+
+char *db_vaccuum (char *file_name)
+{
+ GDBM_FILE dbf;
+ static char msg[81];
+
+ if ((dbf = gdbm_open (file_name, 512, GDBM_WRITER, 0, 0)) == NULL)
+ return "db_vaccuum error";
+
+ gdbm_reorganize (dbf);
+
+ gdbm_close (dbf);
+ snprintf (msg, 80, "I reorganized the database.");
+ return msg;
+}