1// Index.cpp 2 3#include "Debug.h" 4#include "Directory.h" 5#include "Entry.h" 6#include "Index.h" 7#include "IndexImpl.h" 8 9// Index 10 11// constructor 12Index::Index(Volume *volume, const char *name, uint32 type, 13 bool fixedKeyLength, size_t keyLength) 14 : fVolume(volume), 15 fInitStatus(B_OK), 16 fName(name), 17 fType(type), 18 fKeyLength(keyLength), 19 fFixedKeyLength(fixedKeyLength) 20{ 21 if (!fVolume) 22 fInitStatus = B_BAD_VALUE; 23 else if (!fName.GetString()) 24 fInitStatus = B_NO_MEMORY; 25} 26 27// destructor 28Index::~Index() 29{ 30} 31 32// InitCheck 33status_t 34Index::InitCheck() const 35{ 36 return fInitStatus; 37} 38 39// GetIterator 40bool 41Index::GetIterator(IndexEntryIterator *iterator) 42{ 43 bool result = false; 44 if (iterator) { 45 AbstractIndexEntryIterator *actualIterator = InternalGetIterator(); 46 if (actualIterator) { 47 iterator->SetIterator(actualIterator); 48 result = true; 49 } 50 } 51 return result; 52} 53 54// Find 55bool 56Index::Find(const uint8 *key, size_t length, IndexEntryIterator *iterator) 57{ 58 bool result = false; 59 if (key && iterator) { 60 AbstractIndexEntryIterator *actualIterator 61 = InternalFind(key, length); 62 if (actualIterator) { 63 iterator->SetIterator(actualIterator); 64 result = true; 65 } 66 } 67 return result; 68} 69 70// Dump 71void 72Index::Dump() 73{ 74 PRINT(("Index: `%s', type: %lx\n", GetName(), GetType())); 75 for (IndexEntryIterator it(this); it.GetCurrent(); it.GetNext()) { 76 Entry *entry = it.GetCurrent(); 77 PRINT((" entry: `%s', dir: %Ld\n", entry->GetName(), 78 entry->GetParent()->GetID())); 79 } 80} 81 82 83// IndexEntryIterator 84 85// constructor 86IndexEntryIterator::IndexEntryIterator() 87 : fIterator(NULL) 88{ 89} 90 91// constructor 92IndexEntryIterator::IndexEntryIterator(Index *index) 93 : fIterator(NULL) 94{ 95 if (index) 96 index->GetIterator(this); 97} 98 99// destructor 100IndexEntryIterator::~IndexEntryIterator() 101{ 102 SetIterator(NULL); 103} 104 105// GetCurrent 106Entry * 107IndexEntryIterator::GetCurrent() 108{ 109 return (fIterator ? fIterator->GetCurrent() : NULL); 110} 111 112// GetCurrent 113Entry * 114IndexEntryIterator::GetCurrent(uint8 *buffer, size_t *keyLength) 115{ 116 return (fIterator ? fIterator->GetCurrent(buffer, keyLength) : NULL); 117} 118 119// GetPrevious 120Entry * 121IndexEntryIterator::GetPrevious() 122{ 123 return (fIterator ? fIterator->GetPrevious() : NULL); 124} 125 126// GetNext 127Entry * 128IndexEntryIterator::GetNext() 129{ 130 return (fIterator ? fIterator->GetNext() : NULL); 131} 132 133// GetNext 134Entry * 135IndexEntryIterator::GetNext(uint8 *buffer, size_t *keyLength) 136{ 137 Entry *entry = NULL; 138 if (fIterator && fIterator->GetNext()) 139 entry = GetCurrent(buffer, keyLength); 140 return entry; 141} 142 143// Suspend 144status_t 145IndexEntryIterator::Suspend() 146{ 147 return (fIterator ? fIterator->Suspend() : B_BAD_VALUE); 148} 149 150// Resume 151status_t 152IndexEntryIterator::Resume() 153{ 154 return (fIterator ? fIterator->Resume() : B_BAD_VALUE); 155} 156 157// SetIterator 158void 159IndexEntryIterator::SetIterator(AbstractIndexEntryIterator *iterator) 160{ 161 if (fIterator) 162 delete fIterator; 163 fIterator = iterator; 164} 165 166 167// AbstractIndexEntryIterator 168 169// constructor 170AbstractIndexEntryIterator::AbstractIndexEntryIterator() 171{ 172} 173 174// destructor 175AbstractIndexEntryIterator::~AbstractIndexEntryIterator() 176{ 177} 178 179// Suspend 180status_t 181AbstractIndexEntryIterator::Suspend() 182{ 183 return B_OK; 184} 185 186// Resume 187status_t 188AbstractIndexEntryIterator::Resume() 189{ 190 return B_OK; 191} 192 193