/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.dev.store.btree; /** * A cursor to iterate over all keys in new pages. * * @param <K> the key type * @param <V> the value type */ public class ChangeCursor<K, V> extends Cursor<K, V> { private final long minVersion; ChangeCursor(MVMap<K, V> map, Page root, K from, long minVersion) { super(map, root, from); this.minVersion = minVersion; } public CursorPos min(Page p, K from) { while (p != null && p.getVersion() >= minVersion) { if (p.isLeaf()) { CursorPos c = new CursorPos(); c.page = p; c.index = 0; return c; } for (int i = 0; i < p.getChildPageCount(); i++) { if (isChildOld(p, i)) { continue; } CursorPos c = new CursorPos(); c.page = p; c.index = i; push(c); p = p.getChildPage(i); break; } } return null; } public CursorPos visitChild(Page p, int childIndex) { if (isChildOld(p, childIndex)) { return null; } return super.visitChild(p, childIndex); } private boolean isChildOld(Page p, int childIndex) { long pos = p.getChildPagePos(childIndex); if (pos == 0) { Page c = p.getChildPage(childIndex); if (c.getVersion() < minVersion) { return true; } } else if (map.getStore().getChunk(pos).version < minVersion) { return true; } return false; } }