* Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
* All rights reserved. Distributed under the terms of the MIT license.
*/
#include "DebugSupport.h"
#include "Directory.h"
#include "Entry.h"
#include "Index.h"
#include "IndexImpl.h"
Index::Index(Volume *volume, const char *name, uint32 type,
bool fixedKeyLength, size_t keyLength)
: fVolume(volume),
fInitStatus(B_OK),
fName(name),
fType(type),
fKeyLength(keyLength),
fFixedKeyLength(fixedKeyLength)
{
if (!fVolume)
fInitStatus = B_BAD_VALUE;
else if (!fName.GetString())
fInitStatus = B_NO_MEMORY;
}
Index::~Index()
{
}
status_t
Index::InitCheck() const
{
return fInitStatus;
}
bool
Index::GetIterator(IndexEntryIterator *iterator)
{
bool result = false;
if (iterator) {
AbstractIndexEntryIterator *actualIterator = InternalGetIterator();
if (actualIterator) {
iterator->SetIterator(actualIterator);
result = true;
}
}
return result;
}
bool
Index::Find(const uint8 *key, size_t length, IndexEntryIterator *iterator)
{
bool result = false;
if (key && iterator) {
AbstractIndexEntryIterator *actualIterator
= InternalFind(key, length);
if (actualIterator) {
iterator->SetIterator(actualIterator);
result = true;
}
}
return result;
}
void
Index::Dump()
{
D(
PRINT("Index: `%s', type: %lx\n", GetName(), GetType());
for (IndexEntryIterator it(this); it.GetCurrent(); it.GetNext()) {
Entry *entry = it.GetCurrent();
PRINT(" entry: `%s', dir: %lld\n", entry->GetName(),
entry->GetParent()->GetID());
}
)
}
IndexEntryIterator::IndexEntryIterator()
: fIterator(NULL)
{
}
IndexEntryIterator::IndexEntryIterator(Index *index)
: fIterator(NULL)
{
if (index)
index->GetIterator(this);
}
IndexEntryIterator::~IndexEntryIterator()
{
SetIterator(NULL);
}
Entry *
IndexEntryIterator::GetCurrent()
{
return (fIterator ? fIterator->GetCurrent() : NULL);
}
Entry *
IndexEntryIterator::GetCurrent(uint8 *buffer, size_t *keyLength)
{
return (fIterator ? fIterator->GetCurrent(buffer, keyLength) : NULL);
}
Entry *
IndexEntryIterator::GetPrevious()
{
return (fIterator ? fIterator->GetPrevious() : NULL);
}
Entry *
IndexEntryIterator::GetNext()
{
return (fIterator ? fIterator->GetNext() : NULL);
}
Entry *
IndexEntryIterator::GetNext(uint8 *buffer, size_t *keyLength)
{
Entry *entry = NULL;
if (fIterator && fIterator->GetNext())
entry = GetCurrent(buffer, keyLength);
return entry;
}
status_t
IndexEntryIterator::Suspend()
{
return (fIterator ? fIterator->Suspend() : B_BAD_VALUE);
}
status_t
IndexEntryIterator::Resume()
{
return (fIterator ? fIterator->Resume() : B_BAD_VALUE);
}
void
IndexEntryIterator::SetIterator(AbstractIndexEntryIterator *iterator)
{
if (fIterator)
delete fIterator;
fIterator = iterator;
}
AbstractIndexEntryIterator::AbstractIndexEntryIterator()
{
}
AbstractIndexEntryIterator::~AbstractIndexEntryIterator()
{
}
status_t
AbstractIndexEntryIterator::Suspend()
{
return B_OK;
}
status_t
AbstractIndexEntryIterator::Resume()
{
return B_OK;
}