Cursors are required for some advanced queries on an mdb database,
when the basic set of functions in mdb_txn
is not
sufficient.
Cursors must be created from within a transaction (which in turn are created from an environment).
close
Close the cursor
Usage:
close()
Value: None, called for side effects only
Note: In lmdb.h this is mdb_cursor_close()
put
Store data using the cursor
Usage:
put(key, value, overwrite = TRUE, append = FALSE)
Arguments:
key
: The key (string or raw)
value
: The value (string or raw)
overwrite
: As for mdb_txn
$put
append
: As for mdb_txn
$put
Value: Logical scalar, indicating if data was previously stored at this key
Note: In lmdb.h this is mdb_cursor_put()
del
Delete the current key
Usage:
del()
Value:
Logical, indicating if a value was deleted (which will be TRUE
if the cursor was valid before this operation). Primarily called for its side effect of deleting the data. After deletion, we call mdb_cursor_get
with MDB_GET_CURRENT
which will re-validate the cursor.
Note: In lmdb.h this is mdb_cursor_del()
replace
Replace a key's current value with a new value, returning the old value. This is like doing a get()
followed by a put
within a transaction.
Usage:
replace(key, value, as_raw = NULL)
Arguments:
key
: The key to replace
value
: The new value to store
as_raw
: Return the value as raw. With a value of NULL
it will return a string if possible (i.e., if there are no null bytes) and a raw vector otherwise. With as_raw = TRUE
we always return a raw vector. With as_raw = FALSE
we always return a string, or throw an error if this is not possible.
pop
Delete a key's value, returning the value just before it was deleted. This is like doing a get
followed by a del
within a transaction.
Usage:
pop(key, as_raw = NULL)
Arguments:
key
: The key to delete
as_raw
: Return the value as raw. With a value of NULL
it will return a string if possible (i.e., if there are no null bytes) and a raw vector otherwise. With as_raw = TRUE
we always return a raw vector. With as_raw = FALSE
we always return a string, or throw an error if this is not possible.
Value:
Depending on as_raw
and if there is a value stored, NULL
, a character string or a raw vector
first
Move the cursor to the first item in the database
Usage:
first()
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
last
Move the cursor to the last item in the database
Usage:
last()
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
move_next
Move the cursor to the next item in the database. If called while at the last item in the database, this will invalidate the cursor position.
Usage:
move_next()
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
move_prev
Move the cursor to the previous item in the database. If called while at the first item in the database, this will invalidate the cursor position.
Usage:
move_prev()
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
move_to
Move the cursor to the item in the database with key key
. If key
does not exist, this will invalidate the cursor position.
Usage:
move_to(key)
Arguments:
key
: Key to move to (string or raw)
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
seek
Move the cursor to the item in the database with key equal to or greater than key
. If key
does not exist and no key with a key greater than key
exists, this will invalidate the cursor position.
Usage:
seek(key)
Arguments:
key
: Key to seek (string or raw)
Value: Invisibly, a logical indicating if the cursor position is valid, but primarily called for side effects
get
Move to a key and fetch the value
Usage:
get(key, as_proxy = FALSE, as_raw = NULL)
Arguments:
key
: The key to find (string or raw)
as_proxy
: Return as an mdb_proxy
object?
as_raw
: Return the value as raw. With a value of NULL
it will return a string if possible (i.e., if there are no null bytes) and a raw vector otherwise. With as_raw = TRUE
we always return a raw vector. With as_raw = FALSE
we always return a string, or throw an error if this is not possible.
Value:
Depending on as_raw
and if there is a value stored, NULL
, a character string or a raw vector
is_valid
Test if cursor is valid (i.e., that it is pointing at data that can be retrieved). Cursors start off invalid until placed (e.g., first
, last
) and can be invalidated by moving off the beginning or end of the database.
Usage:
is_valid()
key
Return the current key
Usage:
key(as_proxy = FALSE, as_raw = NULL)
Arguments:
as_proxy
: Return as an mdb_proxy
object?
as_raw
: Return the value as raw. With a value of NULL
it will return a string if possible (i.e., if there are no null bytes) and a raw vector otherwise. With as_raw = TRUE
we always return a raw vector. With as_raw = FALSE
we always return a string, or throw an error if this is not possible.
value
Return the current value
Usage:
value(as_proxy = FALSE, as_raw = NULL)
Arguments:
as_proxy
: Return as an mdb_proxy
object?
as_raw
: Return the value as raw. With a value of NULL
it will return a string if possible (i.e., if there are no null bytes) and a raw vector otherwise. With as_raw = TRUE
we always return a raw vector. With as_raw = FALSE
we always return a string, or throw an error if this is not possible.
# Start by creating a new environment, and within that a write
# transaction, and from that a new cursor. But first put a bunch
# of data into the database
env <- thor::mdb_env(tempfile())
env$mput(letters, LETTERS)
#> NULL
txn <- env$begin(write = TRUE)
cur <- txn$cursor()
# Move the cursor to the first position
cur$first()
# The key and value:
cur$key()
#> [1] "a"
cur$value()
#> [1] "A"
# Move to a different key:
cur$move_to("g")
cur$value()
#> [1] "G"
# Delete the current item
cur$del()
#> [1] TRUE
cur$key()
#> [1] "h"
# We can't move to 'g' any more as it's gone:
(cur$move_to("g"))
#> [1] FALSE
cur$key() # NULL
#> NULL
# But we can *seek* 'g', which will move to 'h'
(cur$seek("g"))
#> [1] TRUE
cur$key() # "h"
#> [1] "h"
# Get raw values out:
cur$value(as_raw = TRUE)
#> [1] 48
# Cleanup
env$destroy()