summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc97
1 files changed, 97 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc b/debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc
new file mode 100644
index 00000000..b4fb1225
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htword/WordDBInfo.cc
@@ -0,0 +1,97 @@
+// WordDBInfo.cc
+//
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1999-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+//
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "db.h"
+#include "WordDBInfo.h"
+
+//
+// WordDBInfo implementation
+//
+
+WordDBInfo* WordDBInfo::instance = 0;
+
+//
+// Like standard function but allows easy breakpoint setting.
+//
+static void message(const char *errpfx, char *msg)
+{
+ fprintf(stderr, "%s: %s\n", errpfx, msg);
+}
+
+WordDBInfo::WordDBInfo(const Configuration& config)
+{
+ dbenv = 0;
+
+ if(config.Boolean("wordlist_env_skip")) return;
+
+ int error;
+ if((error = CDB_db_env_create(&dbenv, 0)) != 0) {
+ fprintf(stderr, "WordDBInfo: CDB_db_env_create %s\n", CDB_db_strerror(error));
+ return;
+ }
+ dbenv->set_errpfx(dbenv, "WordDB");
+ dbenv->set_errcall(dbenv, message);
+ if(dbenv->set_verbose(dbenv, DB_VERB_CHKPOINT, 1) != 0)
+ return;
+ if(dbenv->set_verbose(dbenv, DB_VERB_DEADLOCK, 1) != 0)
+ return;
+ if(dbenv->set_verbose(dbenv, DB_VERB_RECOVERY, 1) != 0)
+ return;
+ if(dbenv->set_verbose(dbenv, DB_VERB_WAITSFOR, 1) != 0)
+ return;
+ int cache_size = config.Value("wordlist_cache_size", 10*1024*1024);
+ if(cache_size > 0) {
+ if(dbenv->set_cachesize(dbenv, 0, cache_size, 1) != 0)
+ return;
+ }
+
+ char* dir = 0;
+ int flags = DB_CREATE;
+ if(config.Boolean("wordlist_env_share")) {
+ const String& env_dir = config["wordlist_env_dir"];
+ if(env_dir.empty()) {
+ fprintf(stderr, "WordDB: wordlist_env_dir not specified\n");
+ return;
+ }
+ dir = strdup((const char*)env_dir);
+
+ if(config.Boolean("wordlist_env_cdb"))
+ flags |= DB_INIT_CDB;
+ else
+ flags |= DB_INIT_LOCK | DB_INIT_MPOOL;
+
+ } else {
+ flags |= DB_PRIVATE | DB_INIT_LOCK | DB_INIT_MPOOL;
+ }
+
+ if((error = dbenv->open(dbenv, (const char*)dir, NULL, flags, 0666)) != 0)
+ dbenv->err(dbenv, error, "open %s", (dir ? dir : ""));
+ if(dir) free(dir);
+}
+
+WordDBInfo::~WordDBInfo()
+{
+ if(dbenv) dbenv->close(dbenv, 0);
+}
+
+void
+WordDBInfo::Initialize(const Configuration &config_arg)
+{
+ if(instance != 0)
+ delete instance;
+ instance = new WordDBInfo(config_arg);
+}