Step 11
This commit is contained in:
parent
cd4c6002c6
commit
47d569e3fc
31
db.c
31
db.c
@ -352,6 +352,34 @@ Cursor* leaf_node_find(Table* table, uint32_t page_num, uint32_t key) {
|
||||
return cursor;
|
||||
}
|
||||
|
||||
Cursor* internal_node_find(Table* table, uint32_t page_num, uint32_t key) {
|
||||
void* node = get_page(table->pager, page_num);
|
||||
uint32_t num_keys = *internal_node_num_keys(node);
|
||||
|
||||
/* Binary search to find index of child to search */
|
||||
uint32_t min_index = 0;
|
||||
uint32_t max_index = num_keys; /* there is one more child than key */
|
||||
|
||||
while (min_index != max_index) {
|
||||
uint32_t index = (min_index + max_index) / 2;
|
||||
uint32_t key_to_right = *internal_node_key(node, index);
|
||||
if (key_to_right >= key) {
|
||||
max_index = index;
|
||||
} else {
|
||||
min_index = index + 1;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t child_num = *internal_node_child(node, min_index);
|
||||
void* child = get_page(table->pager, child_num);
|
||||
switch (get_node_type(child)) {
|
||||
case NODE_LEAF:
|
||||
return leaf_node_find(table, child_num, key);
|
||||
case NODE_INTERNAL:
|
||||
return internal_node_find(table, child_num, key);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the position of the given key.
|
||||
* If the key is not present, return the position
|
||||
@ -364,8 +392,7 @@ Cursor* table_find(Table* table, uint32_t key) {
|
||||
if (get_node_type(root_node) == NODE_LEAF) {
|
||||
return leaf_node_find(table, root_page_num, key);
|
||||
} else {
|
||||
printf("Need to implement searching an internal node\n");
|
||||
exit(EXIT_FAILURE);
|
||||
return internal_node_find(table, root_page_num, key);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user