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.
164 lines
4.3 KiB
164 lines
4.3 KiB
3 years ago
|
//
|
||
|
// WordCursorOne.h
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// search and retrieve entries in a WordListOne object.
|
||
|
//
|
||
|
// SYNOPSIS
|
||
|
//
|
||
|
// #include <WordList.h>
|
||
|
//
|
||
|
// int callback(WordList *, WordDBCursor& , const WordReference *, Object &)
|
||
|
// {
|
||
|
// ...
|
||
|
// }
|
||
|
//
|
||
|
// Object* data = ...
|
||
|
//
|
||
|
// WordList *words = ...;
|
||
|
//
|
||
|
// WordCursor *search = words->Cursor(callback, data);
|
||
|
// WordCursor *search = words->Cursor(WordKey("word <UNDEF> <UNDEF>"));
|
||
|
// WordCursor *search = words->Cursor(WordKey("word <UNDEF> <UNDEF>"), callback, data);
|
||
|
// WordCursor *search = words->Cursor(WordKey());
|
||
|
//
|
||
|
// ...
|
||
|
//
|
||
|
// if(search->Walk() == NOTOK) bark;
|
||
|
// List* results = search->GetResults();
|
||
|
//
|
||
|
// search->WalkInit();
|
||
|
// if(search->WalkNext() == OK)
|
||
|
// dosomething(search->GetFound());
|
||
|
// search->WalkFinish();
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// WordCursorOne is a WordCursor derived class that implements search
|
||
|
// in a WordListOne object. It currently is the only derived class of
|
||
|
// the WordCursor object. Most of its behaviour is described in the
|
||
|
// WordCursor manual page, only the behaviour specific to WordCursorOne
|
||
|
// is documented here.
|
||
|
//
|
||
|
//
|
||
|
// END
|
||
|
//
|
||
|
// 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: WordCursorOne.h,v 1.4 2004/05/28 13:15:26 lha Exp $
|
||
|
//
|
||
|
|
||
|
#ifndef _WordCursorOne_h_
|
||
|
#define _WordCursorOne_h_
|
||
|
|
||
|
#ifndef SWIG
|
||
|
#include "htString.h"
|
||
|
#include "WordKey.h"
|
||
|
#include "WordDB.h"
|
||
|
#include "WordCursor.h"
|
||
|
|
||
|
class WordList;
|
||
|
class WordDBCursor;
|
||
|
#endif /* SWIG */
|
||
|
|
||
|
class WordCursorOne : public WordCursor
|
||
|
{
|
||
|
public:
|
||
|
#ifndef SWIG
|
||
|
//-
|
||
|
// Private constructor. Creator of the object must then call Initialize()
|
||
|
// prior to using any other methods.
|
||
|
//
|
||
|
WordCursorOne(WordList *words);
|
||
|
//-
|
||
|
// Private constructor. See WordList::Cursor method with same prototype for
|
||
|
// description.
|
||
|
//
|
||
|
WordCursorOne(WordList *words, wordlist_walk_callback_t callback, Object * callback_data);
|
||
|
//-
|
||
|
// Private constructor. See WordList::Cursor method with same prototype for
|
||
|
// description.
|
||
|
//
|
||
|
WordCursorOne(WordList *words, const WordKey &searchKey, int action = HTDIG_WORDLIST_WALKER);
|
||
|
//-
|
||
|
// Private constructor. See WordList::Cursor method with same prototype for
|
||
|
// description.
|
||
|
//
|
||
|
WordCursorOne(WordList *words, const WordKey &searchKey, wordlist_walk_callback_t callback, Object * callback_data);
|
||
|
#endif /* SWIG */
|
||
|
virtual ~WordCursorOne() {
|
||
|
if(cursor) delete cursor;
|
||
|
}
|
||
|
virtual void Clear();
|
||
|
virtual void ClearInternal();
|
||
|
virtual void ClearResult();
|
||
|
|
||
|
virtual inline int ContextSave(String& buffer) const { found.Get(buffer); return OK; }
|
||
|
virtual int ContextRestore(const String& buffer);
|
||
|
|
||
|
#ifndef SWIG
|
||
|
virtual int Walk();
|
||
|
#endif /* SWIG */
|
||
|
virtual int WalkInit();
|
||
|
virtual int WalkRewind();
|
||
|
virtual int WalkNext();
|
||
|
#ifndef SWIG
|
||
|
virtual int WalkNextStep();
|
||
|
#endif /* SWIG */
|
||
|
virtual int WalkFinish();
|
||
|
//
|
||
|
// Find out if cursor should better jump to the next possible key
|
||
|
// (DB_SET_RANGE) instead of sequential iterating (DB_NEXT). If it
|
||
|
// is decided that jump is a better move : cursor_set_flags =
|
||
|
// DB_SET_RANGE key = calculated next possible key Else do nothing
|
||
|
// Return OK if skipping successfull. Returns WORD_WALK_ATEND if no
|
||
|
// more possible match, reached the maximum. Returns
|
||
|
// WORD_WALK_FAILED on general failure, occurs if called and no
|
||
|
// skipping necessary.
|
||
|
//
|
||
|
int SkipUselessSequentialWalking();
|
||
|
|
||
|
virtual int Seek(const WordKey& patch);
|
||
|
|
||
|
#ifndef SWIG
|
||
|
virtual int Get(String& bufferout) const;
|
||
|
inline String Get() const { String tmp; Get(tmp); return tmp; }
|
||
|
|
||
|
protected:
|
||
|
|
||
|
int Initialize(WordList *nwords, const WordKey &nsearchKey, wordlist_walk_callback_t ncallback, Object * ncallback_data, int naction);
|
||
|
|
||
|
//
|
||
|
// Internal state
|
||
|
//
|
||
|
//
|
||
|
// The actual Berkeley DB cursor.
|
||
|
//
|
||
|
WordDBCursor* cursor;
|
||
|
//
|
||
|
// The latest retrieved key and data
|
||
|
//
|
||
|
String key;
|
||
|
String data;
|
||
|
//
|
||
|
// The shorted prefix key computed from searchKey
|
||
|
//
|
||
|
WordKey prefixKey;
|
||
|
//
|
||
|
// WalkNext leap is either DB_NEXT or DB_SET_RANGE.
|
||
|
//
|
||
|
int cursor_get_flags;
|
||
|
//
|
||
|
// True if search key is a prefix key
|
||
|
//
|
||
|
int searchKeyIsSameAsPrefix;
|
||
|
#endif /* SWIG */
|
||
|
};
|
||
|
|
||
|
#endif /* _WordCursorOne_h_ */
|