int main(void) { btree_tree *tmp; uint32_t data_idx; size_t *size; time_t *ts; char *data; int i, tmp_key; char testdata[11]; int error = 0; /* testing too large data */ tmp = btree_create("test.mmap", 3, 6, 10, &error); if (!tmp) { printf("Couldn't create tree from disk image, errno %d.\n", error); exit(1); } for (i = 0; i < 205; i++) { tmp_key = i * 3; if (0 == btree_insert(tmp, tmp_key)) { sprintf(testdata, "H: %07d", i); btree_set_data(tmp, tmp_key, testdata, 10, time(NULL)); btree_get_data(tmp, tmp_key, &data_idx, (void **)&data, &size, &ts); printf("%s %zd\n", data, *size); btree_data_unlock(tmp, data_idx); } } btree_dump(tmp); btree_close(tmp); return 0; }
void btree_dump (PBTREE btree, int node_idx, int depth) { // write out the keys in this node and all its subtrees, along with // node adresses, for debugging purposes char indent[21]; int i; if (node_idx == BTREE_INVALID_NODE_IDX) node_idx = btree->root_node_idx; if (depth > 10) depth = 10; if (depth > 0) memset(indent, ' ', 2 * depth); indent[2 * depth] = '\0'; if (node_idx == btree->root_node_idx) msg(MSG_INFO,"ROOT\n"); msg(MSG_INFO, "%sNode idx=%d, parent idx=%d, element count=%d\n", indent, node_idx, btree->nodes[node_idx].parent_node_idx, btree->nodes[node_idx].element_count); for (i=0; i<btree->nodes[node_idx].element_count; i++) { PBTREE_ELEMENT element; element = &btree->nodes[node_idx].elements[i]; if (element->data_entry_idx != BTREE_INVALID_ENTRY_IDX) msg(MSG_INFO, "%sKey=%ld, data entry idx=%d\n", indent, element->key, element->data_entry_idx); if (element->subtree_node_idx != BTREE_INVALID_NODE_IDX) btree_dump(btree, element->subtree_node_idx, depth + 1); } }
int main(void) { btree_tree *tmp; uint32_t data_idx; size_t size; time_t ts; char *data; int i; char testdata[11]; // testing too large data tmp = btree_create("test.mmap", 102, 204, 10); if (!tmp) { printf("Couldn't create tree from disk image.\n"); exit(1); } for (i = 0; i < 205; i++) { if (btree_insert(tmp, i * 3, &data_idx)) { sprintf(testdata, "H: %07d", i); btree_set_data(tmp, data_idx, testdata, 10, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } } btree_dump(tmp); btree_free(tmp); return 0; }
int main() { btree_t *b; uint32_t i, *x; uint32_t v[] = {15, 5, 16, 3, 12, 20, 10, 13, 18, 23, 6, 7}; uint32_t nv = sizeof(v) / sizeof(v[0]); btree_create(&b); for(i = 0; i < nv; i++) { x = (uint32_t*)xmalloc(sizeof(uint32_t)); *x = (uint32_t)random(); if (btree_add(b, v[i], (void*)x) != TRUE) { printf("Fail Add %lu %lu\n", v[i], *x); } } printf("depth %d\n", btree_depth(b->root)); btree_dump(b); sleep(3); btree_remove(b, 5, (void*)&x); btree_dump(b); sleep(3); btree_remove(b, 16, (void*)&x); btree_dump(b); sleep(3); btree_remove(b, 13, (void*)&x); btree_dump(b); while (btree_get_root_key(b, &i)) { if (btree_remove(b, i, (void*)&x) == FALSE) { fprintf(stderr, "Failed to remove %lu\n", i); } btree_dump(b); sleep(1); } if (btree_destroy(&b) == FALSE) { printf("Failed to destroy \n"); } return 0; }
TEST(BTree, Remove) { struct btree_s tree; btree_init(&tree, 3); int i; for (i = 0; i < 10; i++) { btree_insert(&tree, i); } btree_dump(&tree); btree_remove(&tree, 5); btree_dump(&tree); btree_remove(&tree, 9); btree_dump(&tree); btree_remove(&tree, 8); btree_dump(&tree); btree_destroy(&tree); }
TEST(BTree, Insert) { struct btree_s tree; btree_init(&tree, 3); int i; for (i = 0; i < 10; i++) { btree_insert(&tree, i); } btree_dump(&tree); btree_destroy(&tree); }
TEST(BTree, RemoveALot) { struct btree_s tree; btree_init(&tree, 3); int i; for (i = 0; i < 1000000; i++) { btree_insert(&tree, i); } for (i = 10; i < 999992; i++) { btree_remove(&tree, i); } btree_dump(&tree); btree_destroy(&tree); }
int main(void) { btree_tree *tmp; uint32_t data_idx; size_t size; time_t ts; char *data; // testing too large data tmp = btree_create("test.mmap", 3, 6, 10); if (!tmp) { printf("Couldn't create tree from disk image.\n"); exit(1); } if (btree_insert(tmp, 'X', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorl1", 10, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'Q', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorld2", 10, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'D', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorld3", 11, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'Z', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorl4", 11, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'A', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorl5", -1, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'C', &data_idx)) { btree_set_data(tmp, data_idx, "HelloWorl6", 0, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } if (btree_insert(tmp, 'G', &data_idx)) { btree_set_data(tmp, data_idx, "TooMany1", 8, time(NULL)); data = (char*) btree_get_data(tmp, data_idx, &size, &ts); printf("%s %zd\n", data, size); } btree_dump(tmp); btree_free(tmp); return 0; }
void btree_remove_impl(struct btree_s *tree, struct bnode_s *r, int k) { int i = r->nkeys - 1; while (i >= 0 && k < r->key[i]) i--; if (i >= 0 && k == r->key[i]) { /* 要删除的节点在本节点 */ if (r->leaf) { /* 叶子节点,直接删除 */ for (; i < r->nkeys; i++) { r->key[i] = r->key[i+1]; } r->nkeys--; } else { /* 非叶子节点 */ assert(i >= 0 && "error"); int left = LEFT_CHILD_OF_KEY(i); int right = RIGHT_CHILD_OF_KEY(i); if (r->child[left]->nkeys >= tree->min_key_nr+1) { /* 左边的孩子的key足够t个 */ r->key[i] = btree_delete_max(tree, r->child[left]); } else if (r->child[right]->nkeys >= tree->min_key_nr+1) { /* 右边的孩子的key足够t个 */ r->key[i] = btree_delete_min(tree, r->child[right]); } else { /* 都不够,需要合并 */ merge_child(tree, r, i); if (r->nkeys == 0) { tree->root = r->child[0]; release_node(r); btree_remove_impl(tree, tree->root, k); } else { btree_remove_impl(tree, r->child[i], k); } } } } else { if (i >= 0 && r->leaf) { printf("%d, %d, \n", i, k); void btree_dump(struct btree_s *); btree_dump(tree); assert(0 && "not in tree"); } /* 要删除的节点不在本节点 */ int remove_child_pos = RIGHT_CHILD_OF_KEY(i); if (r->child[remove_child_pos]->nkeys >= tree->min_key_nr+1) { /* 子节点的key个数足够t */ btree_remove_impl(tree, r->child[remove_child_pos], k); } else { /* key个数不够 */ if (remove_child_pos-1 >=0 && r->child[remove_child_pos-1]->nkeys >= tree->min_child_nr+1) { /* 有左兄弟且左兄弟够 */ right_rotate(tree, r, LEFT_KEY_OF_CHILD(remove_child_pos)); btree_remove_impl(tree, r->child[remove_child_pos], k); } else if (remove_child_pos+1 <= r->nkeys && r->child[remove_child_pos+1]->nkeys >= tree->min_child_nr+1) { /* 有右兄弟且有兄弟够 */ left_rotate(tree, r, RIGHT_KEY_OF_CHILD(remove_child_pos)); btree_remove_impl(tree, r->child[remove_child_pos], k); } else { /* 都不够 */ int merge_pos = -1; if (remove_child_pos-1 >= 0) { merge_pos = LEFT_KEY_OF_CHILD(remove_child_pos); } else if (remove_child_pos+1 <= r->nkeys) { merge_pos = RIGHT_KEY_OF_CHILD(remove_child_pos); } else { assert(0 && "damn"); } merge_child(tree, r, merge_pos); if (r->nkeys == 0) { tree->root = r->child[0]; release_node(r); btree_remove_impl(tree, tree->root, k); } else { btree_remove_impl(tree, r->child[merge_pos], k); } } } } }
int main(void) { btree_tree *tmp; uint32_t data_idx; char data[1024]; memset(data, 4, 1023); memset(data+1023, 0, 1); tmp = btree_create("test.mmap", 3, 400, 1024); if (!tmp) { printf("Couldn't create tree from disk image.\n"); exit(1); } /* Testing one node in the root only */ btree_insert(tmp, 'A', &data_idx); printf("%u\n", data_idx); btree_dump(tmp); btree_delete(tmp, 'A'); btree_dump(tmp); /* Testing two node in the root only (1) */ btree_insert(tmp, 'G', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'Q', &data_idx); printf("%u\n", data_idx); btree_dump(tmp); btree_delete(tmp, 'G'); btree_dump(tmp); /* - cleanup for next test */ btree_delete(tmp, 'Q'); /* Testing two node in the root only (2) */ btree_insert(tmp, 'G', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'Q', &data_idx); printf("%u\n", data_idx); btree_dump(tmp); btree_delete(tmp, 'Q'); btree_dump(tmp); /* - cleanup for next test */ btree_delete(tmp, 'G'); /* Testing with full root node */ btree_insert(tmp, 'E', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'A', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'P', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'F', &data_idx); printf("%u\n", data_idx); btree_insert(tmp, 'Q', &data_idx); printf("%u\n", data_idx); btree_dump(tmp); /* - remove last node */ btree_delete(tmp, 'Q'); btree_dump(tmp); /* - remove middle node */ btree_delete(tmp, 'E'); btree_dump(tmp); /* - remove first node */ btree_delete(tmp, 'A'); btree_dump(tmp); btree_free(tmp); return 0; }