Example #1
0
int initialize_db (const char * filename) {
    const char sql[] = "SELECT * FROM movies";
    sqlite3 * pDb = NULL;
    int nresult, ret = 0;

    ptreeroot = alloc_tnode();

    if ( (nresult = sqlite3_open(filename,&pDb)) != SQLITE_OK) {
        fprintf(stderr,"Error: the database could not be opened. %s (%d)\n", sqlite3_errmsg(pDb), nresult);
        ret = 1;
    } else {
        char * errmsg = NULL;

        nresult = sqlite3_exec(pDb, sql, store_result, NULL, &errmsg);

        if (errmsg) {
            fprintf(stderr, "Error executing SQL query: %s.\n", errmsg);
            sqlite3_free(errmsg);
            ret = 2;
        }

    }

    sqlite3_close(pDb);

    return ret;
}
Example #2
0
static tnode_t *alloc_inode( extbmp_t *ebmp, 
                             long long address_range_in_words, 
                             word start, 
                             long long limit )
{
  tnode_t *retval;

  assert( address_range_in_words > 0 );

  retval = alloc_tnode( ebmp, tag_inode, 
                        (sizeof( inode_t ) 
                         + ebmp->entries_per_inode*sizeof( tnode_t* )));
  retval->inode.address_range_in_words = address_range_in_words;
  retval->inode.address_words_per_child = 
    CEILDIV( ((long long)address_range_in_words), ebmp->entries_per_inode );

  assert( retval->inode.address_words_per_child > 0 );
  assert((retval->inode.address_words_per_child 
          * ebmp->entries_per_inode) 
         >= retval->inode.address_range_in_words);

#if INCLUDE_REDUNDANT_FIELDS
  retval->inode.start = start;
  retval->inode.limit = limit;
#endif

  init_inode_fields_cleared( ebmp, &retval->inode );

  dbmsg(     "alloc_inode(ebmp,%8lld,start=0x%08x,limit=0x%08llx)"
             " ==> 0x%08x", 
             address_range_in_words, start, limit, retval);
  return retval;
}
Example #3
0
static tnode_t *alloc_leaf( extbmp_t *ebmp, word start, word limit ) 
{
  tnode_t *retval;
  ebmp->leaf_count += 1;
  retval = alloc_tnode( ebmp, tag_leaf, 
                        (sizeof( leaf_t )
                         + ebmp->leaf_words*sizeof(word)));
  assert( ((word*)start + (ADDRS_PER_WORD*ebmp->leaf_words)) == (word*)limit );
#if INCLUDE_REDUNDANT_FIELDS
  retval->leaf.start = start;
  retval->leaf.limit = limit;
#endif

  init_leaf_fields_cleared( ebmp, &retval->leaf );

  dbmsg(     "alloc_leaf(ebmp,start=0x%08x,limit=0x%08x)"
             "           ==> 0x%08x",
             start, limit, retval);
  return retval;
}
Example #4
0
/* split_node() - splits a full node in the B-tree into two separate nodes,
 * possibly creating a new root node in the process
 * should be no need to modify this function
 */
void split_node(p_tnode * ppnode, int * poffset) {
    p_tnode pnode = *ppnode;
    int median = pnode->nkeys>>1, i;
    p_tnode parent = pnode->parent, split = alloc_tnode();

    if (poffset != NULL) {
        /* update offset index and ppnode to point to new insertion point */
        if (*poffset > median) {
            /* move to new (split) node */
            *poffset -= (median+1);
            *ppnode = split;
        }
    }
    if (parent) {
        int insert = find_index(pnode->keys[median],parent);

        /* move median into parent */
        for (i = parent->nkeys; i > insert; i--) {
            parent->keys[i] = parent->keys[i-1];
            parent->values[i] = parent->values[i-1];
            parent->children[i+1] = parent->children[i];
        }
        parent->keys[insert] = pnode->keys[median];
        parent->values[insert] = pnode->values[median];
        parent->children[insert] = pnode;
        parent->nkeys++;

        /* move half from pnode into new node */
        for (i = median + 1; i < pnode->nkeys; i++) {
            split->keys[i-(median+1)] = pnode->keys[i];
            split->values[i-(median+1)] = pnode->values[i];
        }
        for (i = median + 1; i < pnode->nkeys+1; i++) {
            split->children[i-(median+1)] = pnode->children[i];
            if (pnode->children[i] != NULL)
                pnode->children[i]->parent = split;
            pnode->children[i] = NULL;
        }
        split->nkeys = pnode->nkeys - (median+1);
        pnode->nkeys = median;
        parent->children[insert+1] = split;
        split->parent = parent;
    } else {
        /* split root */
        parent = ptreeroot = alloc_tnode();
        parent->keys[0] = pnode->keys[median];
        parent->values[0] = pnode->values[median];
        parent->children[0] = pnode;
        parent->nkeys = 1;
        pnode->parent = parent;

        /* move half from pnode into new node */
        for (i = median + 1; i < pnode->nkeys; i++) {
            split->keys[i-(median+1)] = pnode->keys[i];
            split->values[i-(median+1)] = pnode->values[i];
        }
        for (i = median + 1; i < pnode->nkeys+1; i++) {
            split->children[i-(median+1)] = pnode->children[i];
            if (pnode->children[i] != NULL)
                pnode->children[i]->parent = split;
            pnode->children[i] = NULL;
        }
        split->nkeys = pnode->nkeys - (median+1);
        pnode->nkeys = median;
        parent->children[1] = split;
        split->parent = parent;
    }
}