1/* 2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "Index.h" 8 9#include "DebugSupport.h" 10#include "Directory.h" 11#include "Node.h" 12#include "IndexImpl.h" 13 14 15// #pragma mark - Index 16 17 18Index::Index() 19 : 20 fVolume(NULL), 21 fName(NULL), 22 fType(0), 23 fKeyLength(0), 24 fFixedKeyLength(true) 25{ 26} 27 28 29Index::~Index() 30{ 31 free(fName); 32} 33 34 35status_t 36Index::Init(Volume* volume, const char* name, uint32 type, bool fixedKeyLength, 37 size_t keyLength) 38{ 39 fName = strdup(name); 40 if (fName == NULL) 41 return B_NO_MEMORY; 42 43 fVolume = volume; 44 fType = type; 45 fKeyLength = keyLength; 46 fFixedKeyLength = fixedKeyLength; 47 48 return B_OK; 49} 50 51 52bool 53Index::GetIterator(IndexIterator& iterator) 54{ 55 AbstractIndexIterator* actualIterator = InternalGetIterator(); 56 iterator.SetIterator(actualIterator); 57 58 return actualIterator != NULL; 59} 60 61 62bool 63Index::Find(const void* key, size_t length, IndexIterator& iterator) 64{ 65 AbstractIndexIterator* actualIterator 66 = key != NULL ? InternalFind(key, length) : NULL; 67 iterator.SetIterator(actualIterator); 68 69 return actualIterator != NULL; 70} 71 72 73void 74Index::Dump() 75{ 76 D( 77 PRINT("Index: `%s', type: %" B_PRIx32 "\n", Name(), Type()); 78 IndexIterator it; 79 if (GetIterator(it)) { 80 while (Node* node = it.Next()) { 81 PRINT(" node: `%s', dir: %" B_PRIdINO "\n", node->Name(), 82 node->Parent()->ID()); 83 } 84 } 85 ) 86} 87 88 89// #pragma mark - IndexIterator 90 91 92IndexIterator::IndexIterator() 93 : 94 fIterator(NULL) 95{ 96} 97 98 99IndexIterator::~IndexIterator() 100{ 101 SetIterator(NULL); 102} 103 104 105bool 106IndexIterator::HasNext() const 107{ 108 return fIterator != NULL && fIterator->HasNext(); 109} 110 111 112Node* 113IndexIterator::Next() 114{ 115 return fIterator != NULL ? fIterator->Next(NULL, NULL) : NULL; 116} 117 118 119Node* 120IndexIterator::Next(void* buffer, size_t* _keyLength) 121{ 122 return fIterator != NULL ? fIterator->Next(buffer, _keyLength) : NULL; 123} 124 125 126status_t 127IndexIterator::Suspend() 128{ 129 return fIterator != NULL ? fIterator->Suspend() : B_BAD_VALUE; 130} 131 132 133status_t 134IndexIterator::Resume() 135{ 136 return fIterator != NULL ? fIterator->Resume() : B_BAD_VALUE; 137} 138 139 140void 141IndexIterator::SetIterator(AbstractIndexIterator* iterator) 142{ 143 delete fIterator; 144 fIterator = iterator; 145} 146 147 148// #pragma mark - AbstractIndexIterator 149 150 151AbstractIndexIterator::AbstractIndexIterator() 152{ 153} 154 155 156AbstractIndexIterator::~AbstractIndexIterator() 157{ 158} 159 160 161status_t 162AbstractIndexIterator::Suspend() 163{ 164 return B_OK; 165} 166 167 168status_t 169AbstractIndexIterator::Resume() 170{ 171 return B_OK; 172} 173 174