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