A WT_CURSOR handle is the interface to a cursor. More...
Public Member Functions | |
int | close (WT_CURSOR *cursor) |
Close the cursor. More... | |
int | reconfigure (WT_CURSOR *cursor, const char *config) |
Reconfigure the cursor. More... | |
Data access | |
int | get_key (WT_CURSOR *cursor,...) |
Get the key for the current record. More... | |
int | get_value (WT_CURSOR *cursor,...) |
Get the value for the current record. More... | |
void | set_key (WT_CURSOR *cursor,...) |
Set the key for the next operation. More... | |
void | set_value (WT_CURSOR *cursor,...) |
Set the value for the next operation. More... | |
Cursor positioning | |
int | compare (WT_CURSOR *cursor, WT_CURSOR *other, int *comparep) |
Return the ordering relationship between two cursors: both cursors must have the same data source and have valid keys. More... | |
int | equals (WT_CURSOR *cursor, WT_CURSOR *other, int *equalp) |
Return the ordering relationship between two cursors, testing only for equality: both cursors must have the same data source and have valid keys. More... | |
int | next (WT_CURSOR *cursor) |
Return the next record. More... | |
int | prev (WT_CURSOR *cursor) |
Return the previous record. More... | |
int | reset (WT_CURSOR *cursor) |
Reset the cursor. More... | |
int | search (WT_CURSOR *cursor) |
Return the record matching the key. More... | |
int | search_near (WT_CURSOR *cursor, int *exactp) |
Return the record matching the key if it exists, or an adjacent record. More... | |
Data modification | |
int | insert (WT_CURSOR *cursor) |
Insert a record and optionally update an existing record. More... | |
int | modify (WT_CURSOR *cursor, WT_MODIFY *entries, int nentries) |
Modify an existing record. More... | |
int | update (WT_CURSOR *cursor) |
Update an existing record and optionally insert a record. More... | |
int | remove (WT_CURSOR *cursor) |
Remove a record. More... | |
int | reserve (WT_CURSOR *cursor) |
Reserve an existing record so a subsequent write is less likely to fail due to a conflict between concurrent operations. More... | |
Public Attributes | |
WT_SESSION * | session |
The session handle for this cursor. More... | |
const char * | uri |
The name of the data source for the cursor, matches the uri parameter to WT_SESSION::open_cursor used to open the cursor. | |
const char * | key_format |
The format of the data packed into key items. More... | |
const char * | value_format |
The format of the data packed into value items. More... | |
A WT_CURSOR handle is the interface to a cursor.
Cursors allow data to be searched, iterated and modified, implementing the CRUD (create, read, update and delete) operations. Cursors are opened in the context of a session. If a transaction is started, cursors operate in the context of the transaction until the transaction is resolved.
Raw data is represented by key/value pairs of WT_ITEM structures, but cursors can also provide access to fields within the key and value if the formats are described in the WT_SESSION::create method.
In the common case, a cursor is used to access records in a table. However, cursors can be used on subsets of tables (such as a single column or a projection of multiple columns), as an interface to statistics, configuration data or application-specific data sources. See WT_SESSION::open_cursor for more information.
Thread safety: A WT_CURSOR handle is not usually shared between threads, see Multithreading for more information.
int WT_CURSOR::close | ( | WT_CURSOR * | cursor | ) |
Close the cursor.
This releases the resources associated with the cursor handle. Cursors are closed implicitly by ending the enclosing connection or closing the session in which they were opened.
cursor | the cursor handle |
Return the ordering relationship between two cursors: both cursors must have the same data source and have valid keys.
(When testing only for equality, WT_CURSOR::equals may be faster.)
cursor | the cursor handle |
other | another cursor handle |
comparep | the status of the comparison: < 0 if cursor refers to a key that appears before other , 0 if the cursors refer to the same key, and > 0 if cursor refers to a key that appears after other . |
Return the ordering relationship between two cursors, testing only for equality: both cursors must have the same data source and have valid keys.
cursor | the cursor handle | |
other | another cursor handle | |
[out] | equalp | the status of the comparison: 1 if the cursors refer to the same key, otherwise 0. |
int WT_CURSOR::get_key | ( | WT_CURSOR * | cursor, |
... | |||
) |
Get the key for the current record.
cursor | the cursor handle |
... | pointers to hold key fields corresponding to WT_CURSOR::key_format. |
int WT_CURSOR::get_value | ( | WT_CURSOR * | cursor, |
... | |||
) |
Get the value for the current record.
cursor | the cursor handle |
... | pointers to hold value fields corresponding to WT_CURSOR::value_format. |
int WT_CURSOR::insert | ( | WT_CURSOR * | cursor | ) |
Insert a record and optionally update an existing record.
If the cursor was configured with "overwrite=true" (the default), both the key and value must be set; if the record already exists, the key's value will be updated, otherwise, the record will be inserted.
If the cursor was not configured with "overwrite=true", both the key and value must be set and the record must not already exist; the record will be inserted.
If a cursor with record number keys was configured with "append=true" (not the default), the value must be set; a new record will be appended and the record number set as the cursor key value.
The cursor ends with no position, and a subsequent call to the WT_CURSOR::next (WT_CURSOR::prev) method will iterate from the beginning (end) of the table.
If the cursor does not have record number keys or was not configured with "append=true", the cursor ends with no key set and a subsequent call to the WT_CURSOR::get_key method will fail. The cursor ends with no value set and a subsequent call to the WT_CURSOR::get_value method will fail.
Inserting a new record after the current maximum record in a fixed-length bit field column-store (that is, a store with an 'r' type key and 't' type value) may implicitly create the missing records as records with a value of 0.
When loading a large amount of data into a new object, using a cursor with the bulk
configuration string enabled and loading the data in sorted order will be much faster than doing out-of-order inserts. See Bulk-load for more information.
The maximum length of a single column stored in a table is not fixed (as it partially depends on the underlying file configuration), but is always a small number of bytes less than 4GB.
cursor | the cursor handle |
overwrite=false
is configured and a record with the specified key already exists, WT_DUPLICATE_KEY is returned. Also, if in_memory
is configured for the database and the insert requires more than the configured cache size to complete, WT_CACHE_FULL is returned. Modify an existing record.
Both the key and value must be set and the record must already exist; the record will be updated.
Modifications are specified in WT_MODIFY structures. Modifications are applied in order and later modifications can update earlier ones.
The modify method is only supported on strings (value format type S
), or raw byte arrays accessed using a WT_ITEM structure (value format type u
).
The WT_CURSOR::modify method can only be called from within an explicit transaction configured at a higher isolation level than read-uncommitted
. Using read-committed
isolation is allowed, but requires caution: reading a value, re-positioning the cursor and then modifying the value based on the initial read could lead to unexpected results. Using snapshot
isolation is recommended.
The WT_CURSOR::modify method stores a change record in cache and writes a change record to the log instead of the usual complete values. Note that WT_CURSOR::modify is generally slower than the WT_CURSOR::update method, and can result in slower reads because the complete value must be assembled during retrieval. The WT_CURSOR::modify method is intended for applications modifying large records where there is cache or I/O pressure, that is, applications that will benefit when data updates require less cache and they write less logging information.
On success, the cursor ends positioned at the modified record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the cursor no longer needs that position.
The maximum length of a single column stored in a table is not fixed (as it partially depends on the underlying file configuration), but is always a small number of bytes less than 4GB.
cursor | the cursor handle |
entries | an array of modification data structures |
nentries | the number of modification data structures |
in_memory
is configured for the database and the modify requires more than the configured cache size to complete, WT_CACHE_FULL is returned. int WT_CURSOR::next | ( | WT_CURSOR * | cursor | ) |
Return the next record.
cursor | the cursor handle |
int WT_CURSOR::prev | ( | WT_CURSOR * | cursor | ) |
Return the previous record.
cursor | the cursor handle |
int WT_CURSOR::reconfigure | ( | WT_CURSOR * | cursor, |
const char * | config | ||
) |
Reconfigure the cursor.
The cursor is reset.
cursor | the cursor handle | |||||||||
config | configuration string, see Configuration Strings. Permitted values:
|
int WT_CURSOR::remove | ( | WT_CURSOR * | cursor | ) |
Remove a record.
If the cursor was configured with "overwrite=true" (the default), the key must be set; the key's record will be removed if it exists, no error will be returned if the record does not exist.
If the cursor was configured with "overwrite=false" (not the default), the key must be set and the key's record must exist; the record will be removed.
Any cursor position does not change: if the cursor was positioned before the WT_CURSOR::remove call, the cursor remains positioned at the removed record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the cursor no longer needs that position. If the cursor was not positioned before the WT_CURSOR::remove call, the cursor ends with no position, and a subsequent call to the WT_CURSOR::next (WT_CURSOR::prev) method will iterate from the beginning (end) of the table.
Removing a record in a fixed-length bit field column-store (that is, a store with an 'r' type key and 't' type value) is identical to setting the record's value to 0.
cursor | the cursor handle |
overwrite=false
is configured and no record with the specified key exists, WT_NOTFOUND is returned. int WT_CURSOR::reserve | ( | WT_CURSOR * | cursor | ) |
Reserve an existing record so a subsequent write is less likely to fail due to a conflict between concurrent operations.
The key must first be set and the record must already exist.
Note that reserve works by doing a special update operation that is not logged and does not change the value of the record. This update is aborted when the enclosing transaction ends regardless of whether it commits or rolls back. Given that, reserve can only be used to detect conflicts between transactions that execute concurrently. It cannot detect all logical conflicts between transactions. For that, some update to the record must be committed.
On success, the cursor ends positioned at the specified record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the cursor no longer needs that position.
cursor | the cursor handle |
int WT_CURSOR::reset | ( | WT_CURSOR * | cursor | ) |
Reset the cursor.
Any resources held by the cursor are released, and the cursor's key and position are no longer valid. Subsequent iterations with WT_CURSOR::next will move to the first record, or with WT_CURSOR::prev will move to the last record.
In the case of a statistics cursor, resetting the cursor refreshes the statistics information returned. Resetting a session statistics cursor resets all the session statistics values to zero.
cursor | the cursor handle |
int WT_CURSOR::search | ( | WT_CURSOR * | cursor | ) |
Return the record matching the key.
The key must first be set.
On success, the cursor ends positioned at the returned record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the record has been retrieved and the cursor no longer needs that position.
cursor | the cursor handle |
int WT_CURSOR::search_near | ( | WT_CURSOR * | cursor, |
int * | exactp | ||
) |
Return the record matching the key if it exists, or an adjacent record.
An adjacent record is either the smallest record larger than the key or the largest record smaller than the key (in other words, a logically adjacent key).
The key must first be set.
An example of a search for an exact or adjacent match:
An example of a forward scan through the table, where all keys greater than or equal to a specified prefix are included in the scan:
An example of a backward scan through the table, where all keys less than a specified prefix are included in the scan:
On success, the cursor ends positioned at the returned record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the record has been retrieved and the cursor no longer needs that position.
cursor | the cursor handle |
exactp | the status of the search: 0 if an exact match is found, < 0 if a smaller key is returned, > 0 if a larger key is returned |
void WT_CURSOR::set_key | ( | WT_CURSOR * | cursor, |
... | |||
) |
Set the key for the next operation.
cursor | the cursor handle |
... | key fields corresponding to WT_CURSOR::key_format. |
If an error occurs during this operation, a flag will be set in the cursor, and the next operation to access the key will fail. This simplifies error handling in applications.
void WT_CURSOR::set_value | ( | WT_CURSOR * | cursor, |
... | |||
) |
Set the value for the next operation.
cursor | the cursor handle |
... | value fields corresponding to WT_CURSOR::value_format. |
If an error occurs during this operation, a flag will be set in the cursor, and the next operation to access the value will fail. This simplifies error handling in applications.
int WT_CURSOR::update | ( | WT_CURSOR * | cursor | ) |
Update an existing record and optionally insert a record.
If the cursor was configured with "overwrite=true" (the default), both the key and value must be set; if the record already exists, the key's value will be updated, otherwise, the record will be inserted.
If the cursor was not configured with "overwrite=true", both the key and value must be set and the record must already exist; the record will be updated.
On success, the cursor ends positioned at the modified record; to minimize cursor resources, the WT_CURSOR::reset method should be called as soon as the cursor no longer needs that position. (The WT_CURSOR::insert method never keeps a cursor position and may be more efficient for that reason.)
The maximum length of a single column stored in a table is not fixed (as it partially depends on the underlying file configuration), but is always a small number of bytes less than 4GB.
cursor | the cursor handle |
overwrite=false
is configured and no record with the specified key exists, WT_NOTFOUND is returned. Also, if in_memory
is configured for the database and the update requires more than the configured cache size to complete, WT_CACHE_FULL is returned. const char* WT_CURSOR::key_format |
The format of the data packed into key items.
See Packing and Unpacking Data for details. If not set, a default value of "u" is assumed, and applications must use WT_ITEM structures to manipulate untyped byte arrays.
WT_SESSION* WT_CURSOR::session |
The session handle for this cursor.
const char* WT_CURSOR::value_format |
The format of the data packed into value items.
See Packing and Unpacking Data for details. If not set, a default value of "u" is assumed, and applications must use WT_ITEM structures to manipulate untyped byte arrays.