| 215 | } |
| 216 | |
| 217 | fn get_range_node( |
| 218 | &mut self, |
| 219 | node_offset: usize, |
| 220 | start: K, |
| 221 | end: K, |
| 222 | result: &mut Vec<(K, V)>, |
| 223 | ) -> Result<(), io::Error> { |
| 224 | let node = self.storage_manager.load_node(node_offset)?; |
| 225 | |
| 226 | match node.node_type { |
| 227 | NodeType::Internal => { |
| 228 | let mut idx = node |
| 229 | .keys |
| 230 | .binary_search(&start.clone()) |
| 231 | .unwrap_or_else(|x| x); |
| 232 | if idx == node.keys.len() { |
| 233 | idx -= 1; |
| 234 | } |
| 235 | |
| 236 | self.get_range_node(node.children[idx], start.clone(), end.clone(), result)?; |
| 237 | |
| 238 | while idx < node.keys.len() && node.keys[idx] < end { |
| 239 | self.get_range_node( |
| 240 | node.children[idx + 1], |
| 241 | start.clone(), |
| 242 | end.clone(), |
| 243 | result, |
| 244 | )?; |
| 245 | idx += 1; |
| 246 | } |
| 247 | } |
| 248 | NodeType::Leaf => { |
| 249 | let mut idx = node.keys.binary_search(&start).unwrap_or_else(|x| x); |
| 250 | if node.keys.len() == 0 { |
| 251 | return Ok(()); |
| 252 | } |
| 253 | if idx == node.keys.len() { |
| 254 | idx -= 1; |
| 255 | } |
| 256 | |
| 257 | while idx < node.keys.len() && node.keys[idx] < end { |
| 258 | if node.keys[idx] >= start { |
| 259 | result.push((node.keys[idx].clone(), node.values[idx].clone().unwrap())); |
| 260 | } |
| 261 | idx += 1; |
| 262 | } |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | Ok(()) |
| 267 | } |
| 268 | |
| 269 | pub fn batch_insert(&mut self, entries: Vec<(K, V)>) -> Result<(), io::Error> { |
| 270 | if entries.is_empty() { |