示例#1
1
  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);
    }
  }
示例#2
0
  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);
    }
  }