You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.3 KiB

// 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);
}