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;
}
Exemple #2
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;
}
Exemple #4
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;
}
Exemple #5
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);
}
Exemple #6
0
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);
}
Exemple #7
0
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;
}
Exemple #9
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);
				}
			}
		}
	}
}
Exemple #10
0
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;
}