public B_Tree.Page<Key> load(int pageNo) { try { ByteBuffer buffer = ByteBuffer.allocate(pageSize); channel.read(buffer, pageNo * pageSize); buffer.rewind(); B_Tree.Page<Key> page = new B_Tree.Page<Key>(pageNo); List<B_Tree.KeyPointer<Key>> keyPointers = page.keyPointers; char nodeType = buffer.getChar(); int size = buffer.getInt(); for (int i = 0; i < size; i++) { Key key = keyAccessor.read(buffer); if (nodeType == INTERNAL) { int branch = buffer.getInt(); addBranch(keyPointers, key, branch); } else if (nodeType == LEAF) { Value value = valueAccessor.read(buffer); addLeaf(keyPointers, key, value); } } return page; } catch (IOException ex) { throw new RuntimeException(ex); } }
public void save(int pageNo, B_Tree.Page<Key> page) { try { ByteBuffer buffer = ByteBuffer.allocate(pageSize); List<B_Tree.KeyPointer<Key>> ptrs = page.keyPointers; boolean isBranch = !ptrs.isEmpty() && ptrs.get(0).t2 instanceof B_Tree.Branch; buffer.putChar(isBranch ? INTERNAL : LEAF); buffer.putInt(ptrs.size()); for (B_Tree.KeyPointer<Key> keyPtr : ptrs) { keyAccessor.write(buffer, keyPtr.t1); if (keyPtr.t2 instanceof B_Tree.Branch) { int branch = ((B_Tree.Branch) keyPtr.t2).branch; buffer.putInt(branch); } else if (keyPtr.t2 instanceof B_Tree.Leaf) { @SuppressWarnings("unchecked") Value value = ((B_Tree.Leaf<Value>) keyPtr.t2).value; valueAccessor.write(buffer, value); } } buffer.flip(); channel.write(buffer, pageNo * pageSize); } catch (IOException ex) { throw new RuntimeException(ex); } }