node *make_new_tree(char *key, int value) { node *root; record *rec; root = make_new_leaf(); rec = make_new_record(value); root->pointers[0] = rec; root->keys[0] = malloc(MAX_KEY_LEN); strcpy(root->keys[0], key); root->pointers[size-1] = NULL; root->num_keys++; return root; }
node *insert_into_leaf_after_splitting(node *root, node *leaf, int index, char *key, record *rec) { node *new_leaf; record **temp_ps; char **temp_ks, *new_key; int i, split; temp_ps = malloc(size * sizeof(record *)); temp_ks = malloc(size * sizeof(char *)); for (i = 0; i < size; i++){ if (i == index){ temp_ps[i] = rec; temp_ks[i] = malloc(MAX_KEY_LEN); strcpy(temp_ks[i], key); } else if (i < index){ temp_ps[i] = leaf->pointers[i]; temp_ks[i] = leaf->keys[i]; } else{ temp_ps[i] = leaf->pointers[i-1]; temp_ks[i] = leaf->keys[i-1]; } } split = size / 2; leaf->num_keys = split; for (i = 0; i < split; i++){ leaf->pointers[i] = temp_ps[i]; leaf->keys[i] = temp_ks[i]; } new_leaf = make_new_leaf(); new_leaf->num_keys = size - split; for (; i < size; i++){ new_leaf->pointers[i - split] = temp_ps[i]; new_leaf->keys[i - split] = temp_ks[i]; } new_leaf->parent = leaf->parent; new_leaf->pointers[size - 1] = leaf->pointers[size - 1]; leaf->pointers[size - 1] = new_leaf; free(temp_ps); free(temp_ks); new_key = new_leaf->keys[0]; return insert_into_parent(root, leaf, new_leaf, new_key); }
node *make_new_tree(char *key, void *data) { node *root; node_block *block; unsigned long key_id; unsigned long data_id; root = make_new_leaf(); if(NULL == root) { return NULL; } root->pointers[0] = data; root->keys[0] = malloc(MAX_KEY_LEN); strcpy(root->keys[0], key); root->pointers[size-1] = NULL; root->num_keys++; key_id = get_bptree_keyid(data); printf("key id size is %d\r\n",sizeof(key_id)); printf("key id is 0x%llx\r\n",key_id); data_id = get_bptree_dataid(data); if(key_id != -1 && data_id != -1) { block = root->block; block->pointers_id[0] = data_id; block->keys_id[0] = key_id; block->num_keys = root->num_keys; block->is_leaf = root->is_leaf; save_bptree_root_node(block); } else { free_data_block(data_id); free_key_block(key_id); return NULL; } return root; }
node *insert_into_leaf_after_splitting(node *root, node *leaf, int index, char *key, void *data) { node *new_leaf; void **temp_ps; char **temp_ks, *new_key; unsigned long *temp_ps_block,*temp_ks_block; int i, split; unsigned long new_key_id ; unsigned long key_id = get_bptree_keyid(data); unsigned long data_id = get_bptree_dataid(data); if(key_id == -1 || data_id == -1) { free_data_block(data_id); free_key_block(key_id); return root; } temp_ps = malloc(size * sizeof(void *)); temp_ks = malloc(size * sizeof(char *)); temp_ps_block = malloc(size*sizeof(unsigned long)); temp_ks_block = malloc(size*sizeof(unsigned long)); for (i = 0; i < size; i++){ if (i == index){ temp_ps[i] = data; temp_ks[i] = malloc(MAX_KEY_LEN); strcpy(temp_ks[i], key); temp_ps_block[i] = data_id; temp_ks_block[i] = key_id; } else if (i < index){ temp_ps[i] = leaf->pointers[i]; temp_ks[i] = leaf->keys[i]; temp_ps_block[i] = leaf->block->pointers_id[i]; temp_ks_block[i] = leaf->block->keys_id[i]; } else{ temp_ps[i] = leaf->pointers[i-1]; temp_ks[i] = leaf->keys[i-1]; temp_ps_block[i] = leaf->block->pointers_id[i-1]; temp_ks_block[i] = leaf->block->keys_id[i-1]; } } split = size / 2; leaf->num_keys = split; leaf->block->num_keys = split; for (i = 0; i < split; i++){ leaf->pointers[i] = temp_ps[i]; leaf->keys[i] = temp_ks[i]; leaf->block->pointers_id[i] = temp_ps_block[i]; leaf->block->keys_id[i] = temp_ks_block[i]; } new_leaf = make_new_leaf(); new_leaf->num_keys = size - split; new_leaf->block->num_keys = size -split; for (; i < size; i++){ new_leaf->pointers[i - split] = temp_ps[i]; new_leaf->keys[i - split] = temp_ks[i]; new_leaf->block->pointers_id[i - split] = temp_ps_block[i]; new_leaf->block->keys_id[i - split] = temp_ks_block[i]; } new_leaf->parent = leaf->parent; new_leaf->pointers[size - 1] = leaf->pointers[size - 1]; new_leaf->block->parent_id = leaf->block->parent_id; leaf->pointers[size - 1] = new_leaf; leaf->block->pointers_id[size -1] = new_leaf->block->node_id; free(temp_ps); free(temp_ks); free(temp_ps_block); free(temp_ks_block); new_key = new_leaf->keys[0]; new_key_id = new_leaf->block->keys_id[0]; return insert_into_parent(root, leaf, new_leaf, new_key,new_key_id); }