1 /*
2 ** 2011-08-10
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 **
13 ** This file defines the LSM API.
14 */
15 #ifndef _LSM_H
16 #define _LSM_H
17 #include <stddef.h>
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /*
23 ** Opaque handle types.
24 */
25 typedef struct lsm_compress lsm_compress;   /* Compression library functions */
26 typedef struct lsm_compress_factory lsm_compress_factory;
27 typedef struct lsm_cursor lsm_cursor;       /* Database cursor handle */
28 typedef struct lsm_db lsm_db;               /* Database connection handle */
29 typedef struct lsm_env lsm_env;             /* Runtime environment */
30 typedef struct lsm_file lsm_file;           /* OS file handle */
31 typedef struct lsm_mutex lsm_mutex;         /* Mutex handle */
32 
33 /* 64-bit integer type used for file offsets. */
34 typedef long long int lsm_i64;              /* 64-bit signed integer type */
35 
36 /* Candidate values for the 3rd argument to lsm_env.xLock() */
37 #define LSM_LOCK_UNLOCK 0
38 #define LSM_LOCK_SHARED 1
39 #define LSM_LOCK_EXCL   2
40 
41 /* Flags for lsm_env.xOpen() */
42 #define LSM_OPEN_READONLY 0x0001
43 
44 /*
45 ** CAPI: Database Runtime Environment
46 **
47 ** Run-time environment used by LSM
48 */
49 struct lsm_env {
50   int nByte;                 /* Size of this structure in bytes */
51   int iVersion;              /* Version number of this structure (1) */
52   /****** file i/o ***********************************************/
53   void *pVfsCtx;
54   int (*xFullpath)(lsm_env*, const char *, char *, int *);
55   int (*xOpen)(lsm_env*, const char *, int flags, lsm_file **);
56   int (*xRead)(lsm_file *, lsm_i64, void *, int);
57   int (*xWrite)(lsm_file *, lsm_i64, void *, int);
58   int (*xTruncate)(lsm_file *, lsm_i64);
59   int (*xSync)(lsm_file *);
60   int (*xSectorSize)(lsm_file *);
61   int (*xRemap)(lsm_file *, lsm_i64, void **, lsm_i64*);
62   int (*xFileid)(lsm_file *, void *pBuf, int *pnBuf);
63   int (*xClose)(lsm_file *);
64   int (*xUnlink)(lsm_env*, const char *);
65   int (*xLock)(lsm_file*, int, int);
66   int (*xTestLock)(lsm_file*, int, int, int);
67   int (*xShmMap)(lsm_file*, int, int, void **);
68   void (*xShmBarrier)(void);
69   int (*xShmUnmap)(lsm_file*, int);
70   /****** memory allocation ****************************************/
71   void *pMemCtx;
72   void *(*xMalloc)(lsm_env*, size_t);            /* malloc(3) function */
73   void *(*xRealloc)(lsm_env*, void *, size_t);   /* realloc(3) function */
74   void (*xFree)(lsm_env*, void *);               /* free(3) function */
75   size_t (*xSize)(lsm_env*, void *);             /* xSize function */
76   /****** mutexes ****************************************************/
77   void *pMutexCtx;
78   int (*xMutexStatic)(lsm_env*,int,lsm_mutex**); /* Obtain a static mutex */
79   int (*xMutexNew)(lsm_env*, lsm_mutex**);       /* Get a new dynamic mutex */
80   void (*xMutexDel)(lsm_mutex *);           /* Delete an allocated mutex */
81   void (*xMutexEnter)(lsm_mutex *);         /* Grab a mutex */
82   int (*xMutexTry)(lsm_mutex *);            /* Attempt to obtain a mutex */
83   void (*xMutexLeave)(lsm_mutex *);         /* Leave a mutex */
84   int (*xMutexHeld)(lsm_mutex *);           /* Return true if mutex is held */
85   int (*xMutexNotHeld)(lsm_mutex *);        /* Return true if mutex not held */
86   /****** other ****************************************************/
87   int (*xSleep)(lsm_env*, int microseconds);
88 
89   /* New fields may be added in future releases, in which case the
90   ** iVersion value will increase. */
91 };
92 
93 /*
94 ** Values that may be passed as the second argument to xMutexStatic.
95 */
96 #define LSM_MUTEX_GLOBAL 1
97 #define LSM_MUTEX_HEAP   2
98 
99 /*
100 ** CAPI: LSM Error Codes
101 */
102 #define LSM_OK         0
103 #define LSM_ERROR      1
104 #define LSM_BUSY       5
105 #define LSM_NOMEM      7
106 #define LSM_READONLY   8
107 #define LSM_IOERR     10
108 #define LSM_CORRUPT   11
109 #define LSM_FULL      13
110 #define LSM_CANTOPEN  14
111 #define LSM_PROTOCOL  15
112 #define LSM_MISUSE    21
113 
114 #define LSM_MISMATCH  50
115 
116 
117 #define LSM_IOERR_NOENT (LSM_IOERR | (1<<8))
118 
119 /*
120 ** CAPI: Creating and Destroying Database Connection Handles
121 **
122 ** Open and close a database connection handle.
123 */
124 int lsm_new(lsm_env*, lsm_db **ppDb);
125 int lsm_close(lsm_db *pDb);
126 
127 /*
128 ** CAPI: Connecting to a Database
129 */
130 int lsm_open(lsm_db *pDb, const char *zFilename);
131 
132 /*
133 ** CAPI: Obtaining pointers to database environments
134 **
135 ** Return a pointer to the environment used by the database connection
136 ** passed as the first argument. Assuming the argument is valid, this
137 ** function always returns a valid environment pointer - it cannot fail.
138 */
139 lsm_env *lsm_get_env(lsm_db *pDb);
140 
141 /*
142 ** The lsm_default_env() function returns a pointer to the default LSM
143 ** environment for the current platform.
144 */
145 lsm_env *lsm_default_env(void);
146 
147 
148 /*
149 ** CAPI: Configuring a database connection.
150 **
151 ** The lsm_config() function is used to configure a database connection.
152 */
153 int lsm_config(lsm_db *, int, ...);
154 
155 /*
156 ** The following values may be passed as the second argument to lsm_config().
157 **
158 ** LSM_CONFIG_AUTOFLUSH:
159 **   A read/write integer parameter.
160 **
161 **   This value determines the amount of data allowed to accumulate in a
162 **   live in-memory tree before it is marked as old. After committing a
163 **   transaction, a connection checks if the size of the live in-memory tree,
164 **   including data structure overhead, is greater than the value of this
165 **   option in KB. If it is, and there is not already an old in-memory tree,
166 **   the live in-memory tree is marked as old.
167 **
168 **   The maximum allowable value is 1048576 (1GB). There is no minimum
169 **   value. If this parameter is set to zero, then an attempt is made to
170 **   mark the live in-memory tree as old after each transaction is committed.
171 **
172 **   The default value is 1024 (1MB).
173 **
174 ** LSM_CONFIG_PAGE_SIZE:
175 **   A read/write integer parameter. This parameter may only be set before
176 **   lsm_open() has been called.
177 **
178 ** LSM_CONFIG_BLOCK_SIZE:
179 **   A read/write integer parameter.
180 **
181 **   This parameter may only be set before lsm_open() has been called. It
182 **   must be set to a power of two between 64 and 65536, inclusive (block
183 **   sizes between 64KB and 64MB).
184 **
185 **   If the connection creates a new database, the block size of the new
186 **   database is set to the value of this option in KB. After lsm_open()
187 **   has been called, querying this parameter returns the actual block
188 **   size of the opened database.
189 **
190 **   The default value is 1024 (1MB blocks).
191 **
192 ** LSM_CONFIG_SAFETY:
193 **   A read/write integer parameter. Valid values are 0, 1 (the default)
194 **   and 2. This parameter determines how robust the database is in the
195 **   face of a system crash (e.g. a power failure or operating system
196 **   crash). As follows:
197 **
198 **     0 (off):    No robustness. A system crash may corrupt the database.
199 **
200 **     1 (normal): Some robustness. A system crash may not corrupt the
201 **                 database file, but recently committed transactions may
202 **                 be lost following recovery.
203 **
204 **     2 (full):   Full robustness. A system crash may not corrupt the
205 **                 database file. Following recovery the database file
206 **                 contains all successfully committed transactions.
207 **
208 ** LSM_CONFIG_AUTOWORK:
209 **   A read/write integer parameter.
210 **
211 ** LSM_CONFIG_AUTOCHECKPOINT:
212 **   A read/write integer parameter.
213 **
214 **   If this option is set to non-zero value N, then a checkpoint is
215 **   automatically attempted after each N KB of data have been written to
216 **   the database file.
217 **
218 **   The amount of uncheckpointed data already written to the database file
219 **   is a global parameter. After performing database work (writing to the
220 **   database file), the process checks if the total amount of uncheckpointed
221 **   data exceeds the value of this paramter. If so, a checkpoint is performed.
222 **   This means that this option may cause the connection to perform a
223 **   checkpoint even if the current connection has itself written very little
224 **   data into the database file.
225 **
226 **   The default value is 2048 (checkpoint every 2MB).
227 **
228 ** LSM_CONFIG_MMAP:
229 **   A read/write integer parameter. If this value is set to 0, then the
230 **   database file is accessed using ordinary read/write IO functions. Or,
231 **   if it is set to 1, then the database file is memory mapped and accessed
232 **   that way. If this parameter is set to any value N greater than 1, then
233 **   up to the first N KB of the file are memory mapped, and any remainder
234 **   accessed using read/write IO.
235 **
236 **   The default value is 1 on 64-bit platforms and 32768 on 32-bit platforms.
237 **
238 **
239 ** LSM_CONFIG_USE_LOG:
240 **   A read/write boolean parameter. True (the default) to use the log
241 **   file normally. False otherwise.
242 **
243 ** LSM_CONFIG_AUTOMERGE:
244 **   A read/write integer parameter. The minimum number of segments to
245 **   merge together at a time. Default value 4.
246 **
247 ** LSM_CONFIG_MAX_FREELIST:
248 **   A read/write integer parameter. The maximum number of free-list
249 **   entries that are stored in a database checkpoint (the others are
250 **   stored elsewhere in the database).
251 **
252 **   There is no reason for an application to configure or query this
253 **   parameter. It is only present because configuring a small value
254 **   makes certain parts of the lsm code easier to test.
255 **
256 ** LSM_CONFIG_MULTIPLE_PROCESSES:
257 **   A read/write boolean parameter. This parameter may only be set before
258 **   lsm_open() has been called. If true, the library uses shared-memory
259 **   and posix advisory locks to co-ordinate access by clients from within
260 **   multiple processes. Otherwise, if false, all database clients must be
261 **   located in the same process. The default value is true.
262 **
263 ** LSM_CONFIG_SET_COMPRESSION:
264 **   Set the compression methods used to compress and decompress database
265 **   content. The argument to this option should be a pointer to a structure
266 **   of type lsm_compress. The lsm_config() method takes a copy of the
267 **   structures contents.
268 **
269 **   This option may only be used before lsm_open() is called. Invoking it
270 **   after lsm_open() has been called results in an LSM_MISUSE error.
271 **
272 ** LSM_CONFIG_GET_COMPRESSION:
273 **   Query the compression methods used to compress and decompress database
274 **   content.
275 **
276 ** LSM_CONFIG_SET_COMPRESSION_FACTORY:
277 **   Configure a factory method to be invoked in case of an LSM_MISMATCH
278 **   error.
279 **
280 ** LSM_CONFIG_READONLY:
281 **   A read/write boolean parameter. This parameter may only be set before
282 **   lsm_open() is called.
283 */
284 #define LSM_CONFIG_AUTOFLUSH                1
285 #define LSM_CONFIG_PAGE_SIZE                2
286 #define LSM_CONFIG_SAFETY                   3
287 #define LSM_CONFIG_BLOCK_SIZE               4
288 #define LSM_CONFIG_AUTOWORK                 5
289 #define LSM_CONFIG_MMAP                     7
290 #define LSM_CONFIG_USE_LOG                  8
291 #define LSM_CONFIG_AUTOMERGE                9
292 #define LSM_CONFIG_MAX_FREELIST            10
293 #define LSM_CONFIG_MULTIPLE_PROCESSES      11
294 #define LSM_CONFIG_AUTOCHECKPOINT          12
295 #define LSM_CONFIG_SET_COMPRESSION         13
296 #define LSM_CONFIG_GET_COMPRESSION         14
297 #define LSM_CONFIG_SET_COMPRESSION_FACTORY 15
298 #define LSM_CONFIG_READONLY                16
299 
300 #define LSM_SAFETY_OFF    0
301 #define LSM_SAFETY_NORMAL 1
302 #define LSM_SAFETY_FULL   2
303 
304 /*
305 ** CAPI: Compression and/or Encryption Hooks
306 */
307 struct lsm_compress {
308   void *pCtx;
309   unsigned int iId;
310   int (*xBound)(void *, int nSrc);
311   int (*xCompress)(void *, char *, int *, const char *, int);
312   int (*xUncompress)(void *, char *, int *, const char *, int);
313   void (*xFree)(void *pCtx);
314 };
315 
316 struct lsm_compress_factory {
317   void *pCtx;
318   int (*xFactory)(void *, lsm_db *, unsigned int);
319   void (*xFree)(void *pCtx);
320 };
321 
322 #define LSM_COMPRESSION_EMPTY 0
323 #define LSM_COMPRESSION_NONE  1
324 
325 /*
326 ** CAPI: Allocating and Freeing Memory
327 **
328 ** Invoke the memory allocation functions that belong to environment
329 ** pEnv. Or the system defaults if no memory allocation functions have
330 ** been registered.
331 */
332 void *lsm_malloc(lsm_env*, size_t);
333 void *lsm_realloc(lsm_env*, void *, size_t);
334 void lsm_free(lsm_env*, void *);
335 
336 /*
337 ** CAPI: Querying a Connection For Operational Data
338 **
339 ** Query a database connection for operational statistics or data.
340 */
341 int lsm_info(lsm_db *, int, ...);
342 
343 int lsm_get_user_version(lsm_db *, unsigned int *);
344 int lsm_set_user_version(lsm_db *, unsigned int);
345 
346 /*
347 ** The following values may be passed as the second argument to lsm_info().
348 **
349 ** LSM_INFO_NWRITE:
350 **   The third parameter should be of type (int *). The location pointed
351 **   to by the third parameter is set to the number of 4KB pages written to
352 **   the database file during the lifetime of this connection.
353 **
354 ** LSM_INFO_NREAD:
355 **   The third parameter should be of type (int *). The location pointed
356 **   to by the third parameter is set to the number of 4KB pages read from
357 **   the database file during the lifetime of this connection.
358 **
359 ** LSM_INFO_DB_STRUCTURE:
360 **   The third argument should be of type (char **). The location pointed
361 **   to is populated with a pointer to a nul-terminated string containing
362 **   the string representation of a Tcl data-structure reflecting the
363 **   current structure of the database file. Specifically, the current state
364 **   of the worker snapshot. The returned string should be eventually freed
365 **   by the caller using lsm_free().
366 **
367 **   The returned list contains one element for each level in the database,
368 **   in order from most to least recent. Each element contains a
369 **   single element for each segment comprising the corresponding level,
370 **   starting with the lhs segment, then each of the rhs segments (if any)
371 **   in order from most to least recent.
372 **
373 **   Each segment element is itself a list of 4 integer values, as follows:
374 **
375 **   <ol><li> First page of segment
376 **       <li> Last page of segment
377 **       <li> Root page of segment (if applicable)
378 **       <li> Total number of pages in segment
379 **   </ol>
380 **
381 ** LSM_INFO_ARRAY_STRUCTURE:
382 **   There should be two arguments passed following this option (i.e. a
383 **   total of four arguments passed to lsm_info()). The first argument
384 **   should be the page number of the first page in a database array
385 **   (perhaps obtained from an earlier INFO_DB_STRUCTURE call). The second
386 **   trailing argument should be of type (char **). The location pointed
387 **   to is populated with a pointer to a nul-terminated string that must
388 **   be eventually freed using lsm_free() by the caller.
389 **
390 **   The output string contains the text representation of a Tcl list of
391 **   integers. Each pair of integers represent a range of pages used by
392 **   the identified array. For example, if the array occupies database
393 **   pages 993 to 1024, then pages 2048 to 2777, then the returned string
394 **   will be "993 1024 2048 2777".
395 **
396 **   If the specified integer argument does not correspond to the first
397 **   page of any database array, LSM_ERROR is returned and the output
398 **   pointer is set to a NULL value.
399 **
400 ** LSM_INFO_LOG_STRUCTURE:
401 **   The third argument should be of type (char **). The location pointed
402 **   to is populated with a pointer to a nul-terminated string containing
403 **   the string representation of a Tcl data-structure. The returned
404 **   string should be eventually freed by the caller using lsm_free().
405 **
406 **   The Tcl structure returned is a list of six integers that describe
407 **   the current structure of the log file.
408 **
409 ** LSM_INFO_ARRAY_PAGES:
410 **
411 ** LSM_INFO_PAGE_ASCII_DUMP:
412 **   As with LSM_INFO_ARRAY_STRUCTURE, there should be two arguments passed
413 **   with calls that specify this option - an integer page number and a
414 **   (char **) used to return a nul-terminated string that must be later
415 **   freed using lsm_free(). In this case the output string is populated
416 **   with a human-readable description of the page content.
417 **
418 **   If the page cannot be decoded, it is not an error. In this case the
419 **   human-readable output message will report the systems failure to
420 **   interpret the page data.
421 **
422 ** LSM_INFO_PAGE_HEX_DUMP:
423 **   This argument is similar to PAGE_ASCII_DUMP, except that keys and
424 **   values are represented using hexadecimal notation instead of ascii.
425 **
426 ** LSM_INFO_FREELIST:
427 **   The third argument should be of type (char **). The location pointed
428 **   to is populated with a pointer to a nul-terminated string containing
429 **   the string representation of a Tcl data-structure. The returned
430 **   string should be eventually freed by the caller using lsm_free().
431 **
432 **   The Tcl structure returned is a list containing one element for each
433 **   free block in the database. The element itself consists of two
434 **   integers - the block number and the id of the snapshot that freed it.
435 **
436 ** LSM_INFO_CHECKPOINT_SIZE:
437 **   The third argument should be of type (int *). The location pointed to
438 **   by this argument is populated with the number of KB written to the
439 **   database file since the most recent checkpoint.
440 **
441 ** LSM_INFO_TREE_SIZE:
442 **   If this value is passed as the second argument to an lsm_info() call, it
443 **   should be followed by two arguments of type (int *) (for a total of four
444 **   arguments).
445 **
446 **   At any time, there are either one or two tree structures held in shared
447 **   memory that new database clients will access (there may also be additional
448 **   tree structures being used by older clients - this API does not provide
449 **   information on them). One tree structure - the current tree - is used to
450 **   accumulate new data written to the database. The other tree structure -
451 **   the old tree - is a read-only tree holding older data and may be flushed
452 **   to disk at any time.
453 **
454 **   Assuming no error occurs, the location pointed to by the first of the two
455 **   (int *) arguments is set to the size of the old in-memory tree in KB.
456 **   The second is set to the size of the current, or live in-memory tree.
457 **
458 ** LSM_INFO_COMPRESSION_ID:
459 **   This value should be followed by a single argument of type
460 **   (unsigned int *). If successful, the location pointed to is populated
461 **   with the database compression id before returning.
462 */
463 #define LSM_INFO_NWRITE           1
464 #define LSM_INFO_NREAD            2
465 #define LSM_INFO_DB_STRUCTURE     3
466 #define LSM_INFO_LOG_STRUCTURE    4
467 #define LSM_INFO_ARRAY_STRUCTURE  5
468 #define LSM_INFO_PAGE_ASCII_DUMP  6
469 #define LSM_INFO_PAGE_HEX_DUMP    7
470 #define LSM_INFO_FREELIST         8
471 #define LSM_INFO_ARRAY_PAGES      9
472 #define LSM_INFO_CHECKPOINT_SIZE 10
473 #define LSM_INFO_TREE_SIZE       11
474 #define LSM_INFO_FREELIST_SIZE   12
475 #define LSM_INFO_COMPRESSION_ID  13
476 
477 
478 /*
479 ** CAPI: Opening and Closing Write Transactions
480 **
481 ** These functions are used to open and close transactions and nested
482 ** sub-transactions.
483 **
484 ** The lsm_begin() function is used to open transactions and sub-transactions.
485 ** A successful call to lsm_begin() ensures that there are at least iLevel
486 ** nested transactions open. To open a top-level transaction, pass iLevel=1.
487 ** To open a sub-transaction within the top-level transaction, iLevel=2.
488 ** Passing iLevel=0 is a no-op.
489 **
490 ** lsm_commit() is used to commit transactions and sub-transactions. A
491 ** successful call to lsm_commit() ensures that there are at most iLevel
492 ** nested transactions open. To commit a top-level transaction, pass iLevel=0.
493 ** To commit all sub-transactions inside the main transaction, pass iLevel=1.
494 **
495 ** Function lsm_rollback() is used to roll back transactions and
496 ** sub-transactions. A successful call to lsm_rollback() restores the database
497 ** to the state it was in when the iLevel'th nested sub-transaction (if any)
498 ** was first opened. And then closes transactions to ensure that there are
499 ** at most iLevel nested transactions open. Passing iLevel=0 rolls back and
500 ** closes the top-level transaction. iLevel=1 also rolls back the top-level
501 ** transaction, but leaves it open. iLevel=2 rolls back the sub-transaction
502 ** nested directly inside the top-level transaction (and leaves it open).
503 */
504 int lsm_begin(lsm_db *pDb, int iLevel);
505 int lsm_commit(lsm_db *pDb, int iLevel);
506 int lsm_rollback(lsm_db *pDb, int iLevel);
507 
508 /*
509 ** CAPI: Writing to a Database
510 **
511 ** Write a new value into the database. If a value with a duplicate key
512 ** already exists it is replaced.
513 */
514 int lsm_insert(lsm_db*, const void *pKey, int nKey, const void *pVal, int nVal);
515 
516 /*
517 ** Delete a value from the database. No error is returned if the specified
518 ** key value does not exist in the database.
519 */
520 int lsm_delete(lsm_db *, const void *pKey, int nKey);
521 
522 /*
523 ** Delete all database entries with keys that are greater than (pKey1/nKey1)
524 ** and smaller than (pKey2/nKey2). Note that keys (pKey1/nKey1) and
525 ** (pKey2/nKey2) themselves, if they exist in the database, are not deleted.
526 **
527 ** Return LSM_OK if successful, or an LSM error code otherwise.
528 */
529 int lsm_delete_range(lsm_db *,
530     const void *pKey1, int nKey1, const void *pKey2, int nKey2
531 );
532 
533 /*
534 ** CAPI: Explicit Database Work and Checkpointing
535 **
536 ** This function is called by a thread to work on the database structure.
537 */
538 int lsm_work(lsm_db *pDb, int nMerge, int nKB, int *pnWrite);
539 
540 int lsm_flush(lsm_db *pDb);
541 
542 /*
543 ** Attempt to checkpoint the current database snapshot. Return an LSM
544 ** error code if an error occurs or LSM_OK otherwise.
545 **
546 ** If the current snapshot has already been checkpointed, calling this
547 ** function is a no-op. In this case if pnKB is not NULL, *pnKB is
548 ** set to 0. Or, if the current snapshot is successfully checkpointed
549 ** by this function and pbKB is not NULL, *pnKB is set to the number
550 ** of bytes written to the database file since the previous checkpoint
551 ** (the same measure as returned by the LSM_INFO_CHECKPOINT_SIZE query).
552 */
553 int lsm_checkpoint(lsm_db *pDb, int *pnKB);
554 
555 /*
556 ** CAPI: Opening and Closing Database Cursors
557 **
558 ** Open and close a database cursor.
559 */
560 int lsm_csr_open(lsm_db *pDb, lsm_cursor **ppCsr);
561 int lsm_csr_close(lsm_cursor *pCsr);
562 
563 /*
564 ** CAPI: Positioning Database Cursors
565 **
566 ** If the fourth parameter is LSM_SEEK_EQ, LSM_SEEK_GE or LSM_SEEK_LE,
567 ** this function searches the database for an entry with key (pKey/nKey).
568 ** If an error occurs, an LSM error code is returned. Otherwise, LSM_OK.
569 **
570 ** If no error occurs and the requested key is present in the database, the
571 ** cursor is left pointing to the entry with the specified key. Or, if the
572 ** specified key is not present in the database the state of the cursor
573 ** depends on the value passed as the final parameter, as follows:
574 **
575 ** LSM_SEEK_EQ:
576 **   The cursor is left at EOF (invalidated). A call to lsm_csr_valid()
577 **   returns non-zero.
578 **
579 ** LSM_SEEK_LE:
580 **   The cursor is left pointing to the largest key in the database that
581 **   is smaller than (pKey/nKey). If the database contains no keys smaller
582 **   than (pKey/nKey), the cursor is left at EOF.
583 **
584 ** LSM_SEEK_GE:
585 **   The cursor is left pointing to the smallest key in the database that
586 **   is larger than (pKey/nKey). If the database contains no keys larger
587 **   than (pKey/nKey), the cursor is left at EOF.
588 **
589 ** If the fourth parameter is LSM_SEEK_LEFAST, this function searches the
590 ** database in a similar manner to LSM_SEEK_LE, with two differences:
591 **
592 ** <ol><li>Even if a key can be found (the cursor is not left at EOF), the
593 ** lsm_csr_value() function may not be used (attempts to do so return
594 ** LSM_MISUSE).
595 **
596 ** <li>The key that the cursor is left pointing to may be one that has
597 ** been recently deleted from the database. In this case it is
598 ** guaranteed that the returned key is larger than any key currently
599 ** in the database that is less than or equal to (pKey/nKey).
600 ** </ol>
601 **
602 ** LSM_SEEK_LEFAST requests are intended to be used to allocate database
603 ** keys.
604 */
605 int lsm_csr_seek(lsm_cursor *pCsr, const void *pKey, int nKey, int eSeek);
606 
607 int lsm_csr_first(lsm_cursor *pCsr);
608 int lsm_csr_last(lsm_cursor *pCsr);
609 
610 /*
611 ** Advance the specified cursor to the next or previous key in the database.
612 ** Return LSM_OK if successful, or an LSM error code otherwise.
613 **
614 ** Functions lsm_csr_seek(), lsm_csr_first() and lsm_csr_last() are "seek"
615 ** functions. Whether or not lsm_csr_next and lsm_csr_prev may be called
616 ** successfully also depends on the most recent seek function called on
617 ** the cursor. Specifically:
618 **
619 ** <ul>
620 ** <li> At least one seek function must have been called on the cursor.
621 ** <li> To call lsm_csr_next(), the most recent call to a seek function must
622 ** have been either lsm_csr_first() or a call to lsm_csr_seek() specifying
623 ** LSM_SEEK_GE.
624 ** <li> To call lsm_csr_prev(), the most recent call to a seek function must
625 ** have been either lsm_csr_last() or a call to lsm_csr_seek() specifying
626 ** LSM_SEEK_LE.
627 ** </ul>
628 **
629 ** Otherwise, if the above conditions are not met when lsm_csr_next or
630 ** lsm_csr_prev is called, LSM_MISUSE is returned and the cursor position
631 ** remains unchanged.
632 */
633 int lsm_csr_next(lsm_cursor *pCsr);
634 int lsm_csr_prev(lsm_cursor *pCsr);
635 
636 /*
637 ** Values that may be passed as the fourth argument to lsm_csr_seek().
638 */
639 #define LSM_SEEK_LEFAST   -2
640 #define LSM_SEEK_LE       -1
641 #define LSM_SEEK_EQ        0
642 #define LSM_SEEK_GE        1
643 
644 /*
645 ** CAPI: Extracting Data From Database Cursors
646 **
647 ** Retrieve data from a database cursor.
648 */
649 int lsm_csr_valid(lsm_cursor *pCsr);
650 int lsm_csr_key(lsm_cursor *pCsr, const void **ppKey, int *pnKey);
651 int lsm_csr_value(lsm_cursor *pCsr, const void **ppVal, int *pnVal);
652 
653 /*
654 ** If no error occurs, this function compares the database key passed via
655 ** the pKey/nKey arguments with the key that the cursor passed as the first
656 ** argument currently points to. If the cursors key is less than, equal to
657 ** or greater than pKey/nKey, *piRes is set to less than, equal to or greater
658 ** than zero before returning. LSM_OK is returned in this case.
659 **
660 ** Or, if an error occurs, an LSM error code is returned and the final
661 ** value of *piRes is undefined. If the cursor does not point to a valid
662 ** key when this function is called, LSM_MISUSE is returned.
663 */
664 int lsm_csr_cmp(lsm_cursor *pCsr, const void *pKey, int nKey, int *piRes);
665 
666 /*
667 ** CAPI: Change these!!
668 **
669 ** Configure a callback to which debugging and other messages should
670 ** be directed. Only useful for debugging lsm.
671 */
672 void lsm_config_log(lsm_db *, void (*)(void *, int, const char *), void *);
673 
674 /*
675 ** Configure a callback that is invoked if the database connection ever
676 ** writes to the database file.
677 */
678 void lsm_config_work_hook(lsm_db *, void (*)(lsm_db *, void *), void *);
679 
680 /* ENDOFAPI */
681 #ifdef __cplusplus
682 }  /* End of the 'extern "C"' block */
683 #endif
684 #endif /* ifndef _LSM_H */
685