/** * @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); }
/** * @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); }
/** * @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; }
/** * @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; }
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); } }