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