/ Hex Artifact Content
Login

Artifact 0f6f64ff071471cb87bf98beb8386566f30ea001:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 38 2d 31 30  /*.** 2011-08-10
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 64 65 66 69 6e 65 73 20 74 68 65 20 4c 53 4d 20  defines the LSM 
0190: 41 50 49 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  API..*/.#ifndef 
01a0: 5f 4c 53 4d 5f 48 0a 23 64 65 66 69 6e 65 20 5f  _LSM_H.#define _
01b0: 4c 53 4d 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c  LSM_H.#include <
01c0: 73 74 64 64 65 66 2e 68 3e 0a 23 69 66 64 65 66  stddef.h>.#ifdef
01d0: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74   __cplusplus.ext
01e0: 65 72 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66  ern "C" {.#endif
01f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 61 71 75 65 20 68  ../*.** Opaque h
0200: 61 6e 64 6c 65 20 74 79 70 65 73 2e 0a 2a 2f 0a  andle types..*/.
0210: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 6c  typedef struct l
0220: 73 6d 5f 63 6f 6d 70 72 65 73 73 20 6c 73 6d 5f  sm_compress lsm_
0230: 63 6f 6d 70 72 65 73 73 3b 20 20 20 2f 2a 20 43  compress;   /* C
0240: 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 69 62 72 61  ompression libra
0250: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ry functions */.
0260: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 6c  typedef struct l
0270: 73 6d 5f 63 6f 6d 70 72 65 73 73 5f 66 61 63 74  sm_compress_fact
0280: 6f 72 79 20 6c 73 6d 5f 63 6f 6d 70 72 65 73 73  ory lsm_compress
0290: 5f 66 61 63 74 6f 72 79 3b 0a 74 79 70 65 64 65  _factory;.typede
02a0: 66 20 73 74 72 75 63 74 20 6c 73 6d 5f 63 75 72  f struct lsm_cur
02b0: 73 6f 72 20 6c 73 6d 5f 63 75 72 73 6f 72 3b 20  sor lsm_cursor; 
02c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
02d0: 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65 20  e cursor handle 
02e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
02f0: 74 20 6c 73 6d 5f 64 62 20 6c 73 6d 5f 64 62 3b  t lsm_db lsm_db;
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0310: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
0320: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
0330: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 6c  typedef struct l
0340: 73 6d 5f 65 6e 76 20 6c 73 6d 5f 65 6e 76 3b 20  sm_env lsm_env; 
0350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
0360: 75 6e 74 69 6d 65 20 65 6e 76 69 72 6f 6e 6d 65  untime environme
0370: 6e 74 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  nt */.typedef st
0380: 72 75 63 74 20 6c 73 6d 5f 66 69 6c 65 20 6c 73  ruct lsm_file ls
0390: 6d 5f 66 69 6c 65 3b 20 20 20 20 20 20 20 20 20  m_file;         
03a0: 20 20 2f 2a 20 4f 53 20 66 69 6c 65 20 68 61 6e    /* OS file han
03b0: 64 6c 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  dle */.typedef s
03c0: 74 72 75 63 74 20 6c 73 6d 5f 6d 75 74 65 78 20  truct lsm_mutex 
03d0: 6c 73 6d 5f 6d 75 74 65 78 3b 20 20 20 20 20 20  lsm_mutex;      
03e0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 68 61 6e 64     /* Mutex hand
03f0: 6c 65 20 2a 2f 0a 0a 2f 2a 20 36 34 2d 62 69 74  le */../* 64-bit
0400: 20 69 6e 74 65 67 65 72 20 74 79 70 65 20 75 73   integer type us
0410: 65 64 20 66 6f 72 20 66 69 6c 65 20 6f 66 66 73  ed for file offs
0420: 65 74 73 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20  ets. */.typedef 
0430: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 6c 73  long long int ls
0440: 6d 5f 69 36 34 3b 20 20 20 20 20 20 20 20 20 20  m_i64;          
0450: 20 20 20 20 2f 2a 20 36 34 2d 62 69 74 20 73 69      /* 64-bit si
0460: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74 79 70  gned integer typ
0470: 65 20 2a 2f 0a 0a 2f 2a 20 43 61 6e 64 69 64 61  e */../* Candida
0480: 74 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  te values for th
0490: 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74  e 3rd argument t
04a0: 6f 20 6c 73 6d 5f 65 6e 76 2e 78 4c 6f 63 6b 28  o lsm_env.xLock(
04b0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d  ) */.#define LSM
04c0: 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b 20 30 0a 23  _LOCK_UNLOCK 0.#
04d0: 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b 5f  define LSM_LOCK_
04e0: 53 48 41 52 45 44 20 31 0a 23 64 65 66 69 6e 65  SHARED 1.#define
04f0: 20 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 20 20   LSM_LOCK_EXCL  
0500: 20 32 0a 0a 2f 2a 20 46 6c 61 67 73 20 66 6f 72   2../* Flags for
0510: 20 6c 73 6d 5f 65 6e 76 2e 78 4f 70 65 6e 28 29   lsm_env.xOpen()
0520: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f   */.#define LSM_
0530: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 30 78  OPEN_READONLY 0x
0540: 30 30 30 31 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49  0001../*.** CAPI
0550: 3a 20 44 61 74 61 62 61 73 65 20 52 75 6e 74 69  : Database Runti
0560: 6d 65 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 0a 2a  me Environment.*
0570: 2a 0a 2a 2a 20 52 75 6e 2d 74 69 6d 65 20 65 6e  *.** Run-time en
0580: 76 69 72 6f 6e 6d 65 6e 74 20 75 73 65 64 20 62  vironment used b
0590: 79 20 4c 53 4d 0a 2a 2f 0a 73 74 72 75 63 74 20  y LSM.*/.struct 
05a0: 6c 73 6d 5f 65 6e 76 20 7b 0a 20 20 69 6e 74 20  lsm_env {.  int 
05b0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
05c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
05d0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
05e0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
05f0: 6e 74 20 69 56 65 72 73 69 6f 6e 3b 20 20 20 20  nt iVersion;    
0600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
0610: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74  sion number of t
0620: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 28 31  his structure (1
0630: 29 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 2a 2a 20 66  ) */.  /****** f
0640: 69 6c 65 20 69 2f 6f 20 2a 2a 2a 2a 2a 2a 2a 2a  ile i/o ********
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0670: 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 76 6f 69 64 20  *******/.  void 
0680: 2a 70 56 66 73 43 74 78 3b 0a 20 20 69 6e 74 20  *pVfsCtx;.  int 
0690: 28 2a 78 46 75 6c 6c 70 61 74 68 29 28 6c 73 6d  (*xFullpath)(lsm
06a0: 5f 65 6e 76 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _env*, const cha
06b0: 72 20 2a 2c 20 63 68 61 72 20 2a 2c 20 69 6e 74  r *, char *, int
06c0: 20 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 4f 70   *);.  int (*xOp
06d0: 65 6e 29 28 6c 73 6d 5f 65 6e 76 2a 2c 20 63 6f  en)(lsm_env*, co
06e0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 20  nst char *, int 
06f0: 66 6c 61 67 73 2c 20 6c 73 6d 5f 66 69 6c 65 20  flags, lsm_file 
0700: 2a 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78 52 65  **);.  int (*xRe
0710: 61 64 29 28 6c 73 6d 5f 66 69 6c 65 20 2a 2c 20  ad)(lsm_file *, 
0720: 6c 73 6d 5f 69 36 34 2c 20 76 6f 69 64 20 2a 2c  lsm_i64, void *,
0730: 20 69 6e 74 29 3b 0a 20 20 69 6e 74 20 28 2a 78   int);.  int (*x
0740: 57 72 69 74 65 29 28 6c 73 6d 5f 66 69 6c 65 20  Write)(lsm_file 
0750: 2a 2c 20 6c 73 6d 5f 69 36 34 2c 20 76 6f 69 64  *, lsm_i64, void
0760: 20 2a 2c 20 69 6e 74 29 3b 0a 20 20 69 6e 74 20   *, int);.  int 
0770: 28 2a 78 54 72 75 6e 63 61 74 65 29 28 6c 73 6d  (*xTruncate)(lsm
0780: 5f 66 69 6c 65 20 2a 2c 20 6c 73 6d 5f 69 36 34  _file *, lsm_i64
0790: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 53 79 6e 63  );.  int (*xSync
07a0: 29 28 6c 73 6d 5f 66 69 6c 65 20 2a 29 3b 0a 20  )(lsm_file *);. 
07b0: 20 69 6e 74 20 28 2a 78 53 65 63 74 6f 72 53 69   int (*xSectorSi
07c0: 7a 65 29 28 6c 73 6d 5f 66 69 6c 65 20 2a 29 3b  ze)(lsm_file *);
07d0: 0a 20 20 69 6e 74 20 28 2a 78 52 65 6d 61 70 29  .  int (*xRemap)
07e0: 28 6c 73 6d 5f 66 69 6c 65 20 2a 2c 20 6c 73 6d  (lsm_file *, lsm
07f0: 5f 69 36 34 2c 20 76 6f 69 64 20 2a 2a 2c 20 6c  _i64, void **, l
0800: 73 6d 5f 69 36 34 2a 29 3b 0a 20 20 69 6e 74 20  sm_i64*);.  int 
0810: 28 2a 78 46 69 6c 65 69 64 29 28 6c 73 6d 5f 66  (*xFileid)(lsm_f
0820: 69 6c 65 20 2a 2c 20 76 6f 69 64 20 2a 70 42 75  ile *, void *pBu
0830: 66 2c 20 69 6e 74 20 2a 70 6e 42 75 66 29 3b 0a  f, int *pnBuf);.
0840: 20 20 69 6e 74 20 28 2a 78 43 6c 6f 73 65 29 28    int (*xClose)(
0850: 6c 73 6d 5f 66 69 6c 65 20 2a 29 3b 0a 20 20 69  lsm_file *);.  i
0860: 6e 74 20 28 2a 78 55 6e 6c 69 6e 6b 29 28 6c 73  nt (*xUnlink)(ls
0870: 6d 5f 65 6e 76 2a 2c 20 63 6f 6e 73 74 20 63 68  m_env*, const ch
0880: 61 72 20 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78  ar *);.  int (*x
0890: 4c 6f 63 6b 29 28 6c 73 6d 5f 66 69 6c 65 2a 2c  Lock)(lsm_file*,
08a0: 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 20 20 69 6e   int, int);.  in
08b0: 74 20 28 2a 78 54 65 73 74 4c 6f 63 6b 29 28 6c  t (*xTestLock)(l
08c0: 73 6d 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20 69  sm_file*, int, i
08d0: 6e 74 2c 20 69 6e 74 29 3b 0a 20 20 69 6e 74 20  nt, int);.  int 
08e0: 28 2a 78 53 68 6d 4d 61 70 29 28 6c 73 6d 5f 66  (*xShmMap)(lsm_f
08f0: 69 6c 65 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  ile*, int, int, 
0900: 76 6f 69 64 20 2a 2a 29 3b 0a 20 20 76 6f 69 64  void **);.  void
0910: 20 28 2a 78 53 68 6d 42 61 72 72 69 65 72 29 28   (*xShmBarrier)(
0920: 76 6f 69 64 29 3b 0a 20 20 69 6e 74 20 28 2a 78  void);.  int (*x
0930: 53 68 6d 55 6e 6d 61 70 29 28 6c 73 6d 5f 66 69  ShmUnmap)(lsm_fi
0940: 6c 65 2a 2c 20 69 6e 74 29 3b 0a 20 20 2f 2a 2a  le*, int);.  /**
0950: 2a 2a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  **** memory allo
0960: 63 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  cation *********
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0990: 0a 20 20 76 6f 69 64 20 2a 70 4d 65 6d 43 74 78  .  void *pMemCtx
09a0: 3b 0a 20 20 76 6f 69 64 20 2a 28 2a 78 4d 61 6c  ;.  void *(*xMal
09b0: 6c 6f 63 29 28 6c 73 6d 5f 65 6e 76 2a 2c 20 73  loc)(lsm_env*, s
09c0: 69 7a 65 5f 74 29 3b 20 20 20 20 20 20 20 20 20  ize_t);         
09d0: 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 33 29 20     /* malloc(3) 
09e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
09f0: 69 64 20 2a 28 2a 78 52 65 61 6c 6c 6f 63 29 28  id *(*xRealloc)(
0a00: 6c 73 6d 5f 65 6e 76 2a 2c 20 76 6f 69 64 20 2a  lsm_env*, void *
0a10: 2c 20 73 69 7a 65 5f 74 29 3b 20 20 20 2f 2a 20  , size_t);   /* 
0a20: 72 65 61 6c 6c 6f 63 28 33 29 20 66 75 6e 63 74  realloc(3) funct
0a30: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ion */.  void (*
0a40: 78 46 72 65 65 29 28 6c 73 6d 5f 65 6e 76 2a 2c  xFree)(lsm_env*,
0a50: 20 76 6f 69 64 20 2a 29 3b 20 20 20 20 20 20 20   void *);       
0a60: 20 20 20 20 20 20 20 20 2f 2a 20 66 72 65 65 28          /* free(
0a70: 33 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  3) function */. 
0a80: 20 73 69 7a 65 5f 74 20 28 2a 78 53 69 7a 65 29   size_t (*xSize)
0a90: 28 6c 73 6d 5f 65 6e 76 2a 2c 20 76 6f 69 64 20  (lsm_env*, void 
0aa0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
0ab0: 2f 2a 20 78 53 69 7a 65 20 66 75 6e 63 74 69 6f  /* xSize functio
0ac0: 6e 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 2a 2a 20 6d  n */.  /****** m
0ad0: 75 74 65 78 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  utexes *********
0ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 76  ***********/.  v
0b10: 6f 69 64 20 2a 70 4d 75 74 65 78 43 74 78 3b 0a  oid *pMutexCtx;.
0b20: 20 20 69 6e 74 20 28 2a 78 4d 75 74 65 78 53 74    int (*xMutexSt
0b30: 61 74 69 63 29 28 6c 73 6d 5f 65 6e 76 2a 2c 69  atic)(lsm_env*,i
0b40: 6e 74 2c 6c 73 6d 5f 6d 75 74 65 78 2a 2a 29 3b  nt,lsm_mutex**);
0b50: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 73 74 61   /* Obtain a sta
0b60: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69  tic mutex */.  i
0b70: 6e 74 20 28 2a 78 4d 75 74 65 78 4e 65 77 29 28  nt (*xMutexNew)(
0b80: 6c 73 6d 5f 65 6e 76 2a 2c 20 6c 73 6d 5f 6d 75  lsm_env*, lsm_mu
0b90: 74 65 78 2a 2a 29 3b 20 20 20 20 20 20 20 2f 2a  tex**);       /*
0ba0: 20 47 65 74 20 61 20 6e 65 77 20 64 79 6e 61 6d   Get a new dynam
0bb0: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 76 6f  ic mutex */.  vo
0bc0: 69 64 20 28 2a 78 4d 75 74 65 78 44 65 6c 29 28  id (*xMutexDel)(
0bd0: 6c 73 6d 5f 6d 75 74 65 78 20 2a 29 3b 20 20 20  lsm_mutex *);   
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
0bf0: 65 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6d  e an allocated m
0c00: 75 74 65 78 20 2a 2f 0a 20 20 76 6f 69 64 20 28  utex */.  void (
0c10: 2a 78 4d 75 74 65 78 45 6e 74 65 72 29 28 6c 73  *xMutexEnter)(ls
0c20: 6d 5f 6d 75 74 65 78 20 2a 29 3b 20 20 20 20 20  m_mutex *);     
0c30: 20 20 20 20 2f 2a 20 47 72 61 62 20 61 20 6d 75      /* Grab a mu
0c40: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  tex */.  int (*x
0c50: 4d 75 74 65 78 54 72 79 29 28 6c 73 6d 5f 6d 75  MutexTry)(lsm_mu
0c60: 74 65 78 20 2a 29 3b 20 20 20 20 20 20 20 20 20  tex *);         
0c70: 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
0c80: 20 6f 62 74 61 69 6e 20 61 20 6d 75 74 65 78 20   obtain a mutex 
0c90: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4d 75 74  */.  void (*xMut
0ca0: 65 78 4c 65 61 76 65 29 28 6c 73 6d 5f 6d 75 74  exLeave)(lsm_mut
0cb0: 65 78 20 2a 29 3b 20 20 20 20 20 20 20 20 20 2f  ex *);         /
0cc0: 2a 20 4c 65 61 76 65 20 61 20 6d 75 74 65 78 20  * Leave a mutex 
0cd0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 4d 75 74 65  */.  int (*xMute
0ce0: 78 48 65 6c 64 29 28 6c 73 6d 5f 6d 75 74 65 78  xHeld)(lsm_mutex
0cf0: 20 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f   *);           /
0d00: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
0d10: 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 2a   mutex is held *
0d20: 2f 0a 20 20 69 6e 74 20 28 2a 78 4d 75 74 65 78  /.  int (*xMutex
0d30: 4e 6f 74 48 65 6c 64 29 28 6c 73 6d 5f 6d 75 74  NotHeld)(lsm_mut
0d40: 65 78 20 2a 29 3b 20 20 20 20 20 20 20 20 2f 2a  ex *);        /*
0d50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
0d60: 6d 75 74 65 78 20 6e 6f 74 20 68 65 6c 64 20 2a  mutex not held *
0d70: 2f 0a 20 20 2f 2a 2a 2a 2a 2a 2a 20 6f 74 68 65  /.  /****** othe
0d80: 72 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r **************
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0db0: 2a 2a 2a 2a 2a 2a 2f 0a 20 20 69 6e 74 20 28 2a  ******/.  int (*
0dc0: 78 53 6c 65 65 70 29 28 6c 73 6d 5f 65 6e 76 2a  xSleep)(lsm_env*
0dd0: 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
0de0: 64 73 29 3b 0a 0a 20 20 2f 2a 20 4e 65 77 20 66  ds);..  /* New f
0df0: 69 65 6c 64 73 20 6d 61 79 20 62 65 20 61 64 64  ields may be add
0e00: 65 64 20 69 6e 20 66 75 74 75 72 65 20 72 65 6c  ed in future rel
0e10: 65 61 73 65 73 2c 20 69 6e 20 77 68 69 63 68 20  eases, in which 
0e20: 63 61 73 65 20 74 68 65 0a 20 20 2a 2a 20 69 56  case the.  ** iV
0e30: 65 72 73 69 6f 6e 20 76 61 6c 75 65 20 77 69 6c  ersion value wil
0e40: 6c 20 69 6e 63 72 65 61 73 65 2e 20 2a 2f 0a 7d  l increase. */.}
0e50: 3b 0a 0a 2f 2a 20 0a 2a 2a 20 56 61 6c 75 65 73  ;../* .** Values
0e60: 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
0e70: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
0e80: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4d  d argument to xM
0e90: 75 74 65 78 53 74 61 74 69 63 2e 20 0a 2a 2f 0a  utexStatic. .*/.
0ea0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4d 55 54 45  #define LSM_MUTE
0eb0: 58 5f 47 4c 4f 42 41 4c 20 31 0a 23 64 65 66 69  X_GLOBAL 1.#defi
0ec0: 6e 65 20 4c 53 4d 5f 4d 55 54 45 58 5f 48 45 41  ne LSM_MUTEX_HEA
0ed0: 50 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  P   2../*.** CAP
0ee0: 49 3a 20 4c 53 4d 20 45 72 72 6f 72 20 43 6f 64  I: LSM Error Cod
0ef0: 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 53  es.*/.#define LS
0f00: 4d 5f 4f 4b 20 20 20 20 20 20 20 20 20 30 0a 23  M_OK         0.#
0f10: 64 65 66 69 6e 65 20 4c 53 4d 5f 45 52 52 4f 52  define LSM_ERROR
0f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
0f30: 4c 53 4d 5f 42 55 53 59 20 20 20 20 20 20 20 35  LSM_BUSY       5
0f40: 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4e 4f 4d  .#define LSM_NOM
0f50: 45 4d 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e  EM      7.#defin
0f60: 65 20 4c 53 4d 5f 52 45 41 44 4f 4e 4c 59 20 20  e LSM_READONLY  
0f70: 20 38 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49   8.#define LSM_I
0f80: 4f 45 52 52 20 20 20 20 20 31 30 0a 23 64 65 66  OERR     10.#def
0f90: 69 6e 65 20 4c 53 4d 5f 43 4f 52 52 55 50 54 20  ine LSM_CORRUPT 
0fa0: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4c 53 4d    11.#define LSM
0fb0: 5f 46 55 4c 4c 20 20 20 20 20 20 31 33 0a 23 64  _FULL      13.#d
0fc0: 65 66 69 6e 65 20 4c 53 4d 5f 43 41 4e 54 4f 50  efine LSM_CANTOP
0fd0: 45 4e 20 20 31 34 0a 23 64 65 66 69 6e 65 20 4c  EN  14.#define L
0fe0: 53 4d 5f 50 52 4f 54 4f 43 4f 4c 20 20 31 35 0a  SM_PROTOCOL  15.
0ff0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4d 49 53 55  #define LSM_MISU
1000: 53 45 20 20 20 20 32 31 0a 0a 23 64 65 66 69 6e  SE    21..#defin
1010: 65 20 4c 53 4d 5f 4d 49 53 4d 41 54 43 48 20 20  e LSM_MISMATCH  
1020: 35 30 0a 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d  50...#define LSM
1030: 5f 49 4f 45 52 52 5f 4e 4f 45 4e 54 20 28 4c 53  _IOERR_NOENT (LS
1040: 4d 5f 49 4f 45 52 52 20 7c 20 28 31 3c 3c 38 29  M_IOERR | (1<<8)
1050: 29 0a 0a 2f 2a 20 0a 2a 2a 20 43 41 50 49 3a 20  )../* .** CAPI: 
1060: 43 72 65 61 74 69 6e 67 20 61 6e 64 20 44 65 73  Creating and Des
1070: 74 72 6f 79 69 6e 67 20 44 61 74 61 62 61 73 65  troying Database
1080: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 48 61 6e 64   Connection Hand
1090: 6c 65 73 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  les.**.** Open a
10a0: 6e 64 20 63 6c 6f 73 65 20 61 20 64 61 74 61 62  nd close a datab
10b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
10c0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 6c 73  andle..*/.int ls
10d0: 6d 5f 6e 65 77 28 6c 73 6d 5f 65 6e 76 2a 2c 20  m_new(lsm_env*, 
10e0: 6c 73 6d 5f 64 62 20 2a 2a 70 70 44 62 29 3b 0a  lsm_db **ppDb);.
10f0: 69 6e 74 20 6c 73 6d 5f 63 6c 6f 73 65 28 6c 73  int lsm_close(ls
1100: 6d 5f 64 62 20 2a 70 44 62 29 3b 0a 0a 2f 2a 20  m_db *pDb);../* 
1110: 0a 2a 2a 20 43 41 50 49 3a 20 43 6f 6e 6e 65 63  .** CAPI: Connec
1120: 74 69 6e 67 20 74 6f 20 61 20 44 61 74 61 62 61  ting to a Databa
1130: 73 65 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 6f 70  se.*/.int lsm_op
1140: 65 6e 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  en(lsm_db *pDb, 
1150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1160: 65 6e 61 6d 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ename);../*.** C
1170: 41 50 49 3a 20 4f 62 74 61 69 6e 69 6e 67 20 70  API: Obtaining p
1180: 6f 69 6e 74 65 72 73 20 74 6f 20 64 61 74 61 62  ointers to datab
1190: 61 73 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 73  ase environments
11a0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
11b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
11c0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 75 73 65 64 20  nvironment used 
11d0: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
11e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70  connection .** p
11f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1200: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 73 73  st argument. Ass
1210: 75 6d 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65  uming the argume
1220: 6e 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 69  nt is valid, thi
1230: 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  s .** function a
1240: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 61 20  lways returns a 
1250: 76 61 6c 69 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  valid environmen
1260: 74 20 70 6f 69 6e 74 65 72 20 2d 20 69 74 20 63  t pointer - it c
1270: 61 6e 6e 6f 74 20 66 61 69 6c 2e 0a 2a 2f 0a 6c  annot fail..*/.l
1280: 73 6d 5f 65 6e 76 20 2a 6c 73 6d 5f 67 65 74 5f  sm_env *lsm_get_
1290: 65 6e 76 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29  env(lsm_db *pDb)
12a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 73 6d  ;../*.** The lsm
12b0: 5f 64 65 66 61 75 6c 74 5f 65 6e 76 28 29 20 66  _default_env() f
12c0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
12d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12e0: 20 64 65 66 61 75 6c 74 20 4c 53 4d 0a 2a 2a 20   default LSM.** 
12f0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 66 6f 72 20  environment for 
1300: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 74  the current plat
1310: 66 6f 72 6d 2e 0a 2a 2f 0a 6c 73 6d 5f 65 6e 76  form..*/.lsm_env
1320: 20 2a 6c 73 6d 5f 64 65 66 61 75 6c 74 5f 65 6e   *lsm_default_en
1330: 76 28 76 6f 69 64 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  v(void);.../*.**
1340: 20 43 41 50 49 3a 20 43 6f 6e 66 69 67 75 72 69   CAPI: Configuri
1350: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  ng a database co
1360: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1370: 54 68 65 20 6c 73 6d 5f 63 6f 6e 66 69 67 28 29  The lsm_config()
1380: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1390: 64 20 74 6f 20 63 6f 6e 66 69 67 75 72 65 20 61  d to configure a
13a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13b0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d  tion..*/.int lsm
13c0: 5f 63 6f 6e 66 69 67 28 6c 73 6d 5f 64 62 20 2a  _config(lsm_db *
13d0: 2c 20 69 6e 74 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a  , int, ...);../*
13e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13f0: 67 20 76 61 6c 75 65 73 20 6d 61 79 20 62 65 20  g values may be 
1400: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
1420: 20 6c 73 6d 5f 63 6f 6e 66 69 67 28 29 2e 0a 2a   lsm_config()..*
1430: 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f  *.** LSM_CONFIG_
1440: 41 55 54 4f 46 4c 55 53 48 3a 0a 2a 2a 20 20 20  AUTOFLUSH:.**   
1450: 41 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e 74  A read/write int
1460: 65 67 65 72 20 70 61 72 61 6d 65 74 65 72 2e 20  eger parameter. 
1470: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
1480: 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  lue determines t
1490: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74  he amount of dat
14a0: 61 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 63 63  a allowed to acc
14b0: 75 6d 75 6c 61 74 65 20 69 6e 20 61 0a 2a 2a 20  umulate in a.** 
14c0: 20 20 6c 69 76 65 20 69 6e 2d 6d 65 6d 6f 72 79    live in-memory
14d0: 20 74 72 65 65 20 62 65 66 6f 72 65 20 69 74 20   tree before it 
14e0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6f 6c 64  is marked as old
14f0: 2e 20 41 66 74 65 72 20 63 6f 6d 6d 69 74 74 69  . After committi
1500: 6e 67 20 61 0a 2a 2a 20 20 20 74 72 61 6e 73 61  ng a.**   transa
1510: 63 74 69 6f 6e 2c 20 61 20 63 6f 6e 6e 65 63 74  ction, a connect
1520: 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1530: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 69  e size of the li
1540: 76 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  ve in-memory tre
1550: 65 2c 0a 2a 2a 20 20 20 69 6e 63 6c 75 64 69 6e  e,.**   includin
1560: 67 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  g data structure
1570: 20 6f 76 65 72 68 65 61 64 2c 20 69 73 20 67 72   overhead, is gr
1580: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  eater than the v
1590: 61 6c 75 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  alue of this.** 
15a0: 20 20 6f 70 74 69 6f 6e 20 69 6e 20 4b 42 2e 20    option in KB. 
15b0: 49 66 20 69 74 20 69 73 2c 20 61 6e 64 20 74 68  If it is, and th
15c0: 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
15d0: 64 79 20 61 6e 20 6f 6c 64 20 69 6e 2d 6d 65 6d  dy an old in-mem
15e0: 6f 72 79 20 74 72 65 65 2c 0a 2a 2a 20 20 20 74  ory tree,.**   t
15f0: 68 65 20 6c 69 76 65 20 69 6e 2d 6d 65 6d 6f 72  he live in-memor
1600: 79 20 74 72 65 65 20 69 73 20 6d 61 72 6b 65 64  y tree is marked
1610: 20 61 73 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 20   as old..**.**  
1620: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1630: 6f 77 61 62 6c 65 20 76 61 6c 75 65 20 69 73 20  owable value is 
1640: 31 30 34 38 35 37 36 20 28 31 47 42 29 2e 20 54  1048576 (1GB). T
1650: 68 65 72 65 20 69 73 20 6e 6f 20 6d 69 6e 69 6d  here is no minim
1660: 75 6d 20 0a 2a 2a 20 20 20 76 61 6c 75 65 2e 20  um .**   value. 
1670: 49 66 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  If this paramete
1680: 72 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  r is set to zero
1690: 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
16a0: 74 20 69 73 20 6d 61 64 65 20 74 6f 0a 2a 2a 20  t is made to.** 
16b0: 20 20 6d 61 72 6b 20 74 68 65 20 6c 69 76 65 20    mark the live 
16c0: 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 61  in-memory tree a
16d0: 73 20 6f 6c 64 20 61 66 74 65 72 20 65 61 63 68  s old after each
16e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16f0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
1700: 20 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76     The default v
1710: 61 6c 75 65 20 69 73 20 31 30 32 34 20 28 31 4d  alue is 1024 (1M
1720: 42 29 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f  B)..**.** LSM_CO
1730: 4e 46 49 47 5f 50 41 47 45 5f 53 49 5a 45 3a 0a  NFIG_PAGE_SIZE:.
1740: 2a 2a 20 20 20 41 20 72 65 61 64 2f 77 72 69 74  **   A read/writ
1750: 65 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65  e integer parame
1760: 74 65 72 2e 20 54 68 69 73 20 70 61 72 61 6d 65  ter. This parame
1770: 74 65 72 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ter may only be 
1780: 73 65 74 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20  set before.**   
1790: 6c 73 6d 5f 6f 70 65 6e 28 29 20 68 61 73 20 62  lsm_open() has b
17a0: 65 65 6e 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a  een called..**.*
17b0: 2a 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 42 4c 4f  * LSM_CONFIG_BLO
17c0: 43 4b 5f 53 49 5a 45 3a 0a 2a 2a 20 20 20 41 20  CK_SIZE:.**   A 
17d0: 72 65 61 64 2f 77 72 69 74 65 20 69 6e 74 65 67  read/write integ
17e0: 65 72 20 70 61 72 61 6d 65 74 65 72 2e 20 0a 2a  er parameter. .*
17f0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 70 61 72 61  *.**   This para
1800: 6d 65 74 65 72 20 6d 61 79 20 6f 6e 6c 79 20 62  meter may only b
1810: 65 20 73 65 74 20 62 65 66 6f 72 65 20 6c 73 6d  e set before lsm
1820: 5f 6f 70 65 6e 28 29 20 68 61 73 20 62 65 65 6e  _open() has been
1830: 20 63 61 6c 6c 65 64 2e 20 49 74 0a 2a 2a 20 20   called. It.**  
1840: 20 6d 75 73 74 20 62 65 20 73 65 74 20 74 6f 20   must be set to 
1850: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 62  a power of two b
1860: 65 74 77 65 65 6e 20 36 34 20 61 6e 64 20 36 35  etween 64 and 65
1870: 35 33 36 2c 20 69 6e 63 6c 75 73 69 76 65 20 28  536, inclusive (
1880: 62 6c 6f 63 6b 20 0a 2a 2a 20 20 20 73 69 7a 65  block .**   size
1890: 73 20 62 65 74 77 65 65 6e 20 36 34 4b 42 20 61  s between 64KB a
18a0: 6e 64 20 36 34 4d 42 29 2e 0a 2a 2a 0a 2a 2a 20  nd 64MB)..**.** 
18b0: 20 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    If the connect
18c0: 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 6e 65  ion creates a ne
18d0: 77 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  w database, the 
18e0: 62 6c 6f 63 6b 20 73 69 7a 65 20 6f 66 20 74 68  block size of th
18f0: 65 20 6e 65 77 0a 2a 2a 20 20 20 64 61 74 61 62  e new.**   datab
1900: 61 73 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ase is set to th
1910: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  e value of this 
1920: 6f 70 74 69 6f 6e 20 69 6e 20 4b 42 2e 20 41 66  option in KB. Af
1930: 74 65 72 20 6c 73 6d 5f 6f 70 65 6e 28 29 0a 2a  ter lsm_open().*
1940: 2a 20 20 20 68 61 73 20 62 65 65 6e 20 63 61 6c  *   has been cal
1950: 6c 65 64 2c 20 71 75 65 72 79 69 6e 67 20 74 68  led, querying th
1960: 69 73 20 70 61 72 61 6d 65 74 65 72 20 72 65 74  is parameter ret
1970: 75 72 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20  urns the actual 
1980: 62 6c 6f 63 6b 0a 2a 2a 20 20 20 73 69 7a 65 20  block.**   size 
1990: 6f 66 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  of the opened da
19a0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
19b0: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
19c0: 65 20 69 73 20 31 30 32 34 20 28 31 4d 42 20 62  e is 1024 (1MB b
19d0: 6c 6f 63 6b 73 29 2e 0a 2a 2a 0a 2a 2a 20 4c 53  locks)..**.** LS
19e0: 4d 5f 43 4f 4e 46 49 47 5f 53 41 46 45 54 59 3a  M_CONFIG_SAFETY:
19f0: 0a 2a 2a 20 20 20 41 20 72 65 61 64 2f 77 72 69  .**   A read/wri
1a00: 74 65 20 69 6e 74 65 67 65 72 20 70 61 72 61 6d  te integer param
1a10: 65 74 65 72 2e 20 56 61 6c 69 64 20 76 61 6c 75  eter. Valid valu
1a20: 65 73 20 61 72 65 20 30 2c 20 31 20 28 74 68 65  es are 0, 1 (the
1a30: 20 64 65 66 61 75 6c 74 29 20 0a 2a 2a 20 20 20   default) .**   
1a40: 61 6e 64 20 32 2e 20 54 68 69 73 20 70 61 72 61  and 2. This para
1a50: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
1a60: 20 68 6f 77 20 72 6f 62 75 73 74 20 74 68 65 20   how robust the 
1a70: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 74  database is in t
1a80: 68 65 0a 2a 2a 20 20 20 66 61 63 65 20 6f 66 20  he.**   face of 
1a90: 61 20 73 79 73 74 65 6d 20 63 72 61 73 68 20 28  a system crash (
1aa0: 65 2e 67 2e 20 61 20 70 6f 77 65 72 20 66 61 69  e.g. a power fai
1ab0: 6c 75 72 65 20 6f 72 20 6f 70 65 72 61 74 69 6e  lure or operatin
1ac0: 67 20 73 79 73 74 65 6d 20 0a 2a 2a 20 20 20 63  g system .**   c
1ad0: 72 61 73 68 29 2e 20 41 73 20 66 6f 6c 6c 6f 77  rash). As follow
1ae0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 20 28  s:.**.**     0 (
1af0: 6f 66 66 29 3a 20 20 20 20 4e 6f 20 72 6f 62 75  off):    No robu
1b00: 73 74 6e 65 73 73 2e 20 41 20 73 79 73 74 65 6d  stness. A system
1b10: 20 63 72 61 73 68 20 6d 61 79 20 63 6f 72 72 75   crash may corru
1b20: 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  pt the database.
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 20 28 6e 6f  .**.**     1 (no
1b40: 72 6d 61 6c 29 3a 20 53 6f 6d 65 20 72 6f 62 75  rmal): Some robu
1b50: 73 74 6e 65 73 73 2e 20 41 20 73 79 73 74 65 6d  stness. A system
1b60: 20 63 72 61 73 68 20 6d 61 79 20 6e 6f 74 20 63   crash may not c
1b70: 6f 72 72 75 70 74 20 74 68 65 0a 2a 2a 20 20 20  orrupt the.**   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
1b90: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
1ba0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 6d 6d 69 74   recently commit
1bb0: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1bc0: 20 6d 61 79 0a 2a 2a 20 20 20 20 20 20 20 20 20   may.**         
1bd0: 20 20 20 20 20 20 20 20 62 65 20 6c 6f 73 74 20          be lost 
1be0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
1bf0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 32 20  ry..**.**     2 
1c00: 28 66 75 6c 6c 29 3a 20 20 20 46 75 6c 6c 20 72  (full):   Full r
1c10: 6f 62 75 73 74 6e 65 73 73 2e 20 41 20 73 79 73  obustness. A sys
1c20: 74 65 6d 20 63 72 61 73 68 20 6d 61 79 20 6e 6f  tem crash may no
1c30: 74 20 63 6f 72 72 75 70 74 20 74 68 65 0a 2a 2a  t corrupt the.**
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c60: 46 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  Following recove
1c70: 72 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ry the database 
1c80: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
1c90: 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73          contains
1ca0: 20 61 6c 6c 20 73 75 63 63 65 73 73 66 75 6c 6c   all successfull
1cb0: 79 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  y committed tran
1cc0: 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  sactions..**.** 
1cd0: 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 57  LSM_CONFIG_AUTOW
1ce0: 4f 52 4b 3a 0a 2a 2a 20 20 20 41 20 72 65 61 64  ORK:.**   A read
1cf0: 2f 77 72 69 74 65 20 69 6e 74 65 67 65 72 20 70  /write integer p
1d00: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
1d10: 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 43  LSM_CONFIG_AUTOC
1d20: 48 45 43 4b 50 4f 49 4e 54 3a 0a 2a 2a 20 20 20  HECKPOINT:.**   
1d30: 41 20 72 65 61 64 2f 77 72 69 74 65 20 69 6e 74  A read/write int
1d40: 65 67 65 72 20 70 61 72 61 6d 65 74 65 72 2e 0a  eger parameter..
1d50: 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 69 73 20  **.**   If this 
1d60: 6f 70 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  option is set to
1d70: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
1d80: 4e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  N, then a checkp
1d90: 6f 69 6e 74 20 69 73 0a 2a 2a 20 20 20 61 75 74  oint is.**   aut
1da0: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
1db0: 70 74 65 64 20 61 66 74 65 72 20 65 61 63 68 20  pted after each 
1dc0: 4e 20 4b 42 20 6f 66 20 64 61 74 61 20 68 61 76  N KB of data hav
1dd0: 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1de0: 6f 20 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  o .**   the data
1df0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e00: 20 20 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f 66     The amount of
1e10: 20 75 6e 63 68 65 63 6b 70 6f 69 6e 74 65 64 20   uncheckpointed 
1e20: 64 61 74 61 20 61 6c 72 65 61 64 79 20 77 72 69  data already wri
1e30: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1e40: 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69  base file.**   i
1e50: 73 20 61 20 67 6c 6f 62 61 6c 20 70 61 72 61 6d  s a global param
1e60: 65 74 65 72 2e 20 41 66 74 65 72 20 70 65 72 66  eter. After perf
1e70: 6f 72 6d 69 6e 67 20 64 61 74 61 62 61 73 65 20  orming database 
1e80: 77 6f 72 6b 20 28 77 72 69 74 69 6e 67 20 74 6f  work (writing to
1e90: 20 74 68 65 0a 2a 2a 20 20 20 64 61 74 61 62 61   the.**   databa
1ea0: 73 65 20 66 69 6c 65 29 2c 20 74 68 65 20 70 72  se file), the pr
1eb0: 6f 63 65 73 73 20 63 68 65 63 6b 73 20 69 66 20  ocess checks if 
1ec0: 74 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74  the total amount
1ed0: 20 6f 66 20 75 6e 63 68 65 63 6b 70 6f 69 6e 74   of uncheckpoint
1ee0: 65 64 20 0a 2a 2a 20 20 20 64 61 74 61 20 65 78  ed .**   data ex
1ef0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
1f00: 6f 66 20 74 68 69 73 20 70 61 72 61 6d 74 65 72  of this paramter
1f10: 2e 20 49 66 20 73 6f 2c 20 61 20 63 68 65 63 6b  . If so, a check
1f20: 70 6f 69 6e 74 20 69 73 20 70 65 72 66 6f 72 6d  point is perform
1f30: 65 64 2e 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  ed..**   This me
1f40: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 6f 70  ans that this op
1f50: 74 69 6f 6e 20 6d 61 79 20 63 61 75 73 65 20 74  tion may cause t
1f60: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1f70: 20 70 65 72 66 6f 72 6d 20 61 20 0a 2a 2a 20 20   perform a .**  
1f80: 20 63 68 65 63 6b 70 6f 69 6e 74 20 65 76 65 6e   checkpoint even
1f90: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
1fa0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 69  connection has i
1fb0: 74 73 65 6c 66 20 77 72 69 74 74 65 6e 20 76 65  tself written ve
1fc0: 72 79 20 6c 69 74 74 6c 65 0a 2a 2a 20 20 20 64  ry little.**   d
1fd0: 61 74 61 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ata into the dat
1fe0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1ff0: 2a 20 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  *   The default 
2000: 76 61 6c 75 65 20 69 73 20 32 30 34 38 20 28 63  value is 2048 (c
2010: 68 65 63 6b 70 6f 69 6e 74 20 65 76 65 72 79 20  heckpoint every 
2020: 32 4d 42 29 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f  2MB)..**.** LSM_
2030: 43 4f 4e 46 49 47 5f 4d 4d 41 50 3a 0a 2a 2a 20  CONFIG_MMAP:.** 
2040: 20 20 41 20 72 65 61 64 2f 77 72 69 74 65 20 69    A read/write i
2050: 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65 72  nteger parameter
2060: 2e 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20  . If this value 
2070: 69 73 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65  is set to 0, the
2080: 6e 20 74 68 65 20 0a 2a 2a 20 20 20 64 61 74 61  n the .**   data
2090: 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 63 63  base file is acc
20a0: 65 73 73 65 64 20 75 73 69 6e 67 20 6f 72 64 69  essed using ordi
20b0: 6e 61 72 79 20 72 65 61 64 2f 77 72 69 74 65 20  nary read/write 
20c0: 49 4f 20 66 75 6e 63 74 69 6f 6e 73 2e 20 4f 72  IO functions. Or
20d0: 2c 0a 2a 2a 20 20 20 69 66 20 69 74 20 69 73 20  ,.**   if it is 
20e0: 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 74  set to 1, then t
20f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2100: 20 69 73 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65   is memory mappe
2110: 64 20 61 6e 64 20 61 63 63 65 73 73 65 64 0a 2a  d and accessed.*
2120: 2a 20 20 20 74 68 61 74 20 77 61 79 2e 20 49 66  *   that way. If
2130: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
2140: 69 73 20 73 65 74 20 74 6f 20 61 6e 79 20 76 61  is set to any va
2150: 6c 75 65 20 4e 20 67 72 65 61 74 65 72 20 74 68  lue N greater th
2160: 61 6e 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  an 1, then.**   
2170: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
2180: 4e 20 4b 42 20 6f 66 20 74 68 65 20 66 69 6c 65  N KB of the file
2190: 20 61 72 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   are memory mapp
21a0: 65 64 2c 20 61 6e 64 20 61 6e 79 20 72 65 6d 61  ed, and any rema
21b0: 69 6e 64 65 72 0a 2a 2a 20 20 20 61 63 63 65 73  inder.**   acces
21c0: 73 65 64 20 75 73 69 6e 67 20 72 65 61 64 2f 77  sed using read/w
21d0: 72 69 74 65 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 20  rite IO..**.**  
21e0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
21f0: 75 65 20 69 73 20 31 20 6f 6e 20 36 34 2d 62 69  ue is 1 on 64-bi
2200: 74 20 70 6c 61 74 66 6f 72 6d 73 20 61 6e 64 20  t platforms and 
2210: 33 32 37 36 38 20 6f 6e 20 33 32 2d 62 69 74 20  32768 on 32-bit 
2220: 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 20 20 20  platforms..**   
2230: 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f 4e 46 49  .**.** LSM_CONFI
2240: 47 5f 55 53 45 5f 4c 4f 47 3a 0a 2a 2a 20 20 20  G_USE_LOG:.**   
2250: 41 20 72 65 61 64 2f 77 72 69 74 65 20 62 6f 6f  A read/write boo
2260: 6c 65 61 6e 20 70 61 72 61 6d 65 74 65 72 2e 20  lean parameter. 
2270: 54 72 75 65 20 28 74 68 65 20 64 65 66 61 75 6c  True (the defaul
2280: 74 29 20 74 6f 20 75 73 65 20 74 68 65 20 6c 6f  t) to use the lo
2290: 67 0a 2a 2a 20 20 20 66 69 6c 65 20 6e 6f 72 6d  g.**   file norm
22a0: 61 6c 6c 79 2e 20 46 61 6c 73 65 20 6f 74 68 65  ally. False othe
22b0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d  rwise..**.** LSM
22c0: 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 4d 45 52 47  _CONFIG_AUTOMERG
22d0: 45 3a 0a 2a 2a 20 20 20 41 20 72 65 61 64 2f 77  E:.**   A read/w
22e0: 72 69 74 65 20 69 6e 74 65 67 65 72 20 70 61 72  rite integer par
22f0: 61 6d 65 74 65 72 2e 20 54 68 65 20 6d 69 6e 69  ameter. The mini
2300: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  mum number of se
2310: 67 6d 65 6e 74 73 20 74 6f 0a 2a 2a 20 20 20 6d  gments to.**   m
2320: 65 72 67 65 20 74 6f 67 65 74 68 65 72 20 61 74  erge together at
2330: 20 61 20 74 69 6d 65 2e 20 44 65 66 61 75 6c 74   a time. Default
2340: 20 76 61 6c 75 65 20 34 2e 0a 2a 2a 0a 2a 2a 20   value 4..**.** 
2350: 4c 53 4d 5f 43 4f 4e 46 49 47 5f 4d 41 58 5f 46  LSM_CONFIG_MAX_F
2360: 52 45 45 4c 49 53 54 3a 0a 2a 2a 20 20 20 41 20  REELIST:.**   A 
2370: 72 65 61 64 2f 77 72 69 74 65 20 69 6e 74 65 67  read/write integ
2380: 65 72 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  er parameter. Th
2390: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
23a0: 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 0a 2a   of free-list .*
23b0: 2a 20 20 20 65 6e 74 72 69 65 73 20 74 68 61 74  *   entries that
23c0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
23d0: 20 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70   database checkp
23e0: 6f 69 6e 74 20 28 74 68 65 20 6f 74 68 65 72 73  oint (the others
23f0: 20 61 72 65 0a 2a 2a 20 20 20 73 74 6f 72 65 64   are.**   stored
2400: 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68   elsewhere in th
2410: 65 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2a 0a  e database)..**.
2420: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
2430: 20 72 65 61 73 6f 6e 20 66 6f 72 20 61 6e 20 61   reason for an a
2440: 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 63 6f  pplication to co
2450: 6e 66 69 67 75 72 65 20 6f 72 20 71 75 65 72 79  nfigure or query
2460: 20 74 68 69 73 0a 2a 2a 20 20 20 70 61 72 61 6d   this.**   param
2470: 65 74 65 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  eter. It is only
2480: 20 70 72 65 73 65 6e 74 20 62 65 63 61 75 73 65   present because
2490: 20 63 6f 6e 66 69 67 75 72 69 6e 67 20 61 20 73   configuring a s
24a0: 6d 61 6c 6c 20 76 61 6c 75 65 0a 2a 2a 20 20 20  mall value.**   
24b0: 6d 61 6b 65 73 20 63 65 72 74 61 69 6e 20 70 61  makes certain pa
24c0: 72 74 73 20 6f 66 20 74 68 65 20 6c 73 6d 20 63  rts of the lsm c
24d0: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 74 65  ode easier to te
24e0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f  st..**.** LSM_CO
24f0: 4e 46 49 47 5f 4d 55 4c 54 49 50 4c 45 5f 50 52  NFIG_MULTIPLE_PR
2500: 4f 43 45 53 53 45 53 3a 0a 2a 2a 20 20 20 41 20  OCESSES:.**   A 
2510: 72 65 61 64 2f 77 72 69 74 65 20 62 6f 6f 6c 65  read/write boole
2520: 61 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  an parameter. Th
2530: 69 73 20 70 61 72 61 6d 65 74 65 72 20 6d 61 79  is parameter may
2540: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 62 65 66   only be set bef
2550: 6f 72 65 0a 2a 2a 20 20 20 6c 73 6d 5f 6f 70 65  ore.**   lsm_ope
2560: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  n() has been cal
2570: 6c 65 64 2e 20 49 66 20 74 72 75 65 2c 20 74 68  led. If true, th
2580: 65 20 6c 69 62 72 61 72 79 20 75 73 65 73 20 73  e library uses s
2590: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
25a0: 20 20 61 6e 64 20 70 6f 73 69 78 20 61 64 76 69    and posix advi
25b0: 73 6f 72 79 20 6c 6f 63 6b 73 20 74 6f 20 63 6f  sory locks to co
25c0: 2d 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73  -ordinate access
25d0: 20 62 79 20 63 6c 69 65 6e 74 73 20 66 72 6f 6d   by clients from
25e0: 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 6d 75 6c   within.**   mul
25f0: 74 69 70 6c 65 20 70 72 6f 63 65 73 73 65 73 2e  tiple processes.
2600: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 66   Otherwise, if f
2610: 61 6c 73 65 2c 20 61 6c 6c 20 64 61 74 61 62 61  alse, all databa
2620: 73 65 20 63 6c 69 65 6e 74 73 20 6d 75 73 74 20  se clients must 
2630: 62 65 20 0a 2a 2a 20 20 20 6c 6f 63 61 74 65 64  be .**   located
2640: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f   in the same pro
2650: 63 65 73 73 2e 20 54 68 65 20 64 65 66 61 75 6c  cess. The defaul
2660: 74 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  t value is true.
2670: 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f 4e 46 49  .**.** LSM_CONFI
2680: 47 5f 53 45 54 5f 43 4f 4d 50 52 45 53 53 49 4f  G_SET_COMPRESSIO
2690: 4e 3a 0a 2a 2a 20 20 20 53 65 74 20 74 68 65 20  N:.**   Set the 
26a0: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68  compression meth
26b0: 6f 64 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ods used to comp
26c0: 72 65 73 73 20 61 6e 64 20 64 65 63 6f 6d 70 72  ress and decompr
26d0: 65 73 73 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ess database.** 
26e0: 20 20 63 6f 6e 74 65 6e 74 2e 20 54 68 65 20 61    content. The a
26f0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2700: 6f 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  option should be
2710: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2720: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 20 20 6f  structure.**   o
2730: 66 20 74 79 70 65 20 6c 73 6d 5f 63 6f 6d 70 72  f type lsm_compr
2740: 65 73 73 2e 20 54 68 65 20 6c 73 6d 5f 63 6f 6e  ess. The lsm_con
2750: 66 69 67 28 29 20 6d 65 74 68 6f 64 20 74 61 6b  fig() method tak
2760: 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  es a copy of the
2770: 20 0a 2a 2a 20 20 20 73 74 72 75 63 74 75 72 65   .**   structure
2780: 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 0a 2a  s contents..**.*
2790: 2a 20 20 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  *   This option 
27a0: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
27b0: 20 62 65 66 6f 72 65 20 6c 73 6d 5f 6f 70 65 6e   before lsm_open
27c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 6e  () is called. In
27d0: 76 6f 6b 69 6e 67 20 69 74 0a 2a 2a 20 20 20 61  voking it.**   a
27e0: 66 74 65 72 20 6c 73 6d 5f 6f 70 65 6e 28 29 20  fter lsm_open() 
27f0: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
2800: 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 4c 53  results in an LS
2810: 4d 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e 0a  M_MISUSE error..
2820: 2a 2a 0a 2a 2a 20 4c 53 4d 5f 43 4f 4e 46 49 47  **.** LSM_CONFIG
2830: 5f 47 45 54 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _GET_COMPRESSION
2840: 3a 0a 2a 2a 20 20 20 51 75 65 72 79 20 74 68 65  :.**   Query the
2850: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74   compression met
2860: 68 6f 64 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  hods used to com
2870: 70 72 65 73 73 20 61 6e 64 20 64 65 63 6f 6d 70  press and decomp
2880: 72 65 73 73 20 64 61 74 61 62 61 73 65 0a 2a 2a  ress database.**
2890: 20 20 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a     content..**.*
28a0: 2a 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53 45 54  * LSM_CONFIG_SET
28b0: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 5f 46 41 43  _COMPRESSION_FAC
28c0: 54 4f 52 59 3a 0a 2a 2a 20 20 20 43 6f 6e 66 69  TORY:.**   Confi
28d0: 67 75 72 65 20 61 20 66 61 63 74 6f 72 79 20 6d  gure a factory m
28e0: 65 74 68 6f 64 20 74 6f 20 62 65 20 69 6e 76 6f  ethod to be invo
28f0: 6b 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61  ked in case of a
2900: 6e 20 4c 53 4d 5f 4d 49 53 4d 41 54 43 48 0a 2a  n LSM_MISMATCH.*
2910: 2a 20 20 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  *   error..**.**
2920: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 52 45 41 44   LSM_CONFIG_READ
2930: 4f 4e 4c 59 3a 0a 2a 2a 20 20 20 41 20 72 65 61  ONLY:.**   A rea
2940: 64 2f 77 72 69 74 65 20 62 6f 6f 6c 65 61 6e 20  d/write boolean 
2950: 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20  parameter. This 
2960: 70 61 72 61 6d 65 74 65 72 20 6d 61 79 20 6f 6e  parameter may on
2970: 6c 79 20 62 65 20 73 65 74 20 62 65 66 6f 72 65  ly be set before
2980: 0a 2a 2a 20 20 20 6c 73 6d 5f 6f 70 65 6e 28 29  .**   lsm_open()
2990: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 23   is called..*/.#
29a0: 64 65 66 69 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49  define LSM_CONFI
29b0: 47 5f 41 55 54 4f 46 4c 55 53 48 20 20 20 20 20  G_AUTOFLUSH     
29c0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65             1.#de
29d0: 66 69 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f  fine LSM_CONFIG_
29e0: 50 41 47 45 5f 53 49 5a 45 20 20 20 20 20 20 20  PAGE_SIZE       
29f0: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
2a00: 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53 41  ne LSM_CONFIG_SA
2a10: 46 45 54 59 20 20 20 20 20 20 20 20 20 20 20 20  FETY            
2a20: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
2a30: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 42 4c 4f 43   LSM_CONFIG_BLOC
2a40: 4b 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20 20  K_SIZE          
2a50: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4c       4.#define L
2a60: 53 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 57 4f  SM_CONFIG_AUTOWO
2a70: 52 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RK              
2a80: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4c 53 4d     5.#define LSM
2a90: 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 20 20 20 20  _CONFIG_MMAP    
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 37 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 43   7.#define LSM_C
2ac0: 4f 4e 46 49 47 5f 55 53 45 5f 4c 4f 47 20 20 20  ONFIG_USE_LOG   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
2ae0: 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 43 4f 4e  .#define LSM_CON
2af0: 46 49 47 5f 41 55 54 4f 4d 45 52 47 45 20 20 20  FIG_AUTOMERGE   
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23               9.#
2b10: 64 65 66 69 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49  define LSM_CONFI
2b20: 47 5f 4d 41 58 5f 46 52 45 45 4c 49 53 54 20 20  G_MAX_FREELIST  
2b30: 20 20 20 20 20 20 20 20 20 20 31 30 0a 23 64 65            10.#de
2b40: 66 69 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f  fine LSM_CONFIG_
2b50: 4d 55 4c 54 49 50 4c 45 5f 50 52 4f 43 45 53 53  MULTIPLE_PROCESS
2b60: 45 53 20 20 20 20 20 20 31 31 0a 23 64 65 66 69  ES      11.#defi
2b70: 6e 65 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55  ne LSM_CONFIG_AU
2b80: 54 4f 43 48 45 43 4b 50 4f 49 4e 54 20 20 20 20  TOCHECKPOINT    
2b90: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2ba0: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53 45 54 5f   LSM_CONFIG_SET_
2bb0: 43 4f 4d 50 52 45 53 53 49 4f 4e 20 20 20 20 20  COMPRESSION     
2bc0: 20 20 20 20 31 33 0a 23 64 65 66 69 6e 65 20 4c      13.#define L
2bd0: 53 4d 5f 43 4f 4e 46 49 47 5f 47 45 54 5f 43 4f  SM_CONFIG_GET_CO
2be0: 4d 50 52 45 53 53 49 4f 4e 20 20 20 20 20 20 20  MPRESSION       
2bf0: 20 20 31 34 0a 23 64 65 66 69 6e 65 20 4c 53 4d    14.#define LSM
2c00: 5f 43 4f 4e 46 49 47 5f 53 45 54 5f 43 4f 4d 50  _CONFIG_SET_COMP
2c10: 52 45 53 53 49 4f 4e 5f 46 41 43 54 4f 52 59 20  RESSION_FACTORY 
2c20: 31 35 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 43  15.#define LSM_C
2c30: 4f 4e 46 49 47 5f 52 45 41 44 4f 4e 4c 59 20 20  ONFIG_READONLY  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36                16
2c50: 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 53 41  ..#define LSM_SA
2c60: 46 45 54 59 5f 4f 46 46 20 20 20 20 30 0a 23 64  FETY_OFF    0.#d
2c70: 65 66 69 6e 65 20 4c 53 4d 5f 53 41 46 45 54 59  efine LSM_SAFETY
2c80: 5f 4e 4f 52 4d 41 4c 20 31 0a 23 64 65 66 69 6e  _NORMAL 1.#defin
2c90: 65 20 4c 53 4d 5f 53 41 46 45 54 59 5f 46 55 4c  e LSM_SAFETY_FUL
2ca0: 4c 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 43 41 50  L   2../*.** CAP
2cb0: 49 3a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 61  I: Compression a
2cc0: 6e 64 2f 6f 72 20 45 6e 63 72 79 70 74 69 6f 6e  nd/or Encryption
2cd0: 20 48 6f 6f 6b 73 0a 2a 2f 0a 73 74 72 75 63 74   Hooks.*/.struct
2ce0: 20 6c 73 6d 5f 63 6f 6d 70 72 65 73 73 20 7b 0a   lsm_compress {.
2cf0: 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20    void *pCtx;.  
2d00: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 49 64  unsigned int iId
2d10: 3b 0a 20 20 69 6e 74 20 28 2a 78 42 6f 75 6e 64  ;.  int (*xBound
2d20: 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 20 6e 53  )(void *, int nS
2d30: 72 63 29 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f  rc);.  int (*xCo
2d40: 6d 70 72 65 73 73 29 28 76 6f 69 64 20 2a 2c 20  mpress)(void *, 
2d50: 63 68 61 72 20 2a 2c 20 69 6e 74 20 2a 2c 20 63  char *, int *, c
2d60: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
2d70: 29 3b 0a 20 20 69 6e 74 20 28 2a 78 55 6e 63 6f  );.  int (*xUnco
2d80: 6d 70 72 65 73 73 29 28 76 6f 69 64 20 2a 2c 20  mpress)(void *, 
2d90: 63 68 61 72 20 2a 2c 20 69 6e 74 20 2a 2c 20 63  char *, int *, c
2da0: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
2db0: 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65  );.  void (*xFre
2dc0: 65 29 28 76 6f 69 64 20 2a 70 43 74 78 29 3b 0a  e)(void *pCtx);.
2dd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 6c 73 6d 5f 63  };..struct lsm_c
2de0: 6f 6d 70 72 65 73 73 5f 66 61 63 74 6f 72 79 20  ompress_factory 
2df0: 7b 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a  {.  void *pCtx;.
2e00: 20 20 69 6e 74 20 28 2a 78 46 61 63 74 6f 72 79    int (*xFactory
2e10: 29 28 76 6f 69 64 20 2a 2c 20 6c 73 6d 5f 64 62  )(void *, lsm_db
2e20: 20 2a 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74   *, unsigned int
2e30: 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 46 72 65  );.  void (*xFre
2e40: 65 29 28 76 6f 69 64 20 2a 70 43 74 78 29 3b 0a  e)(void *pCtx);.
2e50: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  };..#define LSM_
2e60: 43 4f 4d 50 52 45 53 53 49 4f 4e 5f 45 4d 50 54  COMPRESSION_EMPT
2e70: 59 20 30 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  Y 0.#define LSM_
2e80: 43 4f 4d 50 52 45 53 53 49 4f 4e 5f 4e 4f 4e 45  COMPRESSION_NONE
2e90: 20 20 31 0a 0a 2f 2a 0a 2a 2a 20 43 41 50 49 3a    1../*.** CAPI:
2ea0: 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 6e 64 20   Allocating and 
2eb0: 46 72 65 65 69 6e 67 20 4d 65 6d 6f 72 79 0a 2a  Freeing Memory.*
2ec0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2ed0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2ee0: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  n functions that
2ef0: 20 62 65 6c 6f 6e 67 20 74 6f 20 65 6e 76 69 72   belong to envir
2f00: 6f 6e 6d 65 6e 74 0a 2a 2a 20 70 45 6e 76 2e 20  onment.** pEnv. 
2f10: 4f 72 20 74 68 65 20 73 79 73 74 65 6d 20 64 65  Or the system de
2f20: 66 61 75 6c 74 73 20 69 66 20 6e 6f 20 6d 65 6d  faults if no mem
2f30: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
2f40: 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 0a 2a  unctions have .*
2f50: 2a 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  * been registere
2f60: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 6c 73 6d 5f  d..*/.void *lsm_
2f70: 6d 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e 76 2a 2c  malloc(lsm_env*,
2f80: 20 73 69 7a 65 5f 74 29 3b 0a 76 6f 69 64 20 2a   size_t);.void *
2f90: 6c 73 6d 5f 72 65 61 6c 6c 6f 63 28 6c 73 6d 5f  lsm_realloc(lsm_
2fa0: 65 6e 76 2a 2c 20 76 6f 69 64 20 2a 2c 20 73 69  env*, void *, si
2fb0: 7a 65 5f 74 29 3b 0a 76 6f 69 64 20 6c 73 6d 5f  ze_t);.void lsm_
2fc0: 66 72 65 65 28 6c 73 6d 5f 65 6e 76 2a 2c 20 76  free(lsm_env*, v
2fd0: 6f 69 64 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  oid *);../*.** C
2fe0: 41 50 49 3a 20 51 75 65 72 79 69 6e 67 20 61 20  API: Querying a 
2ff0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 46 6f 72 20 4f  Connection For O
3000: 70 65 72 61 74 69 6f 6e 61 6c 20 44 61 74 61 0a  perational Data.
3010: 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 61 20 64 61  **.** Query a da
3020: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3030: 6e 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 61  n for operationa
3040: 6c 20 73 74 61 74 69 73 74 69 63 73 20 6f 72 20  l statistics or 
3050: 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d  data..*/.int lsm
3060: 5f 69 6e 66 6f 28 6c 73 6d 5f 64 62 20 2a 2c 20  _info(lsm_db *, 
3070: 69 6e 74 2c 20 2e 2e 2e 29 3b 0a 0a 69 6e 74 20  int, ...);..int 
3080: 6c 73 6d 5f 67 65 74 5f 75 73 65 72 5f 76 65 72  lsm_get_user_ver
3090: 73 69 6f 6e 28 6c 73 6d 5f 64 62 20 2a 2c 20 75  sion(lsm_db *, u
30a0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 3b 0a  nsigned int *);.
30b0: 69 6e 74 20 6c 73 6d 5f 73 65 74 5f 75 73 65 72  int lsm_set_user
30c0: 5f 76 65 72 73 69 6f 6e 28 6c 73 6d 5f 64 62 20  _version(lsm_db 
30d0: 2a 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  *, unsigned int)
30e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
30f0: 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6d 61  lowing values ma
3100: 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74  y be passed as t
3110: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3120: 6e 74 20 74 6f 20 6c 73 6d 5f 69 6e 66 6f 28 29  nt to lsm_info()
3130: 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f  ..**.** LSM_INFO
3140: 5f 4e 57 52 49 54 45 3a 0a 2a 2a 20 20 20 54 68  _NWRITE:.**   Th
3150: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
3160: 72 20 73 68 6f 75 6c 64 20 62 65 20 6f 66 20 74  r should be of t
3170: 79 70 65 20 28 69 6e 74 20 2a 29 2e 20 54 68 65  ype (int *). The
3180: 20 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74 65   location pointe
3190: 64 0a 2a 2a 20 20 20 74 6f 20 62 79 20 74 68 65  d.**   to by the
31a0: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
31b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
31c0: 75 6d 62 65 72 20 6f 66 20 34 4b 42 20 70 61 67  umber of 4KB pag
31d0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  es written to.**
31e0: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
31f0: 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20  file during the 
3200: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 69 73  lifetime of this
3210: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 0a 2a 2a   connection. .**
3220: 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f 5f 4e 52 45  .** LSM_INFO_NRE
3230: 41 44 3a 0a 2a 2a 20 20 20 54 68 65 20 74 68 69  AD:.**   The thi
3240: 72 64 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f  rd parameter sho
3250: 75 6c 64 20 62 65 20 6f 66 20 74 79 70 65 20 28  uld be of type (
3260: 69 6e 74 20 2a 29 2e 20 54 68 65 20 6c 6f 63 61  int *). The loca
3270: 74 69 6f 6e 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  tion pointed.** 
3280: 20 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72    to by the thir
3290: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  d parameter is s
32a0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
32b0: 20 6f 66 20 34 4b 42 20 70 61 67 65 73 20 72 65   of 4KB pages re
32c0: 61 64 20 66 72 6f 6d 0a 2a 2a 20 20 20 74 68 65  ad from.**   the
32d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
32e0: 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
32f0: 6d 65 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  me of this conne
3300: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d  ction..**.** LSM
3310: 5f 49 4e 46 4f 5f 44 42 5f 53 54 52 55 43 54 55  _INFO_DB_STRUCTU
3320: 52 45 3a 0a 2a 2a 20 20 20 54 68 65 20 74 68 69  RE:.**   The thi
3330: 72 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  rd argument shou
3340: 6c 64 20 62 65 20 6f 66 20 74 79 70 65 20 28 63  ld be of type (c
3350: 68 61 72 20 2a 2a 29 2e 20 54 68 65 20 6c 6f 63  har **). The loc
3360: 61 74 69 6f 6e 20 70 6f 69 6e 74 65 64 0a 2a 2a  ation pointed.**
3370: 20 20 20 74 6f 20 69 73 20 70 6f 70 75 6c 61 74     to is populat
3380: 65 64 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65  ed with a pointe
3390: 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  r to a nul-termi
33a0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
33b0: 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 74 68 65  taining.**   the
33c0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
33d0: 74 61 74 69 6f 6e 20 6f 66 20 61 20 54 63 6c 20  tation of a Tcl 
33e0: 64 61 74 61 2d 73 74 72 75 63 74 75 72 65 20 72  data-structure r
33f0: 65 66 6c 65 63 74 69 6e 67 20 74 68 65 20 0a 2a  eflecting the .*
3400: 2a 20 20 20 63 75 72 72 65 6e 74 20 73 74 72 75  *   current stru
3410: 63 74 75 72 65 20 6f 66 20 74 68 65 20 64 61 74  cture of the dat
3420: 61 62 61 73 65 20 66 69 6c 65 2e 20 53 70 65 63  abase file. Spec
3430: 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 63 75  ifically, the cu
3440: 72 72 65 6e 74 20 73 74 61 74 65 0a 2a 2a 20 20  rrent state.**  
3450: 20 6f 66 20 74 68 65 20 77 6f 72 6b 65 72 20 73   of the worker s
3460: 6e 61 70 73 68 6f 74 2e 20 54 68 65 20 72 65 74  napshot. The ret
3470: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 73 68 6f  urned string sho
3480: 75 6c 64 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  uld be eventuall
3490: 79 20 66 72 65 65 64 20 0a 2a 2a 20 20 20 62 79  y freed .**   by
34a0: 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
34b0: 67 20 6c 73 6d 5f 66 72 65 65 28 29 2e 0a 2a 2a  g lsm_free()..**
34c0: 0a 2a 2a 20 20 20 54 68 65 20 72 65 74 75 72 6e  .**   The return
34d0: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73  ed list contains
34e0: 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72   one element for
34f0: 20 65 61 63 68 20 6c 65 76 65 6c 20 69 6e 20 74   each level in t
3500: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
3510: 20 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20    in order from 
3520: 6d 6f 73 74 20 74 6f 20 6c 65 61 73 74 20 72 65  most to least re
3530: 63 65 6e 74 2e 20 45 61 63 68 20 65 6c 65 6d 65  cent. Each eleme
3540: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  nt contains a .*
3550: 2a 20 20 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  *   single eleme
3560: 6e 74 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d  nt for each segm
3570: 65 6e 74 20 63 6f 6d 70 72 69 73 69 6e 67 20 74  ent comprising t
3580: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
3590: 20 6c 65 76 65 6c 2c 0a 2a 2a 20 20 20 73 74 61   level,.**   sta
35a0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c  rting with the l
35b0: 68 73 20 73 65 67 6d 65 6e 74 2c 20 74 68 65 6e  hs segment, then
35c0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 72 68 73   each of the rhs
35d0: 20 73 65 67 6d 65 6e 74 73 20 28 69 66 20 61 6e   segments (if an
35e0: 79 29 0a 2a 2a 20 20 20 69 6e 20 6f 72 64 65 72  y).**   in order
35f0: 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65   from most to le
3600: 61 73 74 20 72 65 63 65 6e 74 2e 0a 2a 2a 0a 2a  ast recent..**.*
3610: 2a 20 20 20 45 61 63 68 20 73 65 67 6d 65 6e 74  *   Each segment
3620: 20 65 6c 65 6d 65 6e 74 20 69 73 20 69 74 73 65   element is itse
3630: 6c 66 20 61 20 6c 69 73 74 20 6f 66 20 34 20 69  lf a list of 4 i
3640: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 2c 20 61  nteger values, a
3650: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3660: 20 20 20 3c 6f 6c 3e 3c 6c 69 3e 20 46 69 72 73     <ol><li> Firs
3670: 74 20 70 61 67 65 20 6f 66 20 73 65 67 6d 65 6e  t page of segmen
3680: 74 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 69 3e 20  t.**       <li> 
3690: 4c 61 73 74 20 70 61 67 65 20 6f 66 20 73 65 67  Last page of seg
36a0: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 3c 6c  ment.**       <l
36b0: 69 3e 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  i> Root page of 
36c0: 73 65 67 6d 65 6e 74 20 28 69 66 20 61 70 70 6c  segment (if appl
36d0: 69 63 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20 20  icable).**      
36e0: 20 3c 6c 69 3e 20 54 6f 74 61 6c 20 6e 75 6d 62   <li> Total numb
36f0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 73  er of pages in s
3700: 65 67 6d 65 6e 74 0a 2a 2a 20 20 20 3c 2f 6f 6c  egment.**   </ol
3710: 3e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f  >.**.** LSM_INFO
3720: 5f 41 52 52 41 59 5f 53 54 52 55 43 54 55 52 45  _ARRAY_STRUCTURE
3730: 3a 0a 2a 2a 20 20 20 54 68 65 72 65 20 73 68 6f  :.**   There sho
3740: 75 6c 64 20 62 65 20 74 77 6f 20 61 72 67 75 6d  uld be two argum
3750: 65 6e 74 73 20 70 61 73 73 65 64 20 66 6f 6c 6c  ents passed foll
3760: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 74 69 6f  owing this optio
3770: 6e 20 28 69 2e 65 2e 20 61 20 0a 2a 2a 20 20 20  n (i.e. a .**   
3780: 74 6f 74 61 6c 20 6f 66 20 66 6f 75 72 20 61 72  total of four ar
3790: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
37a0: 6f 20 6c 73 6d 5f 69 6e 66 6f 28 29 29 2e 20 54  o lsm_info()). T
37b0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
37c0: 74 20 0a 2a 2a 20 20 20 73 68 6f 75 6c 64 20 62  t .**   should b
37d0: 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
37e0: 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
37f0: 61 67 65 20 69 6e 20 61 20 64 61 74 61 62 61 73  age in a databas
3800: 65 20 61 72 72 61 79 20 0a 2a 2a 20 20 20 28 70  e array .**   (p
3810: 65 72 68 61 70 73 20 6f 62 74 61 69 6e 65 64 20  erhaps obtained 
3820: 66 72 6f 6d 20 61 6e 20 65 61 72 6c 69 65 72 20  from an earlier 
3830: 49 4e 46 4f 5f 44 42 5f 53 54 52 55 43 54 55 52  INFO_DB_STRUCTUR
3840: 45 20 63 61 6c 6c 29 2e 20 54 68 65 20 73 65 63  E call). The sec
3850: 6f 6e 64 20 0a 2a 2a 20 20 20 74 72 61 69 6c 69  ond .**   traili
3860: 6e 67 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  ng argument shou
3870: 6c 64 20 62 65 20 6f 66 20 74 79 70 65 20 28 63  ld be of type (c
3880: 68 61 72 20 2a 2a 29 2e 20 54 68 65 20 6c 6f 63  har **). The loc
3890: 61 74 69 6f 6e 20 70 6f 69 6e 74 65 64 20 0a 2a  ation pointed .*
38a0: 2a 20 20 20 74 6f 20 69 73 20 70 6f 70 75 6c 61  *   to is popula
38b0: 74 65 64 20 77 69 74 68 20 61 20 70 6f 69 6e 74  ted with a point
38c0: 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  er to a nul-term
38d0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 74 68  inated string th
38e0: 61 74 20 6d 75 73 74 20 0a 2a 2a 20 20 20 62 65  at must .**   be
38f0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
3900: 64 20 75 73 69 6e 67 20 6c 73 6d 5f 66 72 65 65  d using lsm_free
3910: 28 29 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  () by the caller
3920: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 6f 75  ..**.**   The ou
3930: 74 70 75 74 20 73 74 72 69 6e 67 20 63 6f 6e 74  tput string cont
3940: 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 72 65  ains the text re
3950: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
3960: 61 20 54 63 6c 20 6c 69 73 74 20 6f 66 0a 2a 2a  a Tcl list of.**
3970: 20 20 20 69 6e 74 65 67 65 72 73 2e 20 45 61 63     integers. Eac
3980: 68 20 70 61 69 72 20 6f 66 20 69 6e 74 65 67 65  h pair of intege
3990: 72 73 20 72 65 70 72 65 73 65 6e 74 20 61 20 72  rs represent a r
39a0: 61 6e 67 65 20 6f 66 20 70 61 67 65 73 20 75 73  ange of pages us
39b0: 65 64 20 62 79 0a 2a 2a 20 20 20 74 68 65 20 69  ed by.**   the i
39c0: 64 65 6e 74 69 66 69 65 64 20 61 72 72 61 79 2e  dentified array.
39d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
39e0: 20 74 68 65 20 61 72 72 61 79 20 6f 63 63 75 70   the array occup
39f0: 69 65 73 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ies database.** 
3a00: 20 20 70 61 67 65 73 20 39 39 33 20 74 6f 20 31    pages 993 to 1
3a10: 30 32 34 2c 20 74 68 65 6e 20 70 61 67 65 73 20  024, then pages 
3a20: 32 30 34 38 20 74 6f 20 32 37 37 37 2c 20 74 68  2048 to 2777, th
3a30: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3a40: 73 74 72 69 6e 67 0a 2a 2a 20 20 20 77 69 6c 6c  string.**   will
3a50: 20 62 65 20 22 39 39 33 20 31 30 32 34 20 32 30   be "993 1024 20
3a60: 34 38 20 32 37 37 37 22 2e 0a 2a 2a 0a 2a 2a 20  48 2777"..**.** 
3a70: 20 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69    If the specifi
3a80: 65 64 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  ed integer argum
3a90: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 72  ent does not cor
3aa0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
3ab0: 69 72 73 74 0a 2a 2a 20 20 20 70 61 67 65 20 6f  irst.**   page o
3ac0: 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 61  f any database a
3ad0: 72 72 61 79 2c 20 4c 53 4d 5f 45 52 52 4f 52 20  rray, LSM_ERROR 
3ae0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
3af0: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
3b00: 70 6f 69 6e 74 65 72 20 69 73 20 73 65 74 20 74  pointer is set t
3b10: 6f 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2e 0a  o a NULL value..
3b20: 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f 5f 4c  **.** LSM_INFO_L
3b30: 4f 47 5f 53 54 52 55 43 54 55 52 45 3a 0a 2a 2a  OG_STRUCTURE:.**
3b40: 20 20 20 54 68 65 20 74 68 69 72 64 20 61 72 67     The third arg
3b50: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
3b60: 6f 66 20 74 79 70 65 20 28 63 68 61 72 20 2a 2a  of type (char **
3b70: 29 2e 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ). The location 
3b80: 70 6f 69 6e 74 65 64 0a 2a 2a 20 20 20 74 6f 20  pointed.**   to 
3b90: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
3ba0: 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  h a pointer to a
3bb0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
3bc0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
3bd0: 67 0a 2a 2a 20 20 20 74 68 65 20 73 74 72 69 6e  g.**   the strin
3be0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
3bf0: 20 6f 66 20 61 20 54 63 6c 20 64 61 74 61 2d 73   of a Tcl data-s
3c00: 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 72 65  tructure. The re
3c10: 74 75 72 6e 65 64 20 0a 2a 2a 20 20 20 73 74 72  turned .**   str
3c20: 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 65 76  ing should be ev
3c30: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
3c40: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
3c50: 6e 67 20 6c 73 6d 5f 66 72 65 65 28 29 2e 0a 2a  ng lsm_free()..*
3c60: 2a 0a 2a 2a 20 20 20 54 68 65 20 54 63 6c 20 73  *.**   The Tcl s
3c70: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
3c80: 64 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 73  d is a list of s
3c90: 69 78 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  ix integers that
3ca0: 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 20 20 74   describe.**   t
3cb0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 75 63  he current struc
3cc0: 74 75 72 65 20 6f 66 20 74 68 65 20 6c 6f 67 20  ture of the log 
3cd0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f  file..**.** LSM_
3ce0: 49 4e 46 4f 5f 41 52 52 41 59 5f 50 41 47 45 53  INFO_ARRAY_PAGES
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f  :.**.** LSM_INFO
3d00: 5f 50 41 47 45 5f 41 53 43 49 49 5f 44 55 4d 50  _PAGE_ASCII_DUMP
3d10: 3a 0a 2a 2a 20 20 20 41 73 20 77 69 74 68 20 4c  :.**   As with L
3d20: 53 4d 5f 49 4e 46 4f 5f 41 52 52 41 59 5f 53 54  SM_INFO_ARRAY_ST
3d30: 52 55 43 54 55 52 45 2c 20 74 68 65 72 65 20 73  RUCTURE, there s
3d40: 68 6f 75 6c 64 20 62 65 20 74 77 6f 20 61 72 67  hould be two arg
3d50: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 0a 2a 2a  uments passed.**
3d60: 20 20 20 77 69 74 68 20 63 61 6c 6c 73 20 74 68     with calls th
3d70: 61 74 20 73 70 65 63 69 66 79 20 74 68 69 73 20  at specify this 
3d80: 6f 70 74 69 6f 6e 20 2d 20 61 6e 20 69 6e 74 65  option - an inte
3d90: 67 65 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ger page number 
3da0: 61 6e 64 20 61 0a 2a 2a 20 20 20 28 63 68 61 72  and a.**   (char
3db0: 20 2a 2a 29 20 75 73 65 64 20 74 6f 20 72 65 74   **) used to ret
3dc0: 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  urn a nul-termin
3dd0: 61 74 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  ated string that
3de0: 20 6d 75 73 74 20 62 65 20 6c 61 74 65 72 0a 2a   must be later.*
3df0: 2a 20 20 20 66 72 65 65 64 20 75 73 69 6e 67 20  *   freed using 
3e00: 6c 73 6d 5f 66 72 65 65 28 29 2e 20 49 6e 20 74  lsm_free(). In t
3e10: 68 69 73 20 63 61 73 65 20 74 68 65 20 6f 75 74  his case the out
3e20: 70 75 74 20 73 74 72 69 6e 67 20 69 73 20 70 6f  put string is po
3e30: 70 75 6c 61 74 65 64 0a 2a 2a 20 20 20 77 69 74  pulated.**   wit
3e40: 68 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  h a human-readab
3e50: 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
3e60: 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
3e70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74  nt..**.**   If t
3e80: 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
3e90: 65 20 64 65 63 6f 64 65 64 2c 20 69 74 20 69 73  e decoded, it is
3ea0: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 49   not an error. I
3eb0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a  n this case the.
3ec0: 2a 2a 20 20 20 68 75 6d 61 6e 2d 72 65 61 64 61  **   human-reada
3ed0: 62 6c 65 20 6f 75 74 70 75 74 20 6d 65 73 73 61  ble output messa
3ee0: 67 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  ge will report t
3ef0: 68 65 20 73 79 73 74 65 6d 73 20 66 61 69 6c 75  he systems failu
3f00: 72 65 20 74 6f 20 0a 2a 2a 20 20 20 69 6e 74 65  re to .**   inte
3f10: 72 70 72 65 74 20 74 68 65 20 70 61 67 65 20 64  rpret the page d
3f20: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49  ata..**.** LSM_I
3f30: 4e 46 4f 5f 50 41 47 45 5f 48 45 58 5f 44 55 4d  NFO_PAGE_HEX_DUM
3f40: 50 3a 0a 2a 2a 20 20 20 54 68 69 73 20 61 72 67  P:.**   This arg
3f50: 75 6d 65 6e 74 20 69 73 20 73 69 6d 69 6c 61 72  ument is similar
3f60: 20 74 6f 20 50 41 47 45 5f 41 53 43 49 49 5f 44   to PAGE_ASCII_D
3f70: 55 4d 50 2c 20 65 78 63 65 70 74 20 74 68 61 74  UMP, except that
3f80: 20 6b 65 79 73 20 61 6e 64 0a 2a 2a 20 20 20 76   keys and.**   v
3f90: 61 6c 75 65 73 20 61 72 65 20 72 65 70 72 65 73  alues are repres
3fa0: 65 6e 74 65 64 20 75 73 69 6e 67 20 68 65 78 61  ented using hexa
3fb0: 64 65 63 69 6d 61 6c 20 6e 6f 74 61 74 69 6f 6e  decimal notation
3fc0: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 63 69   instead of asci
3fd0: 69 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46  i..**.** LSM_INF
3fe0: 4f 5f 46 52 45 45 4c 49 53 54 3a 0a 2a 2a 20 20  O_FREELIST:.**  
3ff0: 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   The third argum
4000: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 66  ent should be of
4010: 20 74 79 70 65 20 28 63 68 61 72 20 2a 2a 29 2e   type (char **).
4020: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 70 6f   The location po
4030: 69 6e 74 65 64 0a 2a 2a 20 20 20 74 6f 20 69 73  inted.**   to is
4040: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
4050: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
4060: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
4070: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
4080: 2a 2a 20 20 20 74 68 65 20 73 74 72 69 6e 67 20  **   the string 
4090: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
40a0: 66 20 61 20 54 63 6c 20 64 61 74 61 2d 73 74 72  f a Tcl data-str
40b0: 75 63 74 75 72 65 2e 20 54 68 65 20 72 65 74 75  ucture. The retu
40c0: 72 6e 65 64 20 0a 2a 2a 20 20 20 73 74 72 69 6e  rned .**   strin
40d0: 67 20 73 68 6f 75 6c 64 20 62 65 20 65 76 65 6e  g should be even
40e0: 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
40f0: 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
4100: 20 6c 73 6d 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a   lsm_free()..**.
4110: 2a 2a 20 20 20 54 68 65 20 54 63 6c 20 73 74 72  **   The Tcl str
4120: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
4130: 69 73 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  is a list contai
4140: 6e 69 6e 67 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  ning one element
4150: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 20 20 66   for each.**   f
4160: 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65  ree block in the
4170: 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 65   database. The e
4180: 6c 65 6d 65 6e 74 20 69 74 73 65 6c 66 20 63 6f  lement itself co
4190: 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 0a 2a  nsists of two .*
41a0: 2a 20 20 20 69 6e 74 65 67 65 72 73 20 2d 20 74  *   integers - t
41b0: 68 65 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 20  he block number 
41c0: 61 6e 64 20 74 68 65 20 69 64 20 6f 66 20 74 68  and the id of th
41d0: 65 20 73 6e 61 70 73 68 6f 74 20 74 68 61 74 20  e snapshot that 
41e0: 66 72 65 65 64 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  freed it..**.** 
41f0: 4c 53 4d 5f 49 4e 46 4f 5f 43 48 45 43 4b 50 4f  LSM_INFO_CHECKPO
4200: 49 4e 54 5f 53 49 5a 45 3a 0a 2a 2a 20 20 20 54  INT_SIZE:.**   T
4210: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
4220: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 66 20 74  t should be of t
4230: 79 70 65 20 28 69 6e 74 20 2a 29 2e 20 54 68 65  ype (int *). The
4240: 20 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74 65   location pointe
4250: 64 20 74 6f 0a 2a 2a 20 20 20 62 79 20 74 68 69  d to.**   by thi
4260: 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 70 6f  s argument is po
4270: 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
4280: 20 6e 75 6d 62 65 72 20 6f 66 20 4b 42 20 77 72   number of KB wr
4290: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
42a0: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
42b0: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
42c0: 65 63 65 6e 74 20 63 68 65 63 6b 70 6f 69 6e 74  ecent checkpoint
42d0: 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46 4f  ..**.** LSM_INFO
42e0: 5f 54 52 45 45 5f 53 49 5a 45 3a 0a 2a 2a 20 20  _TREE_SIZE:.**  
42f0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
4300: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
4310: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4320: 74 6f 20 61 6e 20 6c 73 6d 5f 69 6e 66 6f 28 29  to an lsm_info()
4330: 20 63 61 6c 6c 2c 20 69 74 0a 2a 2a 20 20 20 73   call, it.**   s
4340: 68 6f 75 6c 64 20 62 65 20 66 6f 6c 6c 6f 77 65  hould be followe
4350: 64 20 62 79 20 74 77 6f 20 61 72 67 75 6d 65 6e  d by two argumen
4360: 74 73 20 6f 66 20 74 79 70 65 20 28 69 6e 74 20  ts of type (int 
4370: 2a 29 20 28 66 6f 72 20 61 20 74 6f 74 61 6c 20  *) (for a total 
4380: 6f 66 20 66 6f 75 72 0a 2a 2a 20 20 20 61 72 67  of four.**   arg
4390: 75 6d 65 6e 74 73 29 2e 0a 2a 2a 0a 2a 2a 20 20  uments)..**.**  
43a0: 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 74 68   At any time, th
43b0: 65 72 65 20 61 72 65 20 65 69 74 68 65 72 20 6f  ere are either o
43c0: 6e 65 20 6f 72 20 74 77 6f 20 74 72 65 65 20 73  ne or two tree s
43d0: 74 72 75 63 74 75 72 65 73 20 68 65 6c 64 20 69  tructures held i
43e0: 6e 20 73 68 61 72 65 64 0a 2a 2a 20 20 20 6d 65  n shared.**   me
43f0: 6d 6f 72 79 20 74 68 61 74 20 6e 65 77 20 64 61  mory that new da
4400: 74 61 62 61 73 65 20 63 6c 69 65 6e 74 73 20 77  tabase clients w
4410: 69 6c 6c 20 61 63 63 65 73 73 20 28 74 68 65 72  ill access (ther
4420: 65 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 64  e may also be ad
4430: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 74 72  ditional.**   tr
4440: 65 65 20 73 74 72 75 63 74 75 72 65 73 20 62 65  ee structures be
4450: 69 6e 67 20 75 73 65 64 20 62 79 20 6f 6c 64 65  ing used by olde
4460: 72 20 63 6c 69 65 6e 74 73 20 2d 20 74 68 69 73  r clients - this
4470: 20 41 50 49 20 64 6f 65 73 20 6e 6f 74 20 70 72   API does not pr
4480: 6f 76 69 64 65 0a 2a 2a 20 20 20 69 6e 66 6f 72  ovide.**   infor
4490: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 6d 29 2e  mation on them).
44a0: 20 4f 6e 65 20 74 72 65 65 20 73 74 72 75 63 74   One tree struct
44b0: 75 72 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e  ure - the curren
44c0: 74 20 74 72 65 65 20 2d 20 69 73 20 75 73 65 64  t tree - is used
44d0: 20 74 6f 0a 2a 2a 20 20 20 61 63 63 75 6d 75 6c   to.**   accumul
44e0: 61 74 65 20 6e 65 77 20 64 61 74 61 20 77 72 69  ate new data wri
44f0: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4500: 62 61 73 65 2e 20 54 68 65 20 6f 74 68 65 72 20  base. The other 
4510: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2d  tree structure -
4520: 0a 2a 2a 20 20 20 74 68 65 20 6f 6c 64 20 74 72  .**   the old tr
4530: 65 65 20 2d 20 69 73 20 61 20 72 65 61 64 2d 6f  ee - is a read-o
4540: 6e 6c 79 20 74 72 65 65 20 68 6f 6c 64 69 6e 67  nly tree holding
4550: 20 6f 6c 64 65 72 20 64 61 74 61 20 61 6e 64 20   older data and 
4560: 6d 61 79 20 62 65 20 66 6c 75 73 68 65 64 20 0a  may be flushed .
4570: 2a 2a 20 20 20 74 6f 20 64 69 73 6b 20 61 74 20  **   to disk at 
4580: 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 0a 2a 2a  any time..** .**
4590: 20 20 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65     Assuming no e
45a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
45b0: 20 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74 65   location pointe
45c0: 64 20 74 6f 20 62 79 20 74 68 65 20 66 69 72 73  d to by the firs
45d0: 74 20 6f 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  t of the two.** 
45e0: 20 20 28 69 6e 74 20 2a 29 20 61 72 67 75 6d 65    (int *) argume
45f0: 6e 74 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  nts is set to th
4600: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c  e size of the ol
4610: 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65  d in-memory tree
4620: 20 69 6e 20 4b 42 2e 0a 2a 2a 20 20 20 54 68 65   in KB..**   The
4630: 20 73 65 63 6f 6e 64 20 69 73 20 73 65 74 20 74   second is set t
4640: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
4650: 65 20 63 75 72 72 65 6e 74 2c 20 6f 72 20 6c 69  e current, or li
4660: 76 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  ve in-memory tre
4670: 65 2e 0a 2a 2a 0a 2a 2a 20 4c 53 4d 5f 49 4e 46  e..**.** LSM_INF
4680: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 5f 49 44  O_COMPRESSION_ID
4690: 3a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 6c 75  :.**   This valu
46a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 6c 6c  e should be foll
46b0: 6f 77 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65  owed by a single
46c0: 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70   argument of typ
46d0: 65 20 0a 2a 2a 20 20 20 28 75 6e 73 69 67 6e 65  e .**   (unsigne
46e0: 64 20 69 6e 74 20 2a 29 2e 20 49 66 20 73 75 63  d int *). If suc
46f0: 63 65 73 73 66 75 6c 2c 20 74 68 65 20 6c 6f 63  cessful, the loc
4700: 61 74 69 6f 6e 20 70 6f 69 6e 74 65 64 20 74 6f  ation pointed to
4710: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 0a 2a   is populated .*
4720: 2a 20 20 20 77 69 74 68 20 74 68 65 20 64 61 74  *   with the dat
4730: 61 62 61 73 65 20 63 6f 6d 70 72 65 73 73 69 6f  abase compressio
4740: 6e 20 69 64 20 62 65 66 6f 72 65 20 72 65 74 75  n id before retu
4750: 72 6e 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rning..*/.#defin
4760: 65 20 4c 53 4d 5f 49 4e 46 4f 5f 4e 57 52 49 54  e LSM_INFO_NWRIT
4770: 45 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64  E           1.#d
4780: 65 66 69 6e 65 20 4c 53 4d 5f 49 4e 46 4f 5f 4e  efine LSM_INFO_N
4790: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
47a0: 32 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49 4e  2.#define LSM_IN
47b0: 46 4f 5f 44 42 5f 53 54 52 55 43 54 55 52 45 20  FO_DB_STRUCTURE 
47c0: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4c 53      3.#define LS
47d0: 4d 5f 49 4e 46 4f 5f 4c 4f 47 5f 53 54 52 55 43  M_INFO_LOG_STRUC
47e0: 54 55 52 45 20 20 20 20 34 0a 23 64 65 66 69 6e  TURE    4.#defin
47f0: 65 20 4c 53 4d 5f 49 4e 46 4f 5f 41 52 52 41 59  e LSM_INFO_ARRAY
4800: 5f 53 54 52 55 43 54 55 52 45 20 20 35 0a 23 64  _STRUCTURE  5.#d
4810: 65 66 69 6e 65 20 4c 53 4d 5f 49 4e 46 4f 5f 50  efine LSM_INFO_P
4820: 41 47 45 5f 41 53 43 49 49 5f 44 55 4d 50 20 20  AGE_ASCII_DUMP  
4830: 36 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49 4e  6.#define LSM_IN
4840: 46 4f 5f 50 41 47 45 5f 48 45 58 5f 44 55 4d 50  FO_PAGE_HEX_DUMP
4850: 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4c 53      7.#define LS
4860: 4d 5f 49 4e 46 4f 5f 46 52 45 45 4c 49 53 54 20  M_INFO_FREELIST 
4870: 20 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e          8.#defin
4880: 65 20 4c 53 4d 5f 49 4e 46 4f 5f 41 52 52 41 59  e LSM_INFO_ARRAY
4890: 5f 50 41 47 45 53 20 20 20 20 20 20 39 0a 23 64  _PAGES      9.#d
48a0: 65 66 69 6e 65 20 4c 53 4d 5f 49 4e 46 4f 5f 43  efine LSM_INFO_C
48b0: 48 45 43 4b 50 4f 49 4e 54 5f 53 49 5a 45 20 31  HECKPOINT_SIZE 1
48c0: 30 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49 4e  0.#define LSM_IN
48d0: 46 4f 5f 54 52 45 45 5f 53 49 5a 45 20 20 20 20  FO_TREE_SIZE    
48e0: 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20 4c 53     11.#define LS
48f0: 4d 5f 49 4e 46 4f 5f 46 52 45 45 4c 49 53 54 5f  M_INFO_FREELIST_
4900: 53 49 5a 45 20 20 20 31 32 0a 23 64 65 66 69 6e  SIZE   12.#defin
4910: 65 20 4c 53 4d 5f 49 4e 46 4f 5f 43 4f 4d 50 52  e LSM_INFO_COMPR
4920: 45 53 53 49 4f 4e 5f 49 44 20 20 31 33 0a 0a 0a  ESSION_ID  13...
4930: 2f 2a 20 0a 2a 2a 20 43 41 50 49 3a 20 4f 70 65  /* .** CAPI: Ope
4940: 6e 69 6e 67 20 61 6e 64 20 43 6c 6f 73 69 6e 67  ning and Closing
4950: 20 57 72 69 74 65 20 54 72 61 6e 73 61 63 74 69   Write Transacti
4960: 6f 6e 73 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ons.**.** These 
4970: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73  functions are us
4980: 65 64 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20 63  ed to open and c
4990: 6c 6f 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lose transaction
49a0: 73 20 61 6e 64 20 6e 65 73 74 65 64 20 0a 2a 2a  s and nested .**
49b0: 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
49c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 73 6d  s..**.** The lsm
49d0: 5f 62 65 67 69 6e 28 29 20 66 75 6e 63 74 69 6f  _begin() functio
49e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 70 65  n is used to ope
49f0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  n transactions a
4a00: 6e 64 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nd sub-transacti
4a10: 6f 6e 73 2e 20 0a 2a 2a 20 41 20 73 75 63 63 65  ons. .** A succe
4a20: 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 20 6c 73  ssful call to ls
4a30: 6d 5f 62 65 67 69 6e 28 29 20 65 6e 73 75 72 65  m_begin() ensure
4a40: 73 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  s that there are
4a50: 20 61 74 20 6c 65 61 73 74 20 69 4c 65 76 65 6c   at least iLevel
4a60: 20 0a 2a 2a 20 6e 65 73 74 65 64 20 74 72 61 6e   .** nested tran
4a70: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2e 20 54  sactions open. T
4a80: 6f 20 6f 70 65 6e 20 61 20 74 6f 70 2d 6c 65 76  o open a top-lev
4a90: 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  el transaction, 
4aa0: 70 61 73 73 20 69 4c 65 76 65 6c 3d 31 2e 20 0a  pass iLevel=1. .
4ab0: 2a 2a 20 54 6f 20 6f 70 65 6e 20 61 20 73 75 62  ** To open a sub
4ac0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74  -transaction wit
4ad0: 68 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  hin the top-leve
4ae0: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  l transaction, i
4af0: 4c 65 76 65 6c 3d 32 2e 20 0a 2a 2a 20 50 61 73  Level=2. .** Pas
4b00: 73 69 6e 67 20 69 4c 65 76 65 6c 3d 30 20 69 73  sing iLevel=0 is
4b10: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
4b20: 6c 73 6d 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  lsm_commit() is 
4b30: 75 73 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 74  used to commit t
4b40: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 20  ransactions and 
4b50: 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  sub-transactions
4b60: 2e 20 41 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  . A.** successfu
4b70: 6c 20 63 61 6c 6c 20 74 6f 20 6c 73 6d 5f 63 6f  l call to lsm_co
4b80: 6d 6d 69 74 28 29 20 65 6e 73 75 72 65 73 20 74  mmit() ensures t
4b90: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
4ba0: 20 6d 6f 73 74 20 69 4c 65 76 65 6c 20 0a 2a 2a   most iLevel .**
4bb0: 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74   nested transact
4bc0: 69 6f 6e 73 20 6f 70 65 6e 2e 20 54 6f 20 63 6f  ions open. To co
4bd0: 6d 6d 69 74 20 61 20 74 6f 70 2d 6c 65 76 65 6c  mmit a top-level
4be0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 61   transaction, pa
4bf0: 73 73 20 69 4c 65 76 65 6c 3d 30 2e 20 0a 2a 2a  ss iLevel=0. .**
4c00: 20 54 6f 20 63 6f 6d 6d 69 74 20 61 6c 6c 20 73   To commit all s
4c10: 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ub-transactions 
4c20: 69 6e 73 69 64 65 20 74 68 65 20 6d 61 69 6e 20  inside the main 
4c30: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 61 73  transaction, pas
4c40: 73 20 69 4c 65 76 65 6c 3d 31 2e 0a 2a 2a 0a 2a  s iLevel=1..**.*
4c50: 2a 20 46 75 6e 63 74 69 6f 6e 20 6c 73 6d 5f 72  * Function lsm_r
4c60: 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 75 73 65  ollback() is use
4c70: 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
4c80: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 0a  ransactions and.
4c90: 2a 2a 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  ** sub-transacti
4ca0: 6f 6e 73 2e 20 41 20 73 75 63 63 65 73 73 66 75  ons. A successfu
4cb0: 6c 20 63 61 6c 6c 20 74 6f 20 6c 73 6d 5f 72 6f  l call to lsm_ro
4cc0: 6c 6c 62 61 63 6b 28 29 20 72 65 73 74 6f 72 65  llback() restore
4cd0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  s the database .
4ce0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
4cf0: 69 74 20 77 61 73 20 69 6e 20 77 68 65 6e 20 74  it was in when t
4d00: 68 65 20 69 4c 65 76 65 6c 27 74 68 20 6e 65 73  he iLevel'th nes
4d10: 74 65 64 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ted sub-transact
4d20: 69 6f 6e 20 28 69 66 20 61 6e 79 29 20 0a 2a 2a  ion (if any) .**
4d30: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
4d40: 64 2e 20 41 6e 64 20 74 68 65 6e 20 63 6c 6f 73  d. And then clos
4d50: 65 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  es transactions 
4d60: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
4d70: 68 65 72 65 20 61 72 65 20 0a 2a 2a 20 61 74 20  here are .** at 
4d80: 6d 6f 73 74 20 69 4c 65 76 65 6c 20 6e 65 73 74  most iLevel nest
4d90: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ed transactions 
4da0: 6f 70 65 6e 2e 20 50 61 73 73 69 6e 67 20 69 4c  open. Passing iL
4db0: 65 76 65 6c 3d 30 20 72 6f 6c 6c 73 20 62 61 63  evel=0 rolls bac
4dc0: 6b 20 61 6e 64 20 0a 2a 2a 20 63 6c 6f 73 65 73  k and .** closes
4dd0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 74   the top-level t
4de0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 69 4c 65 76  ransaction. iLev
4df0: 65 6c 3d 31 20 61 6c 73 6f 20 72 6f 6c 6c 73 20  el=1 also rolls 
4e00: 62 61 63 6b 20 74 68 65 20 74 6f 70 2d 6c 65 76  back the top-lev
4e10: 65 6c 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  el .** transacti
4e20: 6f 6e 2c 20 62 75 74 20 6c 65 61 76 65 73 20 69  on, but leaves i
4e30: 74 20 6f 70 65 6e 2e 20 69 4c 65 76 65 6c 3d 32  t open. iLevel=2
4e40: 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
4e50: 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
4e60: 0a 2a 2a 20 6e 65 73 74 65 64 20 64 69 72 65 63  .** nested direc
4e70: 74 6c 79 20 69 6e 73 69 64 65 20 74 68 65 20 74  tly inside the t
4e80: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
4e90: 74 69 6f 6e 20 28 61 6e 64 20 6c 65 61 76 65 73  tion (and leaves
4ea0: 20 69 74 20 6f 70 65 6e 29 2e 0a 2a 2f 0a 69 6e   it open)..*/.in
4eb0: 74 20 6c 73 6d 5f 62 65 67 69 6e 28 6c 73 6d 5f  t lsm_begin(lsm_
4ec0: 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 4c 65  db *pDb, int iLe
4ed0: 76 65 6c 29 3b 0a 69 6e 74 20 6c 73 6d 5f 63 6f  vel);.int lsm_co
4ee0: 6d 6d 69 74 28 6c 73 6d 5f 64 62 20 2a 70 44 62  mmit(lsm_db *pDb
4ef0: 2c 20 69 6e 74 20 69 4c 65 76 65 6c 29 3b 0a 69  , int iLevel);.i
4f00: 6e 74 20 6c 73 6d 5f 72 6f 6c 6c 62 61 63 6b 28  nt lsm_rollback(
4f10: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74  lsm_db *pDb, int
4f20: 20 69 4c 65 76 65 6c 29 3b 0a 0a 2f 2a 20 0a 2a   iLevel);../* .*
4f30: 2a 20 43 41 50 49 3a 20 57 72 69 74 69 6e 67 20  * CAPI: Writing 
4f40: 74 6f 20 61 20 44 61 74 61 62 61 73 65 0a 2a 2a  to a Database.**
4f50: 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 65 77 20  .** Write a new 
4f60: 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 64  value into the d
4f70: 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 76 61  atabase. If a va
4f80: 6c 75 65 20 77 69 74 68 20 61 20 64 75 70 6c 69  lue with a dupli
4f90: 63 61 74 65 20 6b 65 79 20 0a 2a 2a 20 61 6c 72  cate key .** alr
4fa0: 65 61 64 79 20 65 78 69 73 74 73 20 69 74 20 69  eady exists it i
4fb0: 73 20 72 65 70 6c 61 63 65 64 2e 0a 2a 2f 0a 69  s replaced..*/.i
4fc0: 6e 74 20 6c 73 6d 5f 69 6e 73 65 72 74 28 6c 73  nt lsm_insert(ls
4fd0: 6d 5f 64 62 2a 2c 20 63 6f 6e 73 74 20 76 6f 69  m_db*, const voi
4fe0: 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65  d *pKey, int nKe
4ff0: 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
5000: 56 61 6c 2c 20 69 6e 74 20 6e 56 61 6c 29 3b 0a  Val, int nVal);.
5010: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
5020: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 64  value from the d
5030: 61 74 61 62 61 73 65 2e 20 4e 6f 20 65 72 72 6f  atabase. No erro
5040: 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
5050: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
5060: 2a 20 6b 65 79 20 76 61 6c 75 65 20 64 6f 65 73  * key value does
5070: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
5080: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
5090: 6e 74 20 6c 73 6d 5f 64 65 6c 65 74 65 28 6c 73  nt lsm_delete(ls
50a0: 6d 5f 64 62 20 2a 2c 20 63 6f 6e 73 74 20 76 6f  m_db *, const vo
50b0: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
50c0: 65 79 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ey);../*.** Dele
50d0: 74 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  te all database 
50e0: 65 6e 74 72 69 65 73 20 77 69 74 68 20 6b 65 79  entries with key
50f0: 73 20 74 68 61 74 20 61 72 65 20 67 72 65 61 74  s that are great
5100: 65 72 20 74 68 61 6e 20 28 70 4b 65 79 31 2f 6e  er than (pKey1/n
5110: 4b 65 79 31 29 20 0a 2a 2a 20 61 6e 64 20 73 6d  Key1) .** and sm
5120: 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79  aller than (pKey
5130: 32 2f 6e 4b 65 79 32 29 2e 20 4e 6f 74 65 20 74  2/nKey2). Note t
5140: 68 61 74 20 6b 65 79 73 20 28 70 4b 65 79 31 2f  hat keys (pKey1/
5150: 6e 4b 65 79 31 29 20 61 6e 64 0a 2a 2a 20 28 70  nKey1) and.** (p
5160: 4b 65 79 32 2f 6e 4b 65 79 32 29 20 74 68 65 6d  Key2/nKey2) them
5170: 73 65 6c 76 65 73 2c 20 69 66 20 74 68 65 79 20  selves, if they 
5180: 65 78 69 73 74 20 69 6e 20 74 68 65 20 64 61 74  exist in the dat
5190: 61 62 61 73 65 2c 20 61 72 65 20 6e 6f 74 20 64  abase, are not d
51a0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  eleted..**.** Re
51b0: 74 75 72 6e 20 4c 53 4d 5f 4f 4b 20 69 66 20 73  turn LSM_OK if s
51c0: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
51d0: 20 4c 53 4d 20 65 72 72 6f 72 20 63 6f 64 65 20   LSM error code 
51e0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
51f0: 74 20 6c 73 6d 5f 64 65 6c 65 74 65 5f 72 61 6e  t lsm_delete_ran
5200: 67 65 28 6c 73 6d 5f 64 62 20 2a 2c 20 0a 20 20  ge(lsm_db *, .  
5210: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
5220: 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79 31 2c 20  ey1, int nKey1, 
5230: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
5240: 32 2c 20 69 6e 74 20 6e 4b 65 79 32 0a 29 3b 0a  2, int nKey2.);.
5250: 0a 2f 2a 0a 2a 2a 20 43 41 50 49 3a 20 45 78 70  ./*.** CAPI: Exp
5260: 6c 69 63 69 74 20 44 61 74 61 62 61 73 65 20 57  licit Database W
5270: 6f 72 6b 20 61 6e 64 20 43 68 65 63 6b 70 6f 69  ork and Checkpoi
5280: 6e 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nting.**.** This
5290: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
52a0: 6c 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  led by a thread 
52b0: 74 6f 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 64  to work on the d
52c0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
52d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 77 6f  e..*/.int lsm_wo
52e0: 72 6b 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  rk(lsm_db *pDb, 
52f0: 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74 20  int nMerge, int 
5300: 6e 4b 42 2c 20 69 6e 74 20 2a 70 6e 57 72 69 74  nKB, int *pnWrit
5310: 65 29 3b 0a 0a 69 6e 74 20 6c 73 6d 5f 66 6c 75  e);..int lsm_flu
5320: 73 68 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 3b  sh(lsm_db *pDb);
5330: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
5340: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68  to checkpoint th
5350: 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
5360: 73 65 20 73 6e 61 70 73 68 6f 74 2e 20 52 65 74  se snapshot. Ret
5370: 75 72 6e 20 61 6e 20 4c 53 4d 0a 2a 2a 20 65 72  urn an LSM.** er
5380: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
5390: 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 72 20 4c  rror occurs or L
53a0: 53 4d 5f 4f 4b 20 6f 74 68 65 72 77 69 73 65 2e  SM_OK otherwise.
53b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
53c0: 72 72 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68  rrent snapshot h
53d0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
53e0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 63 61  checkpointed, ca
53f0: 6c 6c 69 6e 67 20 74 68 69 73 20 0a 2a 2a 20 66  lling this .** f
5400: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
5410: 6f 70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  op. In this case
5420: 20 69 66 20 70 6e 4b 42 20 69 73 20 6e 6f 74 20   if pnKB is not 
5430: 4e 55 4c 4c 2c 20 2a 70 6e 4b 42 20 69 73 0a 2a  NULL, *pnKB is.*
5440: 2a 20 73 65 74 20 74 6f 20 30 2e 20 4f 72 2c 20  * set to 0. Or, 
5450: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  if the current s
5460: 6e 61 70 73 68 6f 74 20 69 73 20 73 75 63 63 65  napshot is succe
5470: 73 73 66 75 6c 6c 79 20 63 68 65 63 6b 70 6f 69  ssfully checkpoi
5480: 6e 74 65 64 0a 2a 2a 20 62 79 20 74 68 69 73 20  nted.** by this 
5490: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 62 4b  function and pbK
54a0: 42 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a  B is not NULL, *
54b0: 70 6e 4b 42 20 69 73 20 73 65 74 20 74 6f 20 74  pnKB is set to t
54c0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
54d0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  bytes written to
54e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
54f0: 6c 65 20 73 69 6e 63 65 20 74 68 65 20 70 72 65  le since the pre
5500: 76 69 6f 75 73 20 63 68 65 63 6b 70 6f 69 6e 74  vious checkpoint
5510: 0a 2a 2a 20 28 74 68 65 20 73 61 6d 65 20 6d 65  .** (the same me
5520: 61 73 75 72 65 20 61 73 20 72 65 74 75 72 6e 65  asure as returne
5530: 64 20 62 79 20 74 68 65 20 4c 53 4d 5f 49 4e 46  d by the LSM_INF
5540: 4f 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 53 49 5a  O_CHECKPOINT_SIZ
5550: 45 20 71 75 65 72 79 29 2e 0a 2a 2f 0a 69 6e 74  E query)..*/.int
5560: 20 6c 73 6d 5f 63 68 65 63 6b 70 6f 69 6e 74 28   lsm_checkpoint(
5570: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74  lsm_db *pDb, int
5580: 20 2a 70 6e 4b 42 29 3b 0a 0a 2f 2a 0a 2a 2a 20   *pnKB);../*.** 
5590: 43 41 50 49 3a 20 4f 70 65 6e 69 6e 67 20 61 6e  CAPI: Opening an
55a0: 64 20 43 6c 6f 73 69 6e 67 20 44 61 74 61 62 61  d Closing Databa
55b0: 73 65 20 43 75 72 73 6f 72 73 0a 2a 2a 0a 2a 2a  se Cursors.**.**
55c0: 20 4f 70 65 6e 20 61 6e 64 20 63 6c 6f 73 65 20   Open and close 
55d0: 61 20 64 61 74 61 62 61 73 65 20 63 75 72 73 6f  a database curso
55e0: 72 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 63 73  r..*/.int lsm_cs
55f0: 72 5f 6f 70 65 6e 28 6c 73 6d 5f 64 62 20 2a 70  r_open(lsm_db *p
5600: 44 62 2c 20 6c 73 6d 5f 63 75 72 73 6f 72 20 2a  Db, lsm_cursor *
5610: 2a 70 70 43 73 72 29 3b 0a 69 6e 74 20 6c 73 6d  *ppCsr);.int lsm
5620: 5f 63 73 72 5f 63 6c 6f 73 65 28 6c 73 6d 5f 63  _csr_close(lsm_c
5630: 75 72 73 6f 72 20 2a 70 43 73 72 29 3b 0a 0a 2f  ursor *pCsr);../
5640: 2a 20 0a 2a 2a 20 43 41 50 49 3a 20 50 6f 73 69  * .** CAPI: Posi
5650: 74 69 6f 6e 69 6e 67 20 44 61 74 61 62 61 73 65  tioning Database
5660: 20 43 75 72 73 6f 72 73 0a 2a 2a 0a 2a 2a 20 49   Cursors.**.** I
5670: 66 20 74 68 65 20 66 6f 75 72 74 68 20 70 61 72  f the fourth par
5680: 61 6d 65 74 65 72 20 69 73 20 4c 53 4d 5f 53 45  ameter is LSM_SE
5690: 45 4b 5f 45 51 2c 20 4c 53 4d 5f 53 45 45 4b 5f  EK_EQ, LSM_SEEK_
56a0: 47 45 20 6f 72 20 4c 53 4d 5f 53 45 45 4b 5f 4c  GE or LSM_SEEK_L
56b0: 45 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  E,.** this funct
56c0: 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
56d0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 61 6e   database for an
56e0: 20 65 6e 74 72 79 20 77 69 74 68 20 6b 65 79 20   entry with key 
56f0: 28 70 4b 65 79 2f 6e 4b 65 79 29 2e 20 0a 2a 2a  (pKey/nKey). .**
5700: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5710: 75 72 73 2c 20 61 6e 20 4c 53 4d 20 65 72 72 6f  urs, an LSM erro
5720: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
5730: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 4c  ed. Otherwise, L
5740: 53 4d 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  SM_OK..**.** If 
5750: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
5760: 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
5770: 64 20 6b 65 79 20 69 73 20 70 72 65 73 65 6e 74  d key is present
5780: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5790: 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
57a0: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
57b0: 20 74 6f 20 74 68 65 20 65 6e 74 72 79 20 77 69   to the entry wi
57c0: 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
57d0: 20 6b 65 79 2e 20 4f 72 2c 20 69 66 20 74 68 65   key. Or, if the
57e0: 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6b   .** specified k
57f0: 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ey is not presen
5800: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
5810: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
5820: 68 65 20 63 75 72 73 6f 72 20 0a 2a 2a 20 64 65  he cursor .** de
5830: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
5840: 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
5850: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
5860: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
5870: 0a 2a 2a 20 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a  .** LSM_SEEK_EQ:
5880: 0a 2a 2a 20 20 20 54 68 65 20 63 75 72 73 6f 72  .**   The cursor
5890: 20 69 73 20 6c 65 66 74 20 61 74 20 45 4f 46 20   is left at EOF 
58a0: 28 69 6e 76 61 6c 69 64 61 74 65 64 29 2e 20 41  (invalidated). A
58b0: 20 63 61 6c 6c 20 74 6f 20 6c 73 6d 5f 63 73 72   call to lsm_csr
58c0: 5f 76 61 6c 69 64 28 29 0a 2a 2a 20 20 20 72 65  _valid().**   re
58d0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  turns non-zero..
58e0: 2a 2a 0a 2a 2a 20 4c 53 4d 5f 53 45 45 4b 5f 4c  **.** LSM_SEEK_L
58f0: 45 3a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72 73  E:.**   The curs
5900: 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
5910: 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
5920: 73 74 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61  st key in the da
5930: 74 61 62 61 73 65 20 74 68 61 74 0a 2a 2a 20 20  tabase that.**  
5940: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5950: 20 28 70 4b 65 79 2f 6e 4b 65 79 29 2e 20 49 66   (pKey/nKey). If
5960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
5970: 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79 73 20 73  ntains no keys s
5980: 6d 61 6c 6c 65 72 0a 2a 2a 20 20 20 74 68 61 6e  maller.**   than
5990: 20 28 70 4b 65 79 2f 6e 4b 65 79 29 2c 20 74 68   (pKey/nKey), th
59a0: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
59b0: 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 4c   at EOF..**.** L
59c0: 53 4d 5f 53 45 45 4b 5f 47 45 3a 0a 2a 2a 20 20  SM_SEEK_GE:.**  
59d0: 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
59e0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
59f0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
5a00: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
5a10: 20 74 68 61 74 0a 2a 2a 20 20 20 69 73 20 6c 61   that.**   is la
5a20: 72 67 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2f  rger than (pKey/
5a30: 6e 4b 65 79 29 2e 20 49 66 20 74 68 65 20 64 61  nKey). If the da
5a40: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
5a50: 6e 6f 20 6b 65 79 73 20 6c 61 72 67 65 72 0a 2a  no keys larger.*
5a60: 2a 20 20 20 74 68 61 6e 20 28 70 4b 65 79 2f 6e  *   than (pKey/n
5a70: 4b 65 79 29 2c 20 74 68 65 20 63 75 72 73 6f 72  Key), the cursor
5a80: 20 69 73 20 6c 65 66 74 20 61 74 20 45 4f 46 2e   is left at EOF.
5a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
5aa0: 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
5ab0: 73 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45 46 41 53  s LSM_SEEK_LEFAS
5ac0: 54 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  T, this function
5ad0: 20 73 65 61 72 63 68 65 73 20 74 68 65 0a 2a 2a   searches the.**
5ae0: 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 20 73   database in a s
5af0: 69 6d 69 6c 61 72 20 6d 61 6e 6e 65 72 20 74 6f  imilar manner to
5b00: 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45 2c 20 77 69   LSM_SEEK_LE, wi
5b10: 74 68 20 74 77 6f 20 64 69 66 66 65 72 65 6e 63  th two differenc
5b20: 65 73 3a 0a 2a 2a 0a 2a 2a 20 3c 6f 6c 3e 3c 6c  es:.**.** <ol><l
5b30: 69 3e 45 76 65 6e 20 69 66 20 61 20 6b 65 79 20  i>Even if a key 
5b40: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 28 74 68  can be found (th
5b50: 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
5b60: 6c 65 66 74 20 61 74 20 45 4f 46 29 2c 20 74 68  left at EOF), th
5b70: 65 0a 2a 2a 20 6c 73 6d 5f 63 73 72 5f 76 61 6c  e.** lsm_csr_val
5b80: 75 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61  ue() function ma
5b90: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 28 61  y not be used (a
5ba0: 74 74 65 6d 70 74 73 20 74 6f 20 64 6f 20 73 6f  ttempts to do so
5bb0: 20 72 65 74 75 72 6e 0a 2a 2a 20 4c 53 4d 5f 4d   return.** LSM_M
5bc0: 49 53 55 53 45 29 2e 0a 2a 2a 0a 2a 2a 20 3c 6c  ISUSE)..**.** <l
5bd0: 69 3e 54 68 65 20 6b 65 79 20 74 68 61 74 20 74  i>The key that t
5be0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
5bf0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6d 61  t pointing to ma
5c00: 79 20 62 65 20 6f 6e 65 20 74 68 61 74 20 68 61  y be one that ha
5c10: 73 20 0a 2a 2a 20 62 65 65 6e 20 72 65 63 65 6e  s .** been recen
5c20: 74 6c 79 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  tly deleted from
5c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
5c40: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
5c50: 73 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20  s.** guaranteed 
5c60: 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
5c70: 64 20 6b 65 79 20 69 73 20 6c 61 72 67 65 72 20  d key is larger 
5c80: 74 68 61 6e 20 61 6e 79 20 6b 65 79 20 63 75 72  than any key cur
5c90: 72 65 6e 74 6c 79 20 0a 2a 2a 20 69 6e 20 74 68  rently .** in th
5ca0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
5cb0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5cc0: 65 71 75 61 6c 20 74 6f 20 28 70 4b 65 79 2f 6e  equal to (pKey/n
5cd0: 4b 65 79 29 2e 0a 2a 2a 20 3c 2f 6f 6c 3e 0a 2a  Key)..** </ol>.*
5ce0: 2a 0a 2a 2a 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45  *.** LSM_SEEK_LE
5cf0: 46 41 53 54 20 72 65 71 75 65 73 74 73 20 61 72  FAST requests ar
5d00: 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  e intended to be
5d10: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
5d20: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6b 65  e database.** ke
5d30: 79 73 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 63  ys..*/.int lsm_c
5d40: 73 72 5f 73 65 65 6b 28 6c 73 6d 5f 63 75 72 73  sr_seek(lsm_curs
5d50: 6f 72 20 2a 70 43 73 72 2c 20 63 6f 6e 73 74 20  or *pCsr, const 
5d60: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
5d70: 6e 4b 65 79 2c 20 69 6e 74 20 65 53 65 65 6b 29  nKey, int eSeek)
5d80: 3b 0a 0a 69 6e 74 20 6c 73 6d 5f 63 73 72 5f 66  ;..int lsm_csr_f
5d90: 69 72 73 74 28 6c 73 6d 5f 63 75 72 73 6f 72 20  irst(lsm_cursor 
5da0: 2a 70 43 73 72 29 3b 0a 69 6e 74 20 6c 73 6d 5f  *pCsr);.int lsm_
5db0: 63 73 72 5f 6c 61 73 74 28 6c 73 6d 5f 63 75 72  csr_last(lsm_cur
5dc0: 73 6f 72 20 2a 70 43 73 72 29 3b 0a 0a 2f 2a 0a  sor *pCsr);../*.
5dd0: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73  ** Advance the s
5de0: 70 65 63 69 66 69 65 64 20 63 75 72 73 6f 72 20  pecified cursor 
5df0: 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 72 20 70  to the next or p
5e00: 72 65 76 69 6f 75 73 20 6b 65 79 20 69 6e 20 74  revious key in t
5e10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
5e20: 52 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 20 69 66  Return LSM_OK if
5e30: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
5e40: 61 6e 20 4c 53 4d 20 65 72 72 6f 72 20 63 6f 64  an LSM error cod
5e50: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
5e60: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 6c 73 6d  ** Functions lsm
5e70: 5f 63 73 72 5f 73 65 65 6b 28 29 2c 20 6c 73 6d  _csr_seek(), lsm
5e80: 5f 63 73 72 5f 66 69 72 73 74 28 29 20 61 6e 64  _csr_first() and
5e90: 20 6c 73 6d 5f 63 73 72 5f 6c 61 73 74 28 29 20   lsm_csr_last() 
5ea0: 61 72 65 20 22 73 65 65 6b 22 0a 2a 2a 20 66 75  are "seek".** fu
5eb0: 6e 63 74 69 6f 6e 73 2e 20 57 68 65 74 68 65 72  nctions. Whether
5ec0: 20 6f 72 20 6e 6f 74 20 6c 73 6d 5f 63 73 72 5f   or not lsm_csr_
5ed0: 6e 65 78 74 20 61 6e 64 20 6c 73 6d 5f 63 73 72  next and lsm_csr
5ee0: 5f 70 72 65 76 20 6d 61 79 20 62 65 20 63 61 6c  _prev may be cal
5ef0: 6c 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  led.** successfu
5f00: 6c 6c 79 20 61 6c 73 6f 20 64 65 70 65 6e 64 73  lly also depends
5f10: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
5f20: 65 6e 74 20 73 65 65 6b 20 66 75 6e 63 74 69 6f  ent seek functio
5f30: 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 2a 2a 20 74  n called on.** t
5f40: 68 65 20 63 75 72 73 6f 72 2e 20 53 70 65 63 69  he cursor. Speci
5f50: 66 69 63 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20 3c  fically:.**.** <
5f60: 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 41 74 20 6c  ul>.** <li> At l
5f70: 65 61 73 74 20 6f 6e 65 20 73 65 65 6b 20 66 75  east one seek fu
5f80: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
5f90: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
5fa0: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 20 3c  the cursor..** <
5fb0: 6c 69 3e 20 54 6f 20 63 61 6c 6c 20 6c 73 6d 5f  li> To call lsm_
5fc0: 63 73 72 5f 6e 65 78 74 28 29 2c 20 74 68 65 20  csr_next(), the 
5fd0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
5fe0: 20 74 6f 20 61 20 73 65 65 6b 20 66 75 6e 63 74   to a seek funct
5ff0: 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65  ion must.** have
6000: 20 62 65 65 6e 20 65 69 74 68 65 72 20 6c 73 6d   been either lsm
6010: 5f 63 73 72 5f 66 69 72 73 74 28 29 20 6f 72 20  _csr_first() or 
6020: 61 20 63 61 6c 6c 20 74 6f 20 6c 73 6d 5f 63 73  a call to lsm_cs
6030: 72 5f 73 65 65 6b 28 29 20 73 70 65 63 69 66 79  r_seek() specify
6040: 69 6e 67 0a 2a 2a 20 4c 53 4d 5f 53 45 45 4b 5f  ing.** LSM_SEEK_
6050: 47 45 2e 0a 2a 2a 20 3c 6c 69 3e 20 54 6f 20 63  GE..** <li> To c
6060: 61 6c 6c 20 6c 73 6d 5f 63 73 72 5f 70 72 65 76  all lsm_csr_prev
6070: 28 29 2c 20 74 68 65 20 6d 6f 73 74 20 72 65 63  (), the most rec
6080: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 61 20 73 65  ent call to a se
6090: 65 6b 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ek function must
60a0: 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 65 69  .** have been ei
60b0: 74 68 65 72 20 6c 73 6d 5f 63 73 72 5f 6c 61 73  ther lsm_csr_las
60c0: 74 28 29 20 6f 72 20 61 20 63 61 6c 6c 20 74 6f  t() or a call to
60d0: 20 6c 73 6d 5f 63 73 72 5f 73 65 65 6b 28 29 20   lsm_csr_seek() 
60e0: 73 70 65 63 69 66 79 69 6e 67 0a 2a 2a 20 4c 53  specifying.** LS
60f0: 4d 5f 53 45 45 4b 5f 4c 45 2e 0a 2a 2a 20 3c 2f  M_SEEK_LE..** </
6100: 75 6c 3e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ul>.**.** Otherw
6110: 69 73 65 2c 20 69 66 20 74 68 65 20 61 62 6f 76  ise, if the abov
6120: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65  e conditions are
6130: 20 6e 6f 74 20 6d 65 74 20 77 68 65 6e 20 6c 73   not met when ls
6140: 6d 5f 63 73 72 5f 6e 65 78 74 20 6f 72 20 0a 2a  m_csr_next or .*
6150: 2a 20 6c 73 6d 5f 63 73 72 5f 70 72 65 76 20 69  * lsm_csr_prev i
6160: 73 20 63 61 6c 6c 65 64 2c 20 4c 53 4d 5f 4d 49  s called, LSM_MI
6170: 53 55 53 45 20 69 73 20 72 65 74 75 72 6e 65 64  SUSE is returned
6180: 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
6190: 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 72 65 6d 61  position.** rema
61a0: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ins unchanged..*
61b0: 2f 0a 69 6e 74 20 6c 73 6d 5f 63 73 72 5f 6e 65  /.int lsm_csr_ne
61c0: 78 74 28 6c 73 6d 5f 63 75 72 73 6f 72 20 2a 70  xt(lsm_cursor *p
61d0: 43 73 72 29 3b 0a 69 6e 74 20 6c 73 6d 5f 63 73  Csr);.int lsm_cs
61e0: 72 5f 70 72 65 76 28 6c 73 6d 5f 63 75 72 73 6f  r_prev(lsm_curso
61f0: 72 20 2a 70 43 73 72 29 3b 0a 0a 2f 2a 0a 2a 2a  r *pCsr);../*.**
6200: 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79   Values that may
6210: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
6220: 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
6230: 74 20 74 6f 20 6c 73 6d 5f 63 73 72 5f 73 65 65  t to lsm_csr_see
6240: 6b 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  k()..*/.#define 
6250: 4c 53 4d 5f 53 45 45 4b 5f 4c 45 46 41 53 54 20  LSM_SEEK_LEFAST 
6260: 20 20 2d 32 0a 23 64 65 66 69 6e 65 20 4c 53 4d    -2.#define LSM
6270: 5f 53 45 45 4b 5f 4c 45 20 20 20 20 20 20 20 2d  _SEEK_LE       -
6280: 31 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 53 45  1.#define LSM_SE
6290: 45 4b 5f 45 51 20 20 20 20 20 20 20 20 30 0a 23  EK_EQ        0.#
62a0: 64 65 66 69 6e 65 20 4c 53 4d 5f 53 45 45 4b 5f  define LSM_SEEK_
62b0: 47 45 20 20 20 20 20 20 20 20 31 0a 0a 2f 2a 20  GE        1../* 
62c0: 0a 2a 2a 20 43 41 50 49 3a 20 45 78 74 72 61 63  .** CAPI: Extrac
62d0: 74 69 6e 67 20 44 61 74 61 20 46 72 6f 6d 20 44  ting Data From D
62e0: 61 74 61 62 61 73 65 20 43 75 72 73 6f 72 73 0a  atabase Cursors.
62f0: 2a 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 64  **.** Retrieve d
6300: 61 74 61 20 66 72 6f 6d 20 61 20 64 61 74 61 62  ata from a datab
6310: 61 73 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69  ase cursor..*/.i
6320: 6e 74 20 6c 73 6d 5f 63 73 72 5f 76 61 6c 69 64  nt lsm_csr_valid
6330: 28 6c 73 6d 5f 63 75 72 73 6f 72 20 2a 70 43 73  (lsm_cursor *pCs
6340: 72 29 3b 0a 69 6e 74 20 6c 73 6d 5f 63 73 72 5f  r);.int lsm_csr_
6350: 6b 65 79 28 6c 73 6d 5f 63 75 72 73 6f 72 20 2a  key(lsm_cursor *
6360: 70 43 73 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64  pCsr, const void
6370: 20 2a 2a 70 70 4b 65 79 2c 20 69 6e 74 20 2a 70   **ppKey, int *p
6380: 6e 4b 65 79 29 3b 0a 69 6e 74 20 6c 73 6d 5f 63  nKey);.int lsm_c
6390: 73 72 5f 76 61 6c 75 65 28 6c 73 6d 5f 63 75 72  sr_value(lsm_cur
63a0: 73 6f 72 20 2a 70 43 73 72 2c 20 63 6f 6e 73 74  sor *pCsr, const
63b0: 20 76 6f 69 64 20 2a 2a 70 70 56 61 6c 2c 20 69   void **ppVal, i
63c0: 6e 74 20 2a 70 6e 56 61 6c 29 3b 0a 0a 2f 2a 0a  nt *pnVal);../*.
63d0: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
63e0: 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63  ccurs, this func
63f0: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
6400: 65 20 64 61 74 61 62 61 73 65 20 6b 65 79 20 70  e database key p
6410: 61 73 73 65 64 20 76 69 61 0a 2a 2a 20 74 68 65  assed via.** the
6420: 20 70 4b 65 79 2f 6e 4b 65 79 20 61 72 67 75 6d   pKey/nKey argum
6430: 65 6e 74 73 20 77 69 74 68 20 74 68 65 20 6b 65  ents with the ke
6440: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
6450: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
6460: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
6470: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
6480: 74 73 20 74 6f 2e 20 49 66 20 74 68 65 20 63 75  ts to. If the cu
6490: 72 73 6f 72 73 20 6b 65 79 20 69 73 20 6c 65 73  rsors key is les
64a0: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
64b0: 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
64c0: 68 61 6e 20 70 4b 65 79 2f 6e 4b 65 79 2c 20 2a  han pKey/nKey, *
64d0: 70 69 52 65 73 20 69 73 20 73 65 74 20 74 6f 20  piRes is set to 
64e0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
64f0: 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 0a 2a   to or greater.*
6500: 2a 20 74 68 61 6e 20 7a 65 72 6f 20 62 65 66 6f  * than zero befo
6510: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4c 53  re returning. LS
6520: 4d 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  M_OK is returned
6530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
6540: 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65  *.** Or, if an e
6550: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
6560: 4c 53 4d 20 65 72 72 6f 72 20 63 6f 64 65 20 69  LSM error code i
6570: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
6580: 68 65 20 66 69 6e 61 6c 20 0a 2a 2a 20 76 61 6c  he final .** val
6590: 75 65 20 6f 66 20 2a 70 69 52 65 73 20 69 73 20  ue of *piRes is 
65a0: 75 6e 64 65 66 69 6e 65 64 2e 20 49 66 20 74 68  undefined. If th
65b0: 65 20 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f  e cursor does no
65c0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c  t point to a val
65d0: 69 64 0a 2a 2a 20 6b 65 79 20 77 68 65 6e 20 74  id.** key when t
65e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
65f0: 63 61 6c 6c 65 64 2c 20 4c 53 4d 5f 4d 49 53 55  called, LSM_MISU
6600: 53 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SE is returned..
6610: 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 63 73 72 5f 63  */.int lsm_csr_c
6620: 6d 70 28 6c 73 6d 5f 63 75 72 73 6f 72 20 2a 70  mp(lsm_cursor *p
6630: 43 73 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Csr, const void 
6640: 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c  *pKey, int nKey,
6650: 20 69 6e 74 20 2a 70 69 52 65 73 29 3b 0a 0a 2f   int *piRes);../
6660: 2a 0a 2a 2a 20 43 41 50 49 3a 20 43 68 61 6e 67  *.** CAPI: Chang
6670: 65 20 74 68 65 73 65 21 21 0a 2a 2a 0a 2a 2a 20  e these!!.**.** 
6680: 43 6f 6e 66 69 67 75 72 65 20 61 20 63 61 6c 6c  Configure a call
6690: 62 61 63 6b 20 74 6f 20 77 68 69 63 68 20 64 65  back to which de
66a0: 62 75 67 67 69 6e 67 20 61 6e 64 20 6f 74 68 65  bugging and othe
66b0: 72 20 6d 65 73 73 61 67 65 73 20 73 68 6f 75 6c  r messages shoul
66c0: 64 20 0a 2a 2a 20 62 65 20 64 69 72 65 63 74 65  d .** be directe
66d0: 64 2e 20 4f 6e 6c 79 20 75 73 65 66 75 6c 20 66  d. Only useful f
66e0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6c 73 6d  or debugging lsm
66f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 73 6d 5f 63 6f  ..*/.void lsm_co
6700: 6e 66 69 67 5f 6c 6f 67 28 6c 73 6d 5f 64 62 20  nfig_log(lsm_db 
6710: 2a 2c 20 76 6f 69 64 20 28 2a 29 28 76 6f 69 64  *, void (*)(void
6720: 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63   *, int, const c
6730: 68 61 72 20 2a 29 2c 20 76 6f 69 64 20 2a 29 3b  har *), void *);
6740: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
6750: 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  e a callback tha
6760: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  t is invoked if 
6770: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6780: 6e 65 63 74 69 6f 6e 20 65 76 65 72 0a 2a 2a 20  nection ever.** 
6790: 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  writes to the da
67a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
67b0: 76 6f 69 64 20 6c 73 6d 5f 63 6f 6e 66 69 67 5f  void lsm_config_
67c0: 77 6f 72 6b 5f 68 6f 6f 6b 28 6c 73 6d 5f 64 62  work_hook(lsm_db
67d0: 20 2a 2c 20 76 6f 69 64 20 28 2a 29 28 6c 73 6d   *, void (*)(lsm
67e0: 5f 64 62 20 2a 2c 20 76 6f 69 64 20 2a 29 2c 20  _db *, void *), 
67f0: 76 6f 69 64 20 2a 29 3b 0a 0a 2f 2a 20 45 4e 44  void *);../* END
6800: 4f 46 41 50 49 20 2a 2f 0a 23 69 66 64 65 66 20  OFAPI */.#ifdef 
6810: 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 20 20 2f  __cplusplus.}  /
6820: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 27 65 78  * End of the 'ex
6830: 74 65 72 6e 20 22 43 22 27 20 62 6c 6f 63 6b 20  tern "C"' block 
6840: 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  */.#endif.#endif
6850: 20 2f 2a 20 69 66 6e 64 65 66 20 5f 4c 53 4d 5f   /* ifndef _LSM_
6860: 48 20 2a 2f 0a                                   H */.