00001 // 00002 // WordCursorOne.h 00003 // 00004 // NAME 00005 // 00006 // search and retrieve entries in a WordListOne object. 00007 // 00008 // SYNOPSIS 00009 // 00010 // #include <WordList.h> 00011 // 00012 // int callback(WordList *, WordDBCursor& , const WordReference *, Object &) 00013 // { 00014 // ... 00015 // } 00016 // 00017 // Object* data = ... 00018 // 00019 // WordList *words = ...; 00020 // 00021 // WordCursor *search = words->Cursor(callback, data); 00022 // WordCursor *search = words->Cursor(WordKey("word <UNDEF> <UNDEF>")); 00023 // WordCursor *search = words->Cursor(WordKey("word <UNDEF> <UNDEF>"), callback, data); 00024 // WordCursor *search = words->Cursor(WordKey()); 00025 // 00026 // ... 00027 // 00028 // if(search->Walk() == NOTOK) bark; 00029 // List* results = search->GetResults(); 00030 // 00031 // search->WalkInit(); 00032 // if(search->WalkNext() == OK) 00033 // dosomething(search->GetFound()); 00034 // search->WalkFinish(); 00035 // 00036 // DESCRIPTION 00037 // 00038 // WordCursorOne is a WordCursor derived class that implements search 00039 // in a WordListOne object. It currently is the only derived class of 00040 // the WordCursor object. Most of its behaviour is described in the 00041 // WordCursor manual page, only the behaviour specific to WordCursorOne 00042 // is documented here. 00043 // 00044 // 00045 // END 00046 // 00047 // Part of the ht://Dig package <http://www.htdig.org/> 00048 // Copyright (c) 1999, 2000, 2001 The ht://Dig Group 00049 // For copyright details, see the file COPYING in your distribution 00050 // or the GNU General Public License version 2 or later 00051 // <http://www.gnu.org/copyleft/gpl.html> 00052 // 00053 // $Id: WordCursorOne_8h-source.html,v 1.1 2008/06/08 10:12:59 sebdiaz Exp $ 00054 // 00055 00056 #ifndef _WordCursorOne_h_ 00057 #define _WordCursorOne_h_ 00058 00059 #ifndef SWIG 00060 #include "htString.h" 00061 #include "WordKey.h" 00062 #include "WordDB.h" 00063 #include "WordCursor.h" 00064 00065 class WordList; 00066 class WordDBCursor; 00067 class WordDead; 00068 00069 #endif /* SWIG */ 00070 00071 class WordCursorOne : public WordCursor 00072 { 00073 public: 00074 #ifndef SWIG 00075 //- 00076 // Private constructor. Creator of the object must then call Initialize() 00077 // prior to using any other methods. 00078 // 00079 WordCursorOne(WordList *words); 00080 //- 00081 // Private constructor. See WordList::Cursor method with same prototype for 00082 // description. 00083 // 00084 WordCursorOne(WordList *words, wordlist_walk_callback_t callback, Object * callback_data); 00085 //- 00086 // Private constructor. See WordList::Cursor method with same prototype for 00087 // description. 00088 // 00089 WordCursorOne(WordList *words, const WordKey &searchKey, int action = HTDIG_WORDLIST_WALKER); 00090 //- 00091 // Private constructor. See WordList::Cursor method with same prototype for 00092 // description. 00093 // 00094 WordCursorOne(WordList *words, const WordKey &searchKey, wordlist_walk_callback_t callback, Object * callback_data); 00095 #endif /* SWIG */ 00096 virtual ~WordCursorOne() { 00097 if(cursor) delete cursor; 00098 } 00099 virtual void Clear(); 00100 virtual void ClearInternal(); 00101 virtual void ClearResult(); 00102 00103 virtual inline int ContextSave(String& buffer) const { found.Get(buffer); return OK; } 00104 virtual int ContextRestore(const String& buffer); 00105 00106 #ifndef SWIG 00107 virtual int Walk(); 00108 #endif /* SWIG */ 00109 virtual int WalkInit(); 00110 virtual int WalkRewind(); 00111 virtual int WalkNext(); 00112 #ifndef SWIG 00113 virtual int WalkNextStep(); 00114 #endif /* SWIG */ 00115 virtual int WalkFinish(); 00116 // 00117 // Find out if cursor should better jump to the next possible key 00118 // (DB_SET_RANGE) instead of sequential iterating (DB_NEXT). If it 00119 // is decided that jump is a better move : cursor_set_flags = 00120 // DB_SET_RANGE key = calculated next possible key Else do nothing 00121 // Return OK if skipping successfull. Returns WORD_WALK_ATEND if no 00122 // more possible match, reached the maximum. Returns 00123 // WORD_WALK_FAILED on general failure, occurs if called and no 00124 // skipping necessary. 00125 // 00126 int SkipUselessSequentialWalking(); 00127 00128 virtual int Seek(const WordKey& patch); 00129 00130 #ifndef SWIG 00131 virtual int Get(String& bufferout) const; 00132 inline String Get() const { String tmp; Get(tmp); return tmp; } 00133 00134 protected: 00135 00136 int Initialize(WordList *nwords, const WordKey &nsearchKey, wordlist_walk_callback_t ncallback, Object * ncallback_data, int naction); 00137 00138 // 00139 // Internal state 00140 // 00141 // 00142 // The actual Berkeley DB cursor. 00143 // 00144 WordDBCursor* cursor; 00145 // 00146 // The latest retrieved key and data 00147 // 00148 String key; 00149 String data; 00150 // 00151 // The shorted prefix key computed from searchKey 00152 // 00153 WordKey prefixKey; 00154 // 00155 // WalkNext leap is either DB_NEXT or DB_SET_RANGE. 00156 // 00157 int cursor_get_flags; 00158 // 00159 // True if search key is a prefix key 00160 // 00161 int searchKeyIsSameAsPrefix; 00162 #endif /* SWIG */ 00163 }; 00164 00165 #endif /* _WordCursorOne_h_ */