Example #1
0
/**
* @brief test case for random number insert, search and delete.
*/
void testcase_for_random() {
	TREE* T = bptree_create();
	int i = 0, n = 100;
	int _t = 0;
	srand(time(NULL));
	for (i = 0; i < n; i ++) {
		_t = rand() % n;
		printf("bptree_insert(T, %d) = %d\n", _t, bptree_insert(T, _t));
	}
	for (i = 0; i < n; i ++) {
		_t = rand() % n;
		printf("bptree_search(T, %d) = %d\n", _t, bptree_search(T, _t));
	}

	printf("bptree_traveral: ");
	bptree_traveral(T, printout_node);
	printf("\n");

	for (i = 0; i < n; i ++) {
		_t = rand() % n;
		printf("bptree_delete(T, %d) = %d\n", _t, bptree_delete(T, _t));
	}

	printf("bptree_traveral: ");
	bptree_traveral(T, printout_node);
	printf("\n");

	bptree_destory(T);
}
Example #2
0
/**
* @brief test case for single insert, search and delete method.
*/
void testcase_for_single() {
	TREE* T = bptree_create();

	printf("bptree_insert(T, 32) = %d\n", bptree_insert(T, 32));

	printf("bptree_search(T, 32) = %d\n", bptree_search(T, 32));

	printf("bptree_delete(T, 32) = %d\n", bptree_delete(T, 32));

	printf("bptree_search(T, 32) = %d\n", bptree_search(T, 32));

	printf("bptree_traveral: ");
	bptree_traveral(T, printout_node);
	printf("\n");

	bptree_destory(T);
}
Example #3
0
/**
* @brief B+ tree delete method.
*
* @param T B+ tree.
* @param k the element to delete.
*
* @return return 1 means delete success, otherwise return 0 means not delete it
* as the element k is not include in the B+ tree.
*/
PUBLIC int bptree_delete(TREE* T, ELEMENT k) {
	if (!bptree_search(T, k)) { return 0; }
	_bptree_delete(T->root, k);
	NODE* r = T->root;
	if (0 == r->n) {
		T->root = r->c[0];
		_bptree_free_node(r);
	}
	return 1;
}
Example #4
0
/**
* @brief B+ tree insert method.
*
* @param T B+ tree.
* @param k the element to insert.
*
* @return return 1 means insert success, otherwise return 0 means not insert it
* as the element is already include in the B+ tree.
*/
PUBLIC int bptree_insert(TREE* T, ELEMENT k) {
	if (bptree_search(T, k)) { return 0; }	// if duplicated is not support
	NODE* r = T->root;
	_bptree_insert_nonfull(r, k);
	if (ORDER_B == r->n) {
		NODE* s = _bptree_allocate_node();
		T->root = s;
		s->leaf = FALSE;
		s->n = 0;
		s->c[0] = r;
		_bptree_split_child(s, 0);
	}
	return 1;
}
Example #5
0
static void handle_bptree_search(tcp_client* c,struct evbuffer* buffer)
{
	int rv;
	bptree_session *bps;
	int32_t ksize, vsize;
	char k[MAX_TRANSACTION_SIZE];
	char v[MAX_TRANSACTION_SIZE];
	// FIXME This is a bit of overkill, and slows things down, but
	// bptree_search assumes that any bytes not written to are 0 (problematic
	// for comparison of strings if there is lingering data
	bzero(k,MAX_TRANSACTION_SIZE);
	bzero(v,MAX_TRANSACTION_SIZE);

	struct evbuffer* b = evbuffer_copy(buffer);
	transaction_set_get_cb(c->t, on_bptree_search, c);
	if (bptree_message_incomplete(b)) return;

	bps = retrieve_bptree_session(c,b);
	if(bps == NULL)
	{
		printf("Couldn't find bptree_session in bptree_search!\n");
		send_bptree_result(c,-1,0,v);
	}
	else {

		evbuffer_remove(b,&ksize, sizeof(int32_t));
		evbuffer_remove(b,k, ksize);

		rv = bptree_search(bps,k,ksize,v,&vsize);

		evbuffer_free(b);
		
		if (rv == BPTREE_OP_TAPIOCA_NOT_READY) return;

		evbuffer_drain(buffer, evbuffer_get_length(buffer));
		send_bptree_result(c,rv,vsize,(void *)v);
	}

}