Skip to content

Commit e72721a

Browse files
author
fuli
committed
update btree
1 parent e2a09aa commit e72721a

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

include/btree.h

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,21 @@
3030

3131
#define BLOCKSIZE 4096
3232
#define T 255
33+
#define LEAF 0x0001
34+
#define ONDISK 0x0002
35+
3336
namespace alg {
3437
class BTree {
3538
private:
3639
// 4K node, 4096 bytes to write
3740
// t = 255
3841
struct node_t {
39-
int16_t leaf; // is leaf?
40-
int16_t n; // num key
41-
int32_t offset; // block offset (8 byte head)
42-
int32_t key[509]; // key
43-
int32_t c[510]; // childs pointers (file offsets related to 0)
44-
char padding[12]; // padding to 4096
42+
uint16_t n; // num key
43+
uint16_t flag; // flags
44+
uint32_t offset; // block offset (8 byte head)
45+
char padding[12]; // padding to 4096
46+
int32_t key[509]; // key
47+
int32_t c[510]; // childs pointers (file offsets related to 0)
4548
} __attribute__ ((packed));
4649
typedef struct node_t *node;
4750

@@ -67,7 +70,7 @@ namespace alg {
6770
node x = (node)allocate_node();
6871
int n = read(fd,x,BLOCKSIZE);
6972
if (n != BLOCKSIZE) { // init new btree
70-
x->leaf = true;
73+
x->flag |= LEAF;
7174
WRITE(x);
7275
}
7376
m_root = (node)x;
@@ -86,13 +89,14 @@ namespace alg {
8689
if (r->n == 2*T - 1) {
8790
node s = (node)allocate_node();
8891
// place the old root node to the end of the file
89-
m_root->offset = -1;
90-
WRITE(m_root);
92+
m_root->flag &= ~ONDISK;
93+
WRITE(m_root);
9194
// new root
95+
s->flag &= ~LEAF;
9296
s->offset = 0;
9397
s->n = 0;
9498
s->c[0] = m_root->offset;
95-
free(m_root);
99+
//free(m_root);
96100
m_root = s;
97101
split_child(s, 0);
98102
insert_nonfull(s, k);
@@ -106,14 +110,14 @@ namespace alg {
106110
* search a key, returns node and index
107111
*/
108112
search_r search(node x, int32_t k) {
109-
int i = 0;
113+
uint16_t i = 0;
110114
search_r ret;
111115
while (i<x->n && k > x->key[i]) i++;
112116

113-
if (i < x->n && k == x->key[i]) {
117+
if (i<x->n && k == x->key[i]) {
114118
ret.n = x, ret.i = i;
115119
return ret;
116-
} else if (x->leaf) {
120+
} else if (x->flag & LEAF) {
117121
ret.n = NULL, ret.i = i;
118122
return ret;
119123
} else {
@@ -127,7 +131,7 @@ namespace alg {
127131
*/
128132
void insert_nonfull(node x, int32_t k) {
129133
int32_t i = x->n-1;
130-
if (x->leaf) {
134+
if (x->flag & LEAF) {
131135
while (i>=0 && k <x->key[i]) {
132136
x->key[i+1] = x->key[i];
133137
i = i - 1;
@@ -140,14 +144,15 @@ namespace alg {
140144
i = i-1;
141145
}
142146
i=i+1;
143-
std::auto_ptr<node_t> xi(READ(x, i));
147+
node xi = READ(x, i);
144148
if (xi->n == 2*T-1) {
145149
split_child(x, i);
146150
if (k > x->key[i]) {
147151
i = i+1;
148152
}
149153
}
150-
insert_nonfull(xi.get(), k);
154+
insert_nonfull(xi, k);
155+
free(xi);
151156
}
152157
}
153158

@@ -156,9 +161,9 @@ namespace alg {
156161
*/
157162
void * allocate_node() {
158163
node x = (node)malloc(sizeof(node_t));
159-
x->leaf = false;
160164
x->n = 0;
161-
x->offset = -1;
165+
x->offset = 0;
166+
x->flag = 0;
162167
memset(x->key, 0, sizeof(x->key));
163168
memset(x->c, 0, sizeof(x->c));
164169
return x;
@@ -170,15 +175,15 @@ namespace alg {
170175
void split_child(node x, int32_t i) {
171176
std::auto_ptr<node_t> z((node)allocate_node());
172177
std::auto_ptr<node_t> y(READ(x, i));
173-
z->leaf = y->leaf;
178+
z->flag |= (y->flag & LEAF);
174179
z->n = T - 1;
175180

176-
int j;
181+
uint16_t j;
177182
for (j=0;j<T-1;j++) { // init z
178183
z->key[j] = y->key[j+T];
179184
}
180185

181-
if (!y->leaf) {
186+
if (!(y->flag & LEAF)) {
182187
for (j=0;j<T;j++) {
183188
z->c[j] = y->c[j+T];
184189
}
@@ -192,13 +197,13 @@ namespace alg {
192197
x->c[j+1] = x->c[j]; // shift
193198
}
194199

195-
// relocate z
200+
// save z
196201
x->c[i+1] = z->offset;
197202

198203
for (j=x->n-1;j>=i;j--) {
199204
x->key[j+1] = x->key[j];
200205
}
201-
x->key[i] = y->key[T];
206+
x->key[i] = y->key[T-1];
202207
x->n = x->n +1;
203208
WRITE(x);
204209
}
@@ -217,11 +222,12 @@ namespace alg {
217222
* update a node struct to file, create if offset is -1.
218223
*/
219224
void WRITE(node x) {
220-
if (x->offset !=-1) {
225+
if (x->flag & ONDISK) {
221226
lseek(fd, x->offset, SEEK_SET);
222227
} else {
223228
x->offset = lseek(fd,0, SEEK_END);
224229
}
230+
x->flag |= ONDISK;
225231
write(fd, x, BLOCKSIZE);
226232
}
227233
};

src/btree_demo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ int main(void) {
66
BTree x("./btree.dat");
77
int32_t i;
88

9-
for (i=0;i<510;i++) {
9+
for (i=0;i<100000;i++) {
1010
x.Insert(i);
1111
}
1212

13-
for(i=0;i<509;i++) {
13+
/*
14+
for(i=0;i<100000;i++) {
1415
BTree::search_r r = x.Search(i);
1516
printf("block[%x] idx[%d]\n", r.n, r.i);
1617
}
18+
*/
1719
}

0 commit comments

Comments
 (0)