1/* Test DBKit */
2
3#include <Foundation/Foundation.h>
4#include <DBKit/DBKBTree.h>
5#include <DBKit/DBKBTreeNode.h>
6#include <DBKit/DBKVarLenRecordsFile.h>
7#include "test.h"
8#include "dbpath.h"
9
10@interface TreeDelegate: NSObject <DBKBTreeDelegate>
11{
12}
13
14- (unsigned long)nodesize;
15
16- (NSArray *)keysFromData:(NSData *)data
17               withLength:(unsigned *)dlen;
18
19- (NSData *)dataFromKeys:(NSArray *)keys;
20
21- (NSComparisonResult)compareNodeKey:(id)akey
22                             withKey:(id)bkey;
23
24@end
25
26@implementation	TreeDelegate
27
28- (unsigned long)nodesize
29{
30  return 512;
31}
32
33- (NSArray *)keysFromData:(NSData *)data
34               withLength:(unsigned *)dlen
35{
36  NSMutableArray *keys = [NSMutableArray array];
37  NSRange range;
38  unsigned kcount;
39  unsigned long key;
40  int i;
41
42  range = NSMakeRange(0, sizeof(unsigned));
43  [data getBytes: &kcount range: range];
44  range.location += sizeof(unsigned);
45
46  range.length = sizeof(unsigned long);
47
48  for (i = 0; i < kcount; i++) {
49    [data getBytes: &key range: range];
50    [keys addObject: [NSNumber numberWithUnsignedLong: key]];
51    range.location += sizeof(unsigned long);
52  }
53
54  *dlen = range.location;
55
56  return keys;
57}
58
59- (NSData *)dataFromKeys:(NSArray *)keys
60{
61  NSMutableData *data = [NSMutableData dataWithCapacity: 1];
62  unsigned kcount = [keys count];
63  int i;
64
65  [data appendData: [NSData dataWithBytes: &kcount length: sizeof(unsigned)]];
66
67  for (i = 0; i < kcount; i++) {
68    unsigned long kl = [[keys objectAtIndex: i] unsignedLongValue];
69    [data appendData: [NSData dataWithBytes: &kl length: sizeof(unsigned long)]];
70  }
71
72  return data;
73}
74
75- (NSComparisonResult)compareNodeKey:(id)akey
76                             withKey:(id)bkey
77{
78  return [(NSNumber *)akey compare: (NSNumber *)bkey];
79}
80
81@end
82
83
84int main(int argc, char** argv)
85{
86  CREATE_AUTORELEASE_POOL (pool);
87  TreeDelegate *delegate = [TreeDelegate new];
88  DBKBTree *tree = [[DBKBTree alloc] initWithPath: dbpath order: 3 delegate: delegate];
89  NSDate *date = [NSDate date];
90
91  [tree begin];
92  test1(tree);
93  [tree end];
94
95  [tree begin];
96  test2(tree);
97  [tree end];
98
99  [tree begin];
100  test3(tree);
101  [tree end];
102
103  [tree begin];
104  test4(tree);
105  [tree end];
106
107  [tree begin];
108  test5(tree);
109  [tree end];
110
111  [tree begin];
112  test6(tree);
113  [tree end];
114
115  NSLog(@"%.2f", [[NSDate date] timeIntervalSinceDate: date]);
116  NSLog(@"done");
117
118  RELEASE (tree);
119  RELEASE (delegate);
120
121  RELEASE (pool);
122  exit(EXIT_SUCCESS);
123}
124
125
126void printTree(DBKBTree *tree)
127{
128  printTreeFromNode(tree, [tree root], 0);
129}
130
131void printTreeFromNode(DBKBTree *tree, DBKBTreeNode *node, int depth)
132{
133  int kcount;
134  int index = -1;
135  int i, j;
136
137  if ([node isLoaded] == NO) {
138    [node loadNodeData];
139  }
140
141  kcount = [[node keys] count];
142
143  if ([node parent] != nil) {
144    index = [[node parent] indexOfSubnode: node];
145  }
146
147  if ([node isLeaf] == NO) {
148    printTreeFromNode(tree, [[node subnodes] objectAtIndex: kcount], depth + 1);
149  }
150
151  for (i = kcount - 1; i >= 0; i--) {
152    for(j = 0; j < depth; j++) {
153			printf("\t");
154		}
155
156		printf("      %d (%d)\n", [[[node keys] objectAtIndex: i] intValue], index);
157
158    if ([node isLeaf] == NO) {
159      printTreeFromNode(tree, [[node subnodes] objectAtIndex: i], depth + 1);
160    }
161  }
162}
163
164
165
166
167
168
169
170
171
172
173
174