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.

124 lines
2.3 KiB

//
// WordDead.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>
//
// $Id: WordDead.cc,v 1.4 2004/05/28 13:15:26 lha Exp $
//
#ifdef HAVE_CONFIG_H
#include "htconfig.h"
#endif /* HAVE_CONFIG_H */
#include <fcntl.h>
#include "WordDead.h"
#include "WordListOne.h"
class WordDeadCursor {
public:
WordDBCursor* cursor;
};
WordDead::~WordDead()
{
delete db;
delete mask;
}
int WordDead::Initialize(WordList* nwords)
{
words = nwords;
db = new WordDB(nwords->GetContext()->GetDBInfo());
mask = new WordKey(words->GetContext());
return OK;
}
int WordDead::Open()
{
const String& filename = words->Filename();
int flags = words->Flags();
db->set_pagesize(words->Pagesize());
return db->Open(filename, "dead", DB_BTREE, flags, 0666, WORD_DB_DEAD) == 0 ? OK : NOTOK;
}
int WordDead::Remove()
{
return db->Remove(words->Filename(), "dead") == 0 ? OK : NOTOK;
}
int WordDead::Close()
{
return db->Close() == 0 ? OK : NOTOK;
}
int WordDead::Normalize(WordKey& key) const
{
int nfields = words->GetContext()->GetKeyInfo().nfields;
int i;
//
// Undefine in 'key' all fields not defined in 'mask'
//
for(i = 0; i < nfields; i++) {
if(!mask->IsDefined(i))
key.Set(i, WORD_KEY_VALUE_INVALID);
}
return OK;
}
int WordDead::Exists(const WordKey& key) const
{
WordKey tmp_key = key;
Normalize(tmp_key);
String coded;
String dummy;
tmp_key.Pack(coded);
return db->Get(0, coded, dummy, 0) == 0;
}
int WordDead::Put(const WordKey& key) const
{
WordKey tmp_key = key;
Normalize(tmp_key);
String coded;
String dummy;
tmp_key.Pack(coded);
return db->Put(0, coded, dummy, 0) == 0 ? OK : NOTOK;
}
WordDeadCursor* WordDead::Cursor() const
{
WordDeadCursor* cursor = new WordDeadCursor;
cursor->cursor = db->Cursor();
return cursor;
}
int WordDead::Next(WordDeadCursor* cursor, WordKey& key)
{
String coded;
String dummy;
int ret = cursor->cursor->Get(coded, dummy, DB_NEXT);
if(ret != 0) {
delete cursor->cursor;
delete cursor;
} else {
key.Unpack(coded);
}
return ret;
}