/ Hex Artifact Content
Login

Artifact 5983690e05e83653cc01ba9d8fbf8455e534ddf8349ed9adedbf46a7549760b0:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 38 2d 31 38  /*.** 2011-08-18
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 20 49 6e 74 65 72 6e 61 6c 20 73 74 72 75  ** Internal stru
0180: 63 74 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e  cture definition
0190: 73 20 66 6f 72 20 74 68 65 20 4c 53 4d 20 6d 6f  s for the LSM mo
01a0: 64 75 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  dule..*/.#ifndef
01b0: 20 5f 4c 53 4d 5f 49 4e 54 5f 48 0a 23 64 65 66   _LSM_INT_H.#def
01c0: 69 6e 65 20 5f 4c 53 4d 5f 49 4e 54 5f 48 0a 0a  ine _LSM_INT_H..
01d0: 23 69 6e 63 6c 75 64 65 20 22 6c 73 6d 2e 68 22  #include "lsm.h"
01e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
01f0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0200: 74 72 69 6e 67 2e 68 3e 0a 0a 23 69 6e 63 6c 75  tring.h>..#inclu
0210: 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69  de <stdarg.h>.#i
0220: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0230: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  >.#include <stdi
0240: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  o.h>.#include <c
0250: 74 79 70 65 2e 68 3e 0a 0a 23 69 66 64 65 66 20  type.h>..#ifdef 
0260: 5f 57 49 4e 33 32 0a 23 20 69 66 64 65 66 20 5f  _WIN32.# ifdef _
0270: 4d 53 43 5f 56 45 52 0a 23 20 20 64 65 66 69 6e  MSC_VER.#  defin
0280: 65 20 73 6e 70 72 69 6e 74 66 20 5f 73 6e 70 72  e snprintf _snpr
0290: 69 6e 74 66 0a 23 20 65 6e 64 69 66 0a 23 65 6c  intf.# endif.#el
02a0: 73 65 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  se.# include <un
02b0: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  istd.h>.#endif..
02c0: 23 69 66 64 65 66 20 4e 44 45 42 55 47 0a 23 20  #ifdef NDEBUG.# 
02d0: 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 5f  ifdef LSM_DEBUG_
02e0: 45 58 50 45 4e 53 49 56 45 0a 23 20 20 75 6e 64  EXPENSIVE.#  und
02f0: 65 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50  ef LSM_DEBUG_EXP
0300: 45 4e 53 49 56 45 0a 23 20 65 6e 64 69 66 0a 23  ENSIVE.# endif.#
0310: 20 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47   ifdef LSM_DEBUG
0320: 0a 23 20 20 75 6e 64 65 66 20 4c 53 4d 5f 44 45  .#  undef LSM_DE
0330: 42 55 47 0a 23 20 65 6e 64 69 66 0a 23 65 6c 73  BUG.# endif.#els
0340: 65 0a 23 20 69 66 6e 64 65 66 20 4c 53 4d 5f 44  e.# ifndef LSM_D
0350: 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20 4c  EBUG.#  define L
0360: 53 4d 5f 44 45 42 55 47 0a 23 20 65 6e 64 69 66  SM_DEBUG.# endif
0370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
0380: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f  efault values fo
0390: 72 20 76 61 72 69 6f 75 73 20 64 61 74 61 20 73  r various data s
03a0: 74 72 75 63 74 75 72 65 20 70 61 72 61 6d 65 74  tructure paramet
03b0: 65 72 73 2e 20 54 68 65 73 65 20 6d 61 79 20 62  ers. These may b
03c0: 65 0a 2a 2a 20 6f 76 65 72 72 69 64 64 65 6e 20  e.** overridden 
03d0: 62 79 20 63 61 6c 6c 73 20 74 6f 20 6c 73 6d 5f  by calls to lsm_
03e0: 63 6f 6e 66 69 67 28 29 2e 0a 2a 2f 0a 23 64 65  config()..*/.#de
03f0: 66 69 6e 65 20 4c 53 4d 5f 44 46 4c 54 5f 50 41  fine LSM_DFLT_PA
0400: 47 45 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20  GE_SIZE         
0410: 20 28 34 20 2a 20 31 30 32 34 29 0a 23 64 65 66   (4 * 1024).#def
0420: 69 6e 65 20 4c 53 4d 5f 44 46 4c 54 5f 42 4c 4f  ine LSM_DFLT_BLO
0430: 43 4b 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20  CK_SIZE         
0440: 28 31 20 2a 20 31 30 32 34 20 2a 20 31 30 32 34  (1 * 1024 * 1024
0450: 29 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 44 46  ).#define LSM_DF
0460: 4c 54 5f 41 55 54 4f 46 4c 55 53 48 20 20 20 20  LT_AUTOFLUSH    
0470: 20 20 20 20 20 20 28 31 20 2a 20 31 30 32 34 20        (1 * 1024 
0480: 2a 20 31 30 32 34 29 0a 23 64 65 66 69 6e 65 20  * 1024).#define 
0490: 4c 53 4d 5f 44 46 4c 54 5f 41 55 54 4f 43 48 45  LSM_DFLT_AUTOCHE
04a0: 43 4b 50 4f 49 4e 54 20 20 20 20 20 28 69 36 34  CKPOINT     (i64
04b0: 29 28 32 20 2a 20 31 30 32 34 20 2a 20 31 30 32  )(2 * 1024 * 102
04c0: 34 29 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 44  4).#define LSM_D
04d0: 46 4c 54 5f 41 55 54 4f 57 4f 52 4b 20 20 20 20  FLT_AUTOWORK    
04e0: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
04f0: 20 4c 53 4d 5f 44 46 4c 54 5f 4c 4f 47 5f 53 49   LSM_DFLT_LOG_SI
0500: 5a 45 20 20 20 20 20 20 20 20 20 20 20 28 31 32  ZE           (12
0510: 38 2a 31 30 32 34 29 0a 23 64 65 66 69 6e 65 20  8*1024).#define 
0520: 4c 53 4d 5f 44 46 4c 54 5f 41 55 54 4f 4d 45 52  LSM_DFLT_AUTOMER
0530: 47 45 20 20 20 20 20 20 20 20 20 20 34 0a 23 64  GE          4.#d
0540: 65 66 69 6e 65 20 4c 53 4d 5f 44 46 4c 54 5f 53  efine LSM_DFLT_S
0550: 41 46 45 54 59 20 20 20 20 20 20 20 20 20 20 20  AFETY           
0560: 20 20 4c 53 4d 5f 53 41 46 45 54 59 5f 4e 4f 52    LSM_SAFETY_NOR
0570: 4d 41 4c 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  MAL.#define LSM_
0580: 44 46 4c 54 5f 4d 4d 41 50 20 20 20 20 20 20 20  DFLT_MMAP       
0590: 20 20 20 20 20 20 20 20 28 4c 53 4d 5f 49 53 5f          (LSM_IS_
05a0: 36 34 5f 42 49 54 20 3f 20 31 20 3a 20 33 32 37  64_BIT ? 1 : 327
05b0: 36 38 29 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  68).#define LSM_
05c0: 44 46 4c 54 5f 4d 55 4c 54 49 50 4c 45 5f 50 52  DFLT_MULTIPLE_PR
05d0: 4f 43 45 53 53 45 53 20 31 0a 23 64 65 66 69 6e  OCESSES 1.#defin
05e0: 65 20 4c 53 4d 5f 44 46 4c 54 5f 55 53 45 5f 4c  e LSM_DFLT_USE_L
05f0: 4f 47 20 20 20 20 20 20 20 20 20 20 20 20 31 0a  OG            1.
0600: 0a 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75  ./* Initial valu
0610: 65 73 20 66 6f 72 20 6c 6f 67 20 66 69 6c 65 20  es for log file 
0620: 63 68 65 63 6b 73 75 6d 73 2e 20 54 68 65 73 65  checksums. These
0630: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69   are only used i
0640: 66 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  f the .** databa
0650: 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  se file does not
0660: 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 69 64   contain a valid
0670: 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20 2a 2f   checkpoint.  */
0680: 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 43 4b 53  .#define LSM_CKS
0690: 55 4d 30 5f 49 4e 49 54 20 34 32 0a 23 64 65 66  UM0_INIT 42.#def
06a0: 69 6e 65 20 4c 53 4d 5f 43 4b 53 55 4d 31 5f 49  ine LSM_CKSUM1_I
06b0: 4e 49 54 20 34 32 0a 0a 2f 2a 20 22 6d 6d 61 70  NIT 42../* "mmap
06c0: 22 20 6d 6f 64 65 20 69 73 20 63 75 72 72 65 6e  " mode is curren
06d0: 74 6c 79 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e  tly only used in
06e0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 73 20 77 69   environments wi
06f0: 74 68 20 36 34 2d 62 69 74 20 61 64 64 72 65 73  th 64-bit addres
0700: 73 20 0a 2a 2a 20 73 70 61 63 65 73 2e 20 54 68  s .** spaces. Th
0710: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
0720: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  o is used to tes
0730: 74 20 66 6f 72 20 74 68 69 73 2e 20 20 2a 2f 0a  t for this.  */.
0740: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49 53 5f 36  #define LSM_IS_6
0750: 34 5f 42 49 54 20 28 73 69 7a 65 6f 66 28 76 6f  4_BIT (sizeof(vo
0760: 69 64 2a 29 3d 3d 38 29 0a 0a 23 64 65 66 69 6e  id*)==8)..#defin
0770: 65 20 4c 53 4d 5f 41 55 54 4f 57 4f 52 4b 5f 51  e LSM_AUTOWORK_Q
0780: 55 41 4e 54 20 33 32 0a 0a 74 79 70 65 64 65 66  UANT 32..typedef
0790: 20 73 74 72 75 63 74 20 44 61 74 61 62 61 73 65   struct Database
07a0: 20 44 61 74 61 62 61 73 65 3b 0a 74 79 70 65 64   Database;.typed
07b0: 65 66 20 73 74 72 75 63 74 20 44 62 4c 6f 67 20  ef struct DbLog 
07c0: 44 62 4c 6f 67 3b 0a 74 79 70 65 64 65 66 20 73  DbLog;.typedef s
07d0: 74 72 75 63 74 20 46 69 6c 65 53 79 73 74 65 6d  truct FileSystem
07e0: 20 46 69 6c 65 53 79 73 74 65 6d 3b 0a 74 79 70   FileSystem;.typ
07f0: 65 64 65 66 20 73 74 72 75 63 74 20 46 72 65 65  edef struct Free
0800: 6c 69 73 74 20 46 72 65 65 6c 69 73 74 3b 0a 74  list Freelist;.t
0810: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 72  ypedef struct Fr
0820: 65 65 6c 69 73 74 45 6e 74 72 79 20 46 72 65 65  eelistEntry Free
0830: 6c 69 73 74 45 6e 74 72 79 3b 0a 74 79 70 65 64  listEntry;.typed
0840: 65 66 20 73 74 72 75 63 74 20 4c 65 76 65 6c 20  ef struct Level 
0850: 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73  Level;.typedef s
0860: 74 72 75 63 74 20 4c 6f 67 4d 61 72 6b 20 4c 6f  truct LogMark Lo
0870: 67 4d 61 72 6b 3b 0a 74 79 70 65 64 65 66 20 73  gMark;.typedef s
0880: 74 72 75 63 74 20 4c 6f 67 52 65 67 69 6f 6e 20  truct LogRegion 
0890: 4c 6f 67 52 65 67 69 6f 6e 3b 0a 74 79 70 65 64  LogRegion;.typed
08a0: 65 66 20 73 74 72 75 63 74 20 4c 6f 67 57 72 69  ef struct LogWri
08b0: 74 65 72 20 4c 6f 67 57 72 69 74 65 72 3b 0a 74  ter LogWriter;.t
08c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4c 73  ypedef struct Ls
08d0: 6d 53 74 72 69 6e 67 20 4c 73 6d 53 74 72 69 6e  mString LsmStrin
08e0: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
08f0: 74 20 4d 65 6d 70 6f 6f 6c 20 4d 65 6d 70 6f 6f  t Mempool Mempoo
0900: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
0910: 74 20 4d 65 72 67 65 20 4d 65 72 67 65 3b 0a 74  t Merge Merge;.t
0920: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65  ypedef struct Me
0930: 72 67 65 49 6e 70 75 74 20 4d 65 72 67 65 49 6e  rgeInput MergeIn
0940: 70 75 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72  put;.typedef str
0950: 75 63 74 20 4d 65 74 61 50 61 67 65 20 4d 65 74  uct MetaPage Met
0960: 61 50 61 67 65 3b 0a 74 79 70 65 64 65 66 20 73  aPage;.typedef s
0970: 74 72 75 63 74 20 4d 75 6c 74 69 43 75 72 73 6f  truct MultiCurso
0980: 72 20 4d 75 6c 74 69 43 75 72 73 6f 72 3b 0a 74  r MultiCursor;.t
0990: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
09a0: 67 65 20 50 61 67 65 3b 0a 74 79 70 65 64 65 66  ge Page;.typedef
09b0: 20 73 74 72 75 63 74 20 52 65 64 69 72 65 63 74   struct Redirect
09c0: 20 52 65 64 69 72 65 63 74 3b 0a 74 79 70 65 64   Redirect;.typed
09d0: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
09e0: 74 20 53 65 67 6d 65 6e 74 3b 0a 74 79 70 65 64  t Segment;.typed
09f0: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0a00: 74 4d 65 72 67 65 72 20 53 65 67 6d 65 6e 74 4d  tMerger SegmentM
0a10: 65 72 67 65 72 3b 0a 74 79 70 65 64 65 66 20 73  erger;.typedef s
0a20: 74 72 75 63 74 20 53 68 6d 43 68 75 6e 6b 20 53  truct ShmChunk S
0a30: 68 6d 43 68 75 6e 6b 3b 0a 74 79 70 65 64 65 66  hmChunk;.typedef
0a40: 20 73 74 72 75 63 74 20 53 68 6d 48 65 61 64 65   struct ShmHeade
0a50: 72 20 53 68 6d 48 65 61 64 65 72 3b 0a 74 79 70  r ShmHeader;.typ
0a60: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 6d 52  edef struct ShmR
0a70: 65 61 64 65 72 20 53 68 6d 52 65 61 64 65 72 3b  eader ShmReader;
0a80: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0a90: 53 6e 61 70 73 68 6f 74 20 53 6e 61 70 73 68 6f  Snapshot Snapsho
0aa0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0ab0: 74 20 54 72 61 6e 73 4d 61 72 6b 20 54 72 61 6e  t TransMark Tran
0ac0: 73 4d 61 72 6b 3b 0a 74 79 70 65 64 65 66 20 73  sMark;.typedef s
0ad0: 74 72 75 63 74 20 54 72 65 65 20 54 72 65 65 3b  truct Tree Tree;
0ae0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0af0: 54 72 65 65 43 75 72 73 6f 72 20 54 72 65 65 43  TreeCursor TreeC
0b00: 75 72 73 6f 72 3b 0a 74 79 70 65 64 65 66 20 73  ursor;.typedef s
0b10: 74 72 75 63 74 20 54 72 65 65 48 65 61 64 65 72  truct TreeHeader
0b20: 20 54 72 65 65 48 65 61 64 65 72 3b 0a 74 79 70   TreeHeader;.typ
0b30: 65 64 65 66 20 73 74 72 75 63 74 20 54 72 65 65  edef struct Tree
0b40: 4d 61 72 6b 20 54 72 65 65 4d 61 72 6b 3b 0a 74  Mark TreeMark;.t
0b50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 72  ypedef struct Tr
0b60: 65 65 52 6f 6f 74 20 54 72 65 65 52 6f 6f 74 3b  eeRoot TreeRoot;
0b70: 0a 0a 23 69 66 6e 64 65 66 20 5f 53 51 4c 49 54  ..#ifndef _SQLIT
0b80: 45 49 4e 54 5f 48 5f 0a 74 79 70 65 64 65 66 20  EINT_H_.typedef 
0b90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38  unsigned char u8
0ba0: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0bb0: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 75 31 36  ed short int u16
0bc0: 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ;.typedef unsign
0bd0: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
0be0: 64 65 66 20 6c 73 6d 5f 69 36 34 20 69 36 34 3b  def lsm_i64 i64;
0bf0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
0c00: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20  d long long int 
0c10: 75 36 34 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  u64;.#endif../* 
0c20: 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  A page number is
0c30: 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
0c40: 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 69 36  r. */.typedef i6
0c50: 34 20 4c 73 6d 50 67 6e 6f 3b 0a 0a 23 69 66 64  4 LsmPgno;..#ifd
0c60: 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 69 6e 74  ef LSM_DEBUG.int
0c70: 20 6c 73 6d 45 72 72 6f 72 42 6b 70 74 28 69 6e   lsmErrorBkpt(in
0c80: 74 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  t);.#else.# defi
0c90: 6e 65 20 6c 73 6d 45 72 72 6f 72 42 6b 70 74 28  ne lsmErrorBkpt(
0ca0: 78 29 20 28 78 29 0a 23 65 6e 64 69 66 0a 0a 23  x) (x).#endif..#
0cb0: 64 65 66 69 6e 65 20 4c 53 4d 5f 50 52 4f 54 4f  define LSM_PROTO
0cc0: 43 4f 4c 5f 42 4b 50 54 20 6c 73 6d 45 72 72 6f  COL_BKPT lsmErro
0cd0: 72 42 6b 70 74 28 4c 53 4d 5f 50 52 4f 54 4f 43  rBkpt(LSM_PROTOC
0ce0: 4f 4c 29 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  OL).#define LSM_
0cf0: 49 4f 45 52 52 5f 42 4b 50 54 20 20 20 20 6c 73  IOERR_BKPT    ls
0d00: 6d 45 72 72 6f 72 42 6b 70 74 28 4c 53 4d 5f 49  mErrorBkpt(LSM_I
0d10: 4f 45 52 52 29 0a 23 64 65 66 69 6e 65 20 4c 53  OERR).#define LS
0d20: 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 20 20 20  M_NOMEM_BKPT    
0d30: 6c 73 6d 45 72 72 6f 72 42 6b 70 74 28 4c 53 4d  lsmErrorBkpt(LSM
0d40: 5f 4e 4f 4d 45 4d 29 0a 23 64 65 66 69 6e 65 20  _NOMEM).#define 
0d50: 4c 53 4d 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  LSM_CORRUPT_BKPT
0d60: 20 20 6c 73 6d 45 72 72 6f 72 42 6b 70 74 28 4c    lsmErrorBkpt(L
0d70: 53 4d 5f 43 4f 52 52 55 50 54 29 0a 23 64 65 66  SM_CORRUPT).#def
0d80: 69 6e 65 20 4c 53 4d 5f 4d 49 53 55 53 45 5f 42  ine LSM_MISUSE_B
0d90: 4b 50 54 20 20 20 6c 73 6d 45 72 72 6f 72 42 6b  KPT   lsmErrorBk
0da0: 70 74 28 4c 53 4d 5f 4d 49 53 55 53 45 29 0a 0a  pt(LSM_MISUSE)..
0db0: 23 64 65 66 69 6e 65 20 75 6e 75 73 65 64 5f 70  #define unused_p
0dc0: 61 72 61 6d 65 74 65 72 28 78 29 20 28 76 6f 69  arameter(x) (voi
0dd0: 64 29 28 78 29 0a 23 64 65 66 69 6e 65 20 61 72  d)(x).#define ar
0de0: 72 61 79 5f 73 69 7a 65 28 78 29 20 28 73 69 7a  ray_size(x) (siz
0df0: 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b  eof(x)/sizeof(x[
0e00: 30 5d 29 29 0a 0a 0a 2f 2a 20 54 68 65 20 73 69  0])).../* The si
0e10: 7a 65 20 6f 66 20 65 61 63 68 20 73 68 61 72 65  ze of each share
0e20: 64 2d 6d 65 6d 6f 72 79 20 63 68 75 6e 6b 20 2a  d-memory chunk *
0e30: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 53 48  /.#define LSM_SH
0e40: 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 28 33 32  M_CHUNK_SIZE (32
0e50: 2a 31 30 32 34 29 0a 0a 2f 2a 20 54 68 65 20 6e  *1024)../* The n
0e60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
0e70: 65 73 65 72 76 65 64 20 61 74 20 74 68 65 20 73  eserved at the s
0e80: 74 61 72 74 20 6f 66 20 65 61 63 68 20 73 68 6d  tart of each shm
0e90: 20 63 68 75 6e 6b 20 66 6f 72 20 4d 4d 2e 20 2a   chunk for MM. *
0ea0: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 53 48  /.#define LSM_SH
0eb0: 4d 5f 43 48 55 4e 4b 5f 48 44 52 20 20 28 73 69  M_CHUNK_HDR  (si
0ec0: 7a 65 6f 66 28 53 68 6d 43 68 75 6e 6b 29 29 0a  zeof(ShmChunk)).
0ed0: 0a 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ./* The number o
0ee0: 66 20 61 76 61 69 6c 61 62 6c 65 20 72 65 61 64  f available read
0ef0: 20 6c 6f 63 6b 73 2e 20 2a 2f 0a 23 64 65 66 69   locks. */.#defi
0f00: 6e 65 20 4c 53 4d 5f 4c 4f 43 4b 5f 4e 52 45 41  ne LSM_LOCK_NREA
0f10: 44 45 52 20 20 20 36 0a 0a 2f 2a 20 54 68 65 20  DER   6../* The 
0f20: 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
0f30: 62 6c 65 20 72 65 61 64 2d 77 72 69 74 65 20 63  ble read-write c
0f40: 6c 69 65 6e 74 20 6c 6f 63 6b 73 2e 20 2a 2f 0a  lient locks. */.
0f50: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
0f60: 5f 4e 52 57 43 4c 49 45 4e 54 20 20 20 31 36 0a  _NRWCLIENT   16.
0f70: 0a 2f 2a 20 4c 6f 63 6b 20 64 65 66 69 6e 69 74  ./* Lock definit
0f80: 69 6f 6e 73 2e 20 0a 2a 2f 0a 23 64 65 66 69 6e  ions. .*/.#defin
0f90: 65 20 4c 53 4d 5f 4c 4f 43 4b 5f 44 4d 53 31 20  e LSM_LOCK_DMS1 
0fa0: 20 20 20 20 20 20 20 20 31 20 20 20 2f 2a 20 53          1   /* S
0fb0: 65 72 69 61 6c 69 7a 65 20 63 6f 6e 6e 65 63 74  erialize connect
0fc0: 2f 64 69 73 63 6f 6e 6e 65 63 74 20 6f 70 73 20  /disconnect ops 
0fd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c  */.#define LSM_L
0fe0: 4f 43 4b 5f 44 4d 53 32 20 20 20 20 20 20 20 20  OCK_DMS2        
0ff0: 20 32 20 20 20 2f 2a 20 52 65 61 64 2d 77 72 69   2   /* Read-wri
1000: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  te connections *
1010: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f  /.#define LSM_LO
1020: 43 4b 5f 44 4d 53 33 20 20 20 20 20 20 20 20 20  CK_DMS3         
1030: 33 20 20 20 2f 2a 20 52 65 61 64 2d 6f 6e 6c 79  3   /* Read-only
1040: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1050: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
1060: 5f 57 52 49 54 45 52 20 20 20 20 20 20 20 34 0a  _WRITER       4.
1070: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
1080: 5f 57 4f 52 4b 45 52 20 20 20 20 20 20 20 35 0a  _WORKER       5.
1090: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
10a0: 5f 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 36 0a  _CHECKPOINTER 6.
10b0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
10c0: 5f 52 4f 54 52 41 4e 53 20 20 20 20 20 20 37 0a  _ROTRANS      7.
10d0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b  #define LSM_LOCK
10e0: 5f 52 45 41 44 45 52 28 69 29 20 20 20 20 28 28  _READER(i)    ((
10f0: 69 29 20 2b 20 4c 53 4d 5f 4c 4f 43 4b 5f 52 4f  i) + LSM_LOCK_RO
1100: 54 52 41 4e 53 20 2b 20 31 29 0a 23 64 65 66 69  TRANS + 1).#defi
1110: 6e 65 20 4c 53 4d 5f 4c 4f 43 4b 5f 52 57 43 4c  ne LSM_LOCK_RWCL
1120: 49 45 4e 54 28 69 29 20 20 28 28 69 29 20 2b 20  IENT(i)  ((i) + 
1130: 4c 53 4d 5f 4c 4f 43 4b 5f 52 45 41 44 45 52 28  LSM_LOCK_READER(
1140: 4c 53 4d 5f 4c 4f 43 4b 5f 4e 52 45 41 44 45 52  LSM_LOCK_NREADER
1150: 29 29 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f  ))..#define LSM_
1160: 4e 5f 4c 4f 43 4b 20 4c 53 4d 5f 4c 4f 43 4b 5f  N_LOCK LSM_LOCK_
1170: 52 57 43 4c 49 45 4e 54 28 4c 53 4d 5f 4c 4f 43  RWCLIENT(LSM_LOC
1180: 4b 5f 4e 52 57 43 4c 49 45 4e 54 29 0a 0a 2f 2a  K_NRWCLIENT)../*
1190: 0a 2a 2a 20 4d 65 74 61 2d 70 61 67 65 20 73 69  .** Meta-page si
11a0: 7a 65 20 61 6e 64 20 75 73 61 62 6c 65 20 73 69  ze and usable si
11b0: 7a 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ze..*/.#define L
11c0: 53 4d 5f 4d 45 54 41 5f 50 41 47 45 5f 53 49 5a  SM_META_PAGE_SIZ
11d0: 45 20 34 30 39 36 0a 0a 23 64 65 66 69 6e 65 20  E 4096..#define 
11e0: 4c 53 4d 5f 4d 45 54 41 5f 52 57 5f 50 41 47 45  LSM_META_RW_PAGE
11f0: 5f 53 49 5a 45 20 28 4c 53 4d 5f 4d 45 54 41 5f  _SIZE (LSM_META_
1200: 50 41 47 45 5f 53 49 5a 45 20 2d 20 4c 53 4d 5f  PAGE_SIZE - LSM_
1210: 4e 5f 4c 4f 43 4b 29 0a 0a 2f 2a 0a 2a 2a 20 48  N_LOCK)../*.** H
1220: 61 72 64 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ard limit on the
1230: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
1240: 6c 69 73 74 20 65 6e 74 72 69 65 73 20 74 68 61  list entries tha
1250: 74 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  t may be stored 
1260: 69 6e 20 0a 2a 2a 20 61 20 63 68 65 63 6b 70 6f  in .** a checkpo
1270: 69 6e 74 20 28 74 68 65 20 72 65 6d 61 69 6e 64  int (the remaind
1280: 65 72 20 61 72 65 20 73 74 6f 72 65 64 20 61 73  er are stored as
1290: 20 61 20 73 79 73 74 65 6d 20 72 65 63 6f 72 64   a system record
12a0: 20 69 6e 20 74 68 65 20 4c 53 4d 29 2e 0a 2a 2a   in the LSM)..**
12b0: 20 53 65 65 20 61 6c 73 6f 20 4c 53 4d 5f 43 4f   See also LSM_CO
12c0: 4e 46 49 47 5f 4d 41 58 5f 46 52 45 45 4c 49 53  NFIG_MAX_FREELIS
12d0: 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 53  T..*/.#define LS
12e0: 4d 5f 4d 41 58 5f 46 52 45 45 4c 49 53 54 5f 45  M_MAX_FREELIST_E
12f0: 4e 54 52 49 45 53 20 32 34 0a 0a 23 64 65 66 69  NTRIES 24..#defi
1300: 6e 65 20 4c 53 4d 5f 4d 41 58 5f 42 4c 4f 43 4b  ne LSM_MAX_BLOCK
1310: 5f 52 45 44 49 52 45 43 54 53 20 31 36 0a 0a 23  _REDIRECTS 16..#
1320: 64 65 66 69 6e 65 20 4c 53 4d 5f 41 54 54 45 4d  define LSM_ATTEM
1330: 50 54 53 5f 42 45 46 4f 52 45 5f 50 52 4f 54 4f  PTS_BEFORE_PROTO
1340: 43 4f 4c 20 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a  COL 10000.../*.*
1350: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 73 74 6f  * Each entry sto
1360: 72 65 64 20 69 6e 20 74 68 65 20 4c 53 4d 20 28  red in the LSM (
1370: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  or in-memory tre
1380: 65 20 73 74 72 75 63 74 75 72 65 29 20 68 61 73  e structure) has
1390: 20 61 6e 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65   an.** associate
13a0: 64 20 6d 61 73 6b 20 6f 66 20 74 68 65 20 66 6f  d mask of the fo
13b0: 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 73 2e 0a 2a  llowing flags..*
13c0: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 53 54  /.#define LSM_ST
13d0: 41 52 54 5f 44 45 4c 45 54 45 20 30 78 30 31 20  ART_DELETE 0x01 
13e0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
13f0: 6f 70 65 6e 2d 65 6e 64 65 64 20 64 65 6c 65 74  open-ended delet
1400: 65 20 72 61 6e 67 65 20 2a 2f 0a 23 64 65 66 69  e range */.#defi
1410: 6e 65 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54  ne LSM_END_DELET
1420: 45 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20  E   0x02     /* 
1430: 45 6e 64 20 6f 66 20 6f 70 65 6e 2d 65 6e 64 65  End of open-ende
1440: 64 20 64 65 6c 65 74 65 20 72 61 6e 67 65 20 2a  d delete range *
1450: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 50 4f  /.#define LSM_PO
1460: 49 4e 54 5f 44 45 4c 45 54 45 20 30 78 30 34 20  INT_DELETE 0x04 
1470: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
1480: 69 73 20 6b 65 79 20 2a 2f 0a 23 64 65 66 69 6e  is key */.#defin
1490: 65 20 4c 53 4d 5f 49 4e 53 45 52 54 20 20 20 20  e LSM_INSERT    
14a0: 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20 49     0x08     /* I
14b0: 6e 73 65 72 74 20 74 68 69 73 20 6b 65 79 20 61  nsert this key a
14c0: 6e 64 20 76 61 6c 75 65 20 2a 2f 0a 23 64 65 66  nd value */.#def
14d0: 69 6e 65 20 4c 53 4d 5f 53 45 50 41 52 41 54 4f  ine LSM_SEPARATO
14e0: 52 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a  R    0x10     /*
14f0: 20 54 72 75 65 20 69 66 20 65 6e 74 72 79 20 69   True if entry i
1500: 73 20 73 65 70 61 72 61 74 6f 72 20 6b 65 79 20  s separator key 
1510: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1520: 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 20 20 20  LSM_SYSTEMKEY   
1530: 20 30 78 32 30 20 20 20 20 20 2f 2a 20 54 72 75   0x20     /* Tru
1540: 65 20 69 66 20 65 6e 74 72 79 20 69 73 20 61 20  e if entry is a 
1550: 73 79 73 74 65 6d 20 6b 65 79 20 28 46 52 45 45  system key (FREE
1560: 4c 49 53 54 29 20 2a 2f 0a 0a 23 64 65 66 69 6e  LIST) */..#defin
1570: 65 20 4c 53 4d 5f 43 4f 4e 54 49 47 55 4f 55 53  e LSM_CONTIGUOUS
1580: 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a 20 55     0x40     /* U
1590: 73 65 64 20 69 6e 20 6c 73 6d 5f 74 72 65 65 2e  sed in lsm_tree.
15a0: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  c */../*.** A st
15b0: 72 69 6e 67 20 74 68 61 74 20 63 61 6e 20 67 72  ring that can gr
15c0: 6f 77 20 62 79 20 61 70 70 65 6e 64 69 6e 67 2e  ow by appending.
15d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 73 6d 53 74  .*/.struct LsmSt
15e0: 72 69 6e 67 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76  ring {.  lsm_env
15f0: 20 2a 70 45 6e 76 3b 20 20 20 20 20 20 20 20 20   *pEnv;         
1600: 20 20 20 20 20 2f 2a 20 52 75 6e 2d 74 69 6d 65       /* Run-time
1610: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 2a 2f 0a   environment */.
1620: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1640: 20 53 69 7a 65 20 6f 66 20 73 74 72 69 6e 67 2e   Size of string.
1650: 20 20 2d 31 20 69 6e 64 69 63 61 74 65 73 20 65    -1 indicates e
1660: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  rror */.  int nA
1670: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1680: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
1690: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d  llocated for z[]
16a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20    /* The string 
16d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 74  content */.};..t
16e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4c 73  ypedef struct Ls
16f0: 6d 46 69 6c 65 20 4c 73 6d 46 69 6c 65 3b 0a 73  mFile LsmFile;.s
1700: 74 72 75 63 74 20 4c 73 6d 46 69 6c 65 20 7b 0a  truct LsmFile {.
1710: 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c    lsm_file *pFil
1720: 65 3b 0a 20 20 4c 73 6d 46 69 6c 65 20 2a 70 4e  e;.  LsmFile *pN
1730: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ext;.};../*.** A
1740: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1750: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
1760: 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
1770: 65 20 61 6e 20 6f 72 64 65 72 65 64 20 6c 69 73  e an ordered lis
1780: 74 20 6f 66 0a 2a 2a 20 75 33 32 20 76 61 6c 75  t of.** u32 valu
1790: 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 3a  es. .**.** Note:
17a0: 20 54 68 69 73 20 69 73 20 61 20 70 6c 61 63 65   This is a place
17b0: 2d 68 6f 6c 64 65 72 20 69 6d 70 6c 65 6d 65 6e  -holder implemen
17c0: 74 61 74 69 6f 6e 2e 20 49 74 20 73 68 6f 75 6c  tation. It shoul
17d0: 64 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  d be replaced by
17e0: 0a 2a 2a 20 61 20 76 65 72 73 69 6f 6e 20 74 68  .** a version th
17f0: 61 74 20 61 76 6f 69 64 73 20 6d 61 6b 69 6e 67  at avoids making
1800: 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 20   a single large 
1810: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
1820: 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 63 6f 6e  the array.** con
1830: 74 61 69 6e 73 20 61 20 6c 61 72 67 65 20 6e 75  tains a large nu
1840: 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 2e 20  mber of values. 
1850: 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
1860: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 73 20 6f   the internals o
1870: 66 20 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  f .** this objec
1880: 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 6d 61  t should only ma
1890: 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 65  nipulated by the
18a0: 20 69 6e 74 41 72 72 61 79 58 58 58 28 29 20 66   intArrayXXX() f
18b0: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 0a 2a 2a 20  unctions in .** 
18c0: 6c 73 6d 5f 74 72 65 65 2e 63 2e 0a 2a 2f 0a 74  lsm_tree.c..*/.t
18d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e  ypedef struct In
18e0: 74 41 72 72 61 79 20 49 6e 74 41 72 72 61 79 3b  tArray IntArray;
18f0: 0a 73 74 72 75 63 74 20 49 6e 74 41 72 72 61 79  .struct IntArray
1900: 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b   {.  int nAlloc;
1910: 0a 20 20 69 6e 74 20 6e 41 72 72 61 79 3b 0a 20  .  int nArray;. 
1920: 20 75 33 32 20 2a 61 41 72 72 61 79 3b 0a 7d 3b   u32 *aArray;.};
1930: 0a 0a 73 74 72 75 63 74 20 52 65 64 69 72 65 63  ..struct Redirec
1940: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1970: 6f 66 20 72 65 64 69 72 65 63 74 73 20 2a 2f 0a  of redirects */.
1980: 20 20 73 74 72 75 63 74 20 52 65 64 69 72 65 63    struct Redirec
1990: 74 45 6e 74 72 79 20 7b 0a 20 20 20 20 69 6e 74  tEntry {.    int
19a0: 20 69 46 72 6f 6d 3b 0a 20 20 20 20 69 6e 74 20   iFrom;.    int 
19b0: 69 54 6f 3b 0a 20 20 7d 20 2a 61 3b 0a 7d 3b 0a  iTo;.  } *a;.};.
19c0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
19d0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
19e0: 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20  ture represents 
19f0: 61 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 68  a point in the h
1a00: 69 73 74 6f 72 79 20 6f 66 20 74 68 65 0a 2a 2a  istory of the.**
1a10: 20 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20   tree structure 
1a20: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 6f 2e  to roll back to.
1a30: 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
1a40: 74 73 20 69 6e 20 6c 73 6d 5f 74 72 65 65 2e 63  ts in lsm_tree.c
1a50: 20 66 6f 72 20 0a 2a 2a 20 64 65 74 61 69 6c 73   for .** details
1a60: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 72 65 65  ..*/.struct Tree
1a70: 4d 61 72 6b 20 7b 0a 20 20 75 33 32 20 69 52 6f  Mark {.  u32 iRo
1a80: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1aa0: 65 74 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 20  et of root node 
1ab0: 69 6e 20 73 68 6d 20 66 69 6c 65 20 2a 2f 0a 20  in shm file */. 
1ac0: 20 75 33 32 20 6e 48 65 69 67 68 74 3b 20 20 20   u32 nHeight;   
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 68 65 69 67   /* Current heig
1af0: 68 74 20 6f 66 20 74 72 65 65 20 73 74 72 75 63  ht of tree struc
1b00: 74 75 72 65 20 2a 2f 0a 20 20 75 33 32 20 69 57  ture */.  u32 iW
1b10: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1b30: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 73 68 6d  te offset in shm
1b40: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e   file */.  u32 n
1b50: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b70: 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 69  mber of chunks i
1b80: 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
1b90: 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 69 46  file */.  u32 iF
1ba0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1bc0: 73 74 20 63 68 75 6e 6b 20 69 6e 20 6c 69 6e 6b  st chunk in link
1bd0: 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  ed list */.  u32
1be0: 20 69 4e 65 78 74 53 68 6d 69 64 3b 20 20 20 20   iNextShmid;    
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c00: 4e 65 78 74 20 69 64 20 74 6f 20 61 6c 6c 6f 63  Next id to alloc
1c10: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  ate */.  int iRo
1c20: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1c40: 78 20 69 6e 20 6c 73 6d 2d 3e 72 6f 6c 6c 62 61  x in lsm->rollba
1c50: 63 6b 20 74 6f 20 72 65 76 65 72 74 20 74 6f 20  ck to revert to 
1c60: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1c70: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1c80: 20 73 74 72 75 63 74 75 72 65 20 72 65 70 72 65   structure repre
1c90: 73 65 6e 74 73 20 61 20 70 6f 69 6e 74 20 69 6e  sents a point in
1ca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
1cb0: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 6f 67  g..*/.struct Log
1cc0: 4d 61 72 6b 20 7b 0a 20 20 69 36 34 20 69 4f 66  Mark {.  i64 iOf
1cd0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1cf0: 65 74 20 69 6e 74 6f 20 6c 6f 67 20 28 73 65 65  et into log (see
1d00: 20 6c 73 6d 5f 6c 6f 67 2e 63 29 20 2a 2f 0a 20   lsm_log.c) */. 
1d10: 20 69 6e 74 20 6e 42 75 66 3b 20 20 20 20 20 20   int nBuf;      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 2d 6d   /* Size of in-m
1d40: 65 6d 6f 72 79 20 62 75 66 66 65 72 20 68 65 72  emory buffer her
1d50: 65 20 2a 2f 0a 20 20 75 38 20 61 42 75 66 5b 38  e */.  u8 aBuf[8
1d60: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
1d70: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1d80: 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 61 42  of content in aB
1d90: 75 66 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 63 6b  uf[] */.  u32 ck
1da0: 73 75 6d 30 3b 20 20 20 20 20 20 20 20 20 20 20  sum0;           
1db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
1dc0: 63 6b 73 75 6d 20 30 20 61 74 20 6f 66 66 73 65  cksum 0 at offse
1dd0: 74 20 28 69 4f 66 66 2d 6e 42 75 66 29 20 2a 2f  t (iOff-nBuf) */
1de0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 31 3b 20 20  .  u32 cksum1;  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 31     /* Checksum 1
1e10: 20 61 74 20 6f 66 66 73 65 74 20 28 69 4f 66 66   at offset (iOff
1e20: 2d 6e 42 75 66 29 20 2a 2f 0a 7d 3b 0a 0a 73 74  -nBuf) */.};..st
1e30: 72 75 63 74 20 54 72 61 6e 73 4d 61 72 6b 20 7b  ruct TransMark {
1e40: 0a 20 20 54 72 65 65 4d 61 72 6b 20 74 72 65 65  .  TreeMark tree
1e50: 3b 0a 20 20 4c 6f 67 4d 61 72 6b 20 6c 6f 67 3b  ;.  LogMark log;
1e60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  .};../*.** A str
1e70: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
1e80: 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 61 6e  nes the start an
1e90: 64 20 65 6e 64 20 6f 66 66 73 65 74 73 20 6f 66  d end offsets of
1ea0: 20 61 20 72 65 67 69 6f 6e 20 69 6e 20 74 68 65   a region in the
1eb0: 0a 2a 2a 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  .** log file. Th
1ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
1ed0: 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 69 73  gion in bytes is
1ee0: 20 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29   (iEnd - iStart)
1ef0: 2c 20 73 6f 20 69 66 0a 2a 2a 20 69 45 6e 64 3d  , so if.** iEnd=
1f00: 3d 69 53 74 61 72 74 20 74 68 65 20 72 65 67 69  =iStart the regi
1f10: 6f 6e 20 69 73 20 7a 65 72 6f 20 62 79 74 65 73  on is zero bytes
1f20: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 72   in size..*/.str
1f30: 75 63 74 20 4c 6f 67 52 65 67 69 6f 6e 20 7b 0a  uct LogRegion {.
1f40: 20 20 69 36 34 20 69 53 74 61 72 74 3b 20 20 20    i64 iStart;   
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 65    /* Start of re
1f70: 67 69 6f 6e 20 69 6e 20 6c 6f 67 20 66 69 6c 65  gion in log file
1f80: 20 2a 2f 0a 20 20 69 36 34 20 69 45 6e 64 3b 20   */.  i64 iEnd; 
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
1fb0: 72 65 67 69 6f 6e 20 69 6e 20 6c 6f 67 20 66 69  region in log fi
1fc0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
1fd0: 20 44 62 4c 6f 67 20 7b 0a 20 20 75 33 32 20 63   DbLog {.  u32 c
1fe0: 6b 73 75 6d 30 3b 20 20 20 20 20 20 20 20 20 20  ksum0;          
1ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2000: 65 63 6b 73 75 6d 20 30 20 61 74 20 6f 66 66 73  ecksum 0 at offs
2010: 65 74 20 69 4f 66 66 20 2a 2f 0a 20 20 75 33 32  et iOff */.  u32
2020: 20 63 6b 73 75 6d 31 3b 20 20 20 20 20 20 20 20   cksum1;        
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2040: 43 68 65 63 6b 73 75 6d 20 31 20 61 74 20 6f 66  Checksum 1 at of
2050: 66 73 65 74 20 69 4f 66 66 20 2a 2f 0a 20 20 69  fset iOff */.  i
2060: 36 34 20 69 53 6e 61 70 73 68 6f 74 49 64 3b 20  64 iSnapshotId; 
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2080: 2a 20 4c 6f 67 20 73 70 61 63 65 20 68 61 73 20  * Log space has 
2090: 62 65 65 6e 20 72 65 63 6c 61 69 6d 65 64 20 74  been reclaimed t
20a0: 6f 20 74 68 69 73 20 73 73 20 2a 2f 0a 20 20 4c  o this ss */.  L
20b0: 6f 67 52 65 67 69 6f 6e 20 61 52 65 67 69 6f 6e  ogRegion aRegion
20c0: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  [3];           /
20d0: 2a 20 4c 6f 67 20 66 69 6c 65 20 72 65 67 69 6f  * Log file regio
20e0: 6e 73 20 28 73 65 65 20 64 6f 63 73 20 69 6e 20  ns (see docs in 
20f0: 6c 73 6d 5f 6c 6f 67 2e 63 29 20 2a 2f 0a 7d 3b  lsm_log.c) */.};
2100: 0a 0a 73 74 72 75 63 74 20 54 72 65 65 52 6f 6f  ..struct TreeRoo
2110: 74 20 7b 0a 20 20 75 33 32 20 69 52 6f 6f 74 3b  t {.  u32 iRoot;
2120: 0a 20 20 75 33 32 20 6e 48 65 69 67 68 74 3b 0a  .  u32 nHeight;.
2130: 20 20 75 33 32 20 6e 42 79 74 65 3b 20 20 20 20    u32 nByte;    
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2160: 6f 66 20 74 68 69 73 20 74 72 65 65 20 69 6e 20  of this tree in 
2170: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
2180: 54 72 61 6e 73 49 64 3b 0a 7d 3b 0a 0a 2f 2a 0a  TransId;.};../*.
2190: 2a 2a 20 54 72 65 65 20 68 65 61 64 65 72 20 73  ** Tree header s
21a0: 74 72 75 63 74 75 72 65 2e 20 0a 2a 2f 0a 73 74  tructure. .*/.st
21b0: 72 75 63 74 20 54 72 65 65 48 65 61 64 65 72 20  ruct TreeHeader 
21c0: 7b 0a 20 20 75 33 32 20 69 55 73 65 64 53 68 6d  {.  u32 iUsedShm
21d0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
21e0: 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 66 69 72      /* Id of fir
21f0: 73 74 20 73 68 6d 20 63 68 75 6e 6b 20 75 73 65  st shm chunk use
2200: 64 20 62 79 20 74 68 69 73 20 74 72 65 65 20 2a  d by this tree *
2210: 2f 0a 20 20 75 33 32 20 69 4e 65 78 74 53 68 6d  /.  u32 iNextShm
2220: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2230: 20 20 20 20 2f 2a 20 53 68 6d 2d 69 64 20 6f 66      /* Shm-id of
2240: 20 6e 65 78 74 20 63 68 75 6e 6b 20 61 6c 6c 6f   next chunk allo
2250: 63 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 69  cated */.  u32 i
2260: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2280: 75 6e 6b 20 6e 75 6d 62 65 72 20 6f 66 20 73 6d  unk number of sm
2290: 61 6c 6c 65 73 74 20 73 68 6d 2d 69 64 20 2a 2f  allest shm-id */
22a0: 0a 20 20 75 33 32 20 6e 43 68 75 6e 6b 3b 20 20  .  u32 nChunk;  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22d0: 63 68 75 6e 6b 73 20 69 6e 20 73 68 61 72 65 64  chunks in shared
22e0: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
22f0: 20 20 54 72 65 65 52 6f 6f 74 20 72 6f 6f 74 3b    TreeRoot root;
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 2f 2a 20 52 6f 6f 74 20 61 6e 64 20 68 65    /* Root and he
2320: 69 67 68 74 20 6f 66 20 63 75 72 72 65 6e 74 20  ight of current 
2330: 74 72 65 65 20 2a 2f 0a 20 20 75 33 32 20 69 57  tree */.  u32 iW
2340: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
2350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2360: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 73 68 6d  te offset in shm
2370: 20 66 69 6c 65 20 2a 2f 0a 20 20 54 72 65 65 52   file */.  TreeR
2380: 6f 6f 74 20 6f 6c 64 72 6f 6f 74 3b 20 20 20 20  oot oldroot;    
2390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
23a0: 6f 74 20 61 6e 64 20 68 65 69 67 68 74 20 6f 66  ot and height of
23b0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 72   the previous tr
23c0: 65 65 20 2a 2f 0a 20 20 75 33 32 20 69 4f 6c 64  ee */.  u32 iOld
23d0: 53 68 6d 69 64 3b 20 20 20 20 20 20 20 20 20 20  Shmid;          
23e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
23f0: 73 68 6d 2d 69 64 20 75 73 65 64 20 62 79 20 70  shm-id used by p
2400: 72 65 76 69 6f 75 73 20 74 72 65 65 20 2a 2f 0a  revious tree */.
2410: 20 20 75 33 32 20 69 55 73 72 56 65 72 73 69 6f    u32 iUsrVersio
2420: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2430: 20 20 2f 2a 20 67 65 74 2f 73 65 74 5f 75 73 65    /* get/set_use
2440: 72 5f 76 65 72 73 69 6f 6e 28 29 20 76 61 6c 75  r_version() valu
2450: 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 6c 64 4c  e */.  i64 iOldL
2460: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  og;             
2470: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 6f 66         /* Log of
2480: 66 73 65 74 20 61 73 73 6f 63 69 61 74 65 64 20  fset associated 
2490: 77 69 74 68 20 6f 6c 64 20 74 72 65 65 20 2a 2f  with old tree */
24a0: 0a 20 20 75 33 32 20 6f 6c 64 63 6b 73 75 6d 30  .  u32 oldcksum0
24b0: 3b 0a 20 20 75 33 32 20 6f 6c 64 63 6b 73 75 6d  ;.  u32 oldcksum
24c0: 31 3b 0a 20 20 44 62 4c 6f 67 20 6c 6f 67 3b 20  1;.  DbLog log; 
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24f0: 6c 61 79 6f 75 74 20 6f 66 20 6c 6f 67 20 66 69  layout of log fi
2500: 6c 65 20 2a 2f 20 0a 20 20 75 33 32 20 61 43 6b  le */ .  u32 aCk
2510: 73 75 6d 5b 32 5d 3b 20 20 20 20 20 20 20 20 20  sum[2];         
2520: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2530: 6b 73 75 6d 73 20 31 20 61 6e 64 20 32 2e 20 2a  ksums 1 and 2. *
2540: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 61 74 61  /.};../*.** Data
2550: 62 61 73 65 20 68 61 6e 64 6c 65 20 73 74 72 75  base handle stru
2560: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 6d 4c 6f  cture..**.** mLo
2570: 63 6b 3a 0a 2a 2a 20 20 20 41 20 62 69 74 6d 61  ck:.**   A bitma
2580: 73 6b 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  sk representing 
2590: 74 68 65 20 6c 6f 63 6b 73 20 63 75 72 72 65 6e  the locks curren
25a0: 74 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  tly held by the 
25b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 20  connection..**  
25c0: 20 41 6e 20 4c 53 4d 20 64 61 74 61 62 61 73 65   An LSM database
25d0: 20 73 75 70 70 6f 72 74 73 20 4e 20 64 69 73 74   supports N dist
25e0: 69 6e 63 74 20 6c 6f 63 6b 73 2c 20 77 68 65 72  inct locks, wher
25f0: 65 20 4e 20 69 73 20 73 6f 6d 65 20 6e 75 6d 62  e N is some numb
2600: 65 72 20 6c 65 73 73 0a 2a 2a 20 20 20 74 68 61  er less.**   tha
2610: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 33 32  n or equal to 32
2620: 2e 20 4c 6f 63 6b 73 20 61 72 65 20 6e 75 6d 62  . Locks are numb
2630: 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
2640: 6f 6d 20 31 20 28 73 65 65 20 74 68 65 20 0a 2a  om 1 (see the .*
2650: 2a 20 20 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  *   definitions 
2660: 66 6f 72 20 4c 53 4d 5f 4c 4f 43 4b 5f 57 52 49  for LSM_LOCK_WRI
2670: 54 45 52 20 61 6e 64 20 63 6f 2e 29 2e 0a 2a 2a  TER and co.)..**
2680: 0a 2a 2a 20 20 20 54 68 65 20 6c 65 61 73 74 20  .**   The least 
2690: 73 69 67 6e 69 66 69 63 61 6e 74 20 33 32 2d 62  significant 32-b
26a0: 69 74 73 20 69 6e 20 6d 4c 6f 63 6b 20 72 65 70  its in mLock rep
26b0: 72 65 73 65 6e 74 20 45 58 43 4c 55 53 49 56 45  resent EXCLUSIVE
26c0: 20 6c 6f 63 6b 73 2e 20 54 68 65 0a 2a 2a 20 20   locks. The.**  
26d0: 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
26e0: 74 20 61 72 65 20 53 48 41 52 45 44 20 6c 6f 63  t are SHARED loc
26f0: 6b 73 2e 20 53 6f 2c 20 69 66 20 61 20 63 6f 6e  ks. So, if a con
2700: 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 73 20 61 20  nection holds a 
2710: 53 48 41 52 45 44 0a 2a 2a 20 20 20 6c 6f 63 6b  SHARED.**   lock
2720: 20 6f 6e 20 6c 6f 63 6b 20 72 65 67 69 6f 6e 20   on lock region 
2730: 69 4c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  iLock, then the 
2740: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
2750: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 28  e:.**.**       (
2760: 6d 4c 6f 63 6b 20 26 20 28 28 69 4c 6f 63 6b 2b  mLock & ((iLock+
2770: 33 32 2d 31 29 20 3c 3c 20 31 29 29 0a 2a 2a 0a  32-1) << 1)).**.
2780: 2a 2a 20 20 20 4f 72 20 66 6f 72 20 61 6e 20 45  **   Or for an E
2790: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 3a 0a 2a  XCLUSIVE lock:.*
27a0: 2a 0a 2a 2a 20 20 20 20 20 20 20 28 6d 4c 6f 63  *.**       (mLoc
27b0: 6b 20 26 20 28 28 69 4c 6f 63 6b 2d 31 29 20 3c  k & ((iLock-1) <
27c0: 3c 20 31 29 29 0a 2a 2a 20 0a 2a 2a 20 70 43 73  < 1)).** .** pCs
27d0: 72 3a 0a 2a 2a 20 20 20 50 6f 69 6e 74 73 20 74  r:.**   Points t
27e0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
27f0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 74 68 61 74  linked list that
2800: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 63 75   contains all cu
2810: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 0a 2a 2a 20  rrently open.** 
2820: 20 20 63 75 72 73 6f 72 73 2e 20 4f 6e 63 65 20    cursors. Once 
2830: 74 68 69 73 20 6c 69 73 74 20 62 65 63 6f 6d 65  this list become
2840: 73 20 65 6d 70 74 79 2c 20 74 68 65 20 75 73 65  s empty, the use
2850: 72 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  r has no outstan
2860: 64 69 6e 67 0a 2a 2a 20 20 20 63 75 72 73 6f 72  ding.**   cursor
2870: 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  s and the databa
2880: 73 65 20 68 61 6e 64 6c 65 20 63 61 6e 20 62 65  se handle can be
2890: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c   successfully cl
28a0: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 43 73 72  osed..**.** pCsr
28b0: 43 61 63 68 65 3a 0a 2a 2a 20 20 20 54 68 69 73  Cache:.**   This
28c0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 63   list contains c
28d0: 75 72 73 6f 72 20 6f 62 6a 65 63 74 73 20 74 68  ursor objects th
28e0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f  at have been clo
28f0: 73 65 64 20 75 73 69 6e 67 0a 2a 2a 20 20 20 6c  sed using.**   l
2900: 73 6d 5f 63 73 72 5f 63 6c 6f 73 65 28 29 2e 20  sm_csr_close(). 
2910: 45 61 63 68 20 74 69 6d 65 20 61 20 63 75 72 73  Each time a curs
2920: 6f 72 20 69 73 20 63 6c 6f 73 65 64 2c 20 69 74  or is closed, it
2930: 20 69 73 20 73 68 69 66 74 65 64 20 66 72 6f 6d   is shifted from
2940: 20 0a 2a 2a 20 20 20 74 68 65 20 70 43 73 72 20   .**   the pCsr 
2950: 6c 69 73 74 20 74 6f 20 74 68 69 73 20 6c 69 73  list to this lis
2960: 74 2e 20 57 68 65 6e 20 61 20 6e 65 77 20 63 75  t. When a new cu
2970: 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 2c 20  rsor is opened, 
2980: 74 68 69 73 20 6c 69 73 74 0a 2a 2a 20 20 20 69  this list.**   i
2990: 73 20 69 6e 73 70 65 63 74 65 64 20 74 6f 20 73  s inspected to s
29a0: 65 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ee if there exis
29b0: 74 73 20 61 20 63 75 72 73 6f 72 20 6f 62 6a 65  ts a cursor obje
29c0: 63 74 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a  ct that can be.*
29d0: 2a 20 20 20 72 65 75 73 65 64 2e 20 54 68 69 73  *   reused. This
29e0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
29f0: 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 72  ion only..*/.str
2a00: 75 63 74 20 6c 73 6d 5f 64 62 20 7b 0a 0a 20 20  uct lsm_db {..  
2a10: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
2a20: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
2a30: 20 2a 2f 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70   */.  lsm_env *p
2a40: 45 6e 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Env;            
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 2f 2a 20 72 75 6e 74 69 6d 65 20 65 6e 76 69 72  /* runtime envir
2a70: 6f 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  onment */.  int 
2a80: 28 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20  (*xCmp)(void *, 
2a90: 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74  int, void *, int
2aa0: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65  );    /* Compare
2ab0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
2ac0: 2f 2a 20 56 61 6c 75 65 73 20 63 6f 6e 66 69 67  /* Values config
2ad0: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
2ae0: 20 6c 73 6d 5f 63 6f 6e 66 69 67 20 2a 2f 0a 20   lsm_config */. 
2af0: 20 69 6e 74 20 65 53 61 66 65 74 79 3b 20 20 20   int eSafety;   
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 2f 2a 20 4c 53 4d 5f 53 41 46 45 54 59 5f 4f   /* LSM_SAFETY_O
2b20: 46 46 2c 20 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  FF, NORMAL or FU
2b30: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 41 75 74  LL */.  int bAut
2b40: 6f 77 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20  owork;          
2b50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
2b60: 67 75 72 65 64 20 62 79 20 4c 53 4d 5f 43 4f 4e  gured by LSM_CON
2b70: 46 49 47 5f 41 55 54 4f 57 4f 52 4b 20 2a 2f 0a  FIG_AUTOWORK */.
2b80: 20 20 69 6e 74 20 6e 54 72 65 65 4c 69 6d 69 74    int nTreeLimit
2b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ba0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
2bb0: 62 79 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55  by LSM_CONFIG_AU
2bc0: 54 4f 46 4c 55 53 48 20 2a 2f 0a 20 20 69 6e 74  TOFLUSH */.  int
2bd0: 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20   nMerge;        
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf0: 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 4c 53  Configured by LS
2c00: 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 4d 45 52  M_CONFIG_AUTOMER
2c10: 47 45 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65  GE */.  int bUse
2c20: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
2c30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
2c40: 67 75 72 65 64 20 62 79 20 4c 53 4d 5f 43 4f 4e  gured by LSM_CON
2c50: 46 49 47 5f 55 53 45 5f 4c 4f 47 20 2a 2f 0a 20  FIG_USE_LOG */. 
2c60: 20 69 6e 74 20 6e 44 66 6c 74 50 67 73 7a 3b 20   int nDfltPgsz; 
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
2c90: 79 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 50 41 47  y LSM_CONFIG_PAG
2ca0: 45 5f 53 49 5a 45 20 2a 2f 0a 20 20 69 6e 74 20  E_SIZE */.  int 
2cb0: 6e 44 66 6c 74 42 6c 6b 73 7a 3b 20 20 20 20 20  nDfltBlksz;     
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2cd0: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 4c 53 4d  onfigured by LSM
2ce0: 5f 43 4f 4e 46 49 47 5f 42 4c 4f 43 4b 5f 53 49  _CONFIG_BLOCK_SI
2cf0: 5a 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  ZE */.  int nMax
2d00: 46 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20  Freelist;       
2d10: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
2d20: 67 75 72 65 64 20 62 79 20 4c 53 4d 5f 43 4f 4e  gured by LSM_CON
2d30: 46 49 47 5f 4d 41 58 5f 46 52 45 45 4c 49 53 54  FIG_MAX_FREELIST
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6d 61 70 3b   */.  int iMmap;
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
2d70: 72 65 64 20 62 79 20 4c 53 4d 5f 43 4f 4e 46 49  red by LSM_CONFI
2d80: 47 5f 4d 4d 41 50 20 2a 2f 0a 20 20 69 36 34 20  G_MMAP */.  i64 
2d90: 6e 41 75 74 6f 63 6b 70 74 3b 20 20 20 20 20 20  nAutockpt;      
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2db0: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 4c 53 4d  onfigured by LSM
2dc0: 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 43 48 45 43  _CONFIG_AUTOCHEC
2dd0: 4b 50 4f 49 4e 54 20 2a 2f 0a 20 20 69 6e 74 20  KPOINT */.  int 
2de0: 62 4d 75 6c 74 69 50 72 6f 63 3b 20 20 20 20 20  bMultiProc;     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2e00: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 4c 5f 43  onfigured by L_C
2e10: 5f 4d 55 4c 54 49 50 4c 45 5f 50 52 4f 43 45 53  _MULTIPLE_PROCES
2e20: 53 45 53 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  SES */.  int bRe
2e30: 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adonly;         
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
2e50: 69 67 75 72 65 64 20 62 79 20 4c 53 4d 5f 43 4f  igured by LSM_CO
2e60: 4e 46 49 47 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  NFIG_READONLY */
2e70: 0a 20 20 6c 73 6d 5f 63 6f 6d 70 72 65 73 73 20  .  lsm_compress 
2e80: 63 6f 6d 70 72 65 73 73 3b 20 20 20 20 20 20 20  compress;       
2e90: 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
2ea0: 6e 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  n callbacks */. 
2eb0: 20 6c 73 6d 5f 63 6f 6d 70 72 65 73 73 5f 66 61   lsm_compress_fa
2ec0: 63 74 6f 72 79 20 66 61 63 74 6f 72 79 3b 20 20  ctory factory;  
2ed0: 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
2ee0: 63 61 6c 6c 62 61 63 6b 20 66 61 63 74 6f 72 79  callback factory
2ef0: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 75 62 2d 73 79   */..  /* Sub-sy
2f00: 73 74 65 6d 20 68 61 6e 64 6c 65 73 20 2a 2f 0a  stem handles */.
2f10: 20 20 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46    FileSystem *pF
2f20: 53 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S;              
2f30: 20 20 2f 2a 20 4f 6e 2d 64 69 73 6b 20 70 6f 72    /* On-disk por
2f40: 74 69 6f 6e 20 6f 66 20 64 61 74 61 62 61 73 65  tion of database
2f50: 20 2a 2f 0a 20 20 44 61 74 61 62 61 73 65 20 2a   */.  Database *
2f60: 70 44 61 74 61 62 61 73 65 3b 20 20 20 20 20 20  pDatabase;      
2f70: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2f80: 65 20 73 68 61 72 65 64 20 64 61 74 61 20 2a 2f  e shared data */
2f90: 0a 0a 20 20 69 6e 74 20 69 52 77 63 6c 69 65 6e  ..  int iRwclien
2fa0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2fb0: 20 20 20 20 2f 2a 20 52 65 61 64 2d 77 72 69 74      /* Read-writ
2fc0: 65 20 63 6c 69 65 6e 74 20 6c 6f 63 6b 20 68 65  e client lock he
2fd0: 6c 64 20 28 2d 31 20 3d 3d 20 6e 6f 6e 65 29 20  ld (-1 == none) 
2fe0: 2a 2f 0a 0a 20 20 2f 2a 20 43 6c 69 65 6e 74 20  */..  /* Client 
2ff0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6e 74  transaction cont
3000: 65 78 74 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f  ext */.  Snapsho
3010: 74 20 2a 70 43 6c 69 65 6e 74 3b 20 20 20 20 20  t *pClient;     
3020: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 69 65           /* Clie
3030: 6e 74 20 73 6e 61 70 73 68 6f 74 20 2a 2f 0a 20  nt snapshot */. 
3040: 20 69 6e 74 20 69 52 65 61 64 65 72 3b 20 20 20   int iReader;   
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 2f 2a 20 52 65 61 64 20 6c 6f 63 6b 20 68 65   /* Read lock he
3070: 6c 64 20 28 2d 31 20 3d 3d 20 75 6e 6c 6f 63 6b  ld (-1 == unlock
3080: 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20 62 52 6f  ed) */.  int bRo
3090: 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20 20 20  Trans;          
30a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30b0: 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   if a read-only 
30c0: 64 62 20 74 72 61 6e 73 20 69 73 20 6f 70 65 6e  db trans is open
30d0: 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f   */.  MultiCurso
30e0: 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
30f0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3100: 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72   all open cursor
3110: 73 20 2a 2f 0a 20 20 4c 6f 67 57 72 69 74 65 72  s */.  LogWriter
3120: 20 2a 70 4c 6f 67 57 72 69 74 65 72 3b 20 20 20   *pLogWriter;   
3130: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
3140: 74 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  t for writing to
3150: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 2a 2f   the log file */
3160: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 4f 70 65  .  int nTransOpe
3170: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3190: 6f 70 65 6e 65 64 20 77 72 69 74 65 20 74 72 61  opened write tra
31a0: 6e 73 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  nsactions */.  i
31b0: 6e 74 20 6e 54 72 61 6e 73 41 6c 6c 6f 63 3b 20  nt nTransAlloc; 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31d0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
31e0: 20 6f 66 20 61 54 72 61 6e 73 5b 5d 20 61 72 72   of aTrans[] arr
31f0: 61 79 20 2a 2f 0a 20 20 54 72 61 6e 73 4d 61 72  ay */.  TransMar
3200: 6b 20 2a 61 54 72 61 6e 73 3b 20 20 20 20 20 20  k *aTrans;      
3210: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
3220: 20 6f 66 20 6d 61 72 6b 73 20 66 6f 72 20 74 72   of marks for tr
3230: 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
3240: 63 6b 20 2a 2f 0a 20 20 49 6e 74 41 72 72 61 79  ck */.  IntArray
3250: 20 72 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20   rollback;      
3260: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3270: 6f 66 20 74 72 65 65 2d 6e 6f 64 65 73 20 74 6f  of tree-nodes to
3280: 20 72 6f 6c 6c 20 62 61 63 6b 20 2a 2f 0a 20 20   roll back */.  
3290: 69 6e 74 20 62 44 69 73 63 61 72 64 4f 6c 64 3b  int bDiscardOld;
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 73 6d 54 72  /* True if lsmTr
32c0: 65 65 44 69 73 63 61 72 64 4f 6c 64 28 29 20 77  eeDiscardOld() w
32d0: 61 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 0a 20 20  as called */..  
32e0: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
32f0: 72 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  rCache;         
3300: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 63  /* List of all c
3310: 6c 6f 73 65 64 20 63 75 72 73 6f 72 73 20 2a 2f  losed cursors */
3320: 0a 0a 20 20 2f 2a 20 57 6f 72 6b 65 72 20 63 6f  ..  /* Worker co
3330: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6e 61 70 73  ntext */.  Snaps
3340: 68 6f 74 20 2a 70 57 6f 72 6b 65 72 3b 20 20 20  hot *pWorker;   
3350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 6f             /* Wo
3360: 72 6b 65 72 20 73 6e 61 70 73 68 6f 74 20 28 6f  rker snapshot (o
3370: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 46 72 65  r NULL) */.  Fre
3380: 65 6c 69 73 74 20 2a 70 46 72 65 65 6c 69 73 74  elist *pFreelist
3390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33a0: 53 65 65 20 73 6f 72 74 65 64 4e 65 77 54 6f 70  See sortedNewTop
33b0: 6c 65 76 65 6c 28 29 20 2a 2f 0a 20 20 69 6e 74  level() */.  int
33c0: 20 62 55 73 65 46 72 65 65 6c 69 73 74 3b 20 20   bUseFreelist;  
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e0: 54 72 75 65 20 74 6f 20 75 73 65 20 70 46 72 65  True to use pFre
33f0: 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62  elist */.  int b
3400: 49 6e 63 72 4d 65 72 67 65 3b 20 20 20 20 20 20  IncrMerge;      
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3420: 75 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ue if currently 
3430: 64 6f 69 6e 67 20 61 20 6d 65 72 67 65 20 2a 2f  doing a merge */
3440: 0a 0a 20 20 69 6e 74 20 62 49 6e 46 61 63 74 6f  ..  int bInFacto
3450: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
3460: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
3470: 69 74 68 69 6e 20 66 61 63 74 6f 72 79 2e 78 46  ithin factory.xF
3480: 61 63 74 6f 72 79 28 29 20 2a 2f 0a 0a 20 20 2f  actory() */..  /
3490: 2a 20 44 65 62 75 67 67 69 6e 67 20 6d 65 73 73  * Debugging mess
34a0: 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  age callback */.
34b0: 20 20 76 6f 69 64 20 28 2a 78 4c 6f 67 29 28 76    void (*xLog)(v
34c0: 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  oid *, int, cons
34d0: 74 20 63 68 61 72 20 2a 29 3b 0a 20 20 76 6f 69  t char *);.  voi
34e0: 64 20 2a 70 4c 6f 67 43 74 78 3b 0a 0a 20 20 2f  d *pLogCtx;..  /
34f0: 2a 20 57 6f 72 6b 20 64 6f 6e 65 20 6e 6f 74 69  * Work done noti
3500: 66 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  fication callbac
3510: 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 57  k */.  void (*xW
3520: 6f 72 6b 29 28 6c 73 6d 5f 64 62 20 2a 2c 20 76  ork)(lsm_db *, v
3530: 6f 69 64 20 2a 29 3b 0a 20 20 76 6f 69 64 20 2a  oid *);.  void *
3540: 70 57 6f 72 6b 43 74 78 3b 0a 0a 20 20 75 36 34  pWorkCtx;..  u64
3550: 20 6d 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   mLock;         
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3570: 4d 61 73 6b 20 6f 66 20 63 75 72 72 65 6e 74 20  Mask of current 
3580: 6c 6f 63 6b 73 2e 20 53 65 65 20 6c 73 6d 53 68  locks. See lsmSh
3590: 6d 4c 6f 63 6b 28 29 2e 20 2a 2f 0a 20 20 6c 73  mLock(). */.  ls
35a0: 6d 5f 64 62 20 2a 70 4e 65 78 74 3b 20 20 20 20  m_db *pNext;    
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35c0: 20 4e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   Next connection
35d0: 20 74 6f 20 73 61 6d 65 20 64 61 74 61 62 61 73   to same databas
35e0: 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d  e */..  int nShm
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3600: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3610: 6f 66 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79  of apShm[] array
3620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 61 70 53   */.  void **apS
3630: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
3640: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
3650: 6d 65 6d 6f 72 79 20 63 68 75 6e 6b 73 20 2a 2f  memory chunks */
3660: 0a 20 20 53 68 6d 48 65 61 64 65 72 20 2a 70 53  .  ShmHeader *pS
3670: 68 6d 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  hmhdr;          
3680: 20 20 20 2f 2a 20 4c 69 76 65 20 73 68 61 72 65     /* Live share
3690: 64 2d 6d 65 6d 6f 72 79 20 68 65 61 64 65 72 20  d-memory header 
36a0: 2a 2f 0a 20 20 54 72 65 65 48 65 61 64 65 72 20  */.  TreeHeader 
36b0: 74 72 65 65 68 64 72 3b 20 20 20 20 20 20 20 20  treehdr;        
36c0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 6f       /* Local co
36d0: 70 79 20 6f 66 20 74 72 65 65 2d 68 65 61 64 65  py of tree-heade
36e0: 72 20 2a 2f 0a 20 20 75 33 32 20 61 53 6e 61 70  r */.  u32 aSnap
36f0: 73 68 6f 74 5b 4c 53 4d 5f 4d 45 54 41 5f 50 41  shot[LSM_META_PA
3700: 47 45 5f 53 49 5a 45 20 2f 20 73 69 7a 65 6f 66  GE_SIZE / sizeof
3710: 28 75 33 32 29 5d 3b 0a 7d 3b 0a 0a 73 74 72 75  (u32)];.};..stru
3720: 63 74 20 53 65 67 6d 65 6e 74 20 7b 0a 20 20 4c  ct Segment {.  L
3730: 73 6d 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20  smPgno iFirst;  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
3760: 20 74 68 69 73 20 72 75 6e 20 2a 2f 0a 20 20 4c   this run */.  L
3770: 73 6d 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20  smPgno iLastPg; 
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 6f 66 20  /* Last page of 
37a0: 74 68 69 73 20 72 75 6e 20 2a 2f 0a 20 20 4c 73  this run */.  Ls
37b0: 6d 50 67 6e 6f 20 69 52 6f 6f 74 3b 20 20 20 20  mPgno iRoot;    
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37d0: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * Root page numb
37e0: 65 72 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  er (if any) */. 
37f0: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69    /* Size of thi
3820: 73 20 72 75 6e 20 69 6e 20 70 61 67 65 73 20 2a  s run in pages *
3830: 2f 0a 0a 20 20 52 65 64 69 72 65 63 74 20 2a 70  /..  Redirect *p
3840: 52 65 64 69 72 65 63 74 3b 20 20 20 20 20 20 20  Redirect;       
3850: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 72        /* Block r
3860: 65 64 69 72 65 63 74 73 20 28 6f 72 20 4e 55 4c  edirects (or NUL
3870: 4c 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  L) */.};../*.** 
3880: 69 53 70 6c 69 74 54 6f 70 69 63 2f 70 53 70 6c  iSplitTopic/pSpl
3890: 69 74 4b 65 79 2f 6e 53 70 6c 69 74 4b 65 79 3a  itKey/nSplitKey:
38a0: 0a 2a 2a 20 20 20 49 66 20 6e 52 69 67 68 74 3e  .**   If nRight>
38b0: 30 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 63  0, this buffer c
38c0: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f  ontains a copy o
38d0: 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  f the largest ke
38e0: 79 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20  y that has.**   
38f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
3900: 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  tten to the left
3910: 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
3920: 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 72 75  e level..*/.stru
3930: 63 74 20 4c 65 76 65 6c 20 7b 0a 20 20 53 65 67  ct Level {.  Seg
3940: 6d 65 6e 74 20 6c 68 73 3b 20 20 20 20 20 20 20  ment lhs;       
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3960: 4c 65 66 74 2d 68 61 6e 64 20 28 6d 61 69 6e 29  Left-hand (main)
3970: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
3980: 74 20 6e 52 69 67 68 74 3b 20 20 20 20 20 20 20  t nRight;       
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39a0: 20 53 69 7a 65 20 6f 66 20 61 70 52 69 67 68 74   Size of apRight
39b0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 53 65  [] array */.  Se
39c0: 67 6d 65 6e 74 20 2a 61 52 68 73 3b 20 20 20 20  gment *aRhs;    
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39e0: 20 4f 6c 64 20 73 65 67 6d 65 6e 74 73 20 62 65   Old segments be
39f0: 69 6e 67 20 6d 65 72 67 65 64 20 69 6e 74 6f 20  ing merged into 
3a00: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 53  this */.  int iS
3a10: 70 6c 69 74 54 6f 70 69 63 3b 20 20 20 20 20 20  plitTopic;      
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c            /* Spl
3a30: 69 74 20 6b 65 79 20 74 6f 70 69 63 20 28 69 66  it key topic (if
3a40: 20 6e 52 69 67 68 74 3e 30 29 20 2a 2f 0a 20 20   nRight>0) */.  
3a50: 76 6f 69 64 20 2a 70 53 70 6c 69 74 4b 65 79 3b  void *pSplitKey;
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 70  /* Pointer to sp
3a80: 6c 69 74 2d 6b 65 79 20 28 69 66 20 6e 52 69 67  lit-key (if nRig
3a90: 68 74 3e 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  ht>0) */.  int n
3aa0: 53 70 6c 69 74 4b 65 79 3b 20 20 20 20 20 20 20  SplitKey;       
3ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3ac0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3ad0: 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20   split-key */.. 
3ae0: 20 75 31 36 20 69 41 67 65 3b 20 20 20 20 20 20   u16 iAge;      
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
3b10: 6d 65 73 20 64 61 74 61 20 68 61 73 20 62 65 65  mes data has bee
3b20: 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  n written */.  u
3b30: 31 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  16 flags;       
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b50: 2a 20 4d 61 73 6b 20 6f 66 20 4c 45 56 45 4c 5f  * Mask of LEVEL_
3b60: 58 58 58 20 62 69 74 73 20 2a 2f 0a 20 20 4d 65  XXX bits */.  Me
3b70: 72 67 65 20 2a 70 4d 65 72 67 65 3b 20 20 20 20  rge *pMerge;    
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b90: 20 4d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   Merge operation
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
3bb0: 77 61 79 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a  way */.  Level *
3bc0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
3bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
3be0: 20 6c 65 76 65 6c 20 69 6e 20 74 72 65 65 20 2a   level in tree *
3bf0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
3c00: 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c  Level.flags fiel
3c10: 64 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  d is set to a co
3c20: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
3c30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 73 2e   following bits.
3c40: 0a 2a 2a 0a 2a 2a 20 4c 45 56 45 4c 5f 46 52 45  .**.** LEVEL_FRE
3c50: 45 4c 49 53 54 5f 4f 4e 4c 59 3a 0a 2a 2a 20 20  ELIST_ONLY:.**  
3c60: 20 53 65 74 20 69 66 20 74 68 65 20 6c 65 76 65   Set if the leve
3c70: 6c 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  l consists entir
3c80: 65 6c 79 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ely of free-list
3c90: 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2a 0a 2a 2a   entries. .**.**
3ca0: 20 4c 45 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54   LEVEL_INCOMPLET
3cb0: 45 3a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20  E:.**   This is 
3cc0: 73 65 74 20 77 68 69 6c 65 20 61 20 6e 65 77 20  set while a new 
3cd0: 74 6f 70 6c 65 76 65 6c 20 6c 65 76 65 6c 20 69  toplevel level i
3ce0: 73 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  s being construc
3cf0: 74 65 64 2e 20 49 74 20 69 73 0a 2a 2a 20 20 20  ted. It is.**   
3d00: 6e 65 76 65 72 20 73 65 74 20 66 6f 72 20 61 6e  never set for an
3d10: 79 20 6c 65 76 65 6c 20 6f 74 68 65 72 20 74 68  y level other th
3d20: 61 6e 20 61 20 6e 65 77 20 74 6f 70 6c 65 76 65  an a new topleve
3d30: 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 45  l..*/.#define LE
3d40: 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f 4e 4c  VEL_FREELIST_ONL
3d50: 59 20 20 20 20 20 20 30 78 30 30 30 31 0a 23 64  Y      0x0001.#d
3d60: 65 66 69 6e 65 20 4c 45 56 45 4c 5f 49 4e 43 4f  efine LEVEL_INCO
3d70: 4d 50 4c 45 54 45 20 20 20 20 20 20 20 20 20 30  MPLETE         0
3d80: 78 30 30 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20  x0002.../*.** A 
3d90: 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72 69  structure descri
3da0: 62 69 6e 67 20 61 6e 20 6f 6e 67 6f 69 6e 67 20  bing an ongoing 
3db0: 6d 65 72 67 65 2e 20 54 68 65 72 65 20 69 73 20  merge. There is 
3dc0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3dd0: 68 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  his.** structure
3de0: 20 66 6f 72 20 65 76 65 72 79 20 4c 65 76 65 6c   for every Level
3df0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
3e00: 67 6f 69 6e 67 20 61 20 6d 65 72 67 65 20 69 6e  going a merge in
3e10: 20 74 68 65 20 77 6f 72 6b 65 72 0a 2a 2a 20 73   the worker.** s
3e20: 6e 61 70 73 68 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  napshot..**.** I
3e30: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
3e40: 74 20 63 6f 64 65 20 74 68 61 74 20 75 73 65 73  t code that uses
3e50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3e60: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68  this structure h
3e70: 61 73 0a 2a 2a 20 61 63 63 65 73 73 20 74 6f 20  as.** access to 
3e80: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 4c  the associated L
3e90: 65 76 65 6c 20 73 74 72 75 63 74 2e 0a 2a 2a 0a  evel struct..**.
3ea0: 2a 2a 20 69 4f 75 74 70 75 74 4f 66 66 3a 0a 2a  ** iOutputOff:.*
3eb0: 2a 20 20 20 54 68 65 20 62 79 74 65 20 6f 66 66  *   The byte off
3ec0: 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  set to write to 
3ed0: 6e 65 78 74 20 77 69 74 68 69 6e 20 74 68 65 20  next within the 
3ee0: 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
3ef0: 20 0a 2a 2a 20 20 20 6f 75 74 70 75 74 20 73 65   .**   output se
3f00: 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  gment..*/.struct
3f10: 20 4d 65 72 67 65 49 6e 70 75 74 20 7b 0a 20 20   MergeInput {.  
3f20: 4c 73 6d 50 67 6e 6f 20 69 50 67 3b 20 20 20 20  LsmPgno iPg;    
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 2f 2a 20 50 61 67 65 20 6f 6e 20 77 68 69 63 68  /* Page on which
3f50: 20 6e 65 78 74 20 69 6e 70 75 74 20 69 73 20 73   next input is s
3f60: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  tored */.  int i
3f70: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
3f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65             /* Ce
3f90: 6c 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65  ll containing ne
3fa0: 78 74 20 69 6e 70 75 74 20 74 6f 20 6d 65 72 67  xt input to merg
3fb0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 4d  e */.};.struct M
3fc0: 65 72 67 65 20 7b 0a 20 20 69 6e 74 20 6e 49 6e  erge {.  int nIn
3fd0: 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
3fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ff0: 65 72 20 6f 66 20 69 6e 70 75 74 20 72 75 6e 73  er of input runs
4000: 20 62 65 69 6e 67 20 6d 65 72 67 65 64 20 2a 2f   being merged */
4010: 0a 20 20 4d 65 72 67 65 49 6e 70 75 74 20 2a 61  .  MergeInput *a
4020: 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
4030: 20 20 20 2f 2a 20 41 72 72 61 79 20 6e 49 6e 70     /* Array nInp
4040: 75 74 20 65 6e 74 72 69 65 73 20 69 6e 20 73 69  ut entries in si
4050: 7a 65 20 2a 2f 0a 20 20 4d 65 72 67 65 49 6e 70  ze */.  MergeInp
4060: 75 74 20 73 70 6c 69 74 6b 65 79 3b 20 20 20 20  ut splitkey;    
4070: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
4080: 69 6f 6e 20 69 6e 20 66 69 6c 65 20 6f 66 20 63  ion in file of c
4090: 75 72 72 65 6e 74 20 73 70 6c 69 74 6b 65 79 20  urrent splitkey 
40a0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69 70 3b 20  */.  int nSkip; 
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
40d0: 66 20 73 65 70 61 72 61 74 6f 72 73 20 65 6e 74  f separators ent
40e0: 72 69 65 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ries to skip */.
40f0: 20 20 69 6e 74 20 69 4f 75 74 70 75 74 4f 66 66    int iOutputOff
4100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4110: 20 20 2f 2a 20 57 72 69 74 65 20 6f 66 66 73 65    /* Write offse
4120: 74 20 6f 6e 20 6f 75 74 70 75 74 20 70 61 67 65  t on output page
4130: 20 2a 2f 0a 20 20 4c 73 6d 50 67 6e 6f 20 69 43   */.  LsmPgno iC
4140: 75 72 72 65 6e 74 50 74 72 3b 20 20 20 20 20 20  urrentPtr;      
4150: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4160: 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 2a   pointer value *
4170: 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
4180: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4190: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
41a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
41b0: 53 65 67 6d 65 6e 74 20 73 74 72 75 63 74 75 72  Segment structur
41c0: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 72  e..** Returns tr
41d0: 75 65 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ue if the struct
41e0: 75 72 65 20 69 6e 73 74 61 6e 63 65 20 69 6e 64  ure instance ind
41f0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
4200: 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a 20 61 72  separators.** ar
4210: 72 61 79 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2f  ray is valid..*/
4220: 0a 23 64 65 66 69 6e 65 20 73 65 67 6d 65 6e 74  .#define segment
4230: 48 61 73 53 65 70 61 72 61 74 6f 72 73 28 70 53  HasSeparators(pS
4240: 65 67 6d 65 6e 74 29 20 28 28 70 53 65 67 6d 65  egment) ((pSegme
4250: 6e 74 29 2d 3e 73 65 70 2e 69 46 69 72 73 74 3e  nt)->sep.iFirst>
4260: 30 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61  0)../*.** The va
4270: 6c 75 65 73 20 74 68 61 74 20 61 63 63 6f 6d 70  lues that accomp
4280: 61 6e 79 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  any the lock hel
4290: 64 20 62 79 20 61 20 64 61 74 61 62 61 73 65 20  d by a database 
42a0: 72 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 72 75 63  reader..*/.struc
42b0: 74 20 53 68 6d 52 65 61 64 65 72 20 7b 0a 20 20  t ShmReader {.  
42c0: 75 33 32 20 69 54 72 65 65 49 64 3b 0a 20 20 69  u32 iTreeId;.  i
42d0: 36 34 20 69 4c 73 6d 49 64 3b 0a 7d 3b 0a 0a 2f  64 iLsmId;.};../
42e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
42f0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
4300: 72 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  re is stored in 
4310: 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64  the first shared
4320: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 70 61 67 65 2e  -memory.** page.
4330: 20 54 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   The shared-memo
4340: 72 79 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  ry header..**.**
4350: 20 62 57 72 69 74 65 72 3a 0a 2a 2a 20 20 20 49   bWriter:.**   I
4360: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
4370: 20 6f 70 65 6e 69 6e 67 20 61 20 77 72 69 74 65   opening a write
4380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 61 6b   transaction tak
4390: 69 6e 67 20 74 68 65 20 57 52 49 54 45 52 20 6c  ing the WRITER l
43a0: 6f 63 6b 2c 20 0a 2a 2a 20 20 20 65 61 63 68 20  ock, .**   each 
43b0: 77 72 69 74 65 72 20 63 6c 69 65 6e 74 20 73 65  writer client se
43c0: 74 73 20 74 68 69 73 20 66 6c 61 67 2e 20 49 74  ts this flag. It
43d0: 20 69 73 20 63 6c 65 61 72 65 64 20 72 69 67 68   is cleared righ
43e0: 74 20 62 65 66 6f 72 65 20 74 68 65 20 0a 2a 2a  t before the .**
43f0: 20 20 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69     WRITER lock i
4400: 73 20 72 65 6c 69 6e 71 75 69 73 68 65 64 2e 20  s relinquished. 
4410: 49 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  If a subsequent 
4420: 77 72 69 74 65 72 20 66 69 6e 64 73 20 74 68 61  writer finds tha
4430: 74 20 74 68 69 73 0a 2a 2a 20 20 20 66 6c 61 67  t this.**   flag
4440: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
4450: 77 68 65 6e 20 61 20 77 72 69 74 65 20 74 72 61  when a write tra
4460: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
4470: 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
4480: 65 73 0a 2a 2a 20 20 20 74 68 61 74 20 61 20 70  es.**   that a p
4490: 72 65 76 69 6f 75 73 20 77 72 69 74 65 72 20 66  revious writer f
44a0: 61 69 6c 65 64 20 6d 69 64 2d 74 72 61 6e 73 61  ailed mid-transa
44b0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 4d 65  ction..**.** iMe
44c0: 74 61 50 61 67 65 3a 0a 2a 2a 20 20 20 49 66 20  taPage:.**   If 
44d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
44e0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
44f0: 69 6e 20 61 20 76 61 6c 69 64 2c 20 73 79 6e 63  in a valid, sync
4500: 65 64 2c 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  ed, checkpoint, 
4510: 74 68 69 73 0a 2a 2a 20 20 20 76 61 6c 75 65 20  this.**   value 
4520: 69 73 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68  is set to 0. Oth
4530: 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 73 65  erwise, it is se
4540: 74 20 74 6f 20 74 68 65 20 6d 65 74 61 2d 70 61  t to the meta-pa
4550: 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 0a 2a  ge number that.*
4560: 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  *   contains the
4570: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
4580: 72 69 74 74 65 6e 20 63 68 65 63 6b 70 6f 69 6e  ritten checkpoin
4590: 74 20 28 65 69 74 68 65 72 20 31 20 6f 72 20 32  t (either 1 or 2
45a0: 29 2e 0a 2a 2a 0a 2a 2a 20 68 64 72 31 2c 20 68  )..**.** hdr1, h
45b0: 64 72 32 3a 0a 2a 2a 20 20 20 54 68 65 20 74 77  dr2:.**   The tw
45c0: 6f 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  o copies of the 
45d0: 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 68  in-memory tree h
45e0: 65 61 64 65 72 2e 20 54 77 6f 20 63 6f 70 69 65  eader. Two copie
45f0: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 0a 2a  s are required.*
4600: 2a 20 20 20 69 6e 20 63 61 73 65 20 61 20 77 72  *   in case a wr
4610: 69 74 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  iter fails while
4620: 20 75 70 64 61 74 69 6e 67 20 6f 6e 65 20 6f 66   updating one of
4630: 20 74 68 65 6d 2e 0a 2a 2f 0a 73 74 72 75 63 74   them..*/.struct
4640: 20 53 68 6d 48 65 61 64 65 72 20 7b 0a 20 20 75   ShmHeader {.  u
4650: 33 32 20 61 53 6e 61 70 31 5b 4c 53 4d 5f 4d 45  32 aSnap1[LSM_ME
4660: 54 41 5f 50 41 47 45 5f 53 49 5a 45 20 2f 20 34  TA_PAGE_SIZE / 4
4670: 5d 3b 0a 20 20 75 33 32 20 61 53 6e 61 70 32 5b  ];.  u32 aSnap2[
4680: 4c 53 4d 5f 4d 45 54 41 5f 50 41 47 45 5f 53 49  LSM_META_PAGE_SI
4690: 5a 45 20 2f 20 34 5d 3b 0a 20 20 75 33 32 20 62  ZE / 4];.  u32 b
46a0: 57 72 69 74 65 72 3b 0a 20 20 75 33 32 20 69 4d  Writer;.  u32 iM
46b0: 65 74 61 50 61 67 65 3b 0a 20 20 54 72 65 65 48  etaPage;.  TreeH
46c0: 65 61 64 65 72 20 68 64 72 31 3b 0a 20 20 54 72  eader hdr1;.  Tr
46d0: 65 65 48 65 61 64 65 72 20 68 64 72 32 3b 0a 20  eeHeader hdr2;. 
46e0: 20 53 68 6d 52 65 61 64 65 72 20 61 52 65 61 64   ShmReader aRead
46f0: 65 72 5b 4c 53 4d 5f 4c 4f 43 4b 5f 4e 52 45 41  er[LSM_LOCK_NREA
4700: 44 45 52 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  DER];.};../*.** 
4710: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4720: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
4730: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
4740: 74 61 72 74 20 6f 66 20 65 61 63 68 20 73 68 61  tart of each sha
4750: 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 63 68  red-memory.** ch
4760: 75 6e 6b 20 65 78 63 65 70 74 20 74 68 65 20 66  unk except the f
4770: 69 72 73 74 20 28 77 68 69 63 68 20 69 73 20 74  irst (which is t
4780: 68 65 20 68 65 61 64 65 72 20 63 68 75 6e 6b 20  he header chunk 
4790: 2d 20 73 65 65 20 61 62 6f 76 65 29 2e 0a 2a 2f  - see above)..*/
47a0: 0a 73 74 72 75 63 74 20 53 68 6d 43 68 75 6e 6b  .struct ShmChunk
47b0: 20 7b 0a 20 20 75 33 32 20 69 53 68 6d 69 64 3b   {.  u32 iShmid;
47c0: 0a 20 20 75 33 32 20 69 4e 65 78 74 3b 0a 7d 3b  .  u32 iNext;.};
47d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
47e0: 6e 75 6d 62 65 72 20 6f 66 20 73 68 61 72 65 64  number of shared
47f0: 2d 6d 65 6d 6f 72 79 20 63 68 75 6e 6b 73 20 61  -memory chunks a
4800: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 2a 2d  llowed in the *-
4810: 73 68 6d 20 66 69 6c 65 2e 20 53 69 6e 63 65 0a  shm file. Since.
4820: 2a 2a 20 65 61 63 68 20 73 68 61 72 65 64 2d 6d  ** each shared-m
4830: 65 6d 6f 72 79 20 63 68 75 6e 6b 20 69 73 20 33  emory chunk is 3
4840: 32 4b 42 20 69 6e 20 73 69 7a 65 2c 20 74 68 69  2KB in size, thi
4850: 73 20 69 73 20 61 20 74 68 65 6f 72 65 74 69 63  s is a theoretic
4860: 61 6c 20 6c 69 6d 69 74 20 6f 6e 6c 79 2e 0a 2a  al limit only..*
4870: 2f 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4d 41  /.#define LSM_MA
4880: 58 5f 53 48 4d 43 48 55 4e 4b 53 20 20 28 31 3c  X_SHMCHUNKS  (1<
4890: 3c 33 30 29 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  <30)../* Return 
48a0: 74 72 75 65 20 69 66 20 73 68 6d 2d 73 65 71 75  true if shm-sequ
48b0: 65 6e 63 65 20 22 61 22 20 69 73 20 6c 61 72 67  ence "a" is larg
48c0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
48d0: 20 74 6f 20 22 62 22 20 2a 2f 0a 23 64 65 66 69   to "b" */.#defi
48e0: 6e 65 20 73 68 6d 5f 73 65 71 75 65 6e 63 65 5f  ne shm_sequence_
48f0: 67 65 28 61 2c 20 62 29 20 28 28 28 75 33 32 29  ge(a, b) (((u32)
4900: 61 2d 28 75 33 32 29 62 29 20 3c 20 4c 53 4d 5f  a-(u32)b) < LSM_
4910: 4d 41 58 5f 53 48 4d 43 48 55 4e 4b 53 29 0a 0a  MAX_SHMCHUNKS)..
4920: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 41 50 50 4c  #define LSM_APPL
4930: 49 53 54 5f 53 5a 20 34 0a 0a 2f 2a 0a 2a 2a 20  IST_SZ 4../*.** 
4940: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
4960: 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 74 68  ucture stores th
4970: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 72 74  e in-memory part
4980: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   of.** the curre
4990: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 20 6c 69  nt free block li
49a0: 73 74 2e 20 54 68 69 73 20 73 74 72 75 63 74 75  st. This structu
49b0: 72 65 20 69 73 20 74 6f 20 74 68 65 20 66 72 65  re is to the fre
49c0: 65 20 62 6c 6f 63 6b 20 6c 69 73 74 0a 2a 2a 20  e block list.** 
49d0: 61 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  as the in-memory
49e0: 20 74 72 65 65 20 69 73 20 74 6f 20 74 68 65 20   tree is to the 
49f0: 75 73 65 72 73 20 64 61 74 61 62 61 73 65 20 63  users database c
4a00: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4a10: 65 6e 74 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ents .** of the 
4a20: 66 72 65 65 20 62 6c 6f 63 6b 20 6c 69 73 74 20  free block list 
4a30: 69 73 20 66 6f 75 6e 64 20 62 79 20 6d 65 72 67  is found by merg
4a40: 69 6e 67 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ing the in-memor
4a50: 79 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 0a 2a 2a  y components .**
4a60: 20 77 69 74 68 20 74 68 6f 73 65 20 73 74 6f 72   with those stor
4a70: 65 64 20 69 6e 20 74 68 65 20 4c 53 4d 2c 20 6a  ed in the LSM, j
4a80: 75 73 74 20 61 73 20 74 68 65 20 63 6f 6e 74 65  ust as the conte
4a90: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
4aa0: 61 73 65 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 20  ase is.** found 
4ab0: 62 79 20 6d 65 72 67 69 6e 67 20 74 68 65 20 69  by merging the i
4ac0: 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 77 69  n-memory tree wi
4ad0: 74 68 20 74 68 65 20 75 73 65 72 20 64 61 74 61  th the user data
4ae0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a   entries in the.
4af0: 2a 2a 20 4c 53 4d 2e 0a 2a 2a 0a 2a 2a 20 45 61  ** LSM..**.** Ea
4b00: 63 68 20 46 72 65 65 6c 69 73 74 45 6e 74 72 79  ch FreelistEntry
4b10: 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68   structure in th
4b20: 65 20 61 72 72 61 79 20 72 65 70 72 65 73 65 6e  e array represen
4b30: 74 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 73  ts either an ins
4b40: 65 72 74 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65  ert.** or delete
4b50: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
4b60: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 46 6f 72  e free-list. For
4b70: 20 64 65 6c 65 74 65 73 2c 20 74 68 65 20 46 72   deletes, the Fr
4b80: 65 65 6c 69 73 74 45 6e 74 72 79 2e 69 49 64 0a  eelistEntry.iId.
4b90: 2a 2a 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  ** field is set 
4ba0: 74 6f 20 2d 31 2e 20 46 6f 72 20 69 6e 73 65 72  to -1. For inser
4bb0: 74 73 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f  ts, it is set to
4bc0: 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72   zero or greater
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  . .**.** The arr
4be0: 61 79 20 6f 66 20 46 72 65 65 6c 69 73 74 45 6e  ay of FreelistEn
4bf0: 74 72 79 20 73 74 72 75 63 74 75 72 65 73 20 69  try structures i
4c00: 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
4c10: 69 6e 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 62  in order of.** b
4c20: 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 28 61 73 63  lock number (asc
4c30: 65 6e 64 69 6e 67 29 2e 0a 2a 2a 0a 2a 2a 20 57  ending)..**.** W
4c40: 68 65 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  hen the in-memor
4c50: 79 20 66 72 65 65 20 62 6c 6f 63 6b 20 6c 69 73  y free block lis
4c60: 74 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  t is written int
4c70: 6f 20 74 68 65 20 4c 53 4d 2c 20 65 61 63 68 20  o the LSM, each 
4c80: 69 6e 73 65 72 74 0a 2a 2a 20 6f 70 65 72 61 74  insert.** operat
4c90: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 20 73  ion is written s
4ca0: 65 70 61 72 61 74 65 6c 79 2e 20 54 68 65 20 65  eparately. The e
4cb0: 6e 74 72 79 20 6b 65 79 20 69 73 20 74 68 65 20  ntry key is the 
4cc0: 62 69 74 77 69 73 65 20 69 6e 76 65 72 73 65 0a  bitwise inverse.
4cd0: 2a 2a 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ** of the block 
4ce0: 6e 75 6d 62 65 72 20 61 73 20 61 20 33 32 2d 62  number as a 32-b
4cf0: 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  it big-endian in
4d00: 74 65 67 65 72 2e 20 54 68 69 73 20 69 73 20 64  teger. This is d
4d10: 6f 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  one so that.** t
4d20: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  he entries in th
4d30: 65 20 4c 53 4d 20 61 72 65 20 73 6f 72 74 65 64  e LSM are sorted
4d40: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
4d50: 72 64 65 72 20 6f 66 20 62 6c 6f 63 6b 20 69 64  rder of block id
4d60: 2e 20 0a 2a 2a 20 54 68 65 20 61 73 73 6f 63 69  . .** The associ
4d70: 61 74 65 64 20 76 61 6c 75 65 20 69 73 20 74 68  ated value is th
4d80: 65 20 73 6e 61 70 73 68 6f 74 20 69 64 2c 20 66  e snapshot id, f
4d90: 6f 72 6d 61 74 65 64 20 61 73 20 61 20 76 61 72  ormated as a var
4da0: 69 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  int..*/.struct F
4db0: 72 65 65 6c 69 73 74 20 7b 0a 20 20 46 72 65 65  reelist {.  Free
4dc0: 6c 69 73 74 45 6e 74 72 79 20 2a 61 45 6e 74 72  listEntry *aEntr
4dd0: 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  y;          /* F
4de0: 72 65 65 20 6c 69 73 74 20 65 6e 74 72 69 65 73  ree list entries
4df0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79   */.  int nEntry
4e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4e20: 6f 66 20 76 61 6c 69 64 20 73 6c 6f 74 73 20 69  of valid slots i
4e30: 6e 20 61 45 6e 74 72 79 5b 5d 20 2a 2f 0a 20 20  n aEntry[] */.  
4e40: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
4e70: 65 20 6f 66 20 61 45 6e 74 72 79 5b 5d 20 2a 2f  e of aEntry[] */
4e80: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 72 65 65 6c  .};.struct Freel
4e90: 69 73 74 45 6e 74 72 79 20 7b 0a 20 20 75 33 32  istEntry {.  u32
4ea0: 20 69 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20   iBlk;          
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ec0: 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 2a 2f 0a  Block number */.
4ed0: 20 20 69 36 34 20 69 49 64 3b 20 20 20 20 20 20    i64 iId;      
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 73 6e 61    /* Largest sna
4f00: 70 73 68 6f 74 20 69 64 20 74 6f 20 75 73 65 20  pshot id to use 
4f10: 74 68 69 73 20 62 6c 6f 63 6b 20 2a 2f 0a 7d 3b  this block */.};
4f20: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 6e 61 70 73 68  ../*.** A snapsh
4f30: 6f 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ot of a database
4f40: 2e 20 41 20 73 6e 61 70 73 68 6f 74 20 63 6f 6e  . A snapshot con
4f50: 74 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 69 6e  tains all the in
4f60: 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72  formation requir
4f70: 65 64 0a 2a 2a 20 74 6f 20 72 65 61 64 20 6f 72  ed.** to read or
4f80: 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
4f90: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
4fa0: 53 65 65 20 74 68 65 20 64 65 73 63 72 69 70 74  See the descript
4fb0: 69 6f 6e 20 6f 66 20 73 74 72 75 63 74 0a 2a 2a  ion of struct.**
4fc0: 20 44 61 74 61 62 61 73 65 20 62 65 6c 6f 77 20   Database below 
4fd0: 66 6f 72 20 66 75 74 68 65 72 20 64 65 74 61 69  for futher detai
4fe0: 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 6e  ls..*/.struct Sn
4ff0: 61 70 73 68 6f 74 20 7b 0a 20 20 44 61 74 61 62  apshot {.  Datab
5000: 61 73 65 20 2a 70 44 61 74 61 62 61 73 65 3b 20  ase *pDatabase; 
5010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5020: 74 61 62 61 73 65 20 74 68 69 73 20 73 6e 61 70  tabase this snap
5030: 73 68 6f 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  shot belongs to 
5040: 2a 2f 0a 20 20 75 33 32 20 69 43 6d 70 49 64 3b  */.  u32 iCmpId;
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 63 6f       /* Id of co
5070: 6d 70 72 65 73 73 69 6f 6e 20 73 63 68 65 6d 65  mpression scheme
5080: 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 65   */.  Level *pLe
5090: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
50a0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
50b0: 20 74 6f 20 6c 65 76 65 6c 20 30 20 6f 66 20 73   to level 0 of s
50c0: 6e 61 70 73 68 6f 74 20 28 6f 72 20 4e 55 4c 4c  napshot (or NULL
50d0: 29 20 2a 2f 0a 20 20 69 36 34 20 69 49 64 3b 20  ) */.  i64 iId; 
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 53 6e 61 70 73 68         /* Snapsh
5100: 6f 74 20 69 64 20 2a 2f 0a 20 20 69 36 34 20 69  ot id */.  i64 i
5110: 4c 6f 67 4f 66 66 3b 20 20 20 20 20 20 20 20 20  LogOff;         
5120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5130: 67 20 66 69 6c 65 20 6f 66 66 73 65 74 20 2a 2f  g file offset */
5140: 0a 20 20 52 65 64 69 72 65 63 74 20 72 65 64 69  .  Redirect redi
5150: 72 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  rect;           
5160: 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 72 65 64 69     /* Block redi
5170: 72 65 63 74 69 6f 6e 20 61 72 72 61 79 20 2a 2f  rection array */
5180: 0a 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 77  ..  /* Used by w
5190: 6f 72 6b 65 72 20 73 6e 61 70 73 68 6f 74 73 20  orker snapshots 
51a0: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  only */.  int nB
51b0: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51d0: 4e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  Number of blocks
51e0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
51f0: 65 20 2a 2f 0a 20 20 4c 73 6d 50 67 6e 6f 20 61  e */.  LsmPgno a
5200: 69 41 70 70 65 6e 64 5b 4c 53 4d 5f 41 50 50 4c  iAppend[LSM_APPL
5210: 49 53 54 5f 53 5a 5d 3b 20 20 2f 2a 20 41 70 70  IST_SZ];  /* App
5220: 65 6e 64 20 70 6f 69 6e 74 20 6c 69 73 74 20 2a  end point list *
5230: 2f 0a 20 20 46 72 65 65 6c 69 73 74 20 66 72 65  /.  Freelist fre
5240: 65 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  elist;          
5250: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
5260: 6c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 20 20 75  lock list */.  u
5270: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
52a0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
52b0: 65 6e 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 7d 3b  en to disk */.};
52c0: 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 49 4e 49  .#define LSM_INI
52d0: 54 49 41 4c 5f 53 4e 41 50 53 48 4f 54 5f 49 44  TIAL_SNAPSHOT_ID
52e0: 20 31 31 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74   11../*.** Funct
52f0: 69 6f 6e 73 20 66 72 6f 6d 20 66 69 6c 65 20 22  ions from file "
5300: 6c 73 6d 5f 63 6b 70 74 2e 63 22 2e 0a 2a 2f 0a  lsm_ckpt.c"..*/.
5310: 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e  int lsmCheckpoin
5320: 74 57 72 69 74 65 28 6c 73 6d 5f 64 62 20 2a 2c  tWrite(lsm_db *,
5330: 20 75 33 32 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d   u32 *);.int lsm
5340: 43 68 65 63 6b 70 6f 69 6e 74 4c 65 76 65 6c 73  CheckpointLevels
5350: 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 2c 20  (lsm_db *, int, 
5360: 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b  void **, int *);
5370: 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69  .int lsmCheckpoi
5380: 6e 74 4c 6f 61 64 4c 65 76 65 6c 73 28 6c 73 6d  ntLoadLevels(lsm
5390: 5f 64 62 20 2a 70 44 62 2c 20 76 6f 69 64 20 2a  _db *pDb, void *
53a0: 70 56 61 6c 2c 20 69 6e 74 20 6e 56 61 6c 29 3b  pVal, int nVal);
53b0: 0a 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f  ..int lsmCheckpo
53c0: 69 6e 74 52 65 63 6f 76 65 72 28 6c 73 6d 5f 64  intRecover(lsm_d
53d0: 62 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 43 68 65  b *);.int lsmChe
53e0: 63 6b 70 6f 69 6e 74 44 65 73 65 72 69 61 6c 69  ckpointDeseriali
53f0: 7a 65 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74  ze(lsm_db *, int
5400: 2c 20 75 33 32 20 2a 2c 20 53 6e 61 70 73 68 6f  , u32 *, Snapsho
5410: 74 20 2a 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 43  t **);..int lsmC
5420: 68 65 63 6b 70 6f 69 6e 74 4c 6f 61 64 57 6f 72  heckpointLoadWor
5430: 6b 65 72 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29  ker(lsm_db *pDb)
5440: 3b 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f  ;.int lsmCheckpo
5450: 69 6e 74 53 74 6f 72 65 28 6c 73 6d 5f 64 62 20  intStore(lsm_db 
5460: 2a 70 44 62 2c 20 69 6e 74 29 3b 0a 0a 69 6e 74  *pDb, int);..int
5470: 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4c 6f   lsmCheckpointLo
5480: 61 64 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  ad(lsm_db *pDb, 
5490: 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 43  int *);.int lsmC
54a0: 68 65 63 6b 70 6f 69 6e 74 4c 6f 61 64 4f 6b 28  heckpointLoadOk(
54b0: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74  lsm_db *pDb, int
54c0: 29 3b 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70  );.int lsmCheckp
54d0: 6f 69 6e 74 43 6c 69 65 6e 74 43 61 63 68 65 4f  ointClientCacheO
54e0: 6b 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 0a 75 33  k(lsm_db *);..u3
54f0: 32 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4e  2 lsmCheckpointN
5500: 42 6c 6f 63 6b 28 75 33 32 20 2a 29 3b 0a 69 36  Block(u32 *);.i6
5510: 34 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 49  4 lsmCheckpointI
5520: 64 28 75 33 32 20 2a 2c 20 69 6e 74 29 3b 0a 75  d(u32 *, int);.u
5530: 33 32 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74  32 lsmCheckpoint
5540: 4e 57 72 69 74 65 28 75 33 32 20 2a 2c 20 69 6e  NWrite(u32 *, in
5550: 74 29 3b 0a 69 36 34 20 6c 73 6d 43 68 65 63 6b  t);.i64 lsmCheck
5560: 70 6f 69 6e 74 4c 6f 67 4f 66 66 73 65 74 28 75  pointLogOffset(u
5570: 33 32 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 43 68  32 *);.int lsmCh
5580: 65 63 6b 70 6f 69 6e 74 50 67 73 7a 28 75 33 32  eckpointPgsz(u32
5590: 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 43 68 65 63   *);.int lsmChec
55a0: 6b 70 6f 69 6e 74 42 6c 6b 73 7a 28 75 33 32 20  kpointBlksz(u32 
55b0: 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 43 68 65 63  *);.void lsmChec
55c0: 6b 70 6f 69 6e 74 4c 6f 67 6f 66 66 73 65 74 28  kpointLogoffset(
55d0: 75 33 32 20 2a 61 43 6b 70 74 2c 20 44 62 4c 6f  u32 *aCkpt, DbLo
55e0: 67 20 2a 70 4c 6f 67 29 3b 0a 76 6f 69 64 20 6c  g *pLog);.void l
55f0: 73 6d 43 68 65 63 6b 70 6f 69 6e 74 5a 65 72 6f  smCheckpointZero
5600: 4c 6f 67 6f 66 66 73 65 74 28 6c 73 6d 5f 64 62  Logoffset(lsm_db
5610: 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 43 68 65   *);..int lsmChe
5620: 63 6b 70 6f 69 6e 74 53 61 76 65 57 6f 72 6b 65  ckpointSaveWorke
5630: 72 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69  r(lsm_db *pDb, i
5640: 6e 74 29 3b 0a 69 6e 74 20 6c 73 6d 44 61 74 61  nt);.int lsmData
5650: 62 61 73 65 46 75 6c 6c 28 6c 73 6d 5f 64 62 20  baseFull(lsm_db 
5660: 2a 70 44 62 29 3b 0a 69 6e 74 20 6c 73 6d 43 68  *pDb);.int lsmCh
5670: 65 63 6b 70 6f 69 6e 74 53 79 6e 63 65 64 28 6c  eckpointSynced(l
5680: 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 36 34 20  sm_db *pDb, i64 
5690: 2a 70 69 49 64 2c 20 69 36 34 20 2a 70 69 4c 6f  *piId, i64 *piLo
56a0: 67 2c 20 75 33 32 20 2a 70 6e 57 72 69 74 65 29  g, u32 *pnWrite)
56b0: 3b 0a 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70  ;..int lsmCheckp
56c0: 6f 69 6e 74 53 69 7a 65 28 6c 73 6d 5f 64 62 20  ointSize(lsm_db 
56d0: 2a 64 62 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65  *db, int *pnByte
56e0: 29 3b 0a 0a 69 6e 74 20 6c 73 6d 49 6e 66 6f 43  );..int lsmInfoC
56f0: 6f 6d 70 72 65 73 73 69 6f 6e 49 64 28 6c 73 6d  ompressionId(lsm
5700: 5f 64 62 20 2a 64 62 2c 20 75 33 32 20 2a 70 69  _db *db, u32 *pi
5710: 43 6d 70 49 64 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20  CmpId);../* .** 
5720: 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 66  Functions from f
5730: 69 6c 65 20 22 6c 73 6d 5f 74 72 65 65 2e 63 22  ile "lsm_tree.c"
5740: 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 54 72 65 65  ..*/.int lsmTree
5750: 4e 65 77 28 6c 73 6d 5f 65 6e 76 20 2a 2c 20 69  New(lsm_env *, i
5760: 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 69  nt (*)(void *, i
5770: 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29  nt, void *, int)
5780: 2c 20 54 72 65 65 20 2a 2a 70 70 54 72 65 65 29  , Tree **ppTree)
5790: 3b 0a 76 6f 69 64 20 6c 73 6d 54 72 65 65 52 65  ;.void lsmTreeRe
57a0: 6c 65 61 73 65 28 6c 73 6d 5f 65 6e 76 20 2a 2c  lease(lsm_env *,
57b0: 20 54 72 65 65 20 2a 29 3b 0a 69 6e 74 20 6c 73   Tree *);.int ls
57c0: 6d 54 72 65 65 49 6e 69 74 28 6c 73 6d 5f 64 62  mTreeInit(lsm_db
57d0: 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 54 72 65 65   *);.int lsmTree
57e0: 52 65 70 61 69 72 28 6c 73 6d 5f 64 62 20 2a 29  Repair(lsm_db *)
57f0: 3b 0a 0a 76 6f 69 64 20 6c 73 6d 54 72 65 65 4d  ;..void lsmTreeM
5800: 61 6b 65 4f 6c 64 28 6c 73 6d 5f 64 62 20 2a 70  akeOld(lsm_db *p
5810: 44 62 29 3b 0a 76 6f 69 64 20 6c 73 6d 54 72 65  Db);.void lsmTre
5820: 65 44 69 73 63 61 72 64 4f 6c 64 28 6c 73 6d 5f  eDiscardOld(lsm_
5830: 64 62 20 2a 70 44 62 29 3b 0a 69 6e 74 20 6c 73  db *pDb);.int ls
5840: 6d 54 72 65 65 48 61 73 4f 6c 64 28 6c 73 6d 5f  mTreeHasOld(lsm_
5850: 64 62 20 2a 70 44 62 29 3b 0a 0a 69 6e 74 20 6c  db *pDb);..int l
5860: 73 6d 54 72 65 65 53 69 7a 65 28 6c 73 6d 5f 64  smTreeSize(lsm_d
5870: 62 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 54 72 65  b *);.int lsmTre
5880: 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
5890: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74  lsm_db *pDb, int
58a0: 20 62 43 6f 6d 6d 69 74 29 3b 0a 69 6e 74 20 6c   bCommit);.int l
58b0: 73 6d 54 72 65 65 4c 6f 61 64 48 65 61 64 65 72  smTreeLoadHeader
58c0: 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e  (lsm_db *pDb, in
58d0: 74 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 54 72 65  t *);.int lsmTre
58e0: 65 4c 6f 61 64 48 65 61 64 65 72 4f 6b 28 6c 73  eLoadHeaderOk(ls
58f0: 6d 5f 64 62 20 2a 2c 20 69 6e 74 29 3b 0a 0a 69  m_db *, int);..i
5900: 6e 74 20 6c 73 6d 54 72 65 65 49 6e 73 65 72 74  nt lsmTreeInsert
5910: 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 76 6f  (lsm_db *pDb, vo
5920: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
5930: 65 79 2c 20 76 6f 69 64 20 2a 70 56 61 6c 2c 20  ey, void *pVal, 
5940: 69 6e 74 20 6e 56 61 6c 29 3b 0a 69 6e 74 20 6c  int nVal);.int l
5950: 73 6d 54 72 65 65 44 65 6c 65 74 65 28 6c 73 6d  smTreeDelete(lsm
5960: 5f 64 62 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  _db *db, void *p
5970: 4b 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79 31 2c  Key1, int nKey1,
5980: 20 76 6f 69 64 20 2a 70 4b 65 79 32 2c 20 69 6e   void *pKey2, in
5990: 74 20 6e 4b 65 79 32 29 3b 0a 76 6f 69 64 20 6c  t nKey2);.void l
59a0: 73 6d 54 72 65 65 52 6f 6c 6c 62 61 63 6b 28 6c  smTreeRollback(l
59b0: 73 6d 5f 64 62 20 2a 70 44 62 2c 20 54 72 65 65  sm_db *pDb, Tree
59c0: 4d 61 72 6b 20 2a 70 4d 61 72 6b 29 3b 0a 76 6f  Mark *pMark);.vo
59d0: 69 64 20 6c 73 6d 54 72 65 65 4d 61 72 6b 28 6c  id lsmTreeMark(l
59e0: 73 6d 5f 64 62 20 2a 70 44 62 2c 20 54 72 65 65  sm_db *pDb, Tree
59f0: 4d 61 72 6b 20 2a 70 4d 61 72 6b 29 3b 0a 0a 69  Mark *pMark);..i
5a00: 6e 74 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72  nt lsmTreeCursor
5a10: 4e 65 77 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  New(lsm_db *pDb,
5a20: 20 69 6e 74 2c 20 54 72 65 65 43 75 72 73 6f 72   int, TreeCursor
5a30: 20 2a 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 54 72   **);.void lsmTr
5a40: 65 65 43 75 72 73 6f 72 44 65 73 74 72 6f 79 28  eeCursorDestroy(
5a50: 54 72 65 65 43 75 72 73 6f 72 20 2a 29 3b 0a 0a  TreeCursor *);..
5a60: 69 6e 74 20 6c 73 6d 54 72 65 65 43 75 72 73 6f  int lsmTreeCurso
5a70: 72 53 65 65 6b 28 54 72 65 65 43 75 72 73 6f 72  rSeek(TreeCursor
5a80: 20 2a 70 43 73 72 2c 20 76 6f 69 64 20 2a 70 4b   *pCsr, void *pK
5a90: 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 69 6e  ey, int nKey, in
5aa0: 74 20 2a 70 52 65 73 29 3b 0a 69 6e 74 20 6c 73  t *pRes);.int ls
5ab0: 6d 54 72 65 65 43 75 72 73 6f 72 4e 65 78 74 28  mTreeCursorNext(
5ac0: 54 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  TreeCursor *pCsr
5ad0: 29 3b 0a 69 6e 74 20 6c 73 6d 54 72 65 65 43 75  );.int lsmTreeCu
5ae0: 72 73 6f 72 50 72 65 76 28 54 72 65 65 43 75 72  rsorPrev(TreeCur
5af0: 73 6f 72 20 2a 70 43 73 72 29 3b 0a 69 6e 74 20  sor *pCsr);.int 
5b00: 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 45 6e 64  lsmTreeCursorEnd
5b10: 28 54 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73  (TreeCursor *pCs
5b20: 72 2c 20 69 6e 74 20 62 4c 61 73 74 29 3b 0a 76  r, int bLast);.v
5b30: 6f 69 64 20 6c 73 6d 54 72 65 65 43 75 72 73 6f  oid lsmTreeCurso
5b40: 72 52 65 73 65 74 28 54 72 65 65 43 75 72 73 6f  rReset(TreeCurso
5b50: 72 20 2a 70 43 73 72 29 3b 0a 69 6e 74 20 6c 73  r *pCsr);.int ls
5b60: 6d 54 72 65 65 43 75 72 73 6f 72 4b 65 79 28 54  mTreeCursorKey(T
5b70: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  reeCursor *pCsr,
5b80: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 76 6f   int *pFlags, vo
5b90: 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69 6e 74 20  id **ppKey, int 
5ba0: 2a 70 6e 4b 65 79 29 3b 0a 69 6e 74 20 6c 73 6d  *pnKey);.int lsm
5bb0: 54 72 65 65 43 75 72 73 6f 72 46 6c 61 67 73 28  TreeCursorFlags(
5bc0: 54 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  TreeCursor *pCsr
5bd0: 29 3b 0a 69 6e 74 20 6c 73 6d 54 72 65 65 43 75  );.int lsmTreeCu
5be0: 72 73 6f 72 56 61 6c 75 65 28 54 72 65 65 43 75  rsorValue(TreeCu
5bf0: 72 73 6f 72 20 2a 70 43 73 72 2c 20 76 6f 69 64  rsor *pCsr, void
5c00: 20 2a 2a 70 70 56 61 6c 2c 20 69 6e 74 20 2a 70   **ppVal, int *p
5c10: 6e 56 61 6c 29 3b 0a 69 6e 74 20 6c 73 6d 54 72  nVal);.int lsmTr
5c20: 65 65 43 75 72 73 6f 72 56 61 6c 69 64 28 54 72  eeCursorValid(Tr
5c30: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29 3b  eeCursor *pCsr);
5c40: 0a 69 6e 74 20 6c 73 6d 54 72 65 65 43 75 72 73  .int lsmTreeCurs
5c50: 6f 72 53 61 76 65 28 54 72 65 65 43 75 72 73 6f  orSave(TreeCurso
5c60: 72 20 2a 70 43 73 72 29 3b 0a 0a 76 6f 69 64 20  r *pCsr);..void 
5c70: 6c 73 6d 46 6c 61 67 73 54 6f 53 74 72 69 6e 67  lsmFlagsToString
5c80: 28 69 6e 74 20 66 6c 61 67 73 2c 20 63 68 61 72  (int flags, char
5c90: 20 2a 7a 46 6c 61 67 73 29 3b 0a 0a 2f 2a 20 0a   *zFlags);../* .
5ca0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  ** Functions fro
5cb0: 6d 20 66 69 6c 65 20 22 6d 65 6d 2e 63 22 2e 0a  m file "mem.c"..
5cc0: 2a 2f 0a 76 6f 69 64 20 2a 6c 73 6d 4d 61 6c 6c  */.void *lsmMall
5cd0: 6f 63 28 6c 73 6d 5f 65 6e 76 2a 2c 20 73 69 7a  oc(lsm_env*, siz
5ce0: 65 5f 74 29 3b 0a 76 6f 69 64 20 6c 73 6d 46 72  e_t);.void lsmFr
5cf0: 65 65 28 6c 73 6d 5f 65 6e 76 2a 2c 20 76 6f 69  ee(lsm_env*, voi
5d00: 64 20 2a 29 3b 0a 76 6f 69 64 20 2a 6c 73 6d 52  d *);.void *lsmR
5d10: 65 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e 76 2a 2c  ealloc(lsm_env*,
5d20: 20 76 6f 69 64 20 2a 2c 20 73 69 7a 65 5f 74 29   void *, size_t)
5d30: 3b 0a 76 6f 69 64 20 2a 6c 73 6d 52 65 61 6c 6c  ;.void *lsmReall
5d40: 6f 63 4f 72 46 72 65 65 28 6c 73 6d 5f 65 6e 76  ocOrFree(lsm_env
5d50: 2a 2c 20 76 6f 69 64 20 2a 2c 20 73 69 7a 65 5f  *, void *, size_
5d60: 74 29 3b 0a 76 6f 69 64 20 2a 6c 73 6d 52 65 61  t);.void *lsmRea
5d70: 6c 6c 6f 63 4f 72 46 72 65 65 52 63 28 6c 73 6d  llocOrFreeRc(lsm
5d80: 5f 65 6e 76 20 2a 2c 20 76 6f 69 64 20 2a 2c 20  _env *, void *, 
5d90: 73 69 7a 65 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a  size_t, int *);.
5da0: 0a 76 6f 69 64 20 2a 6c 73 6d 4d 61 6c 6c 6f 63  .void *lsmMalloc
5db0: 5a 65 72 6f 52 63 28 6c 73 6d 5f 65 6e 76 2a 2c  ZeroRc(lsm_env*,
5dc0: 20 73 69 7a 65 5f 74 2c 20 69 6e 74 20 2a 29 3b   size_t, int *);
5dd0: 0a 76 6f 69 64 20 2a 6c 73 6d 4d 61 6c 6c 6f 63  .void *lsmMalloc
5de0: 52 63 28 6c 73 6d 5f 65 6e 76 2a 2c 20 73 69 7a  Rc(lsm_env*, siz
5df0: 65 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a 76 6f  e_t, int *);..vo
5e00: 69 64 20 2a 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  id *lsmMallocZer
5e10: 6f 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c  o(lsm_env *pEnv,
5e20: 20 73 69 7a 65 5f 74 29 3b 0a 63 68 61 72 20 2a   size_t);.char *
5e30: 6c 73 6d 4d 61 6c 6c 6f 63 53 74 72 64 75 70 28  lsmMallocStrdup(
5e40: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 63  lsm_env *pEnv, c
5e50: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f  onst char *);../
5e60: 2a 20 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20  * .** Functions 
5e70: 66 72 6f 6d 20 66 69 6c 65 20 22 6c 73 6d 5f 6d  from file "lsm_m
5e80: 75 74 65 78 2e 63 22 2e 0a 2a 2f 0a 69 6e 74 20  utex.c"..*/.int 
5e90: 6c 73 6d 4d 75 74 65 78 53 74 61 74 69 63 28 6c  lsmMutexStatic(l
5ea0: 73 6d 5f 65 6e 76 2a 2c 20 69 6e 74 2c 20 6c 73  sm_env*, int, ls
5eb0: 6d 5f 6d 75 74 65 78 20 2a 2a 29 3b 0a 69 6e 74  m_mutex **);.int
5ec0: 20 6c 73 6d 4d 75 74 65 78 4e 65 77 28 6c 73 6d   lsmMutexNew(lsm
5ed0: 5f 65 6e 76 2a 2c 20 6c 73 6d 5f 6d 75 74 65 78  _env*, lsm_mutex
5ee0: 20 2a 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 4d 75   **);.void lsmMu
5ef0: 74 65 78 44 65 6c 28 6c 73 6d 5f 65 6e 76 2a 2c  texDel(lsm_env*,
5f00: 20 6c 73 6d 5f 6d 75 74 65 78 20 2a 29 3b 0a 76   lsm_mutex *);.v
5f10: 6f 69 64 20 6c 73 6d 4d 75 74 65 78 45 6e 74 65  oid lsmMutexEnte
5f20: 72 28 6c 73 6d 5f 65 6e 76 2a 2c 20 6c 73 6d 5f  r(lsm_env*, lsm_
5f30: 6d 75 74 65 78 20 2a 29 3b 0a 69 6e 74 20 6c 73  mutex *);.int ls
5f40: 6d 4d 75 74 65 78 54 72 79 28 6c 73 6d 5f 65 6e  mMutexTry(lsm_en
5f50: 76 2a 2c 20 6c 73 6d 5f 6d 75 74 65 78 20 2a 29  v*, lsm_mutex *)
5f60: 3b 0a 76 6f 69 64 20 6c 73 6d 4d 75 74 65 78 4c  ;.void lsmMutexL
5f70: 65 61 76 65 28 6c 73 6d 5f 65 6e 76 2a 2c 20 6c  eave(lsm_env*, l
5f80: 73 6d 5f 6d 75 74 65 78 20 2a 29 3b 0a 0a 23 69  sm_mutex *);..#i
5f90: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
5fa0: 20 6c 73 6d 4d 75 74 65 78 48 65 6c 64 28 6c 73   lsmMutexHeld(ls
5fb0: 6d 5f 65 6e 76 20 2a 2c 20 6c 73 6d 5f 6d 75 74  m_env *, lsm_mut
5fc0: 65 78 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 4d 75  ex *);.int lsmMu
5fd0: 74 65 78 4e 6f 74 48 65 6c 64 28 6c 73 6d 5f 65  texNotHeld(lsm_e
5fe0: 6e 76 20 2a 2c 20 6c 73 6d 5f 6d 75 74 65 78 20  nv *, lsm_mutex 
5ff0: 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a  *);.#endif../***
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74  *******.** Start
6050: 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 66 72   of functions fr
6060: 6f 6d 20 22 6c 73 6d 5f 66 69 6c 65 2e 63 22 2e  om "lsm_file.c".
6070: 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 46 73 4f 70 65  .*/.int lsmFsOpe
6080: 6e 28 6c 73 6d 5f 64 62 20 2a 2c 20 63 6f 6e 73  n(lsm_db *, cons
6090: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
60a0: 69 6e 74 20 6c 73 6d 46 73 4f 70 65 6e 4c 6f 67  int lsmFsOpenLog
60b0: 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 20 2a  (lsm_db *, int *
60c0: 29 3b 0a 76 6f 69 64 20 6c 73 6d 46 73 43 6c 6f  );.void lsmFsClo
60d0: 73 65 4c 6f 67 28 6c 73 6d 5f 64 62 20 2a 29 3b  seLog(lsm_db *);
60e0: 0a 76 6f 69 64 20 6c 73 6d 46 73 43 6c 6f 73 65  .void lsmFsClose
60f0: 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 29 3b 0a  (FileSystem *);.
6100: 0a 69 6e 74 20 6c 73 6d 46 73 55 6e 6d 61 70 28  .int lsmFsUnmap(
6110: 46 69 6c 65 53 79 73 74 65 6d 20 2a 29 3b 0a 0a  FileSystem *);..
6120: 69 6e 74 20 6c 73 6d 46 73 43 6f 6e 66 69 67 75  int lsmFsConfigu
6130: 72 65 28 6c 73 6d 5f 64 62 20 2a 64 62 29 3b 0a  re(lsm_db *db);.
6140: 0a 69 6e 74 20 6c 73 6d 46 73 42 6c 6f 63 6b 53  .int lsmFsBlockS
6150: 69 7a 65 28 46 69 6c 65 53 79 73 74 65 6d 20 2a  ize(FileSystem *
6160: 29 3b 0a 76 6f 69 64 20 6c 73 6d 46 73 53 65 74  );.void lsmFsSet
6170: 42 6c 6f 63 6b 53 69 7a 65 28 46 69 6c 65 53 79  BlockSize(FileSy
6180: 73 74 65 6d 20 2a 2c 20 69 6e 74 29 3b 0a 69 6e  stem *, int);.in
6190: 74 20 6c 73 6d 46 73 4d 6f 76 65 42 6c 6f 63 6b  t lsmFsMoveBlock
61a0: 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53  (FileSystem *pFS
61b0: 2c 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  , Segment *pSeg,
61c0: 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 69 46   int iTo, int iF
61d0: 72 6f 6d 29 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73  rom);..int lsmFs
61e0: 50 61 67 65 53 69 7a 65 28 46 69 6c 65 53 79 73  PageSize(FileSys
61f0: 74 65 6d 20 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d  tem *);.void lsm
6200: 46 73 53 65 74 50 61 67 65 53 69 7a 65 28 46 69  FsSetPageSize(Fi
6210: 6c 65 53 79 73 74 65 6d 20 2a 2c 20 69 6e 74 29  leSystem *, int)
6220: 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73 46 69 6c 65  ;..int lsmFsFile
6230: 69 64 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  id(lsm_db *pDb, 
6240: 76 6f 69 64 20 2a 2a 70 70 49 64 2c 20 69 6e 74  void **ppId, int
6250: 20 2a 70 6e 49 64 29 3b 0a 0a 2f 2a 20 43 72 65   *pnId);../* Cre
6260: 61 74 69 6e 67 2c 20 70 6f 70 75 6c 61 74 69 6e  ating, populatin
6270: 67 2c 20 67 6f 62 62 6c 69 6e 67 20 61 6e 64 20  g, gobbling and 
6280: 64 65 6c 65 74 69 6e 67 20 73 6f 72 74 65 64 20  deleting sorted 
6290: 72 75 6e 73 2e 20 2a 2f 0a 76 6f 69 64 20 6c 73  runs. */.void ls
62a0: 6d 46 73 47 6f 62 62 6c 65 28 6c 73 6d 5f 64 62  mFsGobble(lsm_db
62b0: 20 2a 2c 20 53 65 67 6d 65 6e 74 20 2a 2c 20 4c   *, Segment *, L
62c0: 73 6d 50 67 6e 6f 20 2a 2c 20 69 6e 74 29 3b 0a  smPgno *, int);.
62d0: 69 6e 74 20 6c 73 6d 46 73 53 6f 72 74 65 64 44  int lsmFsSortedD
62e0: 65 6c 65 74 65 28 46 69 6c 65 53 79 73 74 65 6d  elete(FileSystem
62f0: 20 2a 2c 20 53 6e 61 70 73 68 6f 74 20 2a 2c 20   *, Snapshot *, 
6300: 69 6e 74 2c 20 53 65 67 6d 65 6e 74 20 2a 29 3b  int, Segment *);
6310: 0a 69 6e 74 20 6c 73 6d 46 73 53 6f 72 74 65 64  .int lsmFsSorted
6320: 46 69 6e 69 73 68 28 46 69 6c 65 53 79 73 74 65  Finish(FileSyste
6330: 6d 20 2a 2c 20 53 65 67 6d 65 6e 74 20 2a 29 3b  m *, Segment *);
6340: 0a 69 6e 74 20 6c 73 6d 46 73 53 6f 72 74 65 64  .int lsmFsSorted
6350: 41 70 70 65 6e 64 28 46 69 6c 65 53 79 73 74 65  Append(FileSyste
6360: 6d 20 2a 2c 20 53 6e 61 70 73 68 6f 74 20 2a 2c  m *, Snapshot *,
6370: 20 4c 65 76 65 6c 20 2a 2c 20 69 6e 74 2c 20 50   Level *, int, P
6380: 61 67 65 20 2a 2a 29 3b 0a 69 6e 74 20 6c 73 6d  age **);.int lsm
6390: 46 73 53 6f 72 74 65 64 50 61 64 64 69 6e 67 28  FsSortedPadding(
63a0: 46 69 6c 65 53 79 73 74 65 6d 20 2a 2c 20 53 6e  FileSystem *, Sn
63b0: 61 70 73 68 6f 74 20 2a 2c 20 53 65 67 6d 65 6e  apshot *, Segmen
63c0: 74 20 2a 29 3b 0a 0a 2f 2a 20 46 75 6e 63 74 69  t *);../* Functi
63d0: 6f 6e 73 20 74 6f 20 72 65 74 72 69 65 76 65 20  ons to retrieve 
63e0: 74 68 65 20 6c 73 6d 5f 65 6e 76 20 70 6f 69 6e  the lsm_env poin
63f0: 74 65 72 20 66 72 6f 6d 20 61 20 46 69 6c 65 53  ter from a FileS
6400: 79 73 74 65 6d 20 6f 72 20 50 61 67 65 20 6f 62  ystem or Page ob
6410: 6a 65 63 74 20 2a 2f 0a 6c 73 6d 5f 65 6e 76 20  ject */.lsm_env 
6420: 2a 6c 73 6d 46 73 45 6e 76 28 46 69 6c 65 53 79  *lsmFsEnv(FileSy
6430: 73 74 65 6d 20 2a 29 3b 0a 6c 73 6d 5f 65 6e 76  stem *);.lsm_env
6440: 20 2a 6c 73 6d 50 61 67 65 45 6e 76 28 50 61 67   *lsmPageEnv(Pag
6450: 65 20 2a 29 3b 0a 46 69 6c 65 53 79 73 74 65 6d  e *);.FileSystem
6460: 20 2a 6c 73 6d 50 61 67 65 46 53 28 50 61 67 65   *lsmPageFS(Page
6470: 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73 53   *);..int lsmFsS
6480: 65 63 74 6f 72 53 69 7a 65 28 46 69 6c 65 53 79  ectorSize(FileSy
6490: 73 74 65 6d 20 2a 29 3b 0a 0a 76 6f 69 64 20 6c  stem *);..void l
64a0: 73 6d 53 6f 72 74 65 64 53 70 6c 69 74 6b 65 79  smSortedSplitkey
64b0: 28 6c 73 6d 5f 64 62 20 2a 2c 20 4c 65 76 65 6c  (lsm_db *, Level
64c0: 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f 2a 20   *, int *);../* 
64d0: 52 65 61 64 69 6e 67 20 73 6f 72 74 65 64 20 72  Reading sorted r
64e0: 75 6e 20 63 6f 6e 74 65 6e 74 2e 20 2a 2f 0a 69  un content. */.i
64f0: 6e 74 20 6c 73 6d 46 73 44 62 50 61 67 65 4c 61  nt lsmFsDbPageLa
6500: 73 74 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 70  st(FileSystem *p
6510: 46 53 2c 20 53 65 67 6d 65 6e 74 20 2a 70 53 65  FS, Segment *pSe
6520: 67 2c 20 50 61 67 65 20 2a 2a 70 70 50 67 29 3b  g, Page **ppPg);
6530: 0a 69 6e 74 20 6c 73 6d 46 73 44 62 50 61 67 65  .int lsmFsDbPage
6540: 47 65 74 28 46 69 6c 65 53 79 73 74 65 6d 20 2a  Get(FileSystem *
6550: 2c 20 53 65 67 6d 65 6e 74 20 2a 2c 20 4c 73 6d  , Segment *, Lsm
6560: 50 67 6e 6f 2c 20 50 61 67 65 20 2a 2a 29 3b 0a  Pgno, Page **);.
6570: 69 6e 74 20 6c 73 6d 46 73 44 62 50 61 67 65 4e  int lsmFsDbPageN
6580: 65 78 74 28 53 65 67 6d 65 6e 74 20 2a 2c 20 50  ext(Segment *, P
6590: 61 67 65 20 2a 2c 20 69 6e 74 20 65 44 69 72 2c  age *, int eDir,
65a0: 20 50 61 67 65 20 2a 2a 29 3b 0a 0a 75 38 20 2a   Page **);..u8 *
65b0: 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28 50 61  lsmFsPageData(Pa
65c0: 67 65 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e  ge *, int *);.in
65d0: 74 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61  t lsmFsPageRelea
65e0: 73 65 28 50 61 67 65 20 2a 29 3b 0a 69 6e 74 20  se(Page *);.int 
65f0: 6c 73 6d 46 73 50 61 67 65 50 65 72 73 69 73 74  lsmFsPagePersist
6600: 28 50 61 67 65 20 2a 29 3b 0a 76 6f 69 64 20 6c  (Page *);.void l
6610: 73 6d 46 73 50 61 67 65 52 65 66 28 50 61 67 65  smFsPageRef(Page
6620: 20 2a 29 3b 0a 4c 73 6d 50 67 6e 6f 20 6c 73 6d   *);.LsmPgno lsm
6630: 46 73 50 61 67 65 4e 75 6d 62 65 72 28 50 61 67  FsPageNumber(Pag
6640: 65 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73  e *);..int lsmFs
6650: 4e 52 65 61 64 28 46 69 6c 65 53 79 73 74 65 6d  NRead(FileSystem
6660: 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 46 73 4e 57   *);.int lsmFsNW
6670: 72 69 74 65 28 46 69 6c 65 53 79 73 74 65 6d 20  rite(FileSystem 
6680: 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73 4d 65  *);..int lsmFsMe
6690: 74 61 50 61 67 65 47 65 74 28 46 69 6c 65 53 79  taPageGet(FileSy
66a0: 73 74 65 6d 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  stem *, int, int
66b0: 2c 20 4d 65 74 61 50 61 67 65 20 2a 2a 29 3b 0a  , MetaPage **);.
66c0: 69 6e 74 20 6c 73 6d 46 73 4d 65 74 61 50 61 67  int lsmFsMetaPag
66d0: 65 52 65 6c 65 61 73 65 28 4d 65 74 61 50 61 67  eRelease(MetaPag
66e0: 65 20 2a 29 3b 0a 75 38 20 2a 6c 73 6d 46 73 4d  e *);.u8 *lsmFsM
66f0: 65 74 61 50 61 67 65 44 61 74 61 28 4d 65 74 61  etaPageData(Meta
6700: 50 61 67 65 20 2a 2c 20 69 6e 74 20 2a 29 3b 0a  Page *, int *);.
6710: 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55  .#ifdef LSM_DEBU
6720: 47 0a 69 6e 74 20 6c 73 6d 46 73 44 62 50 61 67  G.int lsmFsDbPag
6730: 65 49 73 4c 61 73 74 28 53 65 67 6d 65 6e 74 20  eIsLast(Segment 
6740: 2a 70 53 65 67 2c 20 50 61 67 65 20 2a 70 50 67  *pSeg, Page *pPg
6750: 29 3b 0a 69 6e 74 20 6c 73 6d 46 73 49 6e 74 65  );.int lsmFsInte
6760: 67 72 69 74 79 43 68 65 63 6b 28 6c 73 6d 5f 64  grityCheck(lsm_d
6770: 62 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 4c 73  b *);.#endif..Ls
6780: 6d 50 67 6e 6f 20 6c 73 6d 46 73 52 65 64 69 72  mPgno lsmFsRedir
6790: 65 63 74 50 61 67 65 28 46 69 6c 65 53 79 73 74  ectPage(FileSyst
67a0: 65 6d 20 2a 2c 20 52 65 64 69 72 65 63 74 20 2a  em *, Redirect *
67b0: 2c 20 4c 73 6d 50 67 6e 6f 29 3b 0a 0a 69 6e 74  , LsmPgno);..int
67c0: 20 6c 73 6d 46 73 50 61 67 65 57 72 69 74 61 62   lsmFsPageWritab
67d0: 6c 65 28 50 61 67 65 20 2a 29 3b 0a 0a 2f 2a 20  le(Page *);../* 
67e0: 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20 72 65 61  Functions to rea
67f0: 64 2c 20 77 72 69 74 65 20 61 6e 64 20 73 79 6e  d, write and syn
6800: 63 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  c the log file. 
6810: 2a 2f 0a 69 6e 74 20 6c 73 6d 46 73 57 72 69 74  */.int lsmFsWrit
6820: 65 4c 6f 67 28 46 69 6c 65 53 79 73 74 65 6d 20  eLog(FileSystem 
6830: 2a 70 46 53 2c 20 69 36 34 20 69 4f 66 66 2c 20  *pFS, i64 iOff, 
6840: 4c 73 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 29  LsmString *pStr)
6850: 3b 0a 69 6e 74 20 6c 73 6d 46 73 53 79 6e 63 4c  ;.int lsmFsSyncL
6860: 6f 67 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 70  og(FileSystem *p
6870: 46 53 29 3b 0a 69 6e 74 20 6c 73 6d 46 73 52 65  FS);.int lsmFsRe
6880: 61 64 4c 6f 67 28 46 69 6c 65 53 79 73 74 65 6d  adLog(FileSystem
6890: 20 2a 70 46 53 2c 20 69 36 34 20 69 4f 66 66 2c   *pFS, i64 iOff,
68a0: 20 69 6e 74 20 6e 52 65 61 64 2c 20 4c 73 6d 53   int nRead, LsmS
68b0: 74 72 69 6e 67 20 2a 70 53 74 72 29 3b 0a 69 6e  tring *pStr);.in
68c0: 74 20 6c 73 6d 46 73 54 72 75 6e 63 61 74 65 4c  t lsmFsTruncateL
68d0: 6f 67 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 70  og(FileSystem *p
68e0: 46 53 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a  FS, i64 nByte);.
68f0: 69 6e 74 20 6c 73 6d 46 73 54 72 75 6e 63 61 74  int lsmFsTruncat
6900: 65 44 62 28 46 69 6c 65 53 79 73 74 65 6d 20 2a  eDb(FileSystem *
6910: 70 46 53 2c 20 69 36 34 20 6e 42 79 74 65 29 3b  pFS, i64 nByte);
6920: 0a 69 6e 74 20 6c 73 6d 46 73 43 6c 6f 73 65 41  .int lsmFsCloseA
6930: 6e 64 44 65 6c 65 74 65 4c 6f 67 28 46 69 6c 65  ndDeleteLog(File
6940: 53 79 73 74 65 6d 20 2a 70 46 53 29 3b 0a 0a 4c  System *pFS);..L
6950: 73 6d 46 69 6c 65 20 2a 6c 73 6d 46 73 44 65 66  smFile *lsmFsDef
6960: 65 72 43 6c 6f 73 65 28 46 69 6c 65 53 79 73 74  erClose(FileSyst
6970: 65 6d 20 2a 70 46 53 29 3b 0a 0a 2f 2a 20 41 6e  em *pFS);../* An
6980: 64 20 74 6f 20 73 79 6e 63 20 74 68 65 20 64 62  d to sync the db
6990: 20 66 69 6c 65 20 2a 2f 0a 69 6e 74 20 6c 73 6d   file */.int lsm
69a0: 46 73 53 79 6e 63 44 62 28 46 69 6c 65 53 79 73  FsSyncDb(FileSys
69b0: 74 65 6d 20 2a 2c 20 69 6e 74 29 3b 0a 0a 76 6f  tem *, int);..vo
69c0: 69 64 20 6c 73 6d 46 73 46 6c 75 73 68 57 61 69  id lsmFsFlushWai
69d0: 74 69 6e 67 28 46 69 6c 65 53 79 73 74 65 6d 20  ting(FileSystem 
69e0: 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a 2f 2a 20 55  *, int *);../* U
69f0: 73 65 64 20 62 79 20 6c 73 6d 5f 69 6e 66 6f 28  sed by lsm_info(
6a00: 41 52 52 41 59 5f 53 54 52 55 43 54 55 52 45 29  ARRAY_STRUCTURE)
6a10: 20 61 6e 64 20 6c 73 6d 5f 63 6f 6e 66 69 67 28   and lsm_config(
6a20: 4d 4d 41 50 29 20 2a 2f 0a 69 6e 74 20 6c 73 6d  MMAP) */.int lsm
6a30: 49 6e 66 6f 41 72 72 61 79 53 74 72 75 63 74 75  InfoArrayStructu
6a40: 72 65 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  re(lsm_db *pDb, 
6a50: 69 6e 74 20 62 42 6c 6f 63 6b 2c 20 4c 73 6d 50  int bBlock, LsmP
6a60: 67 6e 6f 20 69 46 69 72 73 74 2c 20 63 68 61 72  gno iFirst, char
6a70: 20 2a 2a 70 7a 29 3b 0a 69 6e 74 20 6c 73 6d 49   **pz);.int lsmI
6a80: 6e 66 6f 41 72 72 61 79 50 61 67 65 73 28 6c 73  nfoArrayPages(ls
6a90: 6d 5f 64 62 20 2a 70 44 62 2c 20 4c 73 6d 50 67  m_db *pDb, LsmPg
6aa0: 6e 6f 20 69 46 69 72 73 74 2c 20 63 68 61 72 20  no iFirst, char 
6ab0: 2a 2a 70 7a 4f 75 74 29 3b 0a 69 6e 74 20 6c 73  **pzOut);.int ls
6ac0: 6d 43 6f 6e 66 69 67 4d 6d 61 70 28 6c 73 6d 5f  mConfigMmap(lsm_
6ad0: 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 2a 70 69  db *pDb, int *pi
6ae0: 50 61 72 61 6d 29 3b 0a 0a 69 6e 74 20 6c 73 6d  Param);..int lsm
6af0: 45 6e 76 4f 70 65 6e 28 6c 73 6d 5f 65 6e 76 20  EnvOpen(lsm_env 
6b00: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  *, const char *,
6b10: 20 69 6e 74 2c 20 6c 73 6d 5f 66 69 6c 65 20 2a   int, lsm_file *
6b20: 2a 29 3b 0a 69 6e 74 20 6c 73 6d 45 6e 76 43 6c  *);.int lsmEnvCl
6b30: 6f 73 65 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ose(lsm_env *pEn
6b40: 76 2c 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69  v, lsm_file *pFi
6b50: 6c 65 29 3b 0a 69 6e 74 20 6c 73 6d 45 6e 76 4c  le);.int lsmEnvL
6b60: 6f 63 6b 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ock(lsm_env *pEn
6b70: 76 2c 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69  v, lsm_file *pFi
6b80: 6c 65 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20 69  le, int iLock, i
6b90: 6e 74 20 65 4c 6f 63 6b 29 3b 0a 69 6e 74 20 6c  nt eLock);.int l
6ba0: 73 6d 45 6e 76 54 65 73 74 4c 6f 63 6b 28 6c 73  smEnvTestLock(ls
6bb0: 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d  m_env *pEnv, lsm
6bc0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
6bd0: 74 20 69 4c 6f 63 6b 2c 20 69 6e 74 20 6e 4c 6f  t iLock, int nLo
6be0: 63 6b 2c 20 69 6e 74 29 3b 0a 0a 69 6e 74 20 6c  ck, int);..int l
6bf0: 73 6d 45 6e 76 53 68 6d 4d 61 70 28 6c 73 6d 5f  smEnvShmMap(lsm_
6c00: 65 6e 76 20 2a 2c 20 6c 73 6d 5f 66 69 6c 65 20  env *, lsm_file 
6c10: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 76 6f 69  *, int, int, voi
6c20: 64 20 2a 2a 29 3b 20 0a 76 6f 69 64 20 6c 73 6d  d **); .void lsm
6c30: 45 6e 76 53 68 6d 42 61 72 72 69 65 72 28 6c 73  EnvShmBarrier(ls
6c40: 6d 5f 65 6e 76 20 2a 29 3b 0a 76 6f 69 64 20 6c  m_env *);.void l
6c50: 73 6d 45 6e 76 53 68 6d 55 6e 6d 61 70 28 6c 73  smEnvShmUnmap(ls
6c60: 6d 5f 65 6e 76 20 2a 2c 20 6c 73 6d 5f 66 69 6c  m_env *, lsm_fil
6c70: 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 76 6f 69 64  e *, int);..void
6c80: 20 6c 73 6d 45 6e 76 53 6c 65 65 70 28 6c 73 6d   lsmEnvSleep(lsm
6c90: 5f 65 6e 76 20 2a 2c 20 69 6e 74 29 3b 0a 0a 69  _env *, int);..i
6ca0: 6e 74 20 6c 73 6d 46 73 52 65 61 64 53 79 6e 63  nt lsmFsReadSync
6cb0: 65 64 49 64 28 6c 73 6d 5f 64 62 20 2a 64 62 2c  edId(lsm_db *db,
6cc0: 20 69 6e 74 2c 20 69 36 34 20 2a 70 69 56 61 6c   int, i64 *piVal
6cd0: 29 3b 0a 0a 69 6e 74 20 6c 73 6d 46 73 53 65 67  );..int lsmFsSeg
6ce0: 6d 65 6e 74 43 6f 6e 74 61 69 6e 73 50 67 28 46  mentContainsPg(F
6cf0: 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 2c 20  ileSystem *pFS, 
6d00: 53 65 67 6d 65 6e 74 20 2a 2c 20 4c 73 6d 50 67  Segment *, LsmPg
6d10: 6e 6f 2c 20 69 6e 74 20 2a 29 3b 0a 0a 76 6f 69  no, int *);..voi
6d20: 64 20 6c 73 6d 46 73 50 75 72 67 65 43 61 63 68  d lsmFsPurgeCach
6d30: 65 28 46 69 6c 65 53 79 73 74 65 6d 20 2a 29 3b  e(FileSystem *);
6d40: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 66  ../*.** End of f
6d50: 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 22 6c  unctions from "l
6d60: 73 6d 5f 66 69 6c 65 2e 63 22 2e 0a 2a 2a 2a 2a  sm_file.c"..****
6d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6db0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 0a 2a 2a 20  ******/../* .** 
6dc0: 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 66  Functions from f
6dd0: 69 6c 65 20 22 6c 73 6d 5f 73 6f 72 74 65 64 2e  ile "lsm_sorted.
6de0: 63 22 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 49 6e  c"..*/.int lsmIn
6df0: 66 6f 50 61 67 65 44 75 6d 70 28 6c 73 6d 5f 64  foPageDump(lsm_d
6e00: 62 20 2a 2c 20 4c 73 6d 50 67 6e 6f 2c 20 69 6e  b *, LsmPgno, in
6e10: 74 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 76 6f 69  t, char **);.voi
6e20: 64 20 6c 73 6d 53 6f 72 74 65 64 43 6c 65 61 6e  d lsmSortedClean
6e30: 75 70 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 69 6e  up(lsm_db *);.in
6e40: 74 20 6c 73 6d 53 6f 72 74 65 64 41 75 74 6f 57  t lsmSortedAutoW
6e50: 6f 72 6b 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e  ork(lsm_db *, in
6e60: 74 20 6e 55 6e 69 74 29 3b 0a 0a 69 6e 74 20 6c  t nUnit);..int l
6e70: 73 6d 53 6f 72 74 65 64 57 61 6c 6b 46 72 65 65  smSortedWalkFree
6e80: 6c 69 73 74 28 6c 73 6d 5f 64 62 20 2a 2c 20 69  list(lsm_db *, i
6e90: 6e 74 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64  nt, int (*)(void
6ea0: 20 2a 2c 20 69 6e 74 2c 20 69 36 34 29 2c 20 76   *, int, i64), v
6eb0: 6f 69 64 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d  oid *);..int lsm
6ec0: 53 61 76 65 57 6f 72 6b 65 72 28 6c 73 6d 5f 64  SaveWorker(lsm_d
6ed0: 62 20 2a 2c 20 69 6e 74 29 3b 0a 0a 69 6e 74 20  b *, int);..int 
6ee0: 6c 73 6d 46 6c 75 73 68 54 72 65 65 54 6f 44 69  lsmFlushTreeToDi
6ef0: 73 6b 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 3b  sk(lsm_db *pDb);
6f00: 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74 65 64  ..void lsmSorted
6f10: 52 65 6d 61 70 28 6c 73 6d 5f 64 62 20 2a 70 44  Remap(lsm_db *pD
6f20: 62 29 3b 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72  b);..void lsmSor
6f30: 74 65 64 46 72 65 65 4c 65 76 65 6c 28 6c 73 6d  tedFreeLevel(lsm
6f40: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 4c 65 76 65  _env *pEnv, Leve
6f50: 6c 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 53 6f  l *);..int lsmSo
6f60: 72 74 65 64 41 64 76 61 6e 63 65 41 6c 6c 28 6c  rtedAdvanceAll(l
6f70: 73 6d 5f 64 62 20 2a 70 44 62 29 3b 0a 0a 69 6e  sm_db *pDb);..in
6f80: 74 20 6c 73 6d 53 6f 72 74 65 64 4c 6f 61 64 4d  t lsmSortedLoadM
6f90: 65 72 67 65 28 6c 73 6d 5f 64 62 20 2a 2c 20 4c  erge(lsm_db *, L
6fa0: 65 76 65 6c 20 2a 2c 20 75 33 32 20 2a 2c 20 69  evel *, u32 *, i
6fb0: 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 53 6f  nt *);.int lsmSo
6fc0: 72 74 65 64 4c 6f 61 64 46 72 65 65 6c 69 73 74  rtedLoadFreelist
6fd0: 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 76 6f  (lsm_db *pDb, vo
6fe0: 69 64 20 2a 2a 2c 20 69 6e 74 20 2a 29 3b 0a 0a  id **, int *);..
6ff0: 76 6f 69 64 20 2a 6c 73 6d 53 6f 72 74 65 64 53  void *lsmSortedS
7000: 70 6c 69 74 4b 65 79 28 4c 65 76 65 6c 20 2a 70  plitKey(Level *p
7010: 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 42 79  Level, int *pnBy
7020: 74 65 29 3b 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f  te);..void lsmSo
7030: 72 74 65 64 53 61 76 65 54 72 65 65 43 75 72 73  rtedSaveTreeCurs
7040: 6f 72 73 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 0a  ors(lsm_db *);..
7050: 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72 4e 65  int lsmMCursorNe
7060: 77 28 6c 73 6d 5f 64 62 20 2a 2c 20 4d 75 6c 74  w(lsm_db *, Mult
7070: 69 43 75 72 73 6f 72 20 2a 2a 29 3b 0a 76 6f 69  iCursor **);.voi
7080: 64 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73  d lsmMCursorClos
7090: 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 2c  e(MultiCursor *,
70a0: 20 69 6e 74 29 3b 0a 69 6e 74 20 6c 73 6d 4d 43   int);.int lsmMC
70b0: 75 72 73 6f 72 53 65 65 6b 28 4d 75 6c 74 69 43  ursorSeek(MultiC
70c0: 75 72 73 6f 72 20 2a 2c 20 69 6e 74 2c 20 76 6f  ursor *, int, vo
70d0: 69 64 20 2a 2c 20 69 6e 74 20 2c 20 69 6e 74 29  id *, int , int)
70e0: 3b 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72  ;.int lsmMCursor
70f0: 46 69 72 73 74 28 4d 75 6c 74 69 43 75 72 73 6f  First(MultiCurso
7100: 72 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 4d 43 75  r *);.int lsmMCu
7110: 72 73 6f 72 50 72 65 76 28 4d 75 6c 74 69 43 75  rsorPrev(MultiCu
7120: 72 73 6f 72 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d  rsor *);.int lsm
7130: 4d 43 75 72 73 6f 72 4c 61 73 74 28 4d 75 6c 74  MCursorLast(Mult
7140: 69 43 75 72 73 6f 72 20 2a 29 3b 0a 69 6e 74 20  iCursor *);.int 
7150: 6c 73 6d 4d 43 75 72 73 6f 72 56 61 6c 69 64 28  lsmMCursorValid(
7160: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 29 3b 0a  MultiCursor *);.
7170: 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72 4e 65  int lsmMCursorNe
7180: 78 74 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  xt(MultiCursor *
7190: 29 3b 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f  );.int lsmMCurso
71a0: 72 4b 65 79 28 4d 75 6c 74 69 43 75 72 73 6f 72  rKey(MultiCursor
71b0: 20 2a 2c 20 76 6f 69 64 20 2a 2a 2c 20 69 6e 74   *, void **, int
71c0: 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 4d 43 75 72   *);.int lsmMCur
71d0: 73 6f 72 56 61 6c 75 65 28 4d 75 6c 74 69 43 75  sorValue(MultiCu
71e0: 72 73 6f 72 20 2a 2c 20 76 6f 69 64 20 2a 2a 2c  rsor *, void **,
71f0: 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d   int *);.int lsm
7200: 4d 43 75 72 73 6f 72 54 79 70 65 28 4d 75 6c 74  MCursorType(Mult
7210: 69 43 75 72 73 6f 72 20 2a 2c 20 69 6e 74 20 2a  iCursor *, int *
7220: 29 3b 0a 6c 73 6d 5f 64 62 20 2a 6c 73 6d 4d 43  );.lsm_db *lsmMC
7230: 75 72 73 6f 72 44 62 28 4d 75 6c 74 69 43 75 72  ursorDb(MultiCur
7240: 73 6f 72 20 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d  sor *);.void lsm
7250: 4d 43 75 72 73 6f 72 46 72 65 65 43 61 63 68 65  MCursorFreeCache
7260: 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 0a 69 6e 74  (lsm_db *);..int
7270: 20 6c 73 6d 53 61 76 65 43 75 72 73 6f 72 73 28   lsmSaveCursors(
7280: 6c 73 6d 5f 64 62 20 2a 70 44 62 29 3b 0a 69 6e  lsm_db *pDb);.in
7290: 74 20 6c 73 6d 52 65 73 74 6f 72 65 43 75 72 73  t lsmRestoreCurs
72a0: 6f 72 73 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29  ors(lsm_db *pDb)
72b0: 3b 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74 65  ;..void lsmSorte
72c0: 64 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 6c  dDumpStructure(l
72d0: 73 6d 5f 64 62 20 2a 70 44 62 2c 20 53 6e 61 70  sm_db *pDb, Snap
72e0: 73 68 6f 74 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  shot *, int, int
72f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
7300: 0a 76 6f 69 64 20 6c 73 6d 46 73 44 75 6d 70 42  .void lsmFsDumpB
7310: 6c 6f 63 6b 6c 69 73 74 73 28 6c 73 6d 5f 64 62  locklists(lsm_db
7320: 20 2a 29 3b 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f   *);..void lsmSo
7330: 72 74 65 64 45 78 70 61 6e 64 42 74 72 65 65 50  rtedExpandBtreeP
7340: 61 67 65 28 50 61 67 65 20 2a 70 50 67 2c 20 69  age(Page *pPg, i
7350: 6e 74 20 6e 4f 72 69 67 29 3b 0a 0a 76 6f 69 64  nt nOrig);..void
7360: 20 6c 73 6d 50 75 74 55 33 32 28 75 38 20 2a 2c   lsmPutU32(u8 *,
7370: 20 75 33 32 29 3b 0a 75 33 32 20 6c 73 6d 47 65   u32);.u32 lsmGe
7380: 74 55 33 32 28 75 38 20 2a 29 3b 0a 75 36 34 20  tU32(u8 *);.u64 
7390: 6c 73 6d 47 65 74 55 36 34 28 75 38 20 2a 29 3b  lsmGetU64(u8 *);
73a0: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
73b0: 73 20 66 72 6f 6d 20 22 6c 73 6d 5f 76 61 72 69  s from "lsm_vari
73c0: 6e 74 2e 63 22 2e 0a 2a 2f 0a 69 6e 74 20 6c 73  nt.c"..*/.int ls
73d0: 6d 56 61 72 69 6e 74 50 75 74 33 32 28 75 38 20  mVarintPut32(u8 
73e0: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 6c 73 6d  *, int);.int lsm
73f0: 56 61 72 69 6e 74 47 65 74 33 32 28 75 38 20 2a  VarintGet32(u8 *
7400: 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73  , int *);.int ls
7410: 6d 56 61 72 69 6e 74 50 75 74 36 34 28 75 38 20  mVarintPut64(u8 
7420: 2a 61 44 61 74 61 2c 20 69 36 34 20 69 56 61 6c  *aData, i64 iVal
7430: 29 3b 0a 69 6e 74 20 6c 73 6d 56 61 72 69 6e 74  );.int lsmVarint
7440: 47 65 74 36 34 28 63 6f 6e 73 74 20 75 38 20 2a  Get64(const u8 *
7450: 61 44 61 74 61 2c 20 69 36 34 20 2a 70 69 56 61  aData, i64 *piVa
7460: 6c 29 3b 0a 0a 69 6e 74 20 6c 73 6d 56 61 72 69  l);..int lsmVari
7470: 6e 74 4c 65 6e 33 32 28 69 6e 74 29 3b 0a 69 6e  ntLen32(int);.in
7480: 74 20 6c 73 6d 56 61 72 69 6e 74 53 69 7a 65 28  t lsmVarintSize(
7490: 75 38 20 63 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 46  u8 c);../* .** F
74a0: 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 66 69  unctions from fi
74b0: 6c 65 20 22 6d 61 69 6e 2e 63 22 2e 0a 2a 2f 0a  le "main.c"..*/.
74c0: 76 6f 69 64 20 6c 73 6d 4c 6f 67 4d 65 73 73 61  void lsmLogMessa
74d0: 67 65 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74  ge(lsm_db *, int
74e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  , const char *, 
74f0: 2e 2e 2e 29 3b 0a 69 6e 74 20 6c 73 6d 49 6e 66  ...);.int lsmInf
7500: 6f 46 72 65 65 6c 69 73 74 28 6c 73 6d 5f 64 62  oFreelist(lsm_db
7510: 20 2a 70 44 62 2c 20 63 68 61 72 20 2a 2a 70 7a   *pDb, char **pz
7520: 4f 75 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  Out);../*.** Fun
7530: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 66 69 6c 65  ctions from file
7540: 20 22 6c 73 6d 5f 6c 6f 67 2e 63 22 2e 0a 2a 2f   "lsm_log.c"..*/
7550: 0a 69 6e 74 20 6c 73 6d 4c 6f 67 42 65 67 69 6e  .int lsmLogBegin
7560: 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 3b 0a 69  (lsm_db *pDb);.i
7570: 6e 74 20 6c 73 6d 4c 6f 67 57 72 69 74 65 28 6c  nt lsmLogWrite(l
7580: 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 2c 20 76 6f  sm_db *, int, vo
7590: 69 64 20 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 20  id *, int, void 
75a0: 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 6c 73 6d  *, int);.int lsm
75b0: 4c 6f 67 43 6f 6d 6d 69 74 28 6c 73 6d 5f 64 62  LogCommit(lsm_db
75c0: 20 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 4c 6f 67   *);.void lsmLog
75d0: 45 6e 64 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  End(lsm_db *pDb,
75e0: 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 3b 0a 76   int bCommit);.v
75f0: 6f 69 64 20 6c 73 6d 4c 6f 67 54 65 6c 6c 28 6c  oid lsmLogTell(l
7600: 73 6d 5f 64 62 20 2a 2c 20 4c 6f 67 4d 61 72 6b  sm_db *, LogMark
7610: 20 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 4c 6f 67   *);.void lsmLog
7620: 53 65 65 6b 28 6c 73 6d 5f 64 62 20 2a 2c 20 4c  Seek(lsm_db *, L
7630: 6f 67 4d 61 72 6b 20 2a 29 3b 0a 76 6f 69 64 20  ogMark *);.void 
7640: 6c 73 6d 4c 6f 67 43 6c 6f 73 65 28 6c 73 6d 5f  lsmLogClose(lsm_
7650: 64 62 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 4c  db *);..int lsmL
7660: 6f 67 52 65 63 6f 76 65 72 28 6c 73 6d 5f 64 62  ogRecover(lsm_db
7670: 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 49 6e 66 6f   *);.int lsmInfo
7680: 4c 6f 67 53 74 72 75 63 74 75 72 65 28 6c 73 6d  LogStructure(lsm
7690: 5f 64 62 20 2a 70 44 62 2c 20 63 68 61 72 20 2a  _db *pDb, char *
76a0: 2a 70 7a 56 61 6c 29 3b 0a 0a 2f 2a 20 56 61 6c  *pzVal);../* Val
76b0: 69 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  id values for th
76c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
76d0: 74 20 74 6f 20 6c 73 6d 4c 6f 67 57 72 69 74 65  t to lsmLogWrite
76e0: 28 29 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  (). */.#define L
76f0: 53 4d 5f 57 52 49 54 45 20 20 20 20 20 20 20 20  SM_WRITE        
7700: 30 78 30 36 0a 23 64 65 66 69 6e 65 20 4c 53 4d  0x06.#define LSM
7710: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20 30 78  _DELETE       0x
7720: 30 38 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 44  08.#define LSM_D
7730: 52 41 4e 47 45 20 20 20 20 20 20 20 30 78 30 41  RANGE       0x0A
7740: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
7790: 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20   Functions from 
77a0: 66 69 6c 65 20 22 6c 73 6d 5f 73 68 61 72 65 64  file "lsm_shared
77b0: 2e 63 22 2e 0a 2a 2f 0a 0a 69 6e 74 20 6c 73 6d  .c"..*/..int lsm
77c0: 44 62 44 61 74 61 62 61 73 65 43 6f 6e 6e 65 63  DbDatabaseConnec
77d0: 74 28 6c 73 6d 5f 64 62 2a 2c 20 63 6f 6e 73 74  t(lsm_db*, const
77e0: 20 63 68 61 72 20 2a 29 3b 0a 76 6f 69 64 20 6c   char *);.void l
77f0: 73 6d 44 62 44 61 74 61 62 61 73 65 52 65 6c 65  smDbDatabaseRele
7800: 61 73 65 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 0a  ase(lsm_db *);..
7810: 69 6e 74 20 6c 73 6d 42 65 67 69 6e 52 65 61 64  int lsmBeginRead
7820: 54 72 61 6e 73 28 6c 73 6d 5f 64 62 20 2a 29 3b  Trans(lsm_db *);
7830: 0a 69 6e 74 20 6c 73 6d 42 65 67 69 6e 57 72 69  .int lsmBeginWri
7840: 74 65 54 72 61 6e 73 28 6c 73 6d 5f 64 62 20 2a  teTrans(lsm_db *
7850: 29 3b 0a 69 6e 74 20 6c 73 6d 42 65 67 69 6e 46  );.int lsmBeginF
7860: 6c 75 73 68 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a  lush(lsm_db *);.
7870: 0a 69 6e 74 20 6c 73 6d 44 65 74 65 63 74 52 6f  .int lsmDetectRo
7880: 54 72 61 6e 73 28 6c 73 6d 5f 64 62 20 2a 64 62  Trans(lsm_db *db
7890: 2c 20 69 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73  , int *);.int ls
78a0: 6d 42 65 67 69 6e 52 6f 54 72 61 6e 73 28 6c 73  mBeginRoTrans(ls
78b0: 6d 5f 64 62 20 2a 64 62 29 3b 0a 0a 69 6e 74 20  m_db *db);..int 
78c0: 6c 73 6d 42 65 67 69 6e 57 6f 72 6b 28 6c 73 6d  lsmBeginWork(lsm
78d0: 5f 64 62 20 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d  _db *);.void lsm
78e0: 46 69 6e 69 73 68 57 6f 72 6b 28 6c 73 6d 5f 64  FinishWork(lsm_d
78f0: 62 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 2a 29  b *, int, int *)
7900: 3b 0a 0a 69 6e 74 20 6c 73 6d 46 69 6e 69 73 68  ;..int lsmFinish
7910: 52 65 63 6f 76 65 72 79 28 6c 73 6d 5f 64 62 20  Recovery(lsm_db 
7920: 2a 29 3b 0a 76 6f 69 64 20 6c 73 6d 46 69 6e 69  *);.void lsmFini
7930: 73 68 52 65 61 64 54 72 61 6e 73 28 6c 73 6d 5f  shReadTrans(lsm_
7940: 64 62 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 46 69  db *);.int lsmFi
7950: 6e 69 73 68 57 72 69 74 65 54 72 61 6e 73 28 6c  nishWriteTrans(l
7960: 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 29 3b 0a 69  sm_db *, int);.i
7970: 6e 74 20 6c 73 6d 46 69 6e 69 73 68 46 6c 75 73  nt lsmFinishFlus
7980: 68 28 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 29  h(lsm_db *, int)
7990: 3b 0a 0a 69 6e 74 20 6c 73 6d 53 6e 61 70 73 68  ;..int lsmSnapsh
79a0: 6f 74 53 65 74 46 72 65 65 6c 69 73 74 28 6c 73  otSetFreelist(ls
79b0: 6d 5f 64 62 20 2a 2c 20 69 6e 74 20 2a 2c 20 69  m_db *, int *, i
79c0: 6e 74 29 3b 0a 0a 53 6e 61 70 73 68 6f 74 20 2a  nt);..Snapshot *
79d0: 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 43 6c 69  lsmDbSnapshotCli
79e0: 65 6e 74 28 6c 73 6d 5f 64 62 20 2a 29 3b 0a 53  ent(lsm_db *);.S
79f0: 6e 61 70 73 68 6f 74 20 2a 6c 73 6d 44 62 53 6e  napshot *lsmDbSn
7a00: 61 70 73 68 6f 74 57 6f 72 6b 65 72 28 6c 73 6d  apshotWorker(lsm
7a10: 5f 64 62 20 2a 29 3b 0a 0a 76 6f 69 64 20 6c 73  _db *);..void ls
7a20: 6d 53 6e 61 70 73 68 6f 74 53 65 74 43 6b 70 74  mSnapshotSetCkpt
7a30: 69 64 28 53 6e 61 70 73 68 6f 74 20 2a 2c 20 69  id(Snapshot *, i
7a40: 36 34 29 3b 0a 0a 4c 65 76 65 6c 20 2a 6c 73 6d  64);..Level *lsm
7a50: 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c 28  DbSnapshotLevel(
7a60: 53 6e 61 70 73 68 6f 74 20 2a 29 3b 0a 76 6f 69  Snapshot *);.voi
7a70: 64 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 53  d lsmDbSnapshotS
7a80: 65 74 4c 65 76 65 6c 28 53 6e 61 70 73 68 6f 74  etLevel(Snapshot
7a90: 20 2a 2c 20 4c 65 76 65 6c 20 2a 29 3b 0a 0a 76   *, Level *);..v
7aa0: 6f 69 64 20 6c 73 6d 44 62 52 65 63 6f 76 65 72  oid lsmDbRecover
7ab0: 79 43 6f 6d 70 6c 65 74 65 28 6c 73 6d 5f 64 62  yComplete(lsm_db
7ac0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 69 6e 74 20 6c   *, int);..int l
7ad0: 73 6d 42 6c 6f 63 6b 41 6c 6c 6f 63 61 74 65 28  smBlockAllocate(
7ae0: 6c 73 6d 5f 64 62 20 2a 2c 20 69 6e 74 2c 20 69  lsm_db *, int, i
7af0: 6e 74 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 42 6c  nt *);.int lsmBl
7b00: 6f 63 6b 46 72 65 65 28 6c 73 6d 5f 64 62 20 2a  ockFree(lsm_db *
7b10: 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 6c 73 6d 42  , int);.int lsmB
7b20: 6c 6f 63 6b 52 65 66 72 65 65 28 6c 73 6d 5f 64  lockRefree(lsm_d
7b30: 62 20 2a 2c 20 69 6e 74 29 3b 0a 0a 76 6f 69 64  b *, int);..void
7b40: 20 6c 73 6d 46 72 65 65 6c 69 73 74 44 65 6c 74   lsmFreelistDelt
7b50: 61 42 65 67 69 6e 28 6c 73 6d 5f 64 62 20 2a 29  aBegin(lsm_db *)
7b60: 3b 0a 76 6f 69 64 20 6c 73 6d 46 72 65 65 6c 69  ;.void lsmFreeli
7b70: 73 74 44 65 6c 74 61 45 6e 64 28 6c 73 6d 5f 64  stDeltaEnd(lsm_d
7b80: 62 20 2a 29 3b 0a 69 6e 74 20 6c 73 6d 46 72 65  b *);.int lsmFre
7b90: 65 6c 69 73 74 44 65 6c 74 61 28 6c 73 6d 5f 64  elistDelta(lsm_d
7ba0: 62 20 2a 70 44 62 29 3b 0a 0a 44 62 4c 6f 67 20  b *pDb);..DbLog 
7bb0: 2a 6c 73 6d 44 61 74 61 62 61 73 65 4c 6f 67 28  *lsmDatabaseLog(
7bc0: 6c 73 6d 5f 64 62 20 2a 70 44 62 29 3b 0a 0a 23  lsm_db *pDb);..#
7bd0: 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a  ifdef LSM_DEBUG.
7be0: 20 20 69 6e 74 20 6c 73 6d 48 6f 6c 64 69 6e 67    int lsmHolding
7bf0: 43 6c 69 65 6e 74 4d 75 74 65 78 28 6c 73 6d 5f  ClientMutex(lsm_
7c00: 64 62 20 2a 70 44 62 29 3b 0a 20 20 69 6e 74 20  db *pDb);.  int 
7c10: 6c 73 6d 53 68 6d 41 73 73 65 72 74 4c 6f 63 6b  lsmShmAssertLock
7c20: 28 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 69 6e 74  (lsm_db *db, int
7c30: 20 69 4c 6f 63 6b 2c 20 69 6e 74 20 65 4f 70 29   iLock, int eOp)
7c40: 3b 0a 20 20 69 6e 74 20 6c 73 6d 53 68 6d 41 73  ;.  int lsmShmAs
7c50: 73 65 72 74 57 6f 72 6b 65 72 28 6c 73 6d 5f 64  sertWorker(lsm_d
7c60: 62 20 2a 64 62 29 3b 0a 23 65 6e 64 69 66 0a 0a  b *db);.#endif..
7c70: 76 6f 69 64 20 6c 73 6d 46 72 65 65 53 6e 61 70  void lsmFreeSnap
7c80: 73 68 6f 74 28 6c 73 6d 5f 65 6e 76 20 2a 2c 20  shot(lsm_env *, 
7c90: 53 6e 61 70 73 68 6f 74 20 2a 29 3b 0a 0a 0a 2f  Snapshot *);.../
7ca0: 2a 20 43 61 6e 64 69 64 61 74 65 20 76 61 6c 75  * Candidate valu
7cb0: 65 73 20 66 6f 72 20 74 68 65 20 33 72 64 20 61  es for the 3rd a
7cc0: 72 67 75 6d 65 6e 74 20 74 6f 20 6c 73 6d 53 68  rgument to lsmSh
7cd0: 6d 4c 6f 63 6b 28 29 20 2a 2f 0a 23 64 65 66 69  mLock() */.#defi
7ce0: 6e 65 20 4c 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f  ne LSM_LOCK_UNLO
7cf0: 43 4b 20 30 0a 23 64 65 66 69 6e 65 20 4c 53 4d  CK 0.#define LSM
7d00: 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 20 31 0a 23  _LOCK_SHARED 1.#
7d10: 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 43 4b 5f  define LSM_LOCK_
7d20: 45 58 43 4c 20 20 20 32 0a 0a 69 6e 74 20 6c 73  EXCL   2..int ls
7d30: 6d 53 68 6d 43 61 63 68 65 43 68 75 6e 6b 73 28  mShmCacheChunks(
7d40: 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 69 6e 74 20  lsm_db *db, int 
7d50: 6e 43 68 75 6e 6b 29 3b 0a 69 6e 74 20 6c 73 6d  nChunk);.int lsm
7d60: 53 68 6d 4c 6f 63 6b 28 6c 73 6d 5f 64 62 20 2a  ShmLock(lsm_db *
7d70: 64 62 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20 69  db, int iLock, i
7d80: 6e 74 20 65 4f 70 2c 20 69 6e 74 20 62 42 6c 6f  nt eOp, int bBlo
7d90: 63 6b 29 3b 0a 69 6e 74 20 6c 73 6d 53 68 6d 54  ck);.int lsmShmT
7da0: 65 73 74 4c 6f 63 6b 28 6c 73 6d 5f 64 62 20 2a  estLock(lsm_db *
7db0: 64 62 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20 69  db, int iLock, i
7dc0: 6e 74 20 6e 4c 6f 63 6b 2c 20 69 6e 74 20 65 4f  nt nLock, int eO
7dd0: 70 29 3b 0a 76 6f 69 64 20 6c 73 6d 53 68 6d 42  p);.void lsmShmB
7de0: 61 72 72 69 65 72 28 6c 73 6d 5f 64 62 20 2a 64  arrier(lsm_db *d
7df0: 62 29 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f  b);..#ifdef LSM_
7e00: 44 45 42 55 47 0a 76 6f 69 64 20 6c 73 6d 53 68  DEBUG.void lsmSh
7e10: 6d 48 61 73 4c 6f 63 6b 28 6c 73 6d 5f 64 62 20  mHasLock(lsm_db 
7e20: 2a 64 62 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20  *db, int iLock, 
7e30: 69 6e 74 20 65 4f 70 29 3b 0a 23 65 6c 73 65 0a  int eOp);.#else.
7e40: 23 20 64 65 66 69 6e 65 20 6c 73 6d 53 68 6d 48  # define lsmShmH
7e50: 61 73 4c 6f 63 6b 28 78 2c 79 2c 7a 29 0a 23 65  asLock(x,y,z).#e
7e60: 6e 64 69 66 0a 0a 69 6e 74 20 6c 73 6d 52 65 61  ndif..int lsmRea
7e70: 64 6c 6f 63 6b 28 6c 73 6d 5f 64 62 20 2a 2c 20  dlock(lsm_db *, 
7e80: 69 36 34 20 69 4c 73 6d 2c 20 75 33 32 20 69 53  i64 iLsm, u32 iS
7e90: 68 6d 4d 69 6e 2c 20 75 33 32 20 69 53 68 6d 4d  hmMin, u32 iShmM
7ea0: 61 78 29 3b 0a 0a 69 6e 74 20 6c 73 6d 4c 73 6d  ax);..int lsmLsm
7eb0: 49 6e 55 73 65 28 6c 73 6d 5f 64 62 20 2a 64 62  InUse(lsm_db *db
7ec0: 2c 20 69 36 34 20 69 4c 73 6d 49 64 2c 20 69 6e  , i64 iLsmId, in
7ed0: 74 20 2a 70 62 49 6e 55 73 65 29 3b 0a 69 6e 74  t *pbInUse);.int
7ee0: 20 6c 73 6d 54 72 65 65 49 6e 55 73 65 28 6c 73   lsmTreeInUse(ls
7ef0: 6d 5f 64 62 20 2a 64 62 2c 20 75 33 32 20 69 4c  m_db *db, u32 iL
7f00: 73 6d 49 64 2c 20 69 6e 74 20 2a 70 62 49 6e 55  smId, int *pbInU
7f10: 73 65 29 3b 0a 69 6e 74 20 6c 73 6d 46 72 65 65  se);.int lsmFree
7f20: 6c 69 73 74 41 70 70 65 6e 64 28 6c 73 6d 5f 65  listAppend(lsm_e
7f30: 6e 76 20 2a 70 45 6e 76 2c 20 46 72 65 65 6c 69  nv *pEnv, Freeli
7f40: 73 74 20 2a 70 2c 20 69 6e 74 20 69 42 6c 6b 2c  st *p, int iBlk,
7f50: 20 69 36 34 20 69 49 64 29 3b 0a 0a 69 6e 74 20   i64 iId);..int 
7f60: 6c 73 6d 44 62 4d 75 6c 74 69 50 72 6f 63 28 6c  lsmDbMultiProc(l
7f70: 73 6d 5f 64 62 20 2a 29 3b 0a 76 6f 69 64 20 6c  sm_db *);.void l
7f80: 73 6d 44 62 44 65 66 65 72 72 65 64 43 6c 6f 73  smDbDeferredClos
7f90: 65 28 6c 73 6d 5f 64 62 20 2a 2c 20 6c 73 6d 5f  e(lsm_db *, lsm_
7fa0: 66 69 6c 65 20 2a 2c 20 4c 73 6d 46 69 6c 65 20  file *, LsmFile 
7fb0: 2a 29 3b 0a 4c 73 6d 46 69 6c 65 20 2a 6c 73 6d  *);.LsmFile *lsm
7fc0: 44 62 52 65 63 79 63 6c 65 46 64 28 6c 73 6d 5f  DbRecycleFd(lsm_
7fd0: 64 62 20 2a 29 3b 0a 0a 69 6e 74 20 6c 73 6d 57  db *);..int lsmW
7fe0: 61 6c 6b 46 72 65 65 6c 69 73 74 28 6c 73 6d 5f  alkFreelist(lsm_
7ff0: 64 62 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 20 28  db *, int, int (
8000: 2a 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20  *)(void *, int, 
8010: 69 36 34 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 0a  i64), void *);..
8020: 69 6e 74 20 6c 73 6d 43 68 65 63 6b 43 6f 6d 70  int lsmCheckComp
8030: 72 65 73 73 69 6f 6e 49 64 28 6c 73 6d 5f 64 62  ressionId(lsm_db
8040: 20 2a 2c 20 75 33 32 29 3b 0a 0a 0a 2f 2a 2a 2a   *, u32);.../***
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8090: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 66 75 6e 63 74  *******.** funct
80a0: 69 6f 6e 73 20 69 6e 20 6c 73 6d 5f 73 74 72 2e  ions in lsm_str.
80b0: 63 0a 2a 2f 0a 76 6f 69 64 20 6c 73 6d 53 74 72  c.*/.void lsmStr
80c0: 69 6e 67 49 6e 69 74 28 4c 73 6d 53 74 72 69 6e  ingInit(LsmStrin
80d0: 67 2a 2c 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  g*, lsm_env *pEn
80e0: 76 29 3b 0a 69 6e 74 20 6c 73 6d 53 74 72 69 6e  v);.int lsmStrin
80f0: 67 45 78 74 65 6e 64 28 4c 73 6d 53 74 72 69 6e  gExtend(LsmStrin
8100: 67 2a 2c 20 69 6e 74 29 3b 0a 69 6e 74 20 6c 73  g*, int);.int ls
8110: 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 28 4c 73  mStringAppend(Ls
8120: 6d 53 74 72 69 6e 67 2a 2c 20 63 6f 6e 73 74 20  mString*, const 
8130: 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f  char *, int);.vo
8140: 69 64 20 6c 73 6d 53 74 72 69 6e 67 56 41 70 70  id lsmStringVApp
8150: 65 6e 64 66 28 4c 73 6d 53 74 72 69 6e 67 2a 2c  endf(LsmString*,
8160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
8170: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 2c 20 76  rmat, va_list, v
8180: 61 5f 6c 69 73 74 29 3b 0a 76 6f 69 64 20 6c 73  a_list);.void ls
8190: 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 4c  mStringAppendf(L
81a0: 73 6d 53 74 72 69 6e 67 2a 2c 20 63 6f 6e 73 74  smString*, const
81b0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
81c0: 2e 2e 2e 29 3b 0a 76 6f 69 64 20 6c 73 6d 53 74  ...);.void lsmSt
81d0: 72 69 6e 67 43 6c 65 61 72 28 4c 73 6d 53 74 72  ringClear(LsmStr
81e0: 69 6e 67 2a 29 3b 0a 63 68 61 72 20 2a 6c 73 6d  ing*);.char *lsm
81f0: 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 6c 73 6d  MallocPrintf(lsm
8200: 5f 65 6e 76 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _env*, const cha
8210: 72 2a 2c 20 2e 2e 2e 29 3b 0a 69 6e 74 20 6c 73  r*, ...);.int ls
8220: 6d 53 74 72 69 6e 67 42 69 6e 41 70 70 65 6e 64  mStringBinAppend
8230: 28 4c 73 6d 53 74 72 69 6e 67 20 2a 70 53 74 72  (LsmString *pStr
8240: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
8250: 6e 74 20 6e 29 3b 0a 0a 69 6e 74 20 6c 73 6d 53  nt n);..int lsmS
8260: 74 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  trlen(const char
8270: 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 0a 0a 2f 2a 20   *zName);..../* 
8280: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 6e  .** Round up a n
8290: 75 6d 62 65 72 20 74 6f 20 74 68 65 20 6e 65 78  umber to the nex
82a0: 74 20 6c 61 72 67 65 72 20 6d 75 6c 74 69 70 6c  t larger multipl
82b0: 65 20 6f 66 20 38 2e 20 20 54 68 69 73 20 69 73  e of 8.  This is
82c0: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 66 6f 72 63   used.** to forc
82d0: 65 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  e 8-byte alignme
82e0: 6e 74 20 6f 6e 20 36 34 2d 62 69 74 20 61 72 63  nt on 64-bit arc
82f0: 68 69 74 65 63 74 75 72 65 73 2e 0a 2a 2f 0a 23  hitectures..*/.#
8300: 64 65 66 69 6e 65 20 52 4f 55 4e 44 38 28 78 29  define ROUND8(x)
8310: 20 20 20 20 20 28 28 28 78 29 2b 37 29 26 7e 37       (((x)+7)&~7
8320: 29 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4d  )..#define LSM_M
8330: 49 4e 28 78 2c 79 29 20 28 28 78 29 3e 28 79 29  IN(x,y) ((x)>(y)
8340: 20 3f 20 28 79 29 20 3a 20 28 78 29 29 0a 23 64   ? (y) : (x)).#d
8350: 65 66 69 6e 65 20 4c 53 4d 5f 4d 41 58 28 78 2c  efine LSM_MAX(x,
8360: 79 29 20 28 28 78 29 3e 28 79 29 20 3f 20 28 78  y) ((x)>(y) ? (x
8370: 29 20 3a 20 28 79 29 29 0a 0a 23 65 6e 64 69 66  ) : (y))..#endif
8380: 0a                                               .