Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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);
}