File: dbtest.m

package info (click to toggle)
gworkspace 1.1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 15,124 kB
  • sloc: objc: 71,982; sh: 488; makefile: 43
file content (173 lines) | stat: -rw-r--r-- 3,324 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/* Test DBKit */

#include <Foundation/Foundation.h>
#include <DBKit/DBKBTree.h>
#include <DBKit/DBKBTreeNode.h>
#include <DBKit/DBKVarLenRecordsFile.h>
#include "test.h"
#include "dbpath.h"

@interface TreeDelegate: NSObject <DBKBTreeDelegate>
{
}

- (unsigned long)nodesize;  

- (NSArray *)keysFromData:(NSData *)data
               withLength:(unsigned *)dlen;

- (NSData *)dataFromKeys:(NSArray *)keys;

- (NSComparisonResult)compareNodeKey:(id)akey 
                             withKey:(id)bkey;

@end

@implementation	TreeDelegate

- (unsigned long)nodesize
{
  return 512;
} 

- (NSArray *)keysFromData:(NSData *)data
               withLength:(unsigned *)dlen
{
  NSMutableArray *keys = [NSMutableArray array];
  NSRange range;
  unsigned kcount;
  unsigned long key;
  int i;
  
  range = NSMakeRange(0, sizeof(unsigned));
  [data getBytes: &kcount range: range];
  range.location += sizeof(unsigned);
  
  range.length = sizeof(unsigned long);

  for (i = 0; i < kcount; i++) {
    [data getBytes: &key range: range];
    [keys addObject: [NSNumber numberWithUnsignedLong: key]];
    range.location += sizeof(unsigned long);
  }
  
  *dlen = range.location;
  
  return keys;
}

- (NSData *)dataFromKeys:(NSArray *)keys
{
  NSMutableData *data = [NSMutableData dataWithCapacity: 1];
  unsigned kcount = [keys count];
  int i;
  
  [data appendData: [NSData dataWithBytes: &kcount length: sizeof(unsigned)]];
    
  for (i = 0; i < kcount; i++) {
    unsigned long kl = [[keys objectAtIndex: i] unsignedLongValue];
    [data appendData: [NSData dataWithBytes: &kl length: sizeof(unsigned long)]];
  }
  
  return data;  
}

- (NSComparisonResult)compareNodeKey:(id)akey 
                             withKey:(id)bkey
{
  return [(NSNumber *)akey compare: (NSNumber *)bkey];
}
                             
@end


int main(int argc, char** argv)
{
  CREATE_AUTORELEASE_POOL (pool);
  TreeDelegate *delegate = [TreeDelegate new];
  DBKBTree *tree = [[DBKBTree alloc] initWithPath: dbpath order: 3 delegate: delegate];
  NSDate *date = [NSDate date];
  
  [tree begin];
  test1(tree);
  [tree end];

  [tree begin];
  test2(tree);
  [tree end];

  [tree begin];
  test3(tree);
  [tree end];

  [tree begin];
  test4(tree);
  [tree end];

  [tree begin];
  test5(tree);
  [tree end];

  [tree begin];
  test6(tree);
  [tree end];
    
  NSLog(@"%.2f", [[NSDate date] timeIntervalSinceDate: date]);
  NSLog(@"done");
      
  RELEASE (tree);
  RELEASE (delegate);
  
  RELEASE (pool);
  exit(EXIT_SUCCESS);
}


void printTree(DBKBTree *tree)
{
  printTreeFromNode(tree, [tree root], 0);
}

void printTreeFromNode(DBKBTree *tree, DBKBTreeNode *node, int depth)
{
  int kcount;
  int index = -1;
  int i, j;
  
  if ([node isLoaded] == NO) {
    [node loadNodeData];
  }
  
  kcount = [[node keys] count];
  
  if ([node parent] != nil) {
    index = [[node parent] indexOfSubnode: node];
  }
  
  if ([node isLeaf] == NO) {
    printTreeFromNode(tree, [[node subnodes] objectAtIndex: kcount], depth + 1);
  }

  for (i = kcount - 1; i >= 0; i--) {
    for(j = 0; j < depth; j++) {
			printf("\t");
		}

		printf("      %d (%d)\n", [[[node keys] objectAtIndex: i] intValue], index);
    
    if ([node isLeaf] == NO) {
      printTreeFromNode(tree, [[node subnodes] objectAtIndex: i], depth + 1);
    }
  }
}