From 8438c6ebc3a6ccd05e33f7bc1e9648645f3c0831 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Thu, 20 Feb 2014 10:55:04 -0800 Subject: Cursor.Get is now Cursor.Seek, and returns the first possible key. This makes range and prefix queries possible. Closes: #44 --- cursor.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'cursor.go') diff --git a/cursor.go b/cursor.go index 3262f4c..410bb89 100644 --- a/cursor.go +++ b/cursor.go @@ -48,32 +48,28 @@ func (c *Cursor) Next() (key []byte, value []byte) { return c.keyValue() } -// Get moves the cursor to a given key and returns its value. -// If the key does not exist then the cursor is left at the closest key and a nil value is returned. -func (c *Cursor) Get(key []byte) (value []byte) { +// Seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. If no keys +// follow, a nil value is returned. +func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { // Start from root page and traverse to correct page. c.stack = c.stack[:0] - c.search(key, c.transaction.page(c.root)) + c.search(seek, c.transaction.page(c.root)) p, index := c.top() // If the cursor is pointing to the end of page then return nil. if index == p.count { - return nil - } - - // If our target node isn't the same key as what's passed in then return nil. - if !bytes.Equal(key, c.element().key()) { - return nil + return nil, nil } - return c.element().value() + return c.element().key(), c.element().value() } // first moves the cursor to the first leaf element under the last page in the stack. func (c *Cursor) first() { p := c.stack[len(c.stack)-1].page for { - // Exit when we hit a leaf page. + // Exit when we hit a leaf page. if (p.flags & leafPageFlag) != 0 { break } -- cgit v1.2.3