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