/ Hex Artifact Content
Login

Artifact 0eabfaf812ddb4ea43add38f05e430694cd054eb622c3e35af4c43118a2d5321:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 39 2d 31 31  /*.** 2011-09-11
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f  contains code to
0190: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
01a0: 63 68 65 63 6b 70 6f 69 6e 74 73 2e 0a 2a 2a 0a  checkpoints..**.
01b0: 2a 2a 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  ** A checkpoint 
01c0: 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 64  represents the d
01d0: 61 74 61 62 61 73 65 20 6c 61 79 6f 75 74 20 61  atabase layout a
01e0: 74 20 61 20 73 69 6e 67 6c 65 20 70 6f 69 6e 74  t a single point
01f0: 20 69 6e 20 74 69 6d 65 2e 0a 2a 2a 20 49 74 20   in time..** It 
0200: 69 6e 63 6c 75 64 65 73 20 61 20 6c 6f 67 20 6f  includes a log o
0210: 66 66 73 65 74 2e 20 57 68 65 6e 20 61 6e 20 65  ffset. When an e
0220: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
0230: 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 0a   is opened, the.
0240: 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
0250: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
0260: 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 65  y reading the ne
0270: 77 65 73 74 20 63 68 65 63 6b 70 6f 69 6e 74 20  west checkpoint 
0280: 61 6e 64 20 75 70 64 61 74 69 6e 67 0a 2a 2a 20  and updating.** 
0290: 69 74 20 77 69 74 68 20 61 6c 6c 20 63 6f 6d 6d  it with all comm
02a0: 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
02b0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 6c 6f 67 20  ns from the log 
02c0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20  that follow the 
02d0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f 66 66  specified.** off
02e0: 73 65 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  set..*/.#include
02f0: 20 22 6c 73 6d 49 6e 74 2e 68 22 0a 0a 2f 2a 0a   "lsmInt.h"../*.
0300: 2a 2a 20 43 48 45 43 4b 50 4f 49 4e 54 20 42 4c  ** CHECKPOINT BL
0310: 4f 42 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a  OB FORMAT:.**.**
0320: 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 6c   A checkpoint bl
0330: 6f 62 20 69 73 20 61 20 73 65 72 69 65 73 20 6f  ob is a series o
0340: 66 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  f unsigned 32-bi
0350: 74 20 69 6e 74 65 67 65 72 73 20 73 74 6f 72 65  t integers store
0360: 64 20 69 6e 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  d in.** big-endi
0370: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 20 41  an byte order. A
0380: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
0390: 20 20 20 43 68 65 63 6b 70 6f 69 6e 74 20 68 65     Checkpoint he
03a0: 61 64 65 72 20 28 73 65 65 20 74 68 65 20 43 4b  ader (see the CK
03b0: 50 54 5f 48 44 52 5f 58 58 58 20 23 64 65 66 69  PT_HDR_XXX #defi
03c0: 6e 65 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nes):.**.**     
03d0: 31 2e 20 54 68 65 20 63 68 65 63 6b 70 6f 69 6e  1. The checkpoin
03e0: 74 20 69 64 20 4d 53 57 2e 0a 2a 2a 20 20 20 20  t id MSW..**    
03f0: 20 32 2e 20 54 68 65 20 63 68 65 63 6b 70 6f 69   2. The checkpoi
0400: 6e 74 20 69 64 20 4c 53 57 2e 0a 2a 2a 20 20 20  nt id LSW..**   
0410: 20 20 33 2e 20 54 68 65 20 6e 75 6d 62 65 72 20    3. The number 
0420: 6f 66 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  of integer value
0430: 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
0440: 63 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 63 6c  checkpoint, incl
0450: 75 64 69 6e 67 20 0a 2a 2a 20 20 20 20 20 20 20  uding .**       
0460: 20 74 68 65 20 74 77 6f 20 63 68 65 63 6b 73 75   the two checksu
0470: 6d 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 20 20 20  m values..**    
0480: 20 34 2e 20 54 68 65 20 63 6f 6d 70 72 65 73 73   4. The compress
0490: 69 6f 6e 20 73 63 68 65 6d 65 20 69 64 2e 0a 2a  ion scheme id..*
04a0: 2a 20 20 20 20 20 35 2e 20 54 68 65 20 74 6f 74  *     5. The tot
04b0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
04c0: 63 6b 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  cks in the datab
04d0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 36 2e 20 54  ase..**     6. T
04e0: 68 65 20 62 6c 6f 63 6b 20 73 69 7a 65 2e 0a 2a  he block size..*
04f0: 2a 20 20 20 20 20 37 2e 20 54 68 65 20 6e 75 6d  *     7. The num
0500: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 2e 0a 2a  ber of levels..*
0510: 2a 20 20 20 20 20 38 2e 20 54 68 65 20 6e 6f 6d  *     8. The nom
0520: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  inal database pa
0530: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 20 20 20  ge size..**     
0540: 39 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  9. The number of
0550: 20 70 61 67 65 73 20 28 69 6e 20 74 6f 74 61 6c   pages (in total
0560: 29 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  ) written to the
0570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
0580: 2a 2a 0a 2a 2a 20 20 20 4c 6f 67 20 70 6f 69 6e  **.**   Log poin
0590: 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31  ter:.**.**     1
05a0: 2e 20 54 68 65 20 6c 6f 67 20 6f 66 66 73 65 74  . The log offset
05b0: 20 4d 53 57 2e 0a 2a 2a 20 20 20 20 20 32 2e 20   MSW..**     2. 
05c0: 54 68 65 20 6c 6f 67 20 6f 66 66 73 65 74 20 4c  The log offset L
05d0: 53 57 2e 0a 2a 2a 20 20 20 20 20 33 2e 20 4c 6f  SW..**     3. Lo
05e0: 67 20 63 68 65 63 6b 73 75 6d 20 30 2e 0a 2a 2a  g checksum 0..**
05f0: 20 20 20 20 20 34 2e 20 4c 6f 67 20 63 68 65 63       4. Log chec
0600: 6b 73 75 6d 20 31 2e 0a 2a 2a 0a 2a 2a 20 20 20  ksum 1..**.**   
0610: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
0620: 22 6c 6f 67 20 6f 66 66 73 65 74 22 20 69 73 20  "log offset" is 
0630: 6e 6f 74 20 74 68 65 20 6c 69 74 65 72 61 6c 20  not the literal 
0640: 62 79 74 65 20 6f 66 66 73 65 74 2e 20 49 6e 73  byte offset. Ins
0650: 74 65 61 64 2c 0a 2a 2a 20 20 20 20 20 69 74 20  tead,.**     it 
0660: 69 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  is the byte offs
0670: 65 74 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  et multiplied by
0680: 20 32 2c 20 77 69 74 68 20 6c 65 61 73 74 20 73   2, with least s
0690: 69 67 6e 69 66 69 63 61 6e 74 20 62 69 74 0a 2a  ignificant bit.*
06a0: 2a 20 20 20 20 20 74 6f 67 67 6c 65 64 20 65 61  *     toggled ea
06b0: 63 68 20 74 69 6d 65 20 74 68 65 20 6c 6f 67 20  ch time the log 
06c0: 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 69 73  pointer value is
06d0: 20 63 68 61 6e 67 65 64 2e 20 54 68 69 73 20 69   changed. This i
06e0: 73 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 20 20 20  s to make.**    
06f0: 20 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20   sure that this 
0700: 66 69 65 6c 64 20 63 68 61 6e 67 65 73 20 65 61  field changes ea
0710: 63 68 20 74 69 6d 65 20 74 68 65 20 6c 6f 67 20  ch time the log 
0720: 70 6f 69 6e 74 65 72 20 69 73 20 75 70 64 61 74  pointer is updat
0730: 65 64 2c 0a 2a 2a 20 20 20 20 20 65 76 65 6e 20  ed,.**     even 
0740: 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
0750: 69 74 73 65 6c 66 20 69 73 20 64 69 73 61 62 6c  itself is disabl
0760: 65 64 2e 20 53 65 65 20 6c 73 6d 54 72 65 65 4d  ed. See lsmTreeM
0770: 61 6b 65 4f 6c 64 28 29 2e 0a 2a 2a 0a 2a 2a 20  akeOld()..**.** 
0780: 20 20 20 20 53 65 65 20 63 6b 70 74 45 78 70 6f      See ckptExpo
0790: 72 74 4c 6f 67 28 29 20 61 6e 64 20 63 6b 70 74  rtLog() and ckpt
07a0: 49 6d 70 6f 72 74 4c 6f 67 28 29 2e 0a 2a 2a 0a  ImportLog()..**.
07b0: 2a 2a 20 20 20 41 70 70 65 6e 64 20 70 6f 69 6e  **   Append poin
07c0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 38 20  ts:.**.**     8 
07d0: 69 6e 74 65 67 65 72 73 20 28 34 20 2a 20 36 34  integers (4 * 64
07e0: 2d 62 69 74 20 70 61 67 65 20 6e 75 6d 62 65 72  -bit page number
07f0: 73 29 2e 20 53 65 65 20 63 6b 70 74 45 78 70 6f  s). See ckptExpo
0800: 72 74 41 70 70 65 6e 64 6c 69 73 74 28 29 2e 0a  rtAppendlist()..
0810: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68  **.**   For each
0820: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61   level in the da
0830: 74 61 62 61 73 65 2c 20 61 20 6c 65 76 65 6c 20  tabase, a level 
0840: 72 65 63 6f 72 64 2e 20 46 6f 72 6d 61 74 74 65  record. Formatte
0850: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
0860: 0a 2a 2a 20 20 20 20 20 30 2e 20 41 67 65 20 6f  .**     0. Age o
0870: 66 20 74 68 65 20 6c 65 76 65 6c 20 28 6c 65 61  f the level (lea
0880: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
0890: 36 2d 62 69 74 73 29 2e 20 41 6e 64 20 66 6c 61  6-bits). And fla
08a0: 67 73 20 6d 61 73 6b 20 28 6d 6f 73 74 0a 2a 2a  gs mask (most.**
08b0: 20 20 20 20 20 20 20 20 73 69 67 6e 69 66 69 63          signific
08c0: 61 6e 74 20 31 36 2d 62 69 74 73 29 2e 0a 2a 2a  ant 16-bits)..**
08d0: 20 20 20 20 20 31 2e 20 54 68 65 20 6e 75 6d 62       1. The numb
08e0: 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  er of right-hand
08f0: 20 73 65 67 6d 65 6e 74 73 20 28 6e 52 69 67 68   segments (nRigh
0900: 74 2c 20 70 6f 73 73 69 62 6c 79 20 30 29 2c 0a  t, possibly 0),.
0910: 2a 2a 20 20 20 20 20 32 2e 20 53 65 67 6d 65 6e  **     2. Segmen
0920: 74 20 72 65 63 6f 72 64 20 66 6f 72 20 6c 65 66  t record for lef
0930: 74 2d 68 61 6e 64 20 73 65 67 6d 65 6e 74 20 28  t-hand segment (
0940: 38 20 69 6e 74 65 67 65 72 73 20 64 65 66 69 6e  8 integers defin
0950: 65 64 20 62 65 6c 6f 77 29 2c 0a 2a 2a 20 20 20  ed below),.**   
0960: 20 20 33 2e 20 53 65 67 6d 65 6e 74 20 72 65 63    3. Segment rec
0970: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 72 69 67  ord for each rig
0980: 68 74 2d 68 61 6e 64 20 73 65 67 6d 65 6e 74 20  ht-hand segment 
0990: 28 38 20 69 6e 74 65 67 65 72 73 20 64 65 66 69  (8 integers defi
09a0: 6e 65 64 20 62 65 6c 6f 77 29 2c 0a 2a 2a 20 20  ned below),.**  
09b0: 20 20 20 34 2e 20 49 66 20 6e 52 69 67 68 74 3e     4. If nRight>
09c0: 30 2c 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  0, The number of
09d0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 76 6f 6c 76   segments involv
09e0: 65 64 20 69 6e 20 74 68 65 20 6d 65 72 67 65 0a  ed in the merge.
09f0: 2a 2a 20 20 20 20 20 35 2e 20 69 66 20 6e 52 69  **     5. if nRi
0a00: 67 68 74 3e 30 2c 20 43 75 72 72 65 6e 74 20 6e  ght>0, Current n
0a10: 53 6b 69 70 20 76 61 6c 75 65 20 28 73 65 65 20  Skip value (see 
0a20: 4d 65 72 67 65 20 73 74 72 75 63 74 75 72 65 20  Merge structure 
0a30: 64 65 66 6e 2e 29 2c 0a 2a 2a 20 20 20 20 20 36  defn.),.**     6
0a40: 2e 20 46 6f 72 20 65 61 63 68 20 73 65 67 6d 65  . For each segme
0a50: 6e 74 20 69 6e 20 74 68 65 20 6d 65 72 67 65 3a  nt in the merge:
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 35 61 2e 20 50  .**        5a. P
0a70: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  age number of ne
0a80: 78 74 20 63 65 6c 6c 20 74 6f 20 72 65 61 64 20  xt cell to read 
0a90: 64 75 72 69 6e 67 20 6d 65 72 67 65 20 28 74 68  during merge (th
0aa0: 69 73 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  is field.**     
0ab0: 20 20 20 20 20 20 20 69 73 20 36 34 2d 62 69 74         is 64-bit
0ac0: 73 20 2d 20 32 20 69 6e 74 65 67 65 72 73 29 0a  s - 2 integers).
0ad0: 2a 2a 20 20 20 20 20 20 20 20 35 62 2e 20 43 65  **        5b. Ce
0ae0: 6c 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78  ll number of nex
0af0: 74 20 63 65 6c 6c 20 74 6f 20 72 65 61 64 20 64  t cell to read d
0b00: 75 72 69 6e 67 20 6d 65 72 67 65 0a 2a 2a 20 20  uring merge.**  
0b10: 20 20 20 37 2e 20 50 61 67 65 20 63 6f 6e 74 61     7. Page conta
0b20: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 73 70  ining current sp
0b30: 6c 69 74 2d 6b 65 79 20 28 36 34 2d 62 69 74 73  lit-key (64-bits
0b40: 20 2d 20 32 20 69 6e 74 65 67 65 72 73 29 2e 0a   - 2 integers)..
0b50: 2a 2a 20 20 20 20 20 38 2e 20 43 65 6c 6c 20 77  **     8. Cell w
0b60: 69 74 68 69 6e 20 70 61 67 65 20 63 6f 6e 74 61  ithin page conta
0b70: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 73 70  ining current sp
0b80: 6c 69 74 2d 6b 65 79 2e 0a 2a 2a 20 20 20 20 20  lit-key..**     
0b90: 39 2e 20 43 75 72 72 65 6e 74 20 70 6f 69 6e 74  9. Current point
0ba0: 65 72 20 76 61 6c 75 65 20 28 36 34 2d 62 69 74  er value (64-bit
0bb0: 73 20 2d 20 32 20 69 6e 74 65 67 65 72 73 29 2e  s - 2 integers).
0bc0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 62 6c 6f  .**.**   The blo
0bd0: 63 6b 20 72 65 64 69 72 65 63 74 20 61 72 72 61  ck redirect arra
0be0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20  y:.**.**     1. 
0bf0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 64 69 72 65  Number of redire
0c00: 63 74 69 6f 6e 73 20 28 6d 61 78 69 6d 75 6d 20  ctions (maximum 
0c10: 4c 53 4d 5f 4d 41 58 5f 42 4c 4f 43 4b 5f 52 45  LSM_MAX_BLOCK_RE
0c20: 44 49 52 45 43 54 53 29 2e 0a 2a 2a 20 20 20 20  DIRECTS)..**    
0c30: 20 32 2e 20 46 6f 72 20 65 61 63 68 20 72 65 64   2. For each red
0c40: 69 72 65 63 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  irection:.**    
0c50: 20 20 20 20 61 2e 20 22 66 72 6f 6d 22 20 62 6c      a. "from" bl
0c60: 6f 63 6b 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ock number.**   
0c70: 20 20 20 20 20 62 2e 20 22 74 6f 22 20 62 6c 6f       b. "to" blo
0c80: 63 6b 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20  ck number.**.** 
0c90: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
0ca0: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 69 65 73  freelist entries
0cb0: 2e 20 45 61 63 68 20 65 6e 74 72 79 20 69 73 20  . Each entry is 
0cc0: 65 69 74 68 65 72 20 61 6e 20 69 6e 73 65 72 74  either an insert
0cd0: 20 6f 72 20 61 0a 2a 2a 20 20 20 64 65 6c 65 74   or a.**   delet
0ce0: 65 2e 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  e. The in-memory
0cf0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 74 6f 20   freelist is to 
0d00: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 2d 6c  the free-block-l
0d10: 69 73 74 20 61 73 20 74 68 65 0a 2a 2a 20 20 20  ist as the.**   
0d20: 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 69  in-memory tree i
0d30: 73 20 74 6f 20 74 68 65 20 75 73 65 72 73 20 64  s to the users d
0d40: 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 2e  atabase content.
0d50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20 4e 75  .**.**     1. Nu
0d60: 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
0d70: 74 20 65 6e 74 72 69 65 73 20 73 74 6f 72 65 64  t entries stored
0d80: 20 69 6e 20 63 68 65 63 6b 70 6f 69 6e 74 20 68   in checkpoint h
0d90: 65 61 64 65 72 2e 0a 2a 2a 20 20 20 20 20 32 2e  eader..**     2.
0da0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   Number of free 
0db0: 62 6c 6f 63 6b 73 20 28 69 6e 20 74 6f 74 61 6c  blocks (in total
0dc0: 29 2e 0a 2a 2a 20 20 20 20 20 33 2e 20 54 6f 74  )..**     3. Tot
0dd0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
0de0: 63 6b 73 20 66 72 65 65 64 20 64 75 72 69 6e 67  cks freed during
0df0: 20 64 61 74 61 62 61 73 65 20 6c 69 66 65 74 69   database lifeti
0e00: 6d 65 2e 0a 2a 2a 20 20 20 20 20 34 2e 20 46 6f  me..**     4. Fo
0e10: 72 20 65 61 63 68 20 65 6e 74 72 79 3a 0a 2a 2a  r each entry:.**
0e20: 20 20 20 20 20 20 20 20 32 61 2e 20 42 6c 6f 63          2a. Bloc
0e30: 6b 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  k number of free
0e40: 20 62 6c 6f 63 6b 2e 0a 2a 2a 20 20 20 20 20 20   block..**      
0e50: 20 20 32 62 2e 20 41 20 36 34 2d 62 69 74 20 69    2b. A 64-bit i
0e60: 6e 74 65 67 65 72 20 28 4d 53 57 20 66 6f 6c 6c  nteger (MSW foll
0e70: 6f 77 65 64 20 62 79 20 4c 53 57 29 2e 20 2d 31  owed by LSW). -1
0e80: 20 66 6f 72 20 61 20 64 65 6c 65 74 65 20 65 6e   for a delete en
0e90: 74 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  try,.**         
0ea0: 20 20 20 6f 72 20 74 68 65 20 61 73 73 6f 63 69     or the associ
0eb0: 61 74 65 64 20 63 68 65 63 6b 70 6f 69 6e 74 20  ated checkpoint 
0ec0: 69 64 20 66 6f 72 20 61 6e 20 69 6e 73 65 72 74  id for an insert
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 68  ..**.**   The ch
0ee0: 65 63 6b 73 75 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  ecksum:.**.**   
0ef0: 20 20 31 2e 20 43 68 65 63 6b 73 75 6d 20 76 61    1. Checksum va
0f00: 6c 75 65 20 31 2e 0a 2a 2a 20 20 20 20 20 32 2e  lue 1..**     2.
0f10: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
0f20: 32 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  2..**.** In the 
0f30: 61 62 6f 76 65 2c 20 61 20 73 65 67 6d 65 6e 74  above, a segment
0f40: 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 73   record consists
0f50: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0f60: 67 20 66 6f 75 72 20 36 34 2d 62 69 74 20 0a 2a  g four 64-bit .*
0f70: 2a 20 66 69 65 6c 64 73 20 28 63 6f 6e 76 65 72  * fields (conver
0f80: 74 65 64 20 74 6f 20 32 20 2a 20 75 33 32 20 62  ted to 2 * u32 b
0f90: 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 4d 53  y storing the MS
0fa0: 57 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 4c 53  W followed by LS
0fb0: 57 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e  W):.**.**     1.
0fc0: 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 61   First page of a
0fd0: 72 72 61 79 2c 0a 2a 2a 20 20 20 20 20 32 2e 20  rray,.**     2. 
0fe0: 4c 61 73 74 20 70 61 67 65 20 6f 66 20 61 72 72  Last page of arr
0ff0: 61 79 2c 0a 2a 2a 20 20 20 20 20 33 2e 20 52 6f  ay,.**     3. Ro
1000: 6f 74 20 70 61 67 65 20 6f 66 20 61 72 72 61 79  ot page of array
1010: 20 28 6f 72 20 30 29 2c 0a 2a 2a 20 20 20 20 20   (or 0),.**     
1020: 34 2e 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  4. Size of array
1030: 20 69 6e 20 70 61 67 65 73 2e 0a 2a 2f 0a 0a 2f   in pages..*/../
1040: 2a 0a 2a 2a 20 4c 41 52 47 45 20 4e 55 4d 42 45  *.** LARGE NUMBE
1050: 52 53 20 4f 46 20 4c 45 56 45 4c 20 52 45 43 4f  RS OF LEVEL RECO
1060: 52 44 53 3a 0a 2a 2a 0a 2a 2a 20 41 20 6c 69 6d  RDS:.**.** A lim
1070: 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
1080: 20 6f 66 20 72 68 73 20 73 65 67 6d 65 6e 74 73   of rhs segments
1090: 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 72 65   that may be pre
10a0: 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  sent in the data
10b0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 20 44 65  base.** file. De
10c0: 66 69 6e 69 6e 67 20 74 68 69 73 20 6c 69 6d 69  fining this limi
10d0: 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  t ensures that a
10e0: 6c 6c 20 6c 65 76 65 6c 20 72 65 63 6f 72 64 73  ll level records
10f0: 20 66 69 74 20 77 69 74 68 69 6e 0a 2a 2a 20 74   fit within.** t
1100: 68 65 20 34 30 39 36 20 62 79 74 65 20 6c 69 6d  he 4096 byte lim
1110: 69 74 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e  it for checkpoin
1120: 74 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 54  t blobs..**.** T
1130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 69 67  he number of rig
1140: 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 73 65 67  ht-hand-side seg
1150: 6d 65 6e 74 73 20 69 6e 20 61 20 64 61 74 61 62  ments in a datab
1160: 61 73 65 20 69 73 20 63 6f 75 6e 74 65 64 20 61  ase is counted a
1170: 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
1180: 2a 0a 2a 2a 20 20 20 2a 20 46 6f 72 20 65 61 63  *.**   * For eac
1190: 68 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64  h level in the d
11a0: 61 74 61 62 61 73 65 20 6e 6f 74 20 75 6e 64 65  atabase not unde
11b0: 72 67 6f 69 6e 67 20 61 20 6d 65 72 67 65 2c 20  rgoing a merge, 
11c0: 61 64 64 20 31 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  add 1..**.**   *
11d0: 20 46 6f 72 20 65 61 63 68 20 6c 65 76 65 6c 20   For each level 
11e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
11f0: 74 68 61 74 20 69 73 20 75 6e 64 65 72 67 6f 69  that is undergoi
1200: 6e 67 20 61 20 6d 65 72 67 65 2c 20 61 64 64 20  ng a merge, add 
1210: 0a 2a 2a 20 20 20 20 20 74 68 65 20 6e 75 6d 62  .**     the numb
1220: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f  er of segments o
1230: 6e 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  n the rhs of the
1240: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 41 20   level..**.** A 
1250: 6c 65 76 65 6c 20 72 65 63 6f 72 64 20 6e 6f 74  level record not
1260: 20 75 6e 64 65 72 67 6f 69 6e 67 20 61 20 6d 65   undergoing a me
1270: 72 67 65 20 69 73 20 31 30 20 69 6e 74 65 67 65  rge is 10 intege
1280: 72 73 2e 20 41 20 6c 65 76 65 6c 20 72 65 63 6f  rs. A level reco
1290: 72 64 20 0a 2a 2a 20 77 69 74 68 20 6e 52 68 73  rd .** with nRhs
12a0: 20 72 68 73 20 73 65 67 6d 65 6e 74 73 20 61 6e   rhs segments an
12b0: 64 20 28 6e 52 68 73 2b 31 29 20 69 6e 70 75 74  d (nRhs+1) input
12c0: 20 73 65 67 6d 65 6e 74 73 20 28 69 2e 65 2e 20   segments (i.e. 
12d0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 0a 2a  including the .*
12e0: 2a 20 73 65 70 61 72 61 74 6f 72 73 20 66 72 6f  * separators fro
12f0: 6d 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c  m the next level
1300: 29 20 69 73 20 28 31 31 2a 6e 52 68 73 2b 32 30  ) is (11*nRhs+20
1310: 29 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  ) integers. The 
1320: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 65 72 20 72  maximum.** per r
1330: 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6c  ight-hand-side l
1340: 65 76 65 6c 20 69 73 20 74 68 65 72 65 66 6f 72  evel is therefor
1350: 65 20 32 31 20 69 6e 74 65 67 65 72 73 2e 20 53  e 21 integers. S
1360: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
1370: 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 6c 65 76   size of all lev
1380: 65 6c 20 72 65 63 6f 72 64 73 20 69 6e 20 61 20  el records in a 
1390: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 32 31  checkpoint is 21
13a0: 2a 34 30 3d 38 32 30 20 69 6e 74 65 67 65 72 73  *40=820 integers
13b0: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 42 65  ..**.** TODO: Be
13c0: 66 6f 72 65 20 70 6f 69 6e 74 65 72 20 76 61 6c  fore pointer val
13d0: 75 65 73 20 77 65 72 65 20 63 68 61 6e 67 65 64  ues were changed
13e0: 20 66 72 6f 6d 20 33 32 20 74 6f 20 36 34 20 62   from 32 to 64 b
13f0: 69 74 73 2c 20 74 68 65 20 61 62 6f 76 65 0a 2a  its, the above.*
1400: 2a 20 75 73 65 64 20 74 6f 20 63 6f 6d 65 20 74  * used to come t
1410: 6f 20 34 32 30 20 62 79 74 65 73 20 2d 20 6c 65  o 420 bytes - le
1420: 61 76 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e  aving significan
1430: 74 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 72  t space for a fr
1440: 65 65 2d 6c 69 73 74 0a 2a 2a 20 70 72 65 66 69  ee-list.** prefi
1450: 78 2e 20 4e 6f 20 6d 6f 72 65 2e 20 54 6f 20 66  x. No more. To f
1460: 69 78 20 74 68 69 73 2c 20 72 65 64 75 63 65 20  ix this, reduce 
1470: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1480: 6c 65 76 65 6c 20 72 65 63 6f 72 64 73 20 69 6e  level records in
1490: 0a 2a 2a 20 61 20 64 62 20 73 6e 61 70 73 68 6f  .** a db snapsho
14a0: 74 2c 20 61 6e 64 20 69 6d 70 72 6f 76 65 20 6d  t, and improve m
14b0: 61 6e 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65  anagement of the
14c0: 20 66 72 65 65 2d 6c 69 73 74 20 74 61 69 6c 20   free-list tail 
14d0: 69 6e 20 0a 2a 2a 20 6c 73 6d 5f 73 6f 72 74 65  in .** lsm_sorte
14e0: 64 2e 63 2e 20 0a 2a 2f 0a 23 64 65 66 69 6e 65  d.c. .*/.#define
14f0: 20 4c 53 4d 5f 4d 41 58 5f 52 48 53 5f 53 45 47   LSM_MAX_RHS_SEG
1500: 4d 45 4e 54 53 20 34 30 0a 0a 2f 2a 0a 2a 2a 20  MENTS 40../*.** 
1510: 4c 41 52 47 45 20 4e 55 4d 42 45 52 53 20 4f 46  LARGE NUMBERS OF
1520: 20 46 52 45 45 4c 49 53 54 20 45 4e 54 52 49 45   FREELIST ENTRIE
1530: 53 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  S:.**.** There i
1540: 73 20 61 6c 73 6f 20 61 20 6c 69 6d 69 74 20 28  s also a limit (
1550: 4c 53 4d 5f 4d 41 58 5f 46 52 45 45 4c 49 53 54  LSM_MAX_FREELIST
1560: 5f 45 4e 54 52 49 45 53 20 2d 20 64 65 66 69 6e  _ENTRIES - defin
1570: 65 64 20 69 6e 20 6c 73 6d 49 6e 74 2e 68 29 0a  ed in lsmInt.h).
1580: 2a 2a 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  ** on the number
1590: 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 65 6e   of free-list en
15a0: 74 72 69 65 73 20 73 74 6f 72 65 64 20 69 6e 20  tries stored in 
15b0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 53 69  a checkpoint. Si
15c0: 6e 63 65 20 65 61 63 68 20 0a 2a 2a 20 66 72 65  nce each .** fre
15d0: 65 2d 6c 69 73 74 20 65 6e 74 72 79 20 63 6f 6e  e-list entry con
15e0: 73 69 73 74 73 20 6f 66 20 33 20 69 6e 74 65 67  sists of 3 integ
15f0: 65 72 73 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ers, the maximum
1600: 20 66 72 65 65 2d 6c 69 73 74 20 73 69 7a 65 20   free-list size 
1610: 69 73 20 0a 2a 2a 20 33 2a 31 30 30 3d 33 30 30  is .** 3*100=300
1620: 20 69 6e 74 65 67 65 72 73 2e 20 43 6f 6d 62 69   integers. Combi
1630: 6e 65 64 20 77 69 74 68 20 74 68 65 20 6c 69 6d  ned with the lim
1640: 69 74 20 6f 6e 20 72 68 73 20 73 65 67 6d 65 6e  it on rhs segmen
1650: 74 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 61 62  ts defined.** ab
1660: 6f 76 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ove, this ensure
1670: 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 70 6f  s that a checkpo
1680: 69 6e 74 20 61 6c 77 61 79 73 20 66 69 74 73 20  int always fits 
1690: 77 69 74 68 69 6e 20 61 20 34 30 39 36 20 62 79  within a 4096 by
16a0: 74 65 0a 2a 2a 20 6d 65 74 61 20 70 61 67 65 2e  te.** meta page.
16b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
16c0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
16d0: 6d 6f 72 65 20 74 68 61 6e 20 31 30 30 20 66 72  more than 100 fr
16e0: 65 65 20 62 6c 6f 63 6b 73 2c 20 74 68 65 20 22  ee blocks, the "
16f0: 6f 76 65 72 66 6c 6f 77 22 20 66 6c 61 67 0a 2a  overflow" flag.*
1700: 2a 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f  * in the checkpo
1710: 69 6e 74 20 68 65 61 64 65 72 20 69 73 20 73 65  int header is se
1720: 74 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e  t and the remain
1730: 64 65 72 20 61 72 65 20 73 74 6f 72 65 64 20 69  der are stored i
1740: 6e 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  n the.** system 
1750: 46 52 45 45 4c 49 53 54 20 65 6e 74 72 79 20 69  FREELIST entry i
1760: 6e 20 74 68 65 20 4c 53 4d 20 28 61 6c 6f 6e 67  n the LSM (along
1770: 20 77 69 74 68 20 75 73 65 72 20 64 61 74 61 29   with user data)
1780: 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 61  . The value.** a
1790: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 74 68 65 20  ccompanying the 
17a0: 46 52 45 45 4c 49 53 54 20 6b 65 79 20 69 6e 20  FREELIST key in 
17b0: 74 68 65 20 4c 53 4d 20 69 73 2c 20 6c 69 6b 65  the LSM is, like
17c0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61   a checkpoint, a
17d0: 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 33 32  n array.** of 32
17e0: 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
17f0: 69 6e 74 65 67 65 72 73 2e 20 41 73 20 66 6f 6c  integers. As fol
1800: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1810: 46 6f 72 20 65 61 63 68 20 65 6e 74 72 79 3a 0a  For each entry:.
1820: 2a 2a 20 20 20 20 20 20 20 61 2e 20 42 6c 6f 63  **       a. Bloc
1830: 6b 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  k number of free
1840: 20 62 6c 6f 63 6b 2e 0a 2a 2a 20 20 20 20 20 20   block..**      
1850: 20 62 2e 20 4d 53 57 20 6f 66 20 61 73 73 6f 63   b. MSW of assoc
1860: 69 61 74 65 64 20 63 68 65 63 6b 70 6f 69 6e 74  iated checkpoint
1870: 20 69 64 2e 0a 2a 2a 20 20 20 20 20 20 20 63 2e   id..**       c.
1880: 20 4c 53 57 20 6f 66 20 61 73 73 6f 63 69 61 74   LSW of associat
1890: 65 64 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 64  ed checkpoint id
18a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
18b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 73  er of entries is
18c0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 2d 20   not required - 
18d0: 69 74 20 69 73 20 69 6d 70 6c 69 65 64 20 62 79  it is implied by
18e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18f0: 0a 2a 2a 20 76 61 6c 75 65 20 62 6c 6f 62 20 63  .** value blob c
1900: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
1910: 74 65 67 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a  teger array..**.
1920: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
1930: 20 6c 69 6d 69 74 20 64 65 66 69 6e 65 64 20 62   limit defined b
1940: 79 20 4c 53 4d 5f 4d 41 58 5f 46 52 45 45 4c 49  y LSM_MAX_FREELI
1950: 53 54 5f 45 4e 54 52 49 45 53 20 69 73 20 61 20  ST_ENTRIES is a 
1960: 68 61 72 64 20 6c 69 6d 69 74 2e 0a 2a 2a 20 54  hard limit..** T
1970: 68 65 20 61 63 74 75 61 6c 20 76 61 6c 75 65 20  he actual value 
1980: 75 73 65 64 20 6d 61 79 20 62 65 20 63 6f 6e 66  used may be conf
1990: 69 67 75 72 65 64 20 75 73 69 6e 67 20 4c 53 4d  igured using LSM
19a0: 5f 43 4f 4e 46 49 47 5f 4d 41 58 5f 46 52 45 45  _CONFIG_MAX_FREE
19b0: 4c 49 53 54 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LIST..*/../*.** 
19c0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
19d0: 74 68 69 73 20 6d 61 63 72 6f 20 6d 75 73 74 20  this macro must 
19e0: 62 65 20 6f 66 20 74 79 70 65 20 75 33 32 2e 20  be of type u32. 
19f0: 4f 6e 20 61 20 6c 69 74 74 6c 65 2d 65 6e 64 69  On a little-endi
1a00: 61 6e 0a 2a 2a 20 61 72 63 68 69 74 65 63 74 75  an.** architectu
1a10: 72 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20 74  re, it returns t
1a20: 68 65 20 75 33 32 20 76 61 6c 75 65 20 74 68 61  he u32 value tha
1a30: 74 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 69  t results from i
1a40: 6e 74 65 72 70 72 65 74 69 6e 67 0a 2a 2a 20 74  nterpreting.** t
1a50: 68 65 20 34 20 62 79 74 65 73 20 61 73 20 61 20  he 4 bytes as a 
1a60: 62 69 67 2d 65 6e 64 69 61 6e 20 76 61 6c 75 65  big-endian value
1a70: 2e 20 4f 6e 20 61 20 62 69 67 2d 65 6e 64 69 61  . On a big-endia
1a80: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 2c 20  n architecture, 
1a90: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 68  it.** returns th
1aa0: 65 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f 75  e value that wou
1ab0: 6c 64 20 62 65 20 70 72 6f 64 75 63 65 64 20 62  ld be produced b
1ac0: 79 20 69 6e 74 65 70 72 65 74 69 6e 67 20 74 68  y intepreting th
1ad0: 65 20 34 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  e 4 bytes.** of 
1ae0: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20  the input value 
1af0: 61 73 20 61 20 6c 69 74 74 6c 65 2d 65 6e 64 69  as a little-endi
1b00: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 23  an integer..*/.#
1b10: 64 65 66 69 6e 65 20 42 59 54 45 53 57 41 50 33  define BYTESWAP3
1b20: 32 28 78 29 20 28 20 5c 0a 20 20 20 28 28 28 78  2(x) ( \.   (((x
1b30: 29 26 30 78 30 30 30 30 30 30 46 46 29 3c 3c 32  )&0x000000FF)<<2
1b40: 34 29 20 2b 20 28 28 28 78 29 26 30 78 30 30 30  4) + (((x)&0x000
1b50: 30 46 46 30 30 29 3c 3c 38 29 20 20 5c 0a 20 2b  0FF00)<<8)  \. +
1b60: 20 28 28 28 78 29 26 30 78 30 30 46 46 30 30 30   (((x)&0x00FF000
1b70: 30 29 3e 3e 38 29 20 20 2b 20 28 28 28 78 29 26  0)>>8)  + (((x)&
1b80: 30 78 46 46 30 30 30 30 30 30 29 3e 3e 32 34 29  0xFF000000)>>24)
1b90: 20 5c 0a 29 0a 0a 73 74 61 74 69 63 20 63 6f 6e   \.)..static con
1ba0: 73 74 20 69 6e 74 20 6f 6e 65 20 3d 20 31 3b 0a  st int one = 1;.
1bb0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 49 54 54  #define LSM_LITT
1bc0: 4c 45 5f 45 4e 44 49 41 4e 20 28 2a 28 75 38 20  LE_ENDIAN (*(u8 
1bd0: 2a 29 28 26 6f 6e 65 29 29 0a 0a 2f 2a 20 53 69  *)(&one))../* Si
1be0: 7a 65 73 2c 20 69 6e 20 69 6e 74 65 67 65 72 73  zes, in integers
1bf0: 2c 20 6f 66 20 76 61 72 69 6f 75 73 20 70 61 72  , of various par
1c00: 74 73 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  ts of the checkp
1c10: 6f 69 6e 74 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  oint. */.#define
1c20: 20 43 4b 50 54 5f 48 44 52 5f 53 49 5a 45 20 20   CKPT_HDR_SIZE  
1c30: 20 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65         9.#define
1c40: 20 43 4b 50 54 5f 4c 4f 47 50 54 52 5f 53 49 5a   CKPT_LOGPTR_SIZ
1c50: 45 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65  E      4.#define
1c60: 20 43 4b 50 54 5f 41 50 50 45 4e 44 4c 49 53 54   CKPT_APPENDLIST
1c70: 5f 53 49 5a 45 20 20 28 4c 53 4d 5f 41 50 50 4c  _SIZE  (LSM_APPL
1c80: 49 53 54 5f 53 5a 20 2a 20 32 29 0a 0a 2f 2a 20  IST_SZ * 2)../* 
1c90: 41 20 23 64 65 66 69 6e 65 20 74 6f 20 64 65 73  A #define to des
1ca0: 63 72 69 62 65 20 65 61 63 68 20 69 6e 74 65 67  cribe each integ
1cb0: 65 72 20 69 6e 20 74 68 65 20 63 68 65 63 6b 70  er in the checkp
1cc0: 6f 69 6e 74 20 68 65 61 64 65 72 2e 20 2a 2f 0a  oint header. */.
1cd0: 23 64 65 66 69 6e 65 20 43 4b 50 54 5f 48 44 52  #define CKPT_HDR
1ce0: 5f 49 44 5f 4d 53 57 20 20 20 30 0a 23 64 65 66  _ID_MSW   0.#def
1cf0: 69 6e 65 20 43 4b 50 54 5f 48 44 52 5f 49 44 5f  ine CKPT_HDR_ID_
1d00: 4c 53 57 20 20 20 31 0a 23 64 65 66 69 6e 65 20  LSW   1.#define 
1d10: 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54 20 20  CKPT_HDR_NCKPT  
1d20: 20 20 32 0a 23 64 65 66 69 6e 65 20 43 4b 50 54    2.#define CKPT
1d30: 5f 48 44 52 5f 43 4d 50 49 44 20 20 20 20 33 0a  _HDR_CMPID    3.
1d40: 23 64 65 66 69 6e 65 20 43 4b 50 54 5f 48 44 52  #define CKPT_HDR
1d50: 5f 4e 42 4c 4f 43 4b 20 20 20 34 0a 23 64 65 66  _NBLOCK   4.#def
1d60: 69 6e 65 20 43 4b 50 54 5f 48 44 52 5f 42 4c 4b  ine CKPT_HDR_BLK
1d70: 53 5a 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20  SZ    5.#define 
1d80: 43 4b 50 54 5f 48 44 52 5f 4e 4c 45 56 45 4c 20  CKPT_HDR_NLEVEL 
1d90: 20 20 36 0a 23 64 65 66 69 6e 65 20 43 4b 50 54    6.#define CKPT
1da0: 5f 48 44 52 5f 50 47 53 5a 20 20 20 20 20 37 0a  _HDR_PGSZ     7.
1db0: 23 64 65 66 69 6e 65 20 43 4b 50 54 5f 48 44 52  #define CKPT_HDR
1dc0: 5f 4e 57 52 49 54 45 20 20 20 38 0a 0a 23 64 65  _NWRITE   8..#de
1dd0: 66 69 6e 65 20 43 4b 50 54 5f 48 44 52 5f 4c 4f  fine CKPT_HDR_LO
1de0: 5f 4d 53 57 20 20 20 20 20 39 0a 23 64 65 66 69  _MSW     9.#defi
1df0: 6e 65 20 43 4b 50 54 5f 48 44 52 5f 4c 4f 5f 4c  ne CKPT_HDR_LO_L
1e00: 53 57 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65  SW    10.#define
1e10: 20 43 4b 50 54 5f 48 44 52 5f 4c 4f 5f 43 4b 53   CKPT_HDR_LO_CKS
1e20: 55 4d 31 20 31 31 0a 23 64 65 66 69 6e 65 20 43  UM1 11.#define C
1e30: 4b 50 54 5f 48 44 52 5f 4c 4f 5f 43 4b 53 55 4d  KPT_HDR_LO_CKSUM
1e40: 32 20 31 32 0a 0a 74 79 70 65 64 65 66 20 73 74  2 12..typedef st
1e50: 72 75 63 74 20 43 6b 70 74 42 75 66 66 65 72 20  ruct CkptBuffer 
1e60: 43 6b 70 74 42 75 66 66 65 72 3b 0a 0a 2f 2a 0a  CkptBuffer;../*.
1e70: 2a 2a 20 44 79 6e 61 6d 69 63 20 62 75 66 66 65  ** Dynamic buffe
1e80: 72 20 75 73 65 64 20 74 6f 20 61 63 63 75 6d 75  r used to accumu
1e90: 6c 61 74 65 20 64 61 74 61 20 66 6f 72 20 61 20  late data for a 
1ea0: 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  checkpoint..*/.s
1eb0: 74 72 75 63 74 20 43 6b 70 74 42 75 66 66 65 72  truct CkptBuffer
1ec0: 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45   {.  lsm_env *pE
1ed0: 6e 76 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  nv;.  int nAlloc
1ee0: 3b 0a 20 20 75 33 32 20 2a 61 43 6b 70 74 3b 0a  ;.  u32 *aCkpt;.
1ef0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c  };../*.** Calcul
1f00: 61 74 65 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ate the checksum
1f10: 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
1f20: 6e 74 20 73 70 65 63 69 66 69 65 64 20 62 79 20  nt specified by 
1f30: 61 72 67 75 6d 65 6e 74 73 20 61 43 6b 70 74 20  arguments aCkpt 
1f40: 61 6e 64 0a 2a 2a 20 6e 43 6b 70 74 2e 20 53 74  and.** nCkpt. St
1f50: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ore the checksum
1f60: 20 69 6e 20 2a 70 69 43 6b 73 75 6d 31 20 61 6e   in *piCksum1 an
1f70: 64 20 2a 70 69 43 6b 73 75 6d 32 20 62 65 66 6f  d *piCksum2 befo
1f80: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1f90: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
1fa0: 20 74 68 65 20 6e 43 6b 70 74 20 70 61 72 61 6d   the nCkpt param
1fb0: 65 74 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  eter includes th
1fc0: 65 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 20 76  e two checksum v
1fd0: 61 6c 75 65 73 20 61 74 0a 2a 2a 20 74 68 65 20  alues at.** the 
1fe0: 65 6e 64 20 6f 66 20 74 68 65 20 63 68 65 63 6b  end of the check
1ff0: 70 6f 69 6e 74 2e 20 54 68 65 79 20 61 72 65 20  point. They are 
2000: 6e 6f 74 20 75 73 65 64 20 61 73 20 69 6e 70 75  not used as inpu
2010: 74 73 20 74 6f 20 74 68 65 20 63 68 65 63 6b 73  ts to the checks
2020: 75 6d 20 0a 2a 2a 20 63 61 6c 63 75 6c 61 74 69  um .** calculati
2030: 6f 6e 2e 20 54 68 65 20 63 68 65 63 6b 73 75 6d  on. The checksum
2040: 20 69 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65   is based on the
2050: 20 61 72 72 61 79 20 6f 66 20 28 6e 43 6b 70 74   array of (nCkpt
2060: 2d 32 29 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  -2) integers.** 
2070: 61 74 20 61 43 6b 70 74 5b 5d 2e 0a 2a 2f 0a 73  at aCkpt[]..*/.s
2080: 74 61 74 69 63 20 76 6f 69 64 20 63 6b 70 74 43  tatic void ckptC
2090: 68 65 63 6b 73 75 6d 28 75 33 32 20 2a 61 43 6b  hecksum(u32 *aCk
20a0: 70 74 2c 20 75 33 32 20 6e 43 6b 70 74 2c 20 75  pt, u32 nCkpt, u
20b0: 33 32 20 2a 70 69 43 6b 73 75 6d 31 2c 20 75 33  32 *piCksum1, u3
20c0: 32 20 2a 70 69 43 6b 73 75 6d 32 29 7b 0a 20 20  2 *piCksum2){.  
20d0: 75 33 32 20 69 3b 0a 20 20 75 33 32 20 63 6b 73  u32 i;.  u32 cks
20e0: 75 6d 31 20 3d 20 31 3b 0a 20 20 75 33 32 20 63  um1 = 1;.  u32 c
20f0: 6b 73 75 6d 32 20 3d 20 32 3b 0a 0a 20 20 69 66  ksum2 = 2;..  if
2100: 28 20 6e 43 6b 70 74 20 25 20 32 20 29 7b 0a 20  ( nCkpt % 2 ){. 
2110: 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 61 43 6b     cksum1 += aCk
2120: 70 74 5b 6e 43 6b 70 74 2d 33 5d 20 26 20 30 78  pt[nCkpt-3] & 0x
2130: 30 30 30 30 46 46 46 46 3b 0a 20 20 20 20 63 6b  0000FFFF;.    ck
2140: 73 75 6d 32 20 2b 3d 20 61 43 6b 70 74 5b 6e 43  sum2 += aCkpt[nC
2150: 6b 70 74 2d 33 5d 20 26 20 30 78 46 46 46 46 30  kpt-3] & 0xFFFF0
2160: 30 30 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  000;.  }..  for(
2170: 69 3d 30 3b 20 28 69 2b 33 29 3c 6e 43 6b 70 74  i=0; (i+3)<nCkpt
2180: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 63 6b 73  ; i+=2){.    cks
2190: 75 6d 31 20 2b 3d 20 63 6b 73 75 6d 32 20 2b 20  um1 += cksum2 + 
21a0: 61 43 6b 70 74 5b 69 5d 3b 0a 20 20 20 20 63 6b  aCkpt[i];.    ck
21b0: 73 75 6d 32 20 2b 3d 20 63 6b 73 75 6d 31 20 2b  sum2 += cksum1 +
21c0: 20 61 43 6b 70 74 5b 69 2b 31 5d 3b 0a 20 20 7d   aCkpt[i+1];.  }
21d0: 0a 0a 20 20 2a 70 69 43 6b 73 75 6d 31 20 3d 20  ..  *piCksum1 = 
21e0: 63 6b 73 75 6d 31 3b 0a 20 20 2a 70 69 43 6b 73  cksum1;.  *piCks
21f0: 75 6d 32 20 3d 20 63 6b 73 75 6d 32 3b 0a 7d 0a  um2 = cksum2;.}.
2200: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 69 6e 74 65 67  ./*.** Set integ
2210: 65 72 20 69 49 64 78 20 6f 66 20 74 68 65 20 63  er iIdx of the c
2220: 68 65 63 6b 70 6f 69 6e 74 20 61 63 63 75 6d 75  heckpoint accumu
2230: 6c 61 74 69 6e 67 20 69 6e 20 62 75 66 66 65 72  lating in buffer
2240: 20 2a 70 20 74 6f 20 69 56 61 6c 2e 0a 2a 2f 0a   *p to iVal..*/.
2250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6b 70 74  static void ckpt
2260: 53 65 74 56 61 6c 75 65 28 43 6b 70 74 42 75 66  SetValue(CkptBuf
2270: 66 65 72 20 2a 70 2c 20 69 6e 74 20 69 49 64 78  fer *p, int iIdx
2280: 2c 20 75 33 32 20 69 56 61 6c 2c 20 69 6e 74 20  , u32 iVal, int 
2290: 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 2a 70 52  *pRc){.  if( *pR
22a0: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  c ) return;.  if
22b0: 28 20 69 49 64 78 3e 3d 70 2d 3e 6e 41 6c 6c 6f  ( iIdx>=p->nAllo
22c0: 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  c ){.    int nNe
22d0: 77 20 3d 20 4c 53 4d 5f 4d 41 58 28 38 2c 20 69  w = LSM_MAX(8, i
22e0: 49 64 78 2a 32 29 3b 0a 20 20 20 20 70 2d 3e 61  Idx*2);.    p->a
22f0: 43 6b 70 74 20 3d 20 28 75 33 32 20 2a 29 6c 73  Ckpt = (u32 *)ls
2300: 6d 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  mReallocOrFree(p
2310: 2d 3e 70 45 6e 76 2c 20 70 2d 3e 61 43 6b 70 74  ->pEnv, p->aCkpt
2320: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 75 33  , nNew*sizeof(u3
2330: 32 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  2));.    if( !p-
2340: 3e 61 43 6b 70 74 20 29 7b 0a 20 20 20 20 20 20  >aCkpt ){.      
2350: 2a 70 52 63 20 3d 20 4c 53 4d 5f 4e 4f 4d 45 4d  *pRc = LSM_NOMEM
2360: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
2370: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
2380: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ->nAlloc = nNew;
2390: 0a 20 20 7d 0a 20 20 70 2d 3e 61 43 6b 70 74 5b  .  }.  p->aCkpt[
23a0: 69 49 64 78 5d 20 3d 20 69 56 61 6c 3b 0a 7d 0a  iIdx] = iVal;.}.
23b0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
23c0: 61 49 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  aInt points to a
23d0: 6e 20 61 72 72 61 79 20 6e 49 6e 74 20 65 6c 65  n array nInt ele
23e0: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 53  ments in size. S
23f0: 77 69 74 63 68 20 74 68 65 20 0a 2a 2a 20 65 6e  witch the .** en
2400: 64 69 61 6e 2d 6e 65 73 73 20 6f 66 20 65 61 63  dian-ness of eac
2410: 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
2420: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
2430: 63 20 76 6f 69 64 20 63 6b 70 74 43 68 61 6e 67  c void ckptChang
2440: 65 45 6e 64 69 61 6e 6e 65 73 73 28 75 33 32 20  eEndianness(u32 
2450: 2a 61 49 6e 74 2c 20 69 6e 74 20 6e 49 6e 74 29  *aInt, int nInt)
2460: 7b 0a 20 20 69 66 28 20 4c 53 4d 5f 4c 49 54 54  {.  if( LSM_LITT
2470: 4c 45 5f 45 4e 44 49 41 4e 20 29 7b 0a 20 20 20  LE_ENDIAN ){.   
2480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
2490: 69 3d 30 3b 20 69 3c 6e 49 6e 74 3b 20 69 2b 2b  i=0; i<nInt; i++
24a0: 29 20 61 49 6e 74 5b 69 5d 20 3d 20 42 59 54 45  ) aInt[i] = BYTE
24b0: 53 57 41 50 33 32 28 61 49 6e 74 5b 69 5d 29 3b  SWAP32(aInt[i]);
24c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62  .  }.}../*.** Ob
24d0: 6a 65 63 74 20 2a 70 20 63 6f 6e 74 61 69 6e 73  ject *p contains
24e0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e   a checkpoint in
24f0: 20 6e 61 74 69 76 65 20 62 79 74 65 2d 6f 72 64   native byte-ord
2500: 65 72 2e 20 54 68 65 20 63 68 65 63 6b 70 6f 69  er. The checkpoi
2510: 6e 74 20 69 73 0a 2a 2a 20 6e 43 6b 70 74 20 69  nt is.** nCkpt i
2520: 6e 74 65 67 65 72 73 20 69 6e 20 73 69 7a 65 2c  ntegers in size,
2530: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 61   not including a
2540: 6e 79 20 63 68 65 63 6b 73 75 6d 2e 20 54 68 69  ny checksum. Thi
2550: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 0a  s function sets.
2560: 2a 2a 20 74 68 65 20 74 77 6f 20 63 68 65 63 6b  ** the two check
2570: 73 75 6d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  sum elements of 
2580: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  the checkpoint a
2590: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
25a0: 74 61 74 69 63 20 76 6f 69 64 20 63 6b 70 74 41  tatic void ckptA
25b0: 64 64 43 68 65 63 6b 73 75 6d 28 43 6b 70 74 42  ddChecksum(CkptB
25c0: 75 66 66 65 72 20 2a 70 2c 20 69 6e 74 20 6e 43  uffer *p, int nC
25d0: 6b 70 74 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  kpt, int *pRc){.
25e0: 20 20 69 66 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f    if( *pRc==LSM_
25f0: 4f 4b 20 29 7b 0a 20 20 20 20 75 33 32 20 61 43  OK ){.    u32 aC
2600: 6b 73 75 6d 5b 32 5d 20 3d 20 7b 30 2c 20 30 7d  ksum[2] = {0, 0}
2610: 3b 0a 20 20 20 20 63 6b 70 74 43 68 65 63 6b 73  ;.    ckptChecks
2620: 75 6d 28 70 2d 3e 61 43 6b 70 74 2c 20 6e 43 6b  um(p->aCkpt, nCk
2630: 70 74 2b 32 2c 20 26 61 43 6b 73 75 6d 5b 30 5d  pt+2, &aCksum[0]
2640: 2c 20 26 61 43 6b 73 75 6d 5b 31 5d 29 3b 0a 20  , &aCksum[1]);. 
2650: 20 20 20 63 6b 70 74 53 65 74 56 61 6c 75 65 28     ckptSetValue(
2660: 70 2c 20 6e 43 6b 70 74 2c 20 61 43 6b 73 75 6d  p, nCkpt, aCksum
2670: 5b 30 5d 2c 20 70 52 63 29 3b 0a 20 20 20 20 63  [0], pRc);.    c
2680: 6b 70 74 53 65 74 56 61 6c 75 65 28 70 2c 20 6e  kptSetValue(p, n
2690: 43 6b 70 74 2b 31 2c 20 61 43 6b 73 75 6d 5b 31  Ckpt+1, aCksum[1
26a0: 5d 2c 20 70 52 63 29 3b 0a 20 20 7d 0a 7d 0a 0a  ], pRc);.  }.}..
26b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6b 70 74  static void ckpt
26c0: 41 70 70 65 6e 64 36 34 28 43 6b 70 74 42 75 66  Append64(CkptBuf
26d0: 66 65 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 4f  fer *p, int *piO
26e0: 75 74 2c 20 69 36 34 20 69 56 61 6c 2c 20 69 6e  ut, i64 iVal, in
26f0: 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74 20 69  t *pRc){.  int i
2700: 4f 75 74 20 3d 20 2a 70 69 4f 75 74 3b 0a 20 20  Out = *piOut;.  
2710: 63 6b 70 74 53 65 74 56 61 6c 75 65 28 70 2c 20  ckptSetValue(p, 
2720: 69 4f 75 74 2b 2b 2c 20 28 69 56 61 6c 20 3e 3e  iOut++, (iVal >>
2730: 20 33 32 29 20 26 20 30 78 46 46 46 46 46 46 46   32) & 0xFFFFFFF
2740: 46 2c 20 70 52 63 29 3b 0a 20 20 63 6b 70 74 53  F, pRc);.  ckptS
2750: 65 74 56 61 6c 75 65 28 70 2c 20 69 4f 75 74 2b  etValue(p, iOut+
2760: 2b 2c 20 28 69 56 61 6c 20 26 20 30 78 46 46 46  +, (iVal & 0xFFF
2770: 46 46 46 46 46 29 2c 20 70 52 63 29 3b 0a 20 20  FFFFF), pRc);.  
2780: 2a 70 69 4f 75 74 20 3d 20 69 4f 75 74 3b 0a 7d  *piOut = iOut;.}
2790: 0a 0a 73 74 61 74 69 63 20 69 36 34 20 63 6b 70  ..static i64 ckp
27a0: 74 52 65 61 64 36 34 28 75 33 32 20 2a 61 29 7b  tRead64(u32 *a){
27b0: 0a 20 20 72 65 74 75 72 6e 20 28 28 28 69 36 34  .  return (((i64
27c0: 29 61 5b 30 5d 29 20 3c 3c 20 33 32 29 20 2b 20  )a[0]) << 32) + 
27d0: 28 69 36 34 29 61 5b 31 5d 3b 0a 7d 0a 0a 73 74  (i64)a[1];.}..st
27e0: 61 74 69 63 20 69 36 34 20 63 6b 70 74 47 6f 62  atic i64 ckptGob
27f0: 62 6c 65 36 34 28 75 33 32 20 2a 61 2c 20 69 6e  ble64(u32 *a, in
2800: 74 20 2a 70 69 49 6e 29 7b 0a 20 20 69 6e 74 20  t *piIn){.  int 
2810: 69 49 6e 20 3d 20 2a 70 69 49 6e 3b 0a 20 20 2a  iIn = *piIn;.  *
2820: 70 69 49 6e 20 2b 3d 20 32 3b 0a 20 20 72 65 74  piIn += 2;.  ret
2830: 75 72 6e 20 63 6b 70 74 52 65 61 64 36 34 28 26  urn ckptRead64(&
2840: 61 5b 69 49 6e 5d 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  a[iIn]);.}.../*.
2850: 2a 2a 20 41 70 70 65 6e 64 20 61 20 36 2d 76 61  ** Append a 6-va
2860: 6c 75 65 20 73 65 67 6d 65 6e 74 20 72 65 63 6f  lue segment reco
2870: 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
2880: 20 74 6f 20 70 53 65 67 20 74 6f 20 74 68 65 20   to pSeg to the 
2890: 63 68 65 63 6b 70 6f 69 6e 74 20 0a 2a 2a 20 62  checkpoint .** b
28a0: 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
28b0: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
28c0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
28d0: 69 64 20 63 6b 70 74 45 78 70 6f 72 74 53 65 67  id ckptExportSeg
28e0: 6d 65 6e 74 28 0a 20 20 53 65 67 6d 65 6e 74 20  ment(.  Segment 
28f0: 2a 70 53 65 67 2c 20 0a 20 20 43 6b 70 74 42 75  *pSeg, .  CkptBu
2900: 66 66 65 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20  ffer *p, .  int 
2910: 2a 70 69 4f 75 74 2c 20 0a 20 20 69 6e 74 20 2a  *piOut, .  int *
2920: 70 52 63 0a 29 7b 0a 20 20 63 6b 70 74 41 70 70  pRc.){.  ckptApp
2930: 65 6e 64 36 34 28 70 2c 20 70 69 4f 75 74 2c 20  end64(p, piOut, 
2940: 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 70 52  pSeg->iFirst, pR
2950: 63 29 3b 0a 20 20 63 6b 70 74 41 70 70 65 6e 64  c);.  ckptAppend
2960: 36 34 28 70 2c 20 70 69 4f 75 74 2c 20 70 53 65  64(p, piOut, pSe
2970: 67 2d 3e 69 4c 61 73 74 50 67 2c 20 70 52 63 29  g->iLastPg, pRc)
2980: 3b 0a 20 20 63 6b 70 74 41 70 70 65 6e 64 36 34  ;.  ckptAppend64
2990: 28 70 2c 20 70 69 4f 75 74 2c 20 70 53 65 67 2d  (p, piOut, pSeg-
29a0: 3e 69 52 6f 6f 74 2c 20 70 52 63 29 3b 0a 20 20  >iRoot, pRc);.  
29b0: 63 6b 70 74 41 70 70 65 6e 64 36 34 28 70 2c 20  ckptAppend64(p, 
29c0: 70 69 4f 75 74 2c 20 70 53 65 67 2d 3e 6e 53 69  piOut, pSeg->nSi
29d0: 7a 65 2c 20 70 52 63 29 3b 0a 7d 0a 0a 73 74 61  ze, pRc);.}..sta
29e0: 74 69 63 20 76 6f 69 64 20 63 6b 70 74 45 78 70  tic void ckptExp
29f0: 6f 72 74 4c 65 76 65 6c 28 0a 20 20 4c 65 76 65  ortLevel(.  Leve
2a00: 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2a20: 65 76 65 6c 20 6f 62 6a 65 63 74 20 74 6f 20 73  evel object to s
2a30: 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 43 6b  erialize */.  Ck
2a40: 70 74 42 75 66 66 65 72 20 2a 70 2c 20 20 20 20  ptBuffer *p,    
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a60: 20 41 70 70 65 6e 64 20 6e 65 77 20 6c 65 76 65   Append new leve
2a70: 6c 20 72 65 63 6f 72 64 20 74 6f 20 74 68 69 73  l record to this
2a80: 20 63 6b 70 74 20 2a 2f 0a 20 20 69 6e 74 20 2a   ckpt */.  int *
2a90: 70 69 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  piOut,          
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2ab0: 2f 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 63 68  /OUT: Size of ch
2ac0: 65 63 6b 70 6f 69 6e 74 20 73 6f 20 66 61 72 20  eckpoint so far 
2ad0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2b00: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b  Error code */.){
2b10: 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 2a 70  .  int iOut = *p
2b20: 69 4f 75 74 3b 0a 20 20 4d 65 72 67 65 20 2a 70  iOut;.  Merge *p
2b30: 4d 65 72 67 65 3b 0a 0a 20 20 70 4d 65 72 67 65  Merge;..  pMerge
2b40: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67   = pLevel->pMerg
2b50: 65 3b 0a 20 20 63 6b 70 74 53 65 74 56 61 6c 75  e;.  ckptSetValu
2b60: 65 28 70 2c 20 69 4f 75 74 2b 2b 2c 20 28 75 33  e(p, iOut++, (u3
2b70: 32 29 70 4c 65 76 65 6c 2d 3e 69 41 67 65 20 2b  2)pLevel->iAge +
2b80: 20 28 75 33 32 29 28 70 4c 65 76 65 6c 2d 3e 66   (u32)(pLevel->f
2b90: 6c 61 67 73 3c 3c 31 36 29 2c 20 70 52 63 29 3b  lags<<16), pRc);
2ba0: 0a 20 20 63 6b 70 74 53 65 74 56 61 6c 75 65 28  .  ckptSetValue(
2bb0: 70 2c 20 69 4f 75 74 2b 2b 2c 20 70 4c 65 76 65  p, iOut++, pLeve
2bc0: 6c 2d 3e 6e 52 69 67 68 74 2c 20 70 52 63 29 3b  l->nRight, pRc);
2bd0: 0a 20 20 63 6b 70 74 45 78 70 6f 72 74 53 65 67  .  ckptExportSeg
2be0: 6d 65 6e 74 28 26 70 4c 65 76 65 6c 2d 3e 6c 68  ment(&pLevel->lh
2bf0: 73 2c 20 70 2c 20 26 69 4f 75 74 2c 20 70 52 63  s, p, &iOut, pRc
2c00: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
2c10: 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3e 30 29  Level->nRight>0)
2c20: 3d 3d 28 70 4d 65 72 67 65 21 3d 30 29 20 29 3b  ==(pMerge!=0) );
2c30: 0a 20 20 69 66 28 20 70 4d 65 72 67 65 20 29 7b  .  if( pMerge ){
2c40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2c50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 65 76 65  for(i=0; i<pLeve
2c60: 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b  l->nRight; i++){
2c70: 0a 20 20 20 20 20 20 63 6b 70 74 45 78 70 6f 72  .      ckptExpor
2c80: 74 53 65 67 6d 65 6e 74 28 26 70 4c 65 76 65 6c  tSegment(&pLevel
2c90: 2d 3e 61 52 68 73 5b 69 5d 2c 20 70 2c 20 26 69  ->aRhs[i], p, &i
2ca0: 4f 75 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 7d  Out, pRc);.    }
2cb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
2cc0: 72 67 65 2d 3e 6e 49 6e 70 75 74 3d 3d 70 4c 65  rge->nInput==pLe
2cd0: 76 65 6c 2d 3e 6e 52 69 67 68 74 20 0a 20 20 20  vel->nRight .   
2ce0: 20 20 20 20 20 20 7c 7c 20 70 4d 65 72 67 65 2d        || pMerge-
2cf0: 3e 6e 49 6e 70 75 74 3d 3d 70 4c 65 76 65 6c 2d  >nInput==pLevel-
2d00: 3e 6e 52 69 67 68 74 2b 31 20 0a 20 20 20 20 29  >nRight+1 .    )
2d10: 3b 0a 20 20 20 20 63 6b 70 74 53 65 74 56 61 6c  ;.    ckptSetVal
2d20: 75 65 28 70 2c 20 69 4f 75 74 2b 2b 2c 20 70 4d  ue(p, iOut++, pM
2d30: 65 72 67 65 2d 3e 6e 49 6e 70 75 74 2c 20 70 52  erge->nInput, pR
2d40: 63 29 3b 0a 20 20 20 20 63 6b 70 74 53 65 74 56  c);.    ckptSetV
2d50: 61 6c 75 65 28 70 2c 20 69 4f 75 74 2b 2b 2c 20  alue(p, iOut++, 
2d60: 70 4d 65 72 67 65 2d 3e 6e 53 6b 69 70 2c 20 70  pMerge->nSkip, p
2d70: 52 63 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Rc);.    for(i=0
2d80: 3b 20 69 3c 70 4d 65 72 67 65 2d 3e 6e 49 6e 70  ; i<pMerge->nInp
2d90: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ut; i++){.      
2da0: 63 6b 70 74 41 70 70 65 6e 64 36 34 28 70 2c 20  ckptAppend64(p, 
2db0: 26 69 4f 75 74 2c 20 70 4d 65 72 67 65 2d 3e 61  &iOut, pMerge->a
2dc0: 49 6e 70 75 74 5b 69 5d 2e 69 50 67 2c 20 70 52  Input[i].iPg, pR
2dd0: 63 29 3b 0a 20 20 20 20 20 20 63 6b 70 74 53 65  c);.      ckptSe
2de0: 74 56 61 6c 75 65 28 70 2c 20 69 4f 75 74 2b 2b  tValue(p, iOut++
2df0: 2c 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74  , pMerge->aInput
2e00: 5b 69 5d 2e 69 43 65 6c 6c 2c 20 70 52 63 29 3b  [i].iCell, pRc);
2e10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6b 70 74 41  .    }.    ckptA
2e20: 70 70 65 6e 64 36 34 28 70 2c 20 26 69 4f 75 74  ppend64(p, &iOut
2e30: 2c 20 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b  , pMerge->splitk
2e40: 65 79 2e 69 50 67 2c 20 70 52 63 29 3b 0a 20 20  ey.iPg, pRc);.  
2e50: 20 20 63 6b 70 74 53 65 74 56 61 6c 75 65 28 70    ckptSetValue(p
2e60: 2c 20 69 4f 75 74 2b 2b 2c 20 70 4d 65 72 67 65  , iOut++, pMerge
2e70: 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65 6c 6c  ->splitkey.iCell
2e80: 2c 20 70 52 63 29 3b 0a 20 20 20 20 63 6b 70 74  , pRc);.    ckpt
2e90: 41 70 70 65 6e 64 36 34 28 70 2c 20 26 69 4f 75  Append64(p, &iOu
2ea0: 74 2c 20 70 4d 65 72 67 65 2d 3e 69 43 75 72 72  t, pMerge->iCurr
2eb0: 65 6e 74 50 74 72 2c 20 70 52 63 29 3b 0a 20 20  entPtr, pRc);.  
2ec0: 7d 0a 0a 20 20 2a 70 69 4f 75 74 20 3d 20 69 4f  }..  *piOut = iO
2ed0: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  ut;.}../*.** Pop
2ee0: 75 6c 61 74 65 20 74 68 65 20 6c 6f 67 20 6f 66  ulate the log of
2ef0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
2f00: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 75  he checkpoint bu
2f10: 66 66 65 72 2e 20 34 20 76 61 6c 75 65 73 2e 0a  ffer. 4 values..
2f20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2f30: 6b 70 74 45 78 70 6f 72 74 4c 6f 67 28 0a 20 20  kptExportLog(.  
2f40: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 0a 20 20  lsm_db *pDb, .  
2f50: 69 6e 74 20 62 46 6c 75 73 68 2c 0a 20 20 43 6b  int bFlush,.  Ck
2f60: 70 74 42 75 66 66 65 72 20 2a 70 2c 20 0a 20 20  ptBuffer *p, .  
2f70: 69 6e 74 20 2a 70 69 4f 75 74 2c 20 0a 20 20 69  int *piOut, .  i
2f80: 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 6e 74  nt *pRc.){.  int
2f90: 20 69 4f 75 74 20 3d 20 2a 70 69 4f 75 74 3b 0a   iOut = *piOut;.
2fa0: 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d  .  assert( iOut=
2fb0: 3d 43 4b 50 54 5f 48 44 52 5f 4c 4f 5f 4d 53 57  =CKPT_HDR_LO_MSW
2fc0: 20 29 3b 0a 0a 20 20 69 66 28 20 62 46 6c 75 73   );..  if( bFlus
2fd0: 68 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  h ){.    i64 iOf
2fe0: 66 20 3d 20 70 44 62 2d 3e 74 72 65 65 68 64 72  f = pDb->treehdr
2ff0: 2e 69 4f 6c 64 4c 6f 67 3b 0a 20 20 20 20 63 6b  .iOldLog;.    ck
3000: 70 74 41 70 70 65 6e 64 36 34 28 70 2c 20 26 69  ptAppend64(p, &i
3010: 4f 75 74 2c 20 69 4f 66 66 2c 20 70 52 63 29 3b  Out, iOff, pRc);
3020: 0a 20 20 20 20 63 6b 70 74 53 65 74 56 61 6c 75  .    ckptSetValu
3030: 65 28 70 2c 20 69 4f 75 74 2b 2b 2c 20 70 44 62  e(p, iOut++, pDb
3040: 2d 3e 74 72 65 65 68 64 72 2e 6f 6c 64 63 6b 73  ->treehdr.oldcks
3050: 75 6d 30 2c 20 70 52 63 29 3b 0a 20 20 20 20 63  um0, pRc);.    c
3060: 6b 70 74 53 65 74 56 61 6c 75 65 28 70 2c 20 69  kptSetValue(p, i
3070: 4f 75 74 2b 2b 2c 20 70 44 62 2d 3e 74 72 65 65  Out++, pDb->tree
3080: 68 64 72 2e 6f 6c 64 63 6b 73 75 6d 31 2c 20 70  hdr.oldcksum1, p
3090: 52 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Rc);.  }else{.  
30a0: 20 20 66 6f 72 28 3b 20 69 4f 75 74 3c 3d 43 4b    for(; iOut<=CK
30b0: 50 54 5f 48 44 52 5f 4c 4f 5f 43 4b 53 55 4d 32  PT_HDR_LO_CKSUM2
30c0: 3b 20 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 20  ; iOut++){.     
30d0: 20 63 6b 70 74 53 65 74 56 61 6c 75 65 28 70 2c   ckptSetValue(p,
30e0: 20 69 4f 75 74 2c 20 70 44 62 2d 3e 70 53 68 6d   iOut, pDb->pShm
30f0: 68 64 72 2d 3e 61 53 6e 61 70 32 5b 69 4f 75 74  hdr->aSnap2[iOut
3100: 5d 2c 20 70 52 63 29 3b 0a 20 20 20 20 7d 0a 20  ], pRc);.    }. 
3110: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
3120: 52 63 20 7c 7c 20 69 4f 75 74 3d 3d 43 4b 50 54  Rc || iOut==CKPT
3130: 5f 48 44 52 5f 4c 4f 5f 43 4b 53 55 4d 32 2b 31  _HDR_LO_CKSUM2+1
3140: 20 29 3b 0a 20 20 2a 70 69 4f 75 74 20 3d 20 69   );.  *piOut = i
3150: 4f 75 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Out;.}..static v
3160: 6f 69 64 20 63 6b 70 74 45 78 70 6f 72 74 41 70  oid ckptExportAp
3170: 70 65 6e 64 6c 69 73 74 28 0a 20 20 6c 73 6d 5f  pendlist(.  lsm_
3180: 64 62 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  db *db,         
3190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
31a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
31b0: 6f 6e 20 2a 2f 0a 20 20 43 6b 70 74 42 75 66 66  on */.  CkptBuff
31c0: 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  er *p,          
31d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
31e0: 70 6f 69 6e 74 20 62 75 66 66 65 72 20 74 6f 20  point buffer to 
31f0: 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
3200: 74 20 2a 70 69 4f 75 74 2c 20 20 20 20 20 20 20  t *piOut,       
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3220: 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20   IN/OUT: Offset 
3230: 77 69 74 68 69 6e 20 63 68 65 63 6b 70 6f 69 6e  within checkpoin
3240: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  t buffer */.  in
3250: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3270: 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
3280: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ode */.){.  int 
3290: 69 3b 0a 20 20 4c 73 6d 50 67 6e 6f 20 2a 61 69  i;.  LsmPgno *ai
32a0: 41 70 70 65 6e 64 20 3d 20 64 62 2d 3e 70 57 6f  Append = db->pWo
32b0: 72 6b 65 72 2d 3e 61 69 41 70 70 65 6e 64 3b 0a  rker->aiAppend;.
32c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 53  .  for(i=0; i<LS
32d0: 4d 5f 41 50 50 4c 49 53 54 5f 53 5a 3b 20 69 2b  M_APPLIST_SZ; i+
32e0: 2b 29 7b 0a 20 20 20 20 63 6b 70 74 41 70 70 65  +){.    ckptAppe
32f0: 6e 64 36 34 28 70 2c 20 70 69 4f 75 74 2c 20 61  nd64(p, piOut, a
3300: 69 41 70 70 65 6e 64 5b 69 5d 2c 20 70 52 63 29  iAppend[i], pRc)
3310: 3b 0a 20 20 7d 0a 7d 3b 0a 0a 73 74 61 74 69 63  ;.  }.};..static
3320: 20 69 6e 74 20 63 6b 70 74 45 78 70 6f 72 74 53   int ckptExportS
3330: 6e 61 70 73 68 6f 74 28 20 0a 20 20 6c 73 6d 5f  napshot( .  lsm_
3340: 64 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  db *pDb,        
3350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3360: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
3370: 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f 67 2c 20   */.  int bLog, 
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
33a0: 20 75 70 64 61 74 65 20 6c 6f 67 2d 6f 66 66 73   update log-offs
33b0: 65 74 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 69  et fields */.  i
33c0: 36 34 20 69 49 64 2c 20 20 20 20 20 20 20 20 20  64 iId,         
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33e0: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 69 64 20  * Checkpoint id 
33f0: 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 73 75 6d 2c  */.  int bCksum,
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
3420: 20 69 6e 63 6c 75 64 65 20 63 68 65 63 6b 73 75   include checksu
3430: 6d 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  ms */.  void **p
3440: 70 43 6b 70 74 2c 20 20 20 20 20 20 20 20 20 20  pCkpt,          
3450: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3460: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3470: 67 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  g checkpoint */.
3480: 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
34b0: 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 20  f checkpoint in 
34c0: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
34d0: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34f0: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
3500: 20 20 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46    FileSystem *pF
3510: 53 20 3d 20 70 44 62 2d 3e 70 46 53 3b 20 20 20  S = pDb->pFS;   
3520: 20 20 2f 2a 20 46 69 6c 65 20 73 79 73 74 65 6d    /* File system
3530: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 6e 61   object */.  Sna
3540: 70 73 68 6f 74 20 2a 70 53 6e 61 70 20 3d 20 70  pshot *pSnap = p
3550: 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 20 2f 2a 20  Db->pWorker; /* 
3560: 57 6f 72 6b 65 72 20 73 6e 61 70 73 68 6f 74 20  Worker snapshot 
3570: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  */.  int nLevel 
3580: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
3590: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35a0: 66 20 6c 65 76 65 6c 73 20 69 6e 20 63 68 65 63  f levels in chec
35b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  kpoint */.  int 
35c0: 69 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  iLevel;         
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
35e0: 73 65 64 20 74 6f 20 63 6f 75 6e 74 20 6f 75 74  sed to count out
35f0: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 73 20 2a   nLevel levels *
3600: 2f 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30  /.  int iOut = 0
3610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3620: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
3630: 66 66 73 65 74 20 69 6e 20 61 43 6b 70 74 5b 5d  ffset in aCkpt[]
3640: 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 65   */.  Level *pLe
3650: 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
3660: 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 69        /* Level i
3670: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
3680: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36a0: 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 77 68  Iterator used wh
36b0: 69 6c 65 20 73 65 72 69 61 6c 69 7a 69 6e 67 20  ile serializing 
36c0: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 43 6b  freelist */.  Ck
36d0: 70 74 42 75 66 66 65 72 20 63 6b 70 74 3b 0a 0a  ptBuffer ckpt;..
36e0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
36f0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
3700: 72 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 63  r */.  memset(&c
3710: 6b 70 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43  kpt, 0, sizeof(C
3720: 6b 70 74 42 75 66 66 65 72 29 29 3b 0a 20 20 63  kptBuffer));.  c
3730: 6b 70 74 2e 70 45 6e 76 20 3d 20 70 44 62 2d 3e  kpt.pEnv = pDb->
3740: 70 45 6e 76 3b 0a 20 20 69 4f 75 74 20 3d 20 43  pEnv;.  iOut = C
3750: 4b 50 54 5f 48 44 52 5f 53 49 5a 45 3b 0a 0a 20  KPT_HDR_SIZE;.. 
3760: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6c 6f   /* Write the lo
3770: 67 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  g offset into th
3780: 65 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 2a 2f  e checkpoint. */
3790: 0a 20 20 63 6b 70 74 45 78 70 6f 72 74 4c 6f 67  .  ckptExportLog
37a0: 28 70 44 62 2c 20 62 4c 6f 67 2c 20 26 63 6b 70  (pDb, bLog, &ckp
37b0: 74 2c 20 26 69 4f 75 74 2c 20 26 72 63 29 3b 0a  t, &iOut, &rc);.
37c0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
37d0: 61 70 70 65 6e 64 2d 70 6f 69 6e 74 20 6c 69 73  append-point lis
37e0: 74 20 2a 2f 0a 20 20 63 6b 70 74 45 78 70 6f 72  t */.  ckptExpor
37f0: 74 41 70 70 65 6e 64 6c 69 73 74 28 70 44 62 2c  tAppendlist(pDb,
3800: 20 26 63 6b 70 74 2c 20 26 69 4f 75 74 2c 20 26   &ckpt, &iOut, &
3810: 72 63 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  rc);..  /* Figur
3820: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c  e out how many l
3830: 65 76 65 6c 73 20 77 69 6c 6c 20 62 65 20 77 72  evels will be wr
3840: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 68 65  itten to the che
3850: 63 6b 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 66 6f  ckpoint. */.  fo
3860: 72 28 70 4c 65 76 65 6c 3d 6c 73 6d 44 62 53 6e  r(pLevel=lsmDbSn
3870: 61 70 73 68 6f 74 4c 65 76 65 6c 28 70 53 6e 61  apshotLevel(pSna
3880: 70 29 3b 20 70 4c 65 76 65 6c 3b 20 70 4c 65 76  p); pLevel; pLev
3890: 65 6c 3d 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74  el=pLevel->pNext
38a0: 29 20 6e 4c 65 76 65 6c 2b 2b 3b 0a 0a 20 20 2f  ) nLevel++;..  /
38b0: 2a 20 53 65 72 69 61 6c 69 7a 65 20 6e 4c 65 76  * Serialize nLev
38c0: 65 6c 20 6c 65 76 65 6c 73 2e 20 2a 2f 0a 20 20  el levels. */.  
38d0: 69 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 66 6f  iLevel = 0;.  fo
38e0: 72 28 70 4c 65 76 65 6c 3d 6c 73 6d 44 62 53 6e  r(pLevel=lsmDbSn
38f0: 61 70 73 68 6f 74 4c 65 76 65 6c 28 70 53 6e 61  apshotLevel(pSna
3900: 70 29 3b 20 69 4c 65 76 65 6c 3c 6e 4c 65 76 65  p); iLevel<nLeve
3910: 6c 3b 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c  l; pLevel=pLevel
3920: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6b  ->pNext){.    ck
3930: 70 74 45 78 70 6f 72 74 4c 65 76 65 6c 28 70 4c  ptExportLevel(pL
3940: 65 76 65 6c 2c 20 26 63 6b 70 74 2c 20 26 69 4f  evel, &ckpt, &iO
3950: 75 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 4c  ut, &rc);.    iL
3960: 65 76 65 6c 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  evel++;.  }..  /
3970: 2a 20 57 72 69 74 65 20 74 68 65 20 62 6c 6f 63  * Write the bloc
3980: 6b 2d 72 65 64 69 72 65 63 74 20 6c 69 73 74 20  k-redirect list 
3990: 2a 2f 0a 20 20 63 6b 70 74 53 65 74 56 61 6c 75  */.  ckptSetValu
39a0: 65 28 26 63 6b 70 74 2c 20 69 4f 75 74 2b 2b 2c  e(&ckpt, iOut++,
39b0: 20 70 53 6e 61 70 2d 3e 72 65 64 69 72 65 63 74   pSnap->redirect
39c0: 2e 6e 2c 20 26 72 63 29 3b 0a 20 20 66 6f 72 28  .n, &rc);.  for(
39d0: 69 3d 30 3b 20 69 3c 70 53 6e 61 70 2d 3e 72 65  i=0; i<pSnap->re
39e0: 64 69 72 65 63 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  direct.n; i++){.
39f0: 20 20 20 20 63 6b 70 74 53 65 74 56 61 6c 75 65      ckptSetValue
3a00: 28 26 63 6b 70 74 2c 20 69 4f 75 74 2b 2b 2c 20  (&ckpt, iOut++, 
3a10: 70 53 6e 61 70 2d 3e 72 65 64 69 72 65 63 74 2e  pSnap->redirect.
3a20: 61 5b 69 5d 2e 69 46 72 6f 6d 2c 20 26 72 63 29  a[i].iFrom, &rc)
3a30: 3b 0a 20 20 20 20 63 6b 70 74 53 65 74 56 61 6c  ;.    ckptSetVal
3a40: 75 65 28 26 63 6b 70 74 2c 20 69 4f 75 74 2b 2b  ue(&ckpt, iOut++
3a50: 2c 20 70 53 6e 61 70 2d 3e 72 65 64 69 72 65 63  , pSnap->redirec
3a60: 74 2e 61 5b 69 5d 2e 69 54 6f 2c 20 26 72 63 29  t.a[i].iTo, &rc)
3a70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
3a80: 65 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  e the freelist *
3a90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 53 6e 61  /.  assert( pSna
3aa0: 70 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74  p->freelist.nEnt
3ab0: 72 79 3c 3d 70 44 62 2d 3e 6e 4d 61 78 46 72 65  ry<=pDb->nMaxFre
3ac0: 65 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 72  elist );.  if( r
3ad0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
3ae0: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 70 53 6e   int nFree = pSn
3af0: 61 70 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e  ap->freelist.nEn
3b00: 74 72 79 3b 0a 20 20 20 20 63 6b 70 74 53 65 74  try;.    ckptSet
3b10: 56 61 6c 75 65 28 26 63 6b 70 74 2c 20 69 4f 75  Value(&ckpt, iOu
3b20: 74 2b 2b 2c 20 6e 46 72 65 65 2c 20 26 72 63 29  t++, nFree, &rc)
3b30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3b40: 3c 6e 46 72 65 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nFree; i++){.  
3b50: 20 20 20 20 46 72 65 65 6c 69 73 74 45 6e 74 72      FreelistEntr
3b60: 79 20 2a 70 20 3d 20 26 70 53 6e 61 70 2d 3e 66  y *p = &pSnap->f
3b70: 72 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 5b 69  reelist.aEntry[i
3b80: 5d 3b 0a 20 20 20 20 20 20 63 6b 70 74 53 65 74  ];.      ckptSet
3b90: 56 61 6c 75 65 28 26 63 6b 70 74 2c 20 69 4f 75  Value(&ckpt, iOu
3ba0: 74 2b 2b 2c 20 70 2d 3e 69 42 6c 6b 2c 20 26 72  t++, p->iBlk, &r
3bb0: 63 29 3b 0a 20 20 20 20 20 20 63 6b 70 74 53 65  c);.      ckptSe
3bc0: 74 56 61 6c 75 65 28 26 63 6b 70 74 2c 20 69 4f  tValue(&ckpt, iO
3bd0: 75 74 2b 2b 2c 20 28 70 2d 3e 69 49 64 20 3e 3e  ut++, (p->iId >>
3be0: 20 33 32 29 20 26 20 30 78 46 46 46 46 46 46 46   32) & 0xFFFFFFF
3bf0: 46 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 63  F, &rc);.      c
3c00: 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63 6b 70  kptSetValue(&ckp
3c10: 74 2c 20 69 4f 75 74 2b 2b 2c 20 70 2d 3e 69 49  t, iOut++, p->iI
3c20: 64 20 26 20 30 78 46 46 46 46 46 46 46 46 2c 20  d & 0xFFFFFFFF, 
3c30: 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
3c40: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
3c50: 63 68 65 63 6b 70 6f 69 6e 74 20 68 65 61 64 65  checkpoint heade
3c60: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  r */.  assert( i
3c70: 49 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Id>=0 );.  asser
3c80: 74 28 20 70 53 6e 61 70 2d 3e 69 43 6d 70 49 64  t( pSnap->iCmpId
3c90: 3d 3d 70 44 62 2d 3e 63 6f 6d 70 72 65 73 73 2e  ==pDb->compress.
3ca0: 69 49 64 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  iId.       || pS
3cb0: 6e 61 70 2d 3e 69 43 6d 70 49 64 3d 3d 4c 53 4d  nap->iCmpId==LSM
3cc0: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 5f 45 4d 50  _COMPRESSION_EMP
3cd0: 54 59 20 0a 20 20 29 3b 0a 20 20 63 6b 70 74 53  TY .  );.  ckptS
3ce0: 65 74 56 61 6c 75 65 28 26 63 6b 70 74 2c 20 43  etValue(&ckpt, C
3cf0: 4b 50 54 5f 48 44 52 5f 49 44 5f 4d 53 57 2c 20  KPT_HDR_ID_MSW, 
3d00: 28 75 33 32 29 28 69 49 64 3e 3e 33 32 29 2c 20  (u32)(iId>>32), 
3d10: 26 72 63 29 3b 0a 20 20 63 6b 70 74 53 65 74 56  &rc);.  ckptSetV
3d20: 61 6c 75 65 28 26 63 6b 70 74 2c 20 43 4b 50 54  alue(&ckpt, CKPT
3d30: 5f 48 44 52 5f 49 44 5f 4c 53 57 2c 20 28 75 33  _HDR_ID_LSW, (u3
3d40: 32 29 28 69 49 64 26 30 78 46 46 46 46 46 46 46  2)(iId&0xFFFFFFF
3d50: 46 29 2c 20 26 72 63 29 3b 0a 20 20 63 6b 70 74  F), &rc);.  ckpt
3d60: 53 65 74 56 61 6c 75 65 28 26 63 6b 70 74 2c 20  SetValue(&ckpt, 
3d70: 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54 2c 20  CKPT_HDR_NCKPT, 
3d80: 69 4f 75 74 2b 32 2c 20 26 72 63 29 3b 0a 20 20  iOut+2, &rc);.  
3d90: 63 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63 6b  ckptSetValue(&ck
3da0: 70 74 2c 20 43 4b 50 54 5f 48 44 52 5f 43 4d 50  pt, CKPT_HDR_CMP
3db0: 49 44 2c 20 70 44 62 2d 3e 63 6f 6d 70 72 65 73  ID, pDb->compres
3dc0: 73 2e 69 49 64 2c 20 26 72 63 29 3b 0a 20 20 63  s.iId, &rc);.  c
3dd0: 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63 6b 70  kptSetValue(&ckp
3de0: 74 2c 20 43 4b 50 54 5f 48 44 52 5f 4e 42 4c 4f  t, CKPT_HDR_NBLO
3df0: 43 4b 2c 20 70 53 6e 61 70 2d 3e 6e 42 6c 6f 63  CK, pSnap->nBloc
3e00: 6b 2c 20 26 72 63 29 3b 0a 20 20 63 6b 70 74 53  k, &rc);.  ckptS
3e10: 65 74 56 61 6c 75 65 28 26 63 6b 70 74 2c 20 43  etValue(&ckpt, C
3e20: 4b 50 54 5f 48 44 52 5f 42 4c 4b 53 5a 2c 20 6c  KPT_HDR_BLKSZ, l
3e30: 73 6d 46 73 42 6c 6f 63 6b 53 69 7a 65 28 70 46  smFsBlockSize(pF
3e40: 53 29 2c 20 26 72 63 29 3b 0a 20 20 63 6b 70 74  S), &rc);.  ckpt
3e50: 53 65 74 56 61 6c 75 65 28 26 63 6b 70 74 2c 20  SetValue(&ckpt, 
3e60: 43 4b 50 54 5f 48 44 52 5f 4e 4c 45 56 45 4c 2c  CKPT_HDR_NLEVEL,
3e70: 20 6e 4c 65 76 65 6c 2c 20 26 72 63 29 3b 0a 20   nLevel, &rc);. 
3e80: 20 63 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63   ckptSetValue(&c
3e90: 6b 70 74 2c 20 43 4b 50 54 5f 48 44 52 5f 50 47  kpt, CKPT_HDR_PG
3ea0: 53 5a 2c 20 6c 73 6d 46 73 50 61 67 65 53 69 7a  SZ, lsmFsPageSiz
3eb0: 65 28 70 46 53 29 2c 20 26 72 63 29 3b 0a 20 20  e(pFS), &rc);.  
3ec0: 63 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63 6b  ckptSetValue(&ck
3ed0: 70 74 2c 20 43 4b 50 54 5f 48 44 52 5f 4e 57 52  pt, CKPT_HDR_NWR
3ee0: 49 54 45 2c 20 70 53 6e 61 70 2d 3e 6e 57 72 69  ITE, pSnap->nWri
3ef0: 74 65 2c 20 26 72 63 29 3b 0a 0a 20 20 69 66 28  te, &rc);..  if(
3f00: 20 62 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 63   bCksum ){.    c
3f10: 6b 70 74 41 64 64 43 68 65 63 6b 73 75 6d 28 26  kptAddChecksum(&
3f20: 63 6b 70 74 2c 20 69 4f 75 74 2c 20 26 72 63 29  ckpt, iOut, &rc)
3f30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3f40: 6b 70 74 53 65 74 56 61 6c 75 65 28 26 63 6b 70  kptSetValue(&ckp
3f50: 74 2c 20 69 4f 75 74 2c 20 30 2c 20 26 72 63 29  t, iOut, 0, &rc)
3f60: 3b 0a 20 20 20 20 63 6b 70 74 53 65 74 56 61 6c  ;.    ckptSetVal
3f70: 75 65 28 26 63 6b 70 74 2c 20 69 4f 75 74 2b 31  ue(&ckpt, iOut+1
3f80: 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 20  , 0, &rc);.  }. 
3f90: 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 61 73   iOut += 2;.  as
3fa0: 73 65 72 74 28 20 69 4f 75 74 3c 3d 31 30 32 34  sert( iOut<=1024
3fb0: 20 29 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f   );..#ifdef LSM_
3fc0: 4c 4f 47 5f 46 52 45 45 4c 49 53 54 0a 20 20 6c  LOG_FREELIST.  l
3fd0: 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62  smLogMessage(pDb
3fe0: 2c 20 72 63 2c 20 0a 20 20 20 20 20 20 22 63 6b  , rc, .      "ck
3ff0: 70 74 45 78 70 6f 72 74 53 6e 61 70 73 68 6f 74  ptExportSnapshot
4000: 28 29 3a 20 69 64 3d 25 6c 6c 64 20 66 72 65 65  (): id=%lld free
4010: 6c 69 73 74 3a 20 25 64 22 2c 20 69 49 64 2c 20  list: %d", iId, 
4020: 70 53 6e 61 70 2d 3e 66 72 65 65 6c 69 73 74 2e  pSnap->freelist.
4030: 6e 45 6e 74 72 79 0a 20 20 29 3b 0a 20 20 66 6f  nEntry.  );.  fo
4040: 72 28 69 3d 30 3b 20 69 3c 70 53 6e 61 70 2d 3e  r(i=0; i<pSnap->
4050: 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74 72 79 3b  freelist.nEntry;
4060: 20 69 2b 2b 29 7b 0a 20 20 6c 73 6d 4c 6f 67 4d   i++){.  lsmLogM
4070: 65 73 73 61 67 65 28 70 44 62 2c 20 72 63 2c 20  essage(pDb, rc, 
4080: 0a 20 20 20 20 20 20 22 63 6b 70 74 45 78 70 6f  .      "ckptExpo
4090: 72 74 53 6e 61 70 73 68 6f 74 28 29 3a 20 69 42  rtSnapshot(): iB
40a0: 6c 6b 3d 25 64 20 69 64 3d 25 6c 6c 64 22 2c 20  lk=%d id=%lld", 
40b0: 0a 20 20 20 20 20 20 70 53 6e 61 70 2d 3e 66 72  .      pSnap->fr
40c0: 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 5b 69 5d  eelist.aEntry[i]
40d0: 2e 69 42 6c 6b 2c 0a 20 20 20 20 20 20 70 53 6e  .iBlk,.      pSn
40e0: 61 70 2d 3e 66 72 65 65 6c 69 73 74 2e 61 45 6e  ap->freelist.aEn
40f0: 74 72 79 5b 69 5d 2e 69 49 64 0a 20 20 29 3b 0a  try[i].iId.  );.
4100: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70    }.#endif..  *p
4110: 70 43 6b 70 74 20 3d 20 28 76 6f 69 64 20 2a 29  pCkpt = (void *)
4120: 63 6b 70 74 2e 61 43 6b 70 74 3b 0a 20 20 69 66  ckpt.aCkpt;.  if
4130: 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
4140: 70 74 20 3d 20 73 69 7a 65 6f 66 28 75 33 32 29  pt = sizeof(u32)
4150: 2a 69 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  *iOut;.  return 
4160: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65  rc;.}.../*.** He
4170: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
4180: 72 20 63 6b 70 74 49 6d 70 6f 72 74 28 29 2e 0a  r ckptImport()..
4190: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
41a0: 6b 70 74 4e 65 77 53 65 67 6d 65 6e 74 28 0a 20  kptNewSegment(. 
41b0: 20 75 33 32 20 2a 61 49 6e 2c 0a 20 20 69 6e 74   u32 *aIn,.  int
41c0: 20 2a 70 69 49 6e 2c 0a 20 20 53 65 67 6d 65 6e   *piIn,.  Segmen
41d0: 74 20 2a 70 53 65 67 6d 65 6e 74 20 20 20 20 20  t *pSegment     
41e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70            /* Pop
41f0: 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
4200: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
4210: 65 72 74 28 20 70 53 65 67 6d 65 6e 74 2d 3e 69  ert( pSegment->i
4220: 46 69 72 73 74 3d 3d 30 20 26 26 20 70 53 65 67  First==0 && pSeg
4230: 6d 65 6e 74 2d 3e 69 4c 61 73 74 50 67 3d 3d 30  ment->iLastPg==0
4240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
4250: 65 67 6d 65 6e 74 2d 3e 6e 53 69 7a 65 3d 3d 30  egment->nSize==0
4260: 20 26 26 20 70 53 65 67 6d 65 6e 74 2d 3e 69 52   && pSegment->iR
4270: 6f 6f 74 3d 3d 30 20 29 3b 0a 20 20 70 53 65 67  oot==0 );.  pSeg
4280: 6d 65 6e 74 2d 3e 69 46 69 72 73 74 20 3d 20 63  ment->iFirst = c
4290: 6b 70 74 47 6f 62 62 6c 65 36 34 28 61 49 6e 2c  kptGobble64(aIn,
42a0: 20 70 69 49 6e 29 3b 0a 20 20 70 53 65 67 6d 65   piIn);.  pSegme
42b0: 6e 74 2d 3e 69 4c 61 73 74 50 67 20 3d 20 63 6b  nt->iLastPg = ck
42c0: 70 74 47 6f 62 62 6c 65 36 34 28 61 49 6e 2c 20  ptGobble64(aIn, 
42d0: 70 69 49 6e 29 3b 0a 20 20 70 53 65 67 6d 65 6e  piIn);.  pSegmen
42e0: 74 2d 3e 69 52 6f 6f 74 20 3d 20 63 6b 70 74 47  t->iRoot = ckptG
42f0: 6f 62 62 6c 65 36 34 28 61 49 6e 2c 20 70 69 49  obble64(aIn, piI
4300: 6e 29 3b 0a 20 20 70 53 65 67 6d 65 6e 74 2d 3e  n);.  pSegment->
4310: 6e 53 69 7a 65 20 3d 20 28 69 6e 74 29 63 6b 70  nSize = (int)ckp
4320: 74 47 6f 62 62 6c 65 36 34 28 61 49 6e 2c 20 70  tGobble64(aIn, p
4330: 69 49 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  iIn);.  assert( 
4340: 70 53 65 67 6d 65 6e 74 2d 3e 69 46 69 72 73 74  pSegment->iFirst
4350: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
4360: 74 20 63 6b 70 74 53 65 74 75 70 4d 65 72 67 65  t ckptSetupMerge
4370: 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 75 33  (lsm_db *pDb, u3
4380: 32 20 2a 61 49 6e 74 2c 20 69 6e 74 20 2a 70 69  2 *aInt, int *pi
4390: 49 6e 2c 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65  In, Level *pLeve
43a0: 6c 29 7b 0a 20 20 4d 65 72 67 65 20 2a 70 4d 65  l){.  Merge *pMe
43b0: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
43c0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
43d0: 65 64 20 4d 65 72 67 65 20 6f 62 6a 65 63 74 20  ed Merge object 
43e0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b  */.  int nInput;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4410: 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
4420: 20 69 6e 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69   in merge */.  i
4430: 6e 74 20 69 49 6e 20 3d 20 2a 70 69 49 6e 3b 20  nt iIn = *piIn; 
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4450: 2a 20 4e 65 78 74 20 76 61 6c 75 65 20 74 6f 20  * Next value to 
4460: 72 65 61 64 20 66 72 6f 6d 20 61 49 6e 74 5b 5d  read from aInt[]
4470: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
44a0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
44b0: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
44e0: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  es to allocate *
44f0: 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
4500: 20 74 68 65 20 4d 65 72 67 65 20 6f 62 6a 65 63   the Merge objec
4510: 74 2e 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 66  t. If malloc() f
4520: 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 4c 53 4d  ails, return LSM
4530: 5f 4e 4f 4d 45 4d 2e 20 2a 2f 0a 20 20 6e 49 6e  _NOMEM. */.  nIn
4540: 70 75 74 20 3d 20 28 69 6e 74 29 61 49 6e 74 5b  put = (int)aInt[
4550: 69 49 6e 2b 2b 5d 3b 0a 20 20 6e 42 79 74 65 20  iIn++];.  nByte 
4560: 3d 20 73 69 7a 65 6f 66 28 4d 65 72 67 65 29 20  = sizeof(Merge) 
4570: 2b 20 73 69 7a 65 6f 66 28 4d 65 72 67 65 49 6e  + sizeof(MergeIn
4580: 70 75 74 29 20 2a 20 6e 49 6e 70 75 74 3b 0a 20  put) * nInput;. 
4590: 20 70 4d 65 72 67 65 20 3d 20 28 4d 65 72 67 65   pMerge = (Merge
45a0: 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f   *)lsmMallocZero
45b0: 28 70 44 62 2d 3e 70 45 6e 76 2c 20 6e 42 79 74  (pDb->pEnv, nByt
45c0: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 65 72 67  e);.  if( !pMerg
45d0: 65 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e  e ) return LSM_N
45e0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4c 65  OMEM_BKPT;.  pLe
45f0: 76 65 6c 2d 3e 70 4d 65 72 67 65 20 3d 20 70 4d  vel->pMerge = pM
4600: 65 72 67 65 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75  erge;..  /* Popu
4610: 6c 61 74 65 20 74 68 65 20 4d 65 72 67 65 20 6f  late the Merge o
4620: 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 4d 65 72  bject. */.  pMer
4630: 67 65 2d 3e 61 49 6e 70 75 74 20 3d 20 28 4d 65  ge->aInput = (Me
4640: 72 67 65 49 6e 70 75 74 20 2a 29 26 70 4d 65 72  rgeInput *)&pMer
4650: 67 65 5b 31 5d 3b 0a 20 20 70 4d 65 72 67 65 2d  ge[1];.  pMerge-
4660: 3e 6e 49 6e 70 75 74 20 3d 20 6e 49 6e 70 75 74  >nInput = nInput
4670: 3b 0a 20 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74  ;.  pMerge->iOut
4680: 70 75 74 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 70  putOff = -1;.  p
4690: 4d 65 72 67 65 2d 3e 6e 53 6b 69 70 20 3d 20 28  Merge->nSkip = (
46a0: 69 6e 74 29 61 49 6e 74 5b 69 49 6e 2b 2b 5d 3b  int)aInt[iIn++];
46b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49  .  for(i=0; i<nI
46c0: 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
46d0: 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69  pMerge->aInput[i
46e0: 5d 2e 69 50 67 20 3d 20 63 6b 70 74 47 6f 62 62  ].iPg = ckptGobb
46f0: 6c 65 36 34 28 61 49 6e 74 2c 20 26 69 49 6e 29  le64(aInt, &iIn)
4700: 3b 0a 20 20 20 20 70 4d 65 72 67 65 2d 3e 61 49  ;.    pMerge->aI
4710: 6e 70 75 74 5b 69 5d 2e 69 43 65 6c 6c 20 3d 20  nput[i].iCell = 
4720: 28 69 6e 74 29 61 49 6e 74 5b 69 49 6e 2b 2b 5d  (int)aInt[iIn++]
4730: 3b 0a 20 20 7d 0a 20 20 70 4d 65 72 67 65 2d 3e  ;.  }.  pMerge->
4740: 73 70 6c 69 74 6b 65 79 2e 69 50 67 20 3d 20 63  splitkey.iPg = c
4750: 6b 70 74 47 6f 62 62 6c 65 36 34 28 61 49 6e 74  kptGobble64(aInt
4760: 2c 20 26 69 49 6e 29 3b 0a 20 20 70 4d 65 72 67  , &iIn);.  pMerg
4770: 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65 6c  e->splitkey.iCel
4780: 6c 20 3d 20 28 69 6e 74 29 61 49 6e 74 5b 69 49  l = (int)aInt[iI
4790: 6e 2b 2b 5d 3b 0a 20 20 70 4d 65 72 67 65 2d 3e  n++];.  pMerge->
47a0: 69 43 75 72 72 65 6e 74 50 74 72 20 3d 20 63 6b  iCurrentPtr = ck
47b0: 70 74 47 6f 62 62 6c 65 36 34 28 61 49 6e 74 2c  ptGobble64(aInt,
47c0: 20 26 69 49 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65   &iIn);..  /* Se
47d0: 74 20 2a 70 69 49 6e 20 61 6e 64 20 72 65 74 75  t *piIn and retu
47e0: 72 6e 20 4c 53 4d 5f 4f 4b 2e 20 2a 2f 0a 20 20  rn LSM_OK. */.  
47f0: 2a 70 69 49 6e 20 3d 20 69 49 6e 3b 0a 20 20 72  *piIn = iIn;.  r
4800: 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a  eturn LSM_OK;.}.
4810: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6b 70  ..static int ckp
4820: 74 4c 6f 61 64 4c 65 76 65 6c 73 28 0a 20 20 6c  tLoadLevels(.  l
4830: 73 6d 5f 64 62 20 2a 70 44 62 2c 0a 20 20 75 33  sm_db *pDb,.  u3
4840: 32 20 2a 61 49 6e 2c 20 0a 20 20 69 6e 74 20 2a  2 *aIn, .  int *
4850: 70 69 49 6e 2c 20 0a 20 20 69 6e 74 20 6e 4c 65  piIn, .  int nLe
4860: 76 65 6c 2c 0a 20 20 4c 65 76 65 6c 20 2a 2a 70  vel,.  Level **p
4870: 70 4c 65 76 65 6c 0a 29 7b 0a 20 20 69 6e 74 20  pLevel.){.  int 
4880: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  i;.  int rc = LS
4890: 4d 5f 4f 4b 3b 0a 20 20 4c 65 76 65 6c 20 2a 70  M_OK;.  Level *p
48a0: 52 65 74 20 3d 20 30 3b 0a 20 20 4c 65 76 65 6c  Ret = 0;.  Level
48b0: 20 2a 2a 70 70 4e 65 78 74 3b 0a 20 20 69 6e 74   **ppNext;.  int
48c0: 20 69 49 6e 20 3d 20 2a 70 69 49 6e 3b 0a 0a 20   iIn = *piIn;.. 
48d0: 20 70 70 4e 65 78 74 20 3d 20 26 70 52 65 74 3b   ppNext = &pRet;
48e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
48f0: 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 6e 4c 65 76  LSM_OK && i<nLev
4900: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  el; i++){.    in
4910: 74 20 69 52 69 67 68 74 3b 0a 20 20 20 20 4c 65  t iRight;.    Le
4920: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 0a 20 20  vel *pLevel;..  
4930: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
4940: 61 63 65 20 66 6f 72 20 74 68 65 20 4c 65 76 65  ace for the Leve
4950: 6c 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  l structure and 
4960: 4c 65 76 65 6c 2e 61 70 52 69 67 68 74 5b 5d 20  Level.apRight[] 
4970: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 70 4c 65  array */.    pLe
4980: 76 65 6c 20 3d 20 28 4c 65 76 65 6c 20 2a 29 6c  vel = (Level *)l
4990: 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70  smMallocZeroRc(p
49a0: 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66  Db->pEnv, sizeof
49b0: 28 4c 65 76 65 6c 29 2c 20 26 72 63 29 3b 0a 20  (Level), &rc);. 
49c0: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
49d0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  K ){.      pLeve
49e0: 6c 2d 3e 69 41 67 65 20 3d 20 28 75 31 36 29 28  l->iAge = (u16)(
49f0: 61 49 6e 5b 69 49 6e 5d 20 26 20 30 78 30 30 30  aIn[iIn] & 0x000
4a00: 30 46 46 46 46 29 3b 0a 20 20 20 20 20 20 70 4c  0FFFF);.      pL
4a10: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 28 75  evel->flags = (u
4a20: 31 36 29 28 28 61 49 6e 5b 69 49 6e 5d 3e 3e 31  16)((aIn[iIn]>>1
4a30: 36 29 20 26 20 30 78 30 30 30 30 46 46 46 46 29  6) & 0x0000FFFF)
4a40: 3b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  ;.      iIn++;. 
4a50: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 52 69       pLevel->nRi
4a60: 67 68 74 20 3d 20 61 49 6e 5b 69 49 6e 2b 2b 5d  ght = aIn[iIn++]
4a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
4a80: 65 6c 2d 3e 6e 52 69 67 68 74 20 29 7b 0a 20 20  el->nRight ){.  
4a90: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4aa0: 3d 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  = sizeof(Segment
4ab0: 29 20 2a 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67  ) * pLevel->nRig
4ac0: 68 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  ht;.        pLev
4ad0: 65 6c 2d 3e 61 52 68 73 20 3d 20 28 53 65 67 6d  el->aRhs = (Segm
4ae0: 65 6e 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  ent *)lsmMallocZ
4af0: 65 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c  eroRc(pDb->pEnv,
4b00: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
4b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4b20: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
4b30: 20 20 20 20 20 20 2a 70 70 4e 65 78 74 20 3d 20        *ppNext = 
4b40: 70 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20  pLevel;.        
4b50: 70 70 4e 65 78 74 20 3d 20 26 70 4c 65 76 65 6c  ppNext = &pLevel
4b60: 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20  ->pNext;..      
4b70: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
4b80: 65 20 6d 61 69 6e 20 73 65 67 6d 65 6e 74 20 2a  e main segment *
4b90: 2f 0a 20 20 20 20 20 20 20 20 63 6b 70 74 4e 65  /.        ckptNe
4ba0: 77 53 65 67 6d 65 6e 74 28 61 49 6e 2c 20 26 69  wSegment(aIn, &i
4bb0: 49 6e 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c 68 73  In, &pLevel->lhs
4bc0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
4bd0: 6c 6c 6f 63 61 74 65 20 65 61 63 68 20 6f 66 20  llocate each of 
4be0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
4bf0: 65 67 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 20  egments, if any 
4c00: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
4c10: 52 69 67 68 74 3d 30 3b 20 69 52 69 67 68 74 3c  Right=0; iRight<
4c20: 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 20  pLevel->nRight; 
4c30: 69 52 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 20  iRight++){.     
4c40: 20 20 20 20 20 63 6b 70 74 4e 65 77 53 65 67 6d       ckptNewSegm
4c50: 65 6e 74 28 61 49 6e 2c 20 26 69 49 6e 2c 20 26  ent(aIn, &iIn, &
4c60: 70 4c 65 76 65 6c 2d 3e 61 52 68 73 5b 69 52 69  pLevel->aRhs[iRi
4c70: 67 68 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  ght]);.        }
4c80: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ..        /* Set
4c90: 20 75 70 20 74 68 65 20 4d 65 72 67 65 20 6f 62   up the Merge ob
4ca0: 6a 65 63 74 2c 20 69 66 20 72 65 71 75 69 72 65  ject, if require
4cb0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  d */.        if(
4cc0: 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3e   pLevel->nRight>
4cd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
4ce0: 63 20 3d 20 63 6b 70 74 53 65 74 75 70 4d 65 72  c = ckptSetupMer
4cf0: 67 65 28 70 44 62 2c 20 61 49 6e 2c 20 26 69 49  ge(pDb, aIn, &iI
4d00: 6e 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  n, pLevel);.    
4d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4d20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
4d30: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c!=LSM_OK ){.   
4d40: 20 2f 2a 20 41 6e 20 4f 4f 4d 20 6d 75 73 74 20   /* An OOM must 
4d50: 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 46  have occurred. F
4d60: 72 65 65 20 61 6e 79 20 6c 65 76 65 6c 20 73 74  ree any level st
4d70: 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
4d80: 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72 65  ed and.    ** re
4d90: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
4da0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  o the caller. */
4db0: 0a 20 20 20 20 6c 73 6d 53 6f 72 74 65 64 46 72  .    lsmSortedFr
4dc0: 65 65 4c 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e  eeLevel(pDb->pEn
4dd0: 76 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 70 52  v, pRet);.    pR
4de0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2a  et = 0;.  }..  *
4df0: 70 70 4c 65 76 65 6c 20 3d 20 70 52 65 74 3b 0a  ppLevel = pRet;.
4e00: 20 20 2a 70 69 49 6e 20 3d 20 69 49 6e 3b 0a 20    *piIn = iIn;. 
4e10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
4e20: 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e  int lsmCheckpoin
4e30: 74 4c 6f 61 64 4c 65 76 65 6c 73 28 6c 73 6d 5f  tLoadLevels(lsm_
4e40: 64 62 20 2a 70 44 62 2c 20 76 6f 69 64 20 2a 70  db *pDb, void *p
4e50: 56 61 6c 2c 20 69 6e 74 20 6e 56 61 6c 29 7b 0a  Val, int nVal){.
4e60: 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
4e70: 4b 3b 0a 20 20 69 66 28 20 6e 56 61 6c 3e 30 20  K;.  if( nVal>0 
4e80: 29 7b 0a 20 20 20 20 75 33 32 20 2a 61 49 6e 3b  ){.    u32 *aIn;
4e90: 0a 0a 20 20 20 20 61 49 6e 20 3d 20 6c 73 6d 4d  ..    aIn = lsmM
4ea0: 61 6c 6c 6f 63 52 63 28 70 44 62 2d 3e 70 45 6e  allocRc(pDb->pEn
4eb0: 76 2c 20 6e 56 61 6c 2c 20 26 72 63 29 3b 0a 20  v, nVal, &rc);. 
4ec0: 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20     if( aIn ){.  
4ed0: 20 20 20 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65      Level *pLeve
4ee0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 4c 65 76  l = 0;.      Lev
4ef0: 65 6c 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20  el *pParent;..  
4f00: 20 20 20 20 69 6e 74 20 6e 49 6e 3b 0a 20 20 20      int nIn;.   
4f10: 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 0a 20     int nLevel;. 
4f20: 20 20 20 20 20 69 6e 74 20 69 49 6e 20 3d 20 31       int iIn = 1
4f30: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  ;.      memcpy(a
4f40: 49 6e 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b  In, pVal, nVal);
4f50: 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 6e 56 61  .      nIn = nVa
4f60: 6c 20 2f 20 73 69 7a 65 6f 66 28 75 33 32 29 3b  l / sizeof(u32);
4f70: 0a 0a 20 20 20 20 20 20 63 6b 70 74 43 68 61 6e  ..      ckptChan
4f80: 67 65 45 6e 64 69 61 6e 6e 65 73 73 28 61 49 6e  geEndianness(aIn
4f90: 2c 20 6e 49 6e 29 3b 0a 20 20 20 20 20 20 6e 4c  , nIn);.      nL
4fa0: 65 76 65 6c 20 3d 20 61 49 6e 5b 30 5d 3b 0a 20  evel = aIn[0];. 
4fb0: 20 20 20 20 20 72 63 20 3d 20 63 6b 70 74 4c 6f       rc = ckptLo
4fc0: 61 64 4c 65 76 65 6c 73 28 70 44 62 2c 20 61 49  adLevels(pDb, aI
4fd0: 6e 2c 20 26 69 49 6e 2c 20 6e 4c 65 76 65 6c 2c  n, &iIn, nLevel,
4fe0: 20 26 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20   &pLevel);.     
4ff0: 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45   lsmFree(pDb->pE
5000: 6e 76 2c 20 61 49 6e 29 3b 0a 20 20 20 20 20 20  nv, aIn);.      
5010: 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f  assert( rc==LSM_
5020: 4f 4b 20 7c 7c 20 70 4c 65 76 65 6c 3d 3d 30 20  OK || pLevel==0 
5030: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5040: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
5050: 20 20 20 70 50 61 72 65 6e 74 20 3d 20 6c 73 6d     pParent = lsm
5060: 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c 28  DbSnapshotLevel(
5070: 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a 20  pDb->pWorker);. 
5080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5090: 50 61 72 65 6e 74 20 29 3b 0a 20 20 20 20 20 20  Parent );.      
50a0: 20 20 77 68 69 6c 65 28 20 70 50 61 72 65 6e 74    while( pParent
50b0: 2d 3e 70 4e 65 78 74 20 29 20 70 50 61 72 65 6e  ->pNext ) pParen
50c0: 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 4e 65  t = pParent->pNe
50d0: 78 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  xt;.        pPar
50e0: 65 6e 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 65  ent->pNext = pLe
50f0: 76 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vel;.      }.   
5100: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
5110: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5120: 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 66 6f  turn the data fo
5130: 72 20 74 68 65 20 4c 45 56 45 4c 53 20 72 65 63  r the LEVELS rec
5140: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ord..**.** The s
5150: 69 7a 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ize of the check
5160: 70 6f 69 6e 74 20 74 68 61 74 20 63 61 6e 20 62  point that can b
5170: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5180: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 0a  database header.
5190: 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  ** must not exce
51a0: 65 64 20 31 30 32 34 20 33 32 2d 62 69 74 20 69  ed 1024 32-bit i
51b0: 6e 74 65 67 65 72 73 2e 20 4e 6f 72 6d 61 6c 6c  ntegers. Normall
51c0: 79 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  y, it does not. 
51d0: 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 69  However,.** if i
51e0: 74 20 64 6f 65 73 2c 20 70 61 72 74 20 6f 66 20  t does, part of 
51f0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  the checkpoint m
5200: 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ust be stored in
5210: 20 74 68 65 20 4c 53 4d 2e 20 54 68 69 73 0a 2a   the LSM. This.*
5220: 2a 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  * routine return
5230: 73 20 74 68 61 74 20 70 61 72 74 2e 0a 2a 2f 0a  s that part..*/.
5240: 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e  int lsmCheckpoin
5250: 74 4c 65 76 65 6c 73 28 0a 20 20 6c 73 6d 5f 64  tLevels(.  lsm_d
5260: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
5270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5280: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
5290: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 2c 20 20  .  int nLevel,  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
52c0: 6c 65 76 65 6c 73 20 74 6f 20 77 72 69 74 65 20  levels to write 
52d0: 74 6f 20 62 6c 6f 62 20 2a 2f 0a 20 20 76 6f 69  to blob */.  voi
52e0: 64 20 2a 2a 70 61 56 61 6c 2c 20 20 20 20 20 20  d **paVal,      
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5300: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
5310: 4c 45 56 45 4c 53 20 62 6c 6f 62 20 2a 2f 0a 20  LEVELS blob */. 
5320: 20 69 6e 74 20 2a 70 6e 56 61 6c 20 20 20 20 20   int *pnVal     
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
5350: 20 4c 45 56 45 4c 53 20 62 6c 6f 62 20 69 6e 20   LEVELS blob in 
5360: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 4c 65  bytes */.){.  Le
5370: 76 65 6c 20 2a 70 3b 20 20 20 20 20 20 20 20 20  vel *p;         
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5390: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
53a0: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
53b0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 3d 20 30  */.  int nAll= 0
53c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
53d0: 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 75 74 3b  t i;.  int iOut;
53e0: 0a 20 20 43 6b 70 74 42 75 66 66 65 72 20 63 6b  .  CkptBuffer ck
53f0: 70 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c  pt;.  assert( nL
5400: 65 76 65 6c 3e 30 20 29 3b 0a 0a 20 20 66 6f 72  evel>0 );..  for
5410: 28 70 3d 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74  (p=lsmDbSnapshot
5420: 4c 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b  Level(pDb->pWork
5430: 65 72 29 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  er); p; p=p->pNe
5440: 78 74 29 20 6e 41 6c 6c 2b 2b 3b 0a 0a 20 20 61  xt) nAll++;..  a
5450: 73 73 65 72 74 28 20 6e 41 6c 6c 3e 6e 4c 65 76  ssert( nAll>nLev
5460: 65 6c 20 29 3b 0a 20 20 6e 41 6c 6c 20 2d 3d 20  el );.  nAll -= 
5470: 6e 4c 65 76 65 6c 3b 0a 20 20 66 6f 72 28 70 3d  nLevel;.  for(p=
5480: 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76  lsmDbSnapshotLev
5490: 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29  el(pDb->pWorker)
54a0: 3b 20 70 20 26 26 20 6e 41 6c 6c 3e 30 3b 20 70  ; p && nAll>0; p
54b0: 3d 70 2d 3e 70 4e 65 78 74 29 20 6e 41 6c 6c 2d  =p->pNext) nAll-
54c0: 2d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6b  -;..  memset(&ck
54d0: 70 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 6b  pt, 0, sizeof(Ck
54e0: 70 74 42 75 66 66 65 72 29 29 3b 0a 20 20 63 6b  ptBuffer));.  ck
54f0: 70 74 2e 70 45 6e 76 20 3d 20 70 44 62 2d 3e 70  pt.pEnv = pDb->p
5500: 45 6e 76 3b 0a 0a 20 20 63 6b 70 74 53 65 74 56  Env;..  ckptSetV
5510: 61 6c 75 65 28 26 63 6b 70 74 2c 20 30 2c 20 6e  alue(&ckpt, 0, n
5520: 4c 65 76 65 6c 2c 20 26 72 63 29 3b 0a 20 20 69  Level, &rc);.  i
5530: 4f 75 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  Out = 1;.  for(i
5540: 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  =0; rc==LSM_OK &
5550: 26 20 69 3c 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  & i<nLevel; i++)
5560: 7b 0a 20 20 20 20 63 6b 70 74 45 78 70 6f 72 74  {.    ckptExport
5570: 4c 65 76 65 6c 28 70 2c 20 26 63 6b 70 74 2c 20  Level(p, &ckpt, 
5580: 26 69 4f 75 74 2c 20 26 72 63 29 3b 0a 20 20 20  &iOut, &rc);.   
5590: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
55a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
55b0: 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 3d 3d 30 20  =LSM_OK || p==0 
55c0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  );..  if( rc==LS
55d0: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6b 70 74  M_OK ){.    ckpt
55e0: 43 68 61 6e 67 65 45 6e 64 69 61 6e 6e 65 73 73  ChangeEndianness
55f0: 28 63 6b 70 74 2e 61 43 6b 70 74 2c 20 69 4f 75  (ckpt.aCkpt, iOu
5600: 74 29 3b 0a 20 20 20 20 2a 70 61 56 61 6c 20 3d  t);.    *paVal =
5610: 20 28 76 6f 69 64 20 2a 29 63 6b 70 74 2e 61 43   (void *)ckpt.aC
5620: 6b 70 74 3b 0a 20 20 20 20 2a 70 6e 56 61 6c 20  kpt;.    *pnVal 
5630: 3d 20 69 4f 75 74 20 2a 20 73 69 7a 65 6f 66 28  = iOut * sizeof(
5640: 75 33 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  u32);.  }else{. 
5650: 20 20 20 2a 70 6e 56 61 6c 20 3d 20 30 3b 0a 20     *pnVal = 0;. 
5660: 20 20 20 2a 70 61 56 61 6c 20 3d 20 30 3b 0a 20     *paVal = 0;. 
5670: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
5680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
5690: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 64  he checkpoint id
56a0: 20 66 72 6f 6d 20 6d 65 74 61 2d 70 61 67 65 20   from meta-page 
56b0: 70 50 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pPg..*/.static i
56c0: 36 34 20 63 6b 70 74 4c 6f 61 64 49 64 28 4d 65  64 ckptLoadId(Me
56d0: 74 61 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  taPage *pPg){.  
56e0: 69 36 34 20 72 65 74 20 3d 20 30 3b 0a 20 20 69  i64 ret = 0;.  i
56f0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 6e  f( pPg ){.    in
5700: 74 20 6e 44 61 74 61 3b 0a 20 20 20 20 75 38 20  t nData;.    u8 
5710: 2a 61 44 61 74 61 20 3d 20 6c 73 6d 46 73 4d 65  *aData = lsmFsMe
5720: 74 61 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  taPageData(pPg, 
5730: 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 72 65 74  &nData);.    ret
5740: 20 3d 20 28 28 28 69 36 34 29 6c 73 6d 47 65 74   = (((i64)lsmGet
5750: 55 33 32 28 26 61 44 61 74 61 5b 43 4b 50 54 5f  U32(&aData[CKPT_
5760: 48 44 52 5f 49 44 5f 4d 53 57 2a 34 5d 29 29 20  HDR_ID_MSW*4])) 
5770: 3c 3c 20 33 32 29 20 2b 20 0a 20 20 20 20 20 20  << 32) + .      
5780: 20 20 20 20 28 28 69 36 34 29 6c 73 6d 47 65 74      ((i64)lsmGet
5790: 55 33 32 28 26 61 44 61 74 61 5b 43 4b 50 54 5f  U32(&aData[CKPT_
57a0: 48 44 52 5f 49 44 5f 4c 53 57 2a 34 5d 29 29 3b  HDR_ID_LSW*4]));
57b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
57c0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
57d0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62  rn true if the b
57e0: 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
57f0: 61 6e 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74  an argument cont
5800: 61 69 6e 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20  ains a valid.** 
5810: 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  checkpoint..*/.s
5820: 74 61 74 69 63 20 69 6e 74 20 63 6b 70 74 43 68  tatic int ckptCh
5830: 65 63 6b 73 75 6d 4f 6b 28 75 33 32 20 2a 61 43  ecksumOk(u32 *aC
5840: 6b 70 74 29 7b 0a 20 20 75 33 32 20 6e 43 6b 70  kpt){.  u32 nCkp
5850: 74 20 3d 20 61 43 6b 70 74 5b 43 4b 50 54 5f 48  t = aCkpt[CKPT_H
5860: 44 52 5f 4e 43 4b 50 54 5d 3b 0a 20 20 75 33 32  DR_NCKPT];.  u32
5870: 20 63 6b 73 75 6d 31 3b 0a 20 20 75 33 32 20 63   cksum1;.  u32 c
5880: 6b 73 75 6d 32 3b 0a 0a 20 20 69 66 28 20 6e 43  ksum2;..  if( nC
5890: 6b 70 74 3c 43 4b 50 54 5f 48 44 52 5f 4e 43 4b  kpt<CKPT_HDR_NCK
58a0: 50 54 20 7c 7c 20 6e 43 6b 70 74 3e 28 4c 53 4d  PT || nCkpt>(LSM
58b0: 5f 4d 45 54 41 5f 52 57 5f 50 41 47 45 5f 53 49  _META_RW_PAGE_SI
58c0: 5a 45 29 2f 73 69 7a 65 6f 66 28 75 33 32 29 20  ZE)/sizeof(u32) 
58d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
58e0: 0a 20 20 7d 0a 20 20 63 6b 70 74 43 68 65 63 6b  .  }.  ckptCheck
58f0: 73 75 6d 28 61 43 6b 70 74 2c 20 6e 43 6b 70 74  sum(aCkpt, nCkpt
5900: 2c 20 26 63 6b 73 75 6d 31 2c 20 26 63 6b 73 75  , &cksum1, &cksu
5910: 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 63  m2);.  return (c
5920: 6b 73 75 6d 31 3d 3d 61 43 6b 70 74 5b 6e 43 6b  ksum1==aCkpt[nCk
5930: 70 74 2d 32 5d 20 26 26 20 63 6b 73 75 6d 32 3d  pt-2] && cksum2=
5940: 3d 61 43 6b 70 74 5b 6e 43 6b 70 74 2d 31 5d 29  =aCkpt[nCkpt-1])
5950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
5960: 70 74 20 74 6f 20 6c 6f 61 64 20 61 20 63 68 65  pt to load a che
5970: 63 6b 70 6f 69 6e 74 20 66 72 6f 6d 20 6d 65 74  ckpoint from met
5980: 61 20 70 61 67 65 20 69 4d 65 74 61 2e 0a 2a 2a  a page iMeta..**
5990: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
59a0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
59b0: 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
59c0: 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74  ny value other t
59d0: 68 61 6e 20 4c 53 4d 5f 4f 4b 0a 2a 2a 20 77 68  han LSM_OK.** wh
59e0: 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e  en it is called.
59f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5a00: 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74  urs, *pRc is set
5a10: 20 74 6f 20 61 6e 20 4c 53 4d 20 65 72 72 6f 72   to an LSM error
5a20: 20 63 6f 64 65 0a 2a 2a 20 62 65 66 6f 72 65 20   code.** before 
5a30: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
5a40: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
5a50: 75 72 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  urs and the chec
5a60: 6b 70 6f 69 6e 74 20 69 73 20 73 75 63 63 65 73  kpoint is succes
5a70: 73 66 75 6c 6c 79 20 6c 6f 61 64 65 64 2c 20 63  sfully loaded, c
5a80: 6f 70 79 20 69 74 20 74 6f 0a 2a 2a 20 53 68 6d  opy it to.** Shm
5a90: 48 65 61 64 65 72 2e 61 53 6e 61 70 31 5b 5d 20  Header.aSnap1[] 
5aa0: 61 6e 64 20 53 68 6d 48 65 61 64 65 72 2e 61 53  and ShmHeader.aS
5ab0: 6e 61 70 32 5b 5d 2c 20 61 6e 64 20 73 65 74 20  nap2[], and set 
5ac0: 53 68 6d 48 65 61 64 65 72 2e 69 4d 65 74 61 50  ShmHeader.iMetaP
5ad0: 61 67 65 20 0a 2a 2a 20 74 6f 20 69 6e 64 69 63  age .** to indic
5ae0: 61 74 65 20 69 74 73 20 6f 72 69 67 69 6e 2e 20  ate its origin. 
5af0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74  In this case ret
5b00: 75 72 6e 20 31 2e 20 4f 72 2c 20 69 66 20 74 68  urn 1. Or, if th
5b10: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 0a 2a 2a  e checkpoint .**
5b20: 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 61 64 65   cannot be loade
5b30: 64 20 28 62 65 63 61 75 73 65 20 74 68 65 20 63  d (because the c
5b40: 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
5b50: 20 63 6f 6d 70 75 74 65 29 2c 20 72 65 74 75 72   compute), retur
5b60: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
5b70: 6e 74 20 63 6b 70 74 54 72 79 4c 6f 61 64 28 6c  nt ckptTryLoad(l
5b80: 73 6d 5f 64 62 20 2a 70 44 62 2c 20 4d 65 74 61  sm_db *pDb, Meta
5b90: 50 61 67 65 20 2a 70 50 67 2c 20 75 33 32 20 69  Page *pPg, u32 i
5ba0: 4d 65 74 61 2c 20 69 6e 74 20 2a 70 52 63 29 7b  Meta, int *pRc){
5bb0: 0a 20 20 69 6e 74 20 62 4c 6f 61 64 65 64 20 3d  .  int bLoaded =
5bc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5bd0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
5be0: 75 65 20 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63  ue */.  if( *pRc
5bf0: 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
5c00: 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c20: 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
5c30: 20 20 20 75 33 32 20 2a 61 43 6b 70 74 20 3d 20     u32 *aCkpt = 
5c40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5c50: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
5c60: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
5c70: 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20   checkpoint */. 
5c80: 20 20 20 75 33 32 20 6e 43 6b 70 74 3b 20 20 20     u32 nCkpt;   
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
5cb0: 65 6d 65 6e 74 73 20 69 6e 20 61 43 6b 70 74 5b  ements in aCkpt[
5cc0: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 61  ] */.    int nDa
5cd0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
5ce0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
5cf0: 6f 66 20 64 61 74 61 20 69 6e 20 61 44 61 74 61  of data in aData
5d00: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 44  [] */.    u8 *aD
5d10: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
5d20: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 74 61 20          /* Meta 
5d30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 20  page data */.   
5d40: 0a 20 20 20 20 61 44 61 74 61 20 3d 20 6c 73 6d  .    aData = lsm
5d50: 46 73 4d 65 74 61 50 61 67 65 44 61 74 61 28 70  FsMetaPageData(p
5d60: 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  Pg, &nData);.   
5d70: 20 6e 43 6b 70 74 20 3d 20 28 75 33 32 29 6c 73   nCkpt = (u32)ls
5d80: 6d 47 65 74 55 33 32 28 26 61 44 61 74 61 5b 43  mGetU32(&aData[C
5d90: 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54 2a 73 69  KPT_HDR_NCKPT*si
5da0: 7a 65 6f 66 28 75 33 32 29 5d 29 3b 0a 20 20 20  zeof(u32)]);.   
5db0: 20 69 66 28 20 6e 43 6b 70 74 3c 3d 6e 44 61 74   if( nCkpt<=nDat
5dc0: 61 2f 73 69 7a 65 6f 66 28 75 33 32 29 20 26 26  a/sizeof(u32) &&
5dd0: 20 6e 43 6b 70 74 3e 43 4b 50 54 5f 48 44 52 5f   nCkpt>CKPT_HDR_
5de0: 4e 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20 61  NCKPT ){.      a
5df0: 43 6b 70 74 20 3d 20 28 75 33 32 20 2a 29 6c 73  Ckpt = (u32 *)ls
5e00: 6d 4d 61 6c 6c 6f 63 52 63 28 70 44 62 2d 3e 70  mMallocRc(pDb->p
5e10: 45 6e 76 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f  Env, nCkpt*sizeo
5e20: 66 28 75 33 32 29 2c 20 26 72 63 29 3b 0a 20 20  f(u32), &rc);.  
5e30: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 43 6b 70    }.    if( aCkp
5e40: 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t ){.      memcp
5e50: 79 28 61 43 6b 70 74 2c 20 61 44 61 74 61 2c 20  y(aCkpt, aData, 
5e60: 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75 33 32  nCkpt*sizeof(u32
5e70: 29 29 3b 0a 20 20 20 20 20 20 63 6b 70 74 43 68  ));.      ckptCh
5e80: 61 6e 67 65 45 6e 64 69 61 6e 6e 65 73 73 28 61  angeEndianness(a
5e90: 43 6b 70 74 2c 20 6e 43 6b 70 74 29 3b 0a 20 20  Ckpt, nCkpt);.  
5ea0: 20 20 20 20 69 66 28 20 63 6b 70 74 43 68 65 63      if( ckptChec
5eb0: 6b 73 75 6d 4f 6b 28 61 43 6b 70 74 29 20 29 7b  ksumOk(aCkpt) ){
5ec0: 0a 20 20 20 20 20 20 20 20 53 68 6d 48 65 61 64  .        ShmHead
5ed0: 65 72 20 2a 70 53 68 6d 20 3d 20 70 44 62 2d 3e  er *pShm = pDb->
5ee0: 70 53 68 6d 68 64 72 3b 0a 20 20 20 20 20 20 20  pShmhdr;.       
5ef0: 20 6d 65 6d 63 70 79 28 70 53 68 6d 2d 3e 61 53   memcpy(pShm->aS
5f00: 6e 61 70 31 2c 20 61 43 6b 70 74 2c 20 6e 43 6b  nap1, aCkpt, nCk
5f10: 70 74 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 3b  pt*sizeof(u32));
5f20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5f30: 70 53 68 6d 2d 3e 61 53 6e 61 70 32 2c 20 61 43  pShm->aSnap2, aC
5f40: 6b 70 74 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f  kpt, nCkpt*sizeo
5f50: 66 28 75 33 32 29 29 3b 0a 20 20 20 20 20 20 20  f(u32));.       
5f60: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 61 53 6e   memcpy(pDb->aSn
5f70: 61 70 73 68 6f 74 2c 20 61 43 6b 70 74 2c 20 6e  apshot, aCkpt, n
5f80: 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75 33 32 29  Ckpt*sizeof(u32)
5f90: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 2d  );.        pShm-
5fa0: 3e 69 4d 65 74 61 50 61 67 65 20 3d 20 69 4d 65  >iMetaPage = iMe
5fb0: 74 61 3b 0a 20 20 20 20 20 20 20 20 62 4c 6f 61  ta;.        bLoa
5fc0: 64 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ded = 1;.      }
5fd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d 46  .    }..    lsmF
5fe0: 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 61  ree(pDb->pEnv, a
5ff0: 43 6b 70 74 29 3b 0a 20 20 20 20 2a 70 52 63 20  Ckpt);.    *pRc 
6000: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
6010: 72 6e 20 62 4c 6f 61 64 65 64 3b 0a 7d 0a 0a 2f  rn bLoaded;.}../
6020: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
6030: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
6040: 79 20 68 65 61 64 65 72 20 77 69 74 68 20 61 6e  y header with an
6050: 20 65 6d 70 74 79 20 73 6e 61 70 73 68 6f 74 2e   empty snapshot.
6060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
6070: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
6080: 20 6e 6f 20 76 61 6c 69 64 20 73 6e 61 70 73 68   no valid snapsh
6090: 6f 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  ot can be found 
60a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
60b0: 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  header..*/.stati
60c0: 63 20 76 6f 69 64 20 63 6b 70 74 4c 6f 61 64 45  c void ckptLoadE
60d0: 6d 70 74 79 28 6c 73 6d 5f 64 62 20 2a 70 44 62  mpty(lsm_db *pDb
60e0: 29 7b 0a 20 20 75 33 32 20 61 43 6b 70 74 5b 5d  ){.  u32 aCkpt[]
60f0: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20 20 20   = {.    0,     
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 2f 2a 20 43 4b 50 54 5f 48 44 52 5f 49 44    /* CKPT_HDR_ID
6120: 5f 4d 53 57 20 2a 2f 0a 20 20 20 20 31 30 2c 20  _MSW */.    10, 
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 2f 2a 20 43 4b 50 54 5f 48 44 52       /* CKPT_HDR
6150: 5f 49 44 5f 4c 53 57 20 2a 2f 0a 20 20 20 20 30  _ID_LSW */.    0
6160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6170: 20 20 20 20 20 20 20 20 2f 2a 20 43 4b 50 54 5f          /* CKPT_
6180: 48 44 52 5f 4e 43 4b 50 54 20 2a 2f 0a 20 20 20  HDR_NCKPT */.   
6190: 20 4c 53 4d 5f 43 4f 4d 50 52 45 53 53 49 4f 4e   LSM_COMPRESSION
61a0: 5f 45 4d 50 54 59 2c 20 20 20 2f 2a 20 43 4b 50  _EMPTY,   /* CKP
61b0: 54 5f 48 44 52 5f 43 4d 50 49 44 20 2a 2f 0a 20  T_HDR_CMPID */. 
61c0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
61e0: 4b 50 54 5f 48 44 52 5f 4e 42 4c 4f 43 4b 20 2a  KPT_HDR_NBLOCK *
61f0: 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6210: 2a 20 43 4b 50 54 5f 48 44 52 5f 42 4c 4b 53 5a  * CKPT_HDR_BLKSZ
6220: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 2f 2a 20 43 4b 50 54 5f 48 44 52 5f 4e 4c 45   /* CKPT_HDR_NLE
6250: 56 45 4c 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  VEL */.    0,   
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 20 20 2f 2a 20 43 4b 50 54 5f 48 44 52 5f      /* CKPT_HDR_
6280: 50 47 53 5a 20 2a 2f 0a 20 20 20 20 30 2c 20 20  PGSZ */.    0,  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 2f 2a 20 43 4b 50 54 5f 48 44 52       /* CKPT_HDR
62b0: 5f 4e 57 52 49 54 45 20 2a 2f 0a 20 20 20 20 30  _NWRITE */.    0
62c0: 2c 20 30 2c 20 31 32 33 34 2c 20 35 36 37 38 2c  , 0, 1234, 5678,
62d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
62e0: 6f 67 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 69  og pointer and i
62f0: 6e 69 74 69 61 6c 20 63 68 65 63 6b 73 75 6d 20  nitial checksum 
6300: 2a 2f 0a 20 20 20 20 30 2c 30 2c 30 2c 30 2c 20  */.    0,0,0,0, 
6310: 30 2c 30 2c 30 2c 30 2c 20 20 20 20 20 20 20 20  0,0,0,0,        
6320: 2f 2a 20 54 68 65 20 61 70 70 65 6e 64 20 6c 69  /* The append li
6330: 73 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  st */.    0,    
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 2f 2a 20 54 68 65 20 72 65 64 69 72 65     /* The redire
6360: 63 74 65 64 20 62 6c 6f 63 6b 20 6c 69 73 74 20  cted block list 
6370: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 2f 2a 20 54 68 65 20 66 72 65 65 20 62 6c 6f 63  /* The free bloc
63a0: 6b 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 30 2c  k list */.    0,
63b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
63c0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
63d0: 66 6f 72 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  for checksum val
63e0: 75 65 73 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 33  ues */.  };.  u3
63f0: 32 20 6e 43 6b 70 74 20 3d 20 61 72 72 61 79 5f  2 nCkpt = array_
6400: 73 69 7a 65 28 61 43 6b 70 74 29 3b 0a 20 20 53  size(aCkpt);.  S
6410: 68 6d 48 65 61 64 65 72 20 2a 70 53 68 6d 20 3d  hmHeader *pShm =
6420: 20 70 44 62 2d 3e 70 53 68 6d 68 64 72 3b 0a 0a   pDb->pShmhdr;..
6430: 20 20 61 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52    aCkpt[CKPT_HDR
6440: 5f 4e 43 4b 50 54 5d 20 3d 20 6e 43 6b 70 74 3b  _NCKPT] = nCkpt;
6450: 0a 20 20 61 43 6b 70 74 5b 43 4b 50 54 5f 48 44  .  aCkpt[CKPT_HD
6460: 52 5f 42 4c 4b 53 5a 5d 20 3d 20 70 44 62 2d 3e  R_BLKSZ] = pDb->
6470: 6e 44 66 6c 74 42 6c 6b 73 7a 3b 0a 20 20 61 43  nDfltBlksz;.  aC
6480: 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 50 47 53  kpt[CKPT_HDR_PGS
6490: 5a 5d 20 3d 20 70 44 62 2d 3e 6e 44 66 6c 74 50  Z] = pDb->nDfltP
64a0: 67 73 7a 3b 0a 20 20 63 6b 70 74 43 68 65 63 6b  gsz;.  ckptCheck
64b0: 73 75 6d 28 61 43 6b 70 74 2c 20 61 72 72 61 79  sum(aCkpt, array
64c0: 5f 73 69 7a 65 28 61 43 6b 70 74 29 2c 20 26 61  _size(aCkpt), &a
64d0: 43 6b 70 74 5b 6e 43 6b 70 74 2d 32 5d 2c 20 26  Ckpt[nCkpt-2], &
64e0: 61 43 6b 70 74 5b 6e 43 6b 70 74 2d 31 5d 29 3b  aCkpt[nCkpt-1]);
64f0: 0a 0a 20 20 6d 65 6d 63 70 79 28 70 53 68 6d 2d  ..  memcpy(pShm-
6500: 3e 61 53 6e 61 70 31 2c 20 61 43 6b 70 74 2c 20  >aSnap1, aCkpt, 
6510: 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75 33 32  nCkpt*sizeof(u32
6520: 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 53 68  ));.  memcpy(pSh
6530: 6d 2d 3e 61 53 6e 61 70 32 2c 20 61 43 6b 70 74  m->aSnap2, aCkpt
6540: 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75  , nCkpt*sizeof(u
6550: 33 32 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  32));.  memcpy(p
6560: 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74 2c 20 61  Db->aSnapshot, a
6570: 43 6b 70 74 2c 20 6e 43 6b 70 74 2a 73 69 7a 65  Ckpt, nCkpt*size
6580: 6f 66 28 75 33 32 29 29 3b 0a 7d 0a 0a 2f 2a 0a  of(u32));.}../*.
6590: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
65a0: 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
65b0: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 72  rt of database r
65c0: 65 63 6f 76 65 72 79 20 74 6f 20 69 6e 69 74 69  ecovery to initi
65d0: 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 53 68 6d  alize the.** Shm
65e0: 48 65 61 64 65 72 2e 61 53 6e 61 70 31 5b 5d 20  Header.aSnap1[] 
65f0: 61 6e 64 20 53 68 6d 48 65 61 64 65 72 2e 61 53  and ShmHeader.aS
6600: 6e 61 70 32 5b 5d 20 73 6e 61 70 73 68 6f 74 73  nap2[] snapshots
6610: 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 43 68 65 63  ..*/.int lsmChec
6620: 6b 70 6f 69 6e 74 52 65 63 6f 76 65 72 28 6c 73  kpointRecover(ls
6630: 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e  m_db *pDb){.  in
6640: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6660: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
6670: 20 20 69 36 34 20 69 49 64 31 3b 20 20 20 20 20    i64 iId1;     
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 2f 2a 20 49 64 20 6f 66 20 63 68 65 63 6b    /* Id of check
66a0: 70 6f 69 6e 74 20 6f 6e 20 6d 65 74 61 2d 70 61  point on meta-pa
66b0: 67 65 20 31 20 2a 2f 0a 20 20 69 36 34 20 69 49  ge 1 */.  i64 iI
66c0: 64 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d2;             
66d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
66e0: 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e  of checkpoint on
66f0: 20 6d 65 74 61 2d 70 61 67 65 20 32 20 2a 2f 0a   meta-page 2 */.
6700: 20 20 69 6e 74 20 62 4c 6f 61 64 65 64 20 3d 20    int bLoaded = 
6710: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6720: 20 20 2f 2a 20 54 72 75 65 20 6f 6e 63 65 20 63    /* True once c
6730: 68 65 63 6b 70 6f 69 6e 74 20 68 61 73 20 62 65  heckpoint has be
6740: 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  en loaded */.  i
6750: 6e 74 20 63 6d 70 3b 20 20 20 20 20 20 20 20 20  nt cmp;         
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6770: 2a 20 54 72 75 65 20 69 66 20 28 69 49 64 32 3e  * True if (iId2>
6780: 69 49 64 31 29 20 2a 2f 0a 20 20 4d 65 74 61 50  iId1) */.  MetaP
6790: 61 67 65 20 2a 61 70 50 67 5b 32 5d 20 3d 20 7b  age *apPg[2] = {
67a0: 30 2c 20 30 7d 3b 20 20 20 20 20 2f 2a 20 4d 65  0, 0};     /* Me
67b0: 74 61 2d 70 61 67 65 73 20 31 20 61 6e 64 20 32  ta-pages 1 and 2
67c0: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46   */..  rc = lsmF
67d0: 73 4d 65 74 61 50 61 67 65 47 65 74 28 70 44 62  sMetaPageGet(pDb
67e0: 2d 3e 70 46 53 2c 20 30 2c 20 31 2c 20 26 61 70  ->pFS, 0, 1, &ap
67f0: 50 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63  Pg[0]);.  if( rc
6800: 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20  ==LSM_OK ) rc = 
6810: 6c 73 6d 46 73 4d 65 74 61 50 61 67 65 47 65 74  lsmFsMetaPageGet
6820: 28 70 44 62 2d 3e 70 46 53 2c 20 30 2c 20 32 2c  (pDb->pFS, 0, 2,
6830: 20 26 61 70 50 67 5b 31 5d 29 3b 0a 0a 20 20 69   &apPg[1]);..  i
6840: 49 64 31 20 3d 20 63 6b 70 74 4c 6f 61 64 49 64  Id1 = ckptLoadId
6850: 28 61 70 50 67 5b 30 5d 29 3b 0a 20 20 69 49 64  (apPg[0]);.  iId
6860: 32 20 3d 20 63 6b 70 74 4c 6f 61 64 49 64 28 61  2 = ckptLoadId(a
6870: 70 50 67 5b 31 5d 29 3b 0a 20 20 63 6d 70 20 3d  pPg[1]);.  cmp =
6880: 20 28 69 49 64 32 20 3e 20 69 49 64 31 29 3b 0a   (iId2 > iId1);.
6890: 20 20 62 4c 6f 61 64 65 64 20 3d 20 63 6b 70 74    bLoaded = ckpt
68a0: 54 72 79 4c 6f 61 64 28 70 44 62 2c 20 61 70 50  TryLoad(pDb, apP
68b0: 67 5b 63 6d 70 3f 31 3a 30 5d 2c 20 28 63 6d 70  g[cmp?1:0], (cmp
68c0: 3f 32 3a 31 29 2c 20 26 72 63 29 3b 0a 20 20 69  ?2:1), &rc);.  i
68d0: 66 28 20 62 4c 6f 61 64 65 64 3d 3d 30 20 29 7b  f( bLoaded==0 ){
68e0: 0a 20 20 20 20 62 4c 6f 61 64 65 64 20 3d 20 63  .    bLoaded = c
68f0: 6b 70 74 54 72 79 4c 6f 61 64 28 70 44 62 2c 20  kptTryLoad(pDb, 
6900: 61 70 50 67 5b 63 6d 70 3f 30 3a 31 5d 2c 20 28  apPg[cmp?0:1], (
6910: 63 6d 70 3f 31 3a 32 29 2c 20 26 72 63 29 3b 0a  cmp?1:2), &rc);.
6920: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 64 61    }..  /* The da
6930: 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  tabase does not 
6940: 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 69 64 20  contain a valid 
6950: 63 68 65 63 6b 70 6f 69 6e 74 2e 20 49 6e 69 74  checkpoint. Init
6960: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
6970: 64 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 68 65  d.  ** memory he
6980: 61 64 65 72 20 77 69 74 68 20 61 6e 20 65 6d 70  ader with an emp
6990: 74 79 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 20  ty checkpoint.  
69a0: 2a 2f 0a 20 20 69 66 28 20 62 4c 6f 61 64 65 64  */.  if( bLoaded
69b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6b 70 74 4c  ==0 ){.    ckptL
69c0: 6f 61 64 45 6d 70 74 79 28 70 44 62 29 3b 0a 20  oadEmpty(pDb);. 
69d0: 20 7d 0a 0a 20 20 6c 73 6d 46 73 4d 65 74 61 50   }..  lsmFsMetaP
69e0: 61 67 65 52 65 6c 65 61 73 65 28 61 70 50 67 5b  ageRelease(apPg[
69f0: 30 5d 29 3b 0a 20 20 6c 73 6d 46 73 4d 65 74 61  0]);.  lsmFsMeta
6a00: 50 61 67 65 52 65 6c 65 61 73 65 28 61 70 50 67  PageRelease(apPg
6a10: 5b 31 5d 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  [1]);..  return 
6a20: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 74  rc;.}../* .** St
6a30: 6f 72 65 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ore the snapshot
6a40: 20 69 6e 20 70 44 62 2d 3e 61 53 6e 61 70 73 68   in pDb->aSnapsh
6a50: 6f 74 5b 5d 20 69 6e 20 6d 65 74 61 2d 70 61 67  ot[] in meta-pag
6a60: 65 20 69 4d 65 74 61 2e 0a 2a 2f 0a 69 6e 74 20  e iMeta..*/.int 
6a70: 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 53 74 6f  lsmCheckpointSto
6a80: 72 65 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  re(lsm_db *pDb, 
6a90: 69 6e 74 20 69 4d 65 74 61 29 7b 0a 20 20 4d 65  int iMeta){.  Me
6aa0: 74 61 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  taPage *pPg = 0;
6ab0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
6ac0: 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 31 20 7c  sert( iMeta==1 |
6ad0: 7c 20 69 4d 65 74 61 3d 3d 32 20 29 3b 0a 20 20  | iMeta==2 );.  
6ae0: 72 63 20 3d 20 6c 73 6d 46 73 4d 65 74 61 50 61  rc = lsmFsMetaPa
6af0: 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20  geGet(pDb->pFS, 
6b00: 31 2c 20 69 4d 65 74 61 2c 20 26 70 50 67 29 3b  1, iMeta, &pPg);
6b10: 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
6b20: 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 44 61  K ){.    u8 *aDa
6b30: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74  ta;.    int nDat
6b40: 61 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6b 70 74  a;.    int nCkpt
6b50: 3b 0a 0a 20 20 20 20 6e 43 6b 70 74 20 3d 20 28  ;..    nCkpt = (
6b60: 69 6e 74 29 70 44 62 2d 3e 61 53 6e 61 70 73 68  int)pDb->aSnapsh
6b70: 6f 74 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50  ot[CKPT_HDR_NCKP
6b80: 54 5d 3b 0a 20 20 20 20 61 44 61 74 61 20 3d 20  T];.    aData = 
6b90: 6c 73 6d 46 73 4d 65 74 61 50 61 67 65 44 61 74  lsmFsMetaPageDat
6ba0: 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a  a(pPg, &nData);.
6bb0: 20 20 20 20 6d 65 6d 63 70 79 28 61 44 61 74 61      memcpy(aData
6bc0: 2c 20 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74  , pDb->aSnapshot
6bd0: 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75  , nCkpt*sizeof(u
6be0: 33 32 29 29 3b 0a 20 20 20 20 63 6b 70 74 43 68  32));.    ckptCh
6bf0: 61 6e 67 65 45 6e 64 69 61 6e 6e 65 73 73 28 28  angeEndianness((
6c00: 75 33 32 20 2a 29 61 44 61 74 61 2c 20 6e 43 6b  u32 *)aData, nCk
6c10: 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73  pt);.    rc = ls
6c20: 6d 46 73 4d 65 74 61 50 61 67 65 52 65 6c 65 61  mFsMetaPageRelea
6c30: 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 20  se(pPg);.  }.   
6c40: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b     .  return rc;
6c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
6c60: 68 65 20 63 75 72 72 65 6e 74 20 63 6c 69 65 6e  he current clien
6c70: 74 20 73 6e 61 70 73 68 6f 74 20 66 72 6f 6d 20  t snapshot from 
6c80: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 74 6f  shared-memory to
6c90: 20 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74 5b   pDb->aSnapshot[
6ca0: 5d 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 43 68 65  ]..*/.int lsmChe
6cb0: 63 6b 70 6f 69 6e 74 4c 6f 61 64 28 6c 73 6d 5f  ckpointLoad(lsm_
6cc0: 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 2a 70 69  db *pDb, int *pi
6cd0: 52 65 61 64 29 7b 0a 20 20 69 6e 74 20 6e 52 65  Read){.  int nRe
6ce0: 6d 20 3d 20 4c 53 4d 5f 41 54 54 45 4d 50 54 53  m = LSM_ATTEMPTS
6cf0: 5f 42 45 46 4f 52 45 5f 50 52 4f 54 4f 43 4f 4c  _BEFORE_PROTOCOL
6d00: 3b 0a 20 20 53 68 6d 48 65 61 64 65 72 20 2a 70  ;.  ShmHeader *p
6d10: 53 68 6d 20 3d 20 70 44 62 2d 3e 70 53 68 6d 68  Shm = pDb->pShmh
6d20: 64 72 3b 0a 20 20 77 68 69 6c 65 28 20 28 6e 52  dr;.  while( (nR
6d30: 65 6d 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 69  em--)>0 ){.    i
6d40: 6e 74 20 6e 49 6e 74 3b 0a 0a 20 20 20 20 6e 49  nt nInt;..    nI
6d50: 6e 74 20 3d 20 70 53 68 6d 2d 3e 61 53 6e 61 70  nt = pShm->aSnap
6d60: 31 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54  1[CKPT_HDR_NCKPT
6d70: 5d 3b 0a 20 20 20 20 69 66 28 20 6e 49 6e 74 3c  ];.    if( nInt<
6d80: 3d 28 4c 53 4d 5f 4d 45 54 41 5f 52 57 5f 50 41  =(LSM_META_RW_PA
6d90: 47 45 5f 53 49 5a 45 20 2f 20 73 69 7a 65 6f 66  GE_SIZE / sizeof
6da0: 28 75 33 32 29 29 20 29 7b 0a 20 20 20 20 20 20  (u32)) ){.      
6db0: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 61 53 6e 61  memcpy(pDb->aSna
6dc0: 70 73 68 6f 74 2c 20 70 53 68 6d 2d 3e 61 53 6e  pshot, pShm->aSn
6dd0: 61 70 31 2c 20 6e 49 6e 74 2a 73 69 7a 65 6f 66  ap1, nInt*sizeof
6de0: 28 75 33 32 29 29 3b 0a 20 20 20 20 20 20 69 66  (u32));.      if
6df0: 28 20 63 6b 70 74 43 68 65 63 6b 73 75 6d 4f 6b  ( ckptChecksumOk
6e00: 28 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74 29  (pDb->aSnapshot)
6e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6e20: 70 69 52 65 61 64 20 29 20 2a 70 69 52 65 61 64  piRead ) *piRead
6e30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
6e40: 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20  turn LSM_OK;.   
6e50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
6e60: 6e 49 6e 74 20 3d 20 70 53 68 6d 2d 3e 61 53 6e  nInt = pShm->aSn
6e70: 61 70 32 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b  ap2[CKPT_HDR_NCK
6e80: 50 54 5d 3b 0a 20 20 20 20 69 66 28 20 6e 49 6e  PT];.    if( nIn
6e90: 74 3c 3d 28 4c 53 4d 5f 4d 45 54 41 5f 52 57 5f  t<=(LSM_META_RW_
6ea0: 50 41 47 45 5f 53 49 5a 45 20 2f 20 73 69 7a 65  PAGE_SIZE / size
6eb0: 6f 66 28 75 33 32 29 29 20 29 7b 0a 20 20 20 20  of(u32)) ){.    
6ec0: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 61 53    memcpy(pDb->aS
6ed0: 6e 61 70 73 68 6f 74 2c 20 70 53 68 6d 2d 3e 61  napshot, pShm->a
6ee0: 53 6e 61 70 32 2c 20 6e 49 6e 74 2a 73 69 7a 65  Snap2, nInt*size
6ef0: 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 20 20  of(u32));.      
6f00: 69 66 28 20 63 6b 70 74 43 68 65 63 6b 73 75 6d  if( ckptChecksum
6f10: 4f 6b 28 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f  Ok(pDb->aSnapsho
6f20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  t) ){.        if
6f30: 28 20 70 69 52 65 61 64 20 29 20 2a 70 69 52 65  ( piRead ) *piRe
6f40: 61 64 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  ad = 2;.        
6f50: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 20  return LSM_OK;. 
6f60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
6f70: 20 20 6c 73 6d 53 68 6d 42 61 72 72 69 65 72 28    lsmShmBarrier(
6f80: 70 44 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pDb);.  }.  retu
6f90: 72 6e 20 4c 53 4d 5f 50 52 4f 54 4f 43 4f 4c 5f  rn LSM_PROTOCOL_
6fa0: 42 4b 50 54 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d  BKPT;.}..int lsm
6fb0: 49 6e 66 6f 43 6f 6d 70 72 65 73 73 69 6f 6e 49  InfoCompressionI
6fc0: 64 28 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 75 33  d(lsm_db *db, u3
6fd0: 32 20 2a 70 69 43 6d 70 49 64 29 7b 0a 20 20 69  2 *piCmpId){.  i
6fe0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6ff0: 28 20 64 62 2d 3e 70 43 6c 69 65 6e 74 3d 3d 30  ( db->pClient==0
7000: 20 26 26 20 64 62 2d 3e 70 57 6f 72 6b 65 72 3d   && db->pWorker=
7010: 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 6c 73 6d  =0 );.  rc = lsm
7020: 43 68 65 63 6b 70 6f 69 6e 74 4c 6f 61 64 28 64  CheckpointLoad(d
7030: 62 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  b, 0);.  if( rc=
7040: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  =LSM_OK ){.    *
7050: 70 69 43 6d 70 49 64 20 3d 20 64 62 2d 3e 61 53  piCmpId = db->aS
7060: 6e 61 70 73 68 6f 74 5b 43 4b 50 54 5f 48 44 52  napshot[CKPT_HDR
7070: 5f 43 4d 50 49 44 5d 3b 0a 20 20 7d 0a 0a 20 20  _CMPID];.  }..  
7080: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
7090: 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4c  t lsmCheckpointL
70a0: 6f 61 64 4f 6b 28 6c 73 6d 5f 64 62 20 2a 70 44  oadOk(lsm_db *pD
70b0: 62 2c 20 69 6e 74 20 69 53 6e 61 70 29 7b 0a 20  b, int iSnap){. 
70c0: 20 75 33 32 20 2a 61 53 68 6d 3b 0a 20 20 61 73   u32 *aShm;.  as
70d0: 73 65 72 74 28 20 69 53 6e 61 70 3d 3d 31 20 7c  sert( iSnap==1 |
70e0: 7c 20 69 53 6e 61 70 3d 3d 32 20 29 3b 0a 20 20  | iSnap==2 );.  
70f0: 61 53 68 6d 20 3d 20 28 69 53 6e 61 70 3d 3d 31  aShm = (iSnap==1
7100: 29 20 3f 20 70 44 62 2d 3e 70 53 68 6d 68 64 72  ) ? pDb->pShmhdr
7110: 2d 3e 61 53 6e 61 70 31 20 3a 20 70 44 62 2d 3e  ->aSnap1 : pDb->
7120: 70 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 32 3b  pShmhdr->aSnap2;
7130: 0a 20 20 72 65 74 75 72 6e 20 28 6c 73 6d 43 68  .  return (lsmCh
7140: 65 63 6b 70 6f 69 6e 74 49 64 28 70 44 62 2d 3e  eckpointId(pDb->
7150: 61 53 6e 61 70 73 68 6f 74 2c 20 30 29 3d 3d 6c  aSnapshot, 0)==l
7160: 73 6d 43 68 65 63 6b 70 6f 69 6e 74 49 64 28 61  smCheckpointId(a
7170: 53 68 6d 2c 20 30 29 20 29 3b 0a 7d 0a 0a 69 6e  Shm, 0) );.}..in
7180: 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 43  t lsmCheckpointC
7190: 6c 69 65 6e 74 43 61 63 68 65 4f 6b 28 6c 73 6d  lientCacheOk(lsm
71a0: 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 72 65 74  _db *pDb){.  ret
71b0: 75 72 6e 20 28 20 70 44 62 2d 3e 70 43 6c 69 65  urn ( pDb->pClie
71c0: 6e 74 20 0a 20 20 20 20 20 20 20 20 26 26 20 70  nt .        && p
71d0: 44 62 2d 3e 70 43 6c 69 65 6e 74 2d 3e 69 49 64  Db->pClient->iId
71e0: 3d 3d 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 49  ==lsmCheckpointI
71f0: 64 28 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74  d(pDb->aSnapshot
7200: 2c 20 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  , 0).        && 
7210: 70 44 62 2d 3e 70 43 6c 69 65 6e 74 2d 3e 69 49  pDb->pClient->iI
7220: 64 3d 3d 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74  d==lsmCheckpoint
7230: 49 64 28 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d  Id(pDb->pShmhdr-
7240: 3e 61 53 6e 61 70 31 2c 20 30 29 0a 20 20 20 20  >aSnap1, 0).    
7250: 20 20 20 20 26 26 20 70 44 62 2d 3e 70 43 6c 69      && pDb->pCli
7260: 65 6e 74 2d 3e 69 49 64 3d 3d 6c 73 6d 43 68 65  ent->iId==lsmChe
7270: 63 6b 70 6f 69 6e 74 49 64 28 70 44 62 2d 3e 70  ckpointId(pDb->p
7280: 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 32 2c 20  Shmhdr->aSnap2, 
7290: 30 29 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6c  0).  );.}..int l
72a0: 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4c 6f 61 64  smCheckpointLoad
72b0: 57 6f 72 6b 65 72 28 6c 73 6d 5f 64 62 20 2a 70  Worker(lsm_db *p
72c0: 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Db){.  int rc;. 
72d0: 20 53 68 6d 48 65 61 64 65 72 20 2a 70 53 68 6d   ShmHeader *pShm
72e0: 20 3d 20 70 44 62 2d 3e 70 53 68 6d 68 64 72 3b   = pDb->pShmhdr;
72f0: 0a 20 20 69 6e 74 20 6e 49 6e 74 31 3b 0a 20 20  .  int nInt1;.  
7300: 69 6e 74 20 6e 49 6e 74 32 3b 0a 0a 20 20 2f 2a  int nInt2;..  /*
7310: 20 4d 75 73 74 20 62 65 20 68 6f 6c 64 69 6e 67   Must be holding
7320: 20 74 68 65 20 57 4f 52 4b 45 52 20 6c 6f 63 6b   the WORKER lock
7330: 20 74 6f 20 64 6f 20 74 68 69 73 2e 20 4f 72 20   to do this. Or 
7340: 44 4d 53 32 2e 20 2a 2f 0a 20 20 61 73 73 65 72  DMS2. */.  asser
7350: 74 28 20 0a 20 20 20 20 20 20 6c 73 6d 53 68 6d  t( .      lsmShm
7360: 41 73 73 65 72 74 4c 6f 63 6b 28 70 44 62 2c 20  AssertLock(pDb, 
7370: 4c 53 4d 5f 4c 4f 43 4b 5f 57 4f 52 4b 45 52 2c  LSM_LOCK_WORKER,
7380: 20 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 29 20   LSM_LOCK_EXCL) 
7390: 0a 20 20 20 7c 7c 20 6c 73 6d 53 68 6d 41 73 73  .   || lsmShmAss
73a0: 65 72 74 4c 6f 63 6b 28 70 44 62 2c 20 4c 53 4d  ertLock(pDb, LSM
73b0: 5f 4c 4f 43 4b 5f 44 4d 53 31 2c 20 4c 53 4d 5f  _LOCK_DMS1, LSM_
73c0: 4c 4f 43 4b 5f 45 58 43 4c 29 20 0a 20 20 29 3b  LOCK_EXCL) .  );
73d0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
73e0: 74 20 74 68 65 20 74 77 6f 20 73 6e 61 70 73 68  t the two snapsh
73f0: 6f 74 73 20 6d 61 74 63 68 2e 20 49 66 20 6e 6f  ots match. If no
7400: 74 2c 20 72 65 70 61 69 72 20 74 68 65 6d 2e 20  t, repair them. 
7410: 2a 2f 0a 20 20 6e 49 6e 74 31 20 3d 20 70 53 68  */.  nInt1 = pSh
7420: 6d 2d 3e 61 53 6e 61 70 31 5b 43 4b 50 54 5f 48  m->aSnap1[CKPT_H
7430: 44 52 5f 4e 43 4b 50 54 5d 3b 0a 20 20 6e 49 6e  DR_NCKPT];.  nIn
7440: 74 32 20 3d 20 70 53 68 6d 2d 3e 61 53 6e 61 70  t2 = pShm->aSnap
7450: 32 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54  2[CKPT_HDR_NCKPT
7460: 5d 3b 0a 20 20 69 66 28 20 6e 49 6e 74 31 21 3d  ];.  if( nInt1!=
7470: 6e 49 6e 74 32 20 7c 7c 20 6d 65 6d 63 6d 70 28  nInt2 || memcmp(
7480: 70 53 68 6d 2d 3e 61 53 6e 61 70 31 2c 20 70 53  pShm->aSnap1, pS
7490: 68 6d 2d 3e 61 53 6e 61 70 32 2c 20 6e 49 6e 74  hm->aSnap2, nInt
74a0: 32 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 20 29  2*sizeof(u32)) )
74b0: 7b 0a 20 20 20 20 69 66 28 20 63 6b 70 74 43 68  {.    if( ckptCh
74c0: 65 63 6b 73 75 6d 4f 6b 28 70 53 68 6d 2d 3e 61  ecksumOk(pShm->a
74d0: 53 6e 61 70 31 29 20 29 7b 0a 20 20 20 20 20 20  Snap1) ){.      
74e0: 6d 65 6d 63 70 79 28 70 53 68 6d 2d 3e 61 53 6e  memcpy(pShm->aSn
74f0: 61 70 32 2c 20 70 53 68 6d 2d 3e 61 53 6e 61 70  ap2, pShm->aSnap
7500: 31 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e  1, sizeof(u32)*n
7510: 49 6e 74 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Int1);.    }else
7520: 20 69 66 28 20 63 6b 70 74 43 68 65 63 6b 73 75   if( ckptChecksu
7530: 6d 4f 6b 28 70 53 68 6d 2d 3e 61 53 6e 61 70 32  mOk(pShm->aSnap2
7540: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
7550: 79 28 70 53 68 6d 2d 3e 61 53 6e 61 70 31 2c 20  y(pShm->aSnap1, 
7560: 70 53 68 6d 2d 3e 61 53 6e 61 70 32 2c 20 73 69  pShm->aSnap2, si
7570: 7a 65 6f 66 28 75 33 32 29 2a 6e 49 6e 74 32 29  zeof(u32)*nInt2)
7580: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7590: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 50 52     return LSM_PR
75a0: 4f 54 4f 43 4f 4c 5f 42 4b 50 54 3b 0a 20 20 20  OTOCOL_BKPT;.   
75b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6c   }.  }..  rc = l
75c0: 73 6d 43 68 65 63 6b 70 6f 69 6e 74 44 65 73 65  smCheckpointDese
75d0: 72 69 61 6c 69 7a 65 28 70 44 62 2c 20 31 2c 20  rialize(pDb, 1, 
75e0: 70 53 68 6d 2d 3e 61 53 6e 61 70 31 2c 20 26 70  pShm->aSnap1, &p
75f0: 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a 20 20  Db->pWorker);.  
7600: 69 66 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  if( pDb->pWorker
7610: 20 29 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d   ) pDb->pWorker-
7620: 3e 70 44 61 74 61 62 61 73 65 20 3d 20 70 44 62  >pDatabase = pDb
7630: 2d 3e 70 44 61 74 61 62 61 73 65 3b 0a 0a 20 20  ->pDatabase;..  
7640: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
7650: 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 43 68  {.    rc = lsmCh
7660: 65 63 6b 43 6f 6d 70 72 65 73 73 69 6f 6e 49 64  eckCompressionId
7670: 28 70 44 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b  (pDb, pDb->pWork
7680: 65 72 2d 3e 69 43 6d 70 49 64 29 3b 0a 20 20 7d  er->iCmpId);.  }
7690: 0a 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  ..#if 0.  assert
76a0: 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20  ( rc!=LSM_OK || 
76b0: 6c 73 6d 46 73 49 6e 74 65 67 72 69 74 79 43 68  lsmFsIntegrityCh
76c0: 65 63 6b 28 70 44 62 29 20 29 3b 0a 23 65 6e 64  eck(pDb) );.#end
76d0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
76e0: 7d 0a 0a 69 6e 74 20 6c 73 6d 43 68 65 63 6b 70  }..int lsmCheckp
76f0: 6f 69 6e 74 44 65 73 65 72 69 61 6c 69 7a 65 28  ointDeserialize(
7700: 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  .  lsm_db *pDb, 
7710: 0a 20 20 69 6e 74 20 62 49 6e 63 6c 46 72 65 65  .  int bInclFree
7720: 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  list,           
7730: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 64     /* If true, d
7740: 65 73 65 72 69 61 6c 69 7a 65 20 66 72 65 65 2d  eserialize free-
7750: 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61  list */.  u32 *a
7760: 43 6b 70 74 2c 20 0a 20 20 53 6e 61 70 73 68 6f  Ckpt, .  Snapsho
7770: 74 20 2a 2a 70 70 53 6e 61 70 0a 29 7b 0a 20 20  t **ppSnap.){.  
7780: 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
7790: 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 4e 65  .  Snapshot *pNe
77a0: 77 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 28 53 6e  w;..  pNew = (Sn
77b0: 61 70 73 68 6f 74 20 2a 29 6c 73 6d 4d 61 6c 6c  apshot *)lsmMall
77c0: 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70 45  ocZeroRc(pDb->pE
77d0: 6e 76 2c 20 73 69 7a 65 6f 66 28 53 6e 61 70 73  nv, sizeof(Snaps
77e0: 68 6f 74 29 2c 20 26 72 63 29 3b 0a 20 20 69 66  hot), &rc);.  if
77f0: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
7800: 20 20 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b      Level *pLvl;
7810: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a  .    int nFree;.
7820: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
7830: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 28 69 6e 74  nt nLevel = (int
7840: 29 61 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f  )aCkpt[CKPT_HDR_
7850: 4e 4c 45 56 45 4c 5d 3b 0a 20 20 20 20 69 6e 74  NLEVEL];.    int
7860: 20 69 49 6e 20 3d 20 43 4b 50 54 5f 48 44 52 5f   iIn = CKPT_HDR_
7870: 53 49 5a 45 20 2b 20 43 4b 50 54 5f 41 50 50 45  SIZE + CKPT_APPE
7880: 4e 44 4c 49 53 54 5f 53 49 5a 45 20 2b 20 43 4b  NDLIST_SIZE + CK
7890: 50 54 5f 4c 4f 47 50 54 52 5f 53 49 5a 45 3b 0a  PT_LOGPTR_SIZE;.
78a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 49 64 20 3d  .    pNew->iId =
78b0: 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 49 64   lsmCheckpointId
78c0: 28 61 43 6b 70 74 2c 20 30 29 3b 0a 20 20 20 20  (aCkpt, 0);.    
78d0: 70 4e 65 77 2d 3e 6e 42 6c 6f 63 6b 20 3d 20 61  pNew->nBlock = a
78e0: 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 4e 42  Ckpt[CKPT_HDR_NB
78f0: 4c 4f 43 4b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  LOCK];.    pNew-
7900: 3e 6e 57 72 69 74 65 20 3d 20 61 43 6b 70 74 5b  >nWrite = aCkpt[
7910: 43 4b 50 54 5f 48 44 52 5f 4e 57 52 49 54 45 5d  CKPT_HDR_NWRITE]
7920: 3b 0a 20 20 20 20 72 63 20 3d 20 63 6b 70 74 4c  ;.    rc = ckptL
7930: 6f 61 64 4c 65 76 65 6c 73 28 70 44 62 2c 20 61  oadLevels(pDb, a
7940: 43 6b 70 74 2c 20 26 69 49 6e 2c 20 6e 4c 65 76  Ckpt, &iIn, nLev
7950: 65 6c 2c 20 26 70 4e 65 77 2d 3e 70 4c 65 76 65  el, &pNew->pLeve
7960: 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  l);.    pNew->iL
7970: 6f 67 4f 66 66 20 3d 20 6c 73 6d 43 68 65 63 6b  ogOff = lsmCheck
7980: 70 6f 69 6e 74 4c 6f 67 4f 66 66 73 65 74 28 61  pointLogOffset(a
7990: 43 6b 70 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Ckpt);.    pNew-
79a0: 3e 69 43 6d 70 49 64 20 3d 20 61 43 6b 70 74 5b  >iCmpId = aCkpt[
79b0: 43 4b 50 54 5f 48 44 52 5f 43 4d 50 49 44 5d 3b  CKPT_HDR_CMPID];
79c0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20  ..    /* Make a 
79d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 70 65  copy of the appe
79e0: 6e 64 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 66  nd-list */.    f
79f0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 53 4d 5f 41 50  or(i=0; i<LSM_AP
7a00: 50 4c 49 53 54 5f 53 5a 3b 20 69 2b 2b 29 7b 0a  PLIST_SZ; i++){.
7a10: 20 20 20 20 20 20 75 33 32 20 2a 61 20 3d 20 26        u32 *a = &
7a20: 61 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 53  aCkpt[CKPT_HDR_S
7a30: 49 5a 45 20 2b 20 43 4b 50 54 5f 4c 4f 47 50 54  IZE + CKPT_LOGPT
7a40: 52 5f 53 49 5a 45 20 2b 20 69 2a 32 5d 3b 0a 20  R_SIZE + i*2];. 
7a50: 20 20 20 20 20 70 4e 65 77 2d 3e 61 69 41 70 70       pNew->aiApp
7a60: 65 6e 64 5b 69 5d 20 3d 20 63 6b 70 74 52 65 61  end[i] = ckptRea
7a70: 64 36 34 28 61 29 3b 0a 20 20 20 20 7d 0a 0a 20  d64(a);.    }.. 
7a80: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62     /* Read the b
7a90: 6c 6f 63 6b 2d 72 65 64 69 72 65 63 74 20 6c 69  lock-redirect li
7aa0: 73 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  st */.    pNew->
7ab0: 72 65 64 69 72 65 63 74 2e 6e 20 3d 20 61 43 6b  redirect.n = aCk
7ac0: 70 74 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 69  pt[iIn++];.    i
7ad0: 66 28 20 70 4e 65 77 2d 3e 72 65 64 69 72 65 63  f( pNew->redirec
7ae0: 74 2e 6e 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  t.n ){.      pNe
7af0: 77 2d 3e 72 65 64 69 72 65 63 74 2e 61 20 3d 20  w->redirect.a = 
7b00: 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28  lsmMallocZeroRc(
7b10: 70 44 62 2d 3e 70 45 6e 76 2c 20 0a 20 20 20 20  pDb->pEnv, .    
7b20: 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 73 74        (sizeof(st
7b30: 72 75 63 74 20 52 65 64 69 72 65 63 74 45 6e 74  ruct RedirectEnt
7b40: 72 79 29 20 2a 20 4c 53 4d 5f 4d 41 58 5f 42 4c  ry) * LSM_MAX_BL
7b50: 4f 43 4b 5f 52 45 44 49 52 45 43 54 53 29 2c 20  OCK_REDIRECTS), 
7b60: 26 72 63 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  &rc.      );.   
7b70: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
7b80: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  K ){.        for
7b90: 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 72 65  (i=0; i<pNew->re
7ba0: 64 69 72 65 63 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  direct.n; i++){.
7bb0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7bc0: 72 65 64 69 72 65 63 74 2e 61 5b 69 5d 2e 69 46  redirect.a[i].iF
7bd0: 72 6f 6d 20 3d 20 61 43 6b 70 74 5b 69 49 6e 2b  rom = aCkpt[iIn+
7be0: 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  +];.          pN
7bf0: 65 77 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 69  ew->redirect.a[i
7c00: 5d 2e 69 54 6f 20 3d 20 61 43 6b 70 74 5b 69 49  ].iTo = aCkpt[iI
7c10: 6e 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n++];.        }.
7c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
7c30: 72 28 70 4c 76 6c 3d 70 4e 65 77 2d 3e 70 4c 65  r(pLvl=pNew->pLe
7c40: 76 65 6c 3b 20 70 4c 76 6c 2d 3e 70 4e 65 78 74  vel; pLvl->pNext
7c50: 3b 20 70 4c 76 6c 3d 70 4c 76 6c 2d 3e 70 4e 65  ; pLvl=pLvl->pNe
7c60: 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xt);.      if( p
7c70: 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 29 7b 0a 20  Lvl->nRight ){. 
7c80: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 52 68         pLvl->aRh
7c90: 73 5b 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 2d 31  s[pLvl->nRight-1
7ca0: 5d 2e 70 52 65 64 69 72 65 63 74 20 3d 20 26 70  ].pRedirect = &p
7cb0: 4e 65 77 2d 3e 72 65 64 69 72 65 63 74 3b 0a 20  New->redirect;. 
7cc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7cd0: 20 20 20 20 70 4c 76 6c 2d 3e 6c 68 73 2e 70 52      pLvl->lhs.pR
7ce0: 65 64 69 72 65 63 74 20 3d 20 26 70 4e 65 77 2d  edirect = &pNew-
7cf0: 3e 72 65 64 69 72 65 63 74 3b 0a 20 20 20 20 20  >redirect;.     
7d00: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
7d10: 20 43 6f 70 79 20 74 68 65 20 66 72 65 65 2d 6c   Copy the free-l
7d20: 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ist */.    if( r
7d30: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62 49 6e  c==LSM_OK && bIn
7d40: 63 6c 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  clFreelist ){.  
7d50: 20 20 20 20 6e 46 72 65 65 20 3d 20 61 43 6b 70      nFree = aCkp
7d60: 74 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 20 20  t[iIn++];.      
7d70: 69 66 28 20 6e 46 72 65 65 20 29 7b 0a 20 20 20  if( nFree ){.   
7d80: 20 20 20 20 20 70 4e 65 77 2d 3e 66 72 65 65 6c       pNew->freel
7d90: 69 73 74 2e 61 45 6e 74 72 79 20 3d 20 28 46 72  ist.aEntry = (Fr
7da0: 65 65 6c 69 73 74 45 6e 74 72 79 20 2a 29 6c 73  eelistEntry *)ls
7db0: 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 0a 20  mMallocZeroRc(. 
7dc0: 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e             pDb->
7dd0: 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 46 72 65  pEnv, sizeof(Fre
7de0: 65 6c 69 73 74 45 6e 74 72 79 29 2a 6e 46 72 65  elistEntry)*nFre
7df0: 65 2c 20 26 72 63 0a 20 20 20 20 20 20 20 20 29  e, &rc.        )
7e00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7e10: 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
7e20: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7e30: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7e40: 6a 3c 6e 46 72 65 65 3b 20 6a 2b 2b 29 7b 0a 20  j<nFree; j++){. 
7e50: 20 20 20 20 20 20 20 20 20 20 20 46 72 65 65 6c             Freel
7e60: 69 73 74 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  istEntry *p = &p
7e70: 4e 65 77 2d 3e 66 72 65 65 6c 69 73 74 2e 61 45  New->freelist.aE
7e80: 6e 74 72 79 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  ntry[j];.       
7e90: 20 20 20 20 20 70 2d 3e 69 42 6c 6b 20 3d 20 61       p->iBlk = a
7ea0: 43 6b 70 74 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20  Ckpt[iIn++];.   
7eb0: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 64 20           p->iId 
7ec0: 3d 20 28 28 69 36 34 29 28 61 43 6b 70 74 5b 69  = ((i64)(aCkpt[i
7ed0: 49 6e 5d 29 3c 3c 33 32 29 20 2b 20 61 43 6b 70  In])<<32) + aCkp
7ee0: 74 5b 69 49 6e 2b 31 5d 3b 0a 20 20 20 20 20 20  t[iIn+1];.      
7ef0: 20 20 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b 0a        iIn += 2;.
7f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7f10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 72 65 65        pNew->free
7f20: 6c 69 73 74 2e 6e 45 6e 74 72 79 20 3d 20 70 4e  list.nEntry = pN
7f30: 65 77 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 41 6c  ew->freelist.nAl
7f40: 6c 6f 63 20 3d 20 6e 46 72 65 65 3b 0a 20 20 20  loc = nFree;.   
7f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7f60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
7f70: 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc!=LSM_OK ){.  
7f80: 20 20 6c 73 6d 46 72 65 65 53 6e 61 70 73 68 6f    lsmFreeSnapsho
7f90: 74 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4e 65  t(pDb->pEnv, pNe
7fa0: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
7fb0: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 6e 61 70  ;.  }..  *ppSnap
7fc0: 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
7fd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
7fe0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 20 6d 75  onnection pDb mu
7ff0: 73 74 20 62 65 20 74 68 65 20 77 6f 72 6b 65 72  st be the worker
8000: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 6f   connection in o
8010: 72 64 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rder to call thi
8020: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49  s.** function. I
8030: 74 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  t returns true i
8040: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
8050: 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
8060: 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 6e  the maximum.** n
8070: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
8080: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
8090: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  se..**.** This i
80a0: 73 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73  s used when flus
80b0: 68 69 6e 67 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  hing the in-memo
80c0: 72 79 20 74 72 65 65 20 74 6f 20 64 69 73 6b 2e  ry tree to disk.
80d0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
80e0: 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 66  .** is already f
80f0: 75 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ull, then the ca
8100: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
8110: 6b 65 20 6c 73 6d 5f 77 6f 72 6b 28 29 20 6f 72  ke lsm_work() or
8120: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 75 6e 74 69   similar.** unti
8130: 6c 20 69 74 20 69 73 20 6e 6f 74 20 66 75 6c 6c  l it is not full
8140: 20 62 65 66 6f 72 65 20 63 72 65 61 74 69 6e 67   before creating
8150: 20 61 20 6e 65 77 20 6c 65 76 65 6c 20 62 79 20   a new level by 
8160: 66 6c 75 73 68 69 6e 67 20 74 68 65 20 69 6e 2d  flushing the in-
8170: 6d 65 6d 6f 72 79 0a 2a 2a 20 74 72 65 65 20 74  memory.** tree t
8180: 6f 20 64 69 73 6b 2e 20 4c 69 6d 69 74 69 6e 67  o disk. Limiting
8190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
81a0: 65 76 65 6c 73 20 69 6e 20 74 68 65 20 64 61 74  evels in the dat
81b0: 61 62 61 73 65 20 65 6e 73 75 72 65 73 20 74 68  abase ensures th
81c0: 61 74 0a 2a 2a 20 74 68 65 20 72 65 63 6f 72 64  at.** the record
81d0: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  s describing the
81e0: 6d 20 61 6c 77 61 79 73 20 66 69 74 20 77 69 74  m always fit wit
81f0: 68 69 6e 20 74 68 65 20 63 68 65 63 6b 70 6f 69  hin the checkpoi
8200: 6e 74 20 62 6c 6f 62 2e 0a 2a 2f 0a 69 6e 74 20  nt blob..*/.int 
8210: 6c 73 6d 44 61 74 61 62 61 73 65 46 75 6c 6c 28  lsmDatabaseFull(
8220: 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20  lsm_db *pDb){.  
8230: 4c 65 76 65 6c 20 2a 70 3b 0a 20 20 69 6e 74 20  Level *p;.  int 
8240: 6e 52 68 73 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nRhs = 0;..  ass
8250: 65 72 74 28 20 6c 73 6d 53 68 6d 41 73 73 65 72  ert( lsmShmAsser
8260: 74 4c 6f 63 6b 28 70 44 62 2c 20 4c 53 4d 5f 4c  tLock(pDb, LSM_L
8270: 4f 43 4b 5f 57 4f 52 4b 45 52 2c 20 4c 53 4d 5f  OCK_WORKER, LSM_
8280: 4c 4f 43 4b 5f 45 58 43 4c 29 20 29 3b 0a 20 20  LOCK_EXCL) );.  
8290: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 57 6f  assert( pDb->pWo
82a0: 72 6b 65 72 20 29 3b 0a 0a 20 20 66 6f 72 28 70  rker );..  for(p
82b0: 3d 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e 70  =pDb->pWorker->p
82c0: 4c 65 76 65 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  Level; p; p=p->p
82d0: 4e 65 78 74 29 7b 0a 20 20 20 20 6e 52 68 73 20  Next){.    nRhs 
82e0: 2b 3d 20 28 70 2d 3e 6e 52 69 67 68 74 20 3f 20  += (p->nRight ? 
82f0: 70 2d 3e 6e 52 69 67 68 74 20 3a 20 31 29 3b 0a  p->nRight : 1);.
8300: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 6e    }..  return (n
8310: 52 68 73 20 3e 3d 20 4c 53 4d 5f 4d 41 58 5f 52  Rhs >= LSM_MAX_R
8320: 48 53 5f 53 45 47 4d 45 4e 54 53 29 3b 0a 7d 0a  HS_SEGMENTS);.}.
8330: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 6e 65  ./*.** The conne
8340: 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
8350: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
8360: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  t is currently t
8370: 68 65 20 77 6f 72 6b 65 72 0a 2a 2a 20 63 6f 6e  he worker.** con
8380: 6e 65 63 74 69 6f 6e 2e 20 53 6f 6d 65 20 77 6f  nection. Some wo
8390: 72 6b 20 68 61 73 20 62 65 65 6e 20 70 65 72 66  rk has been perf
83a0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ormed on the dat
83b0: 61 62 61 73 65 20 62 79 20 74 68 65 20 63 6f 6e  abase by the con
83c0: 6e 65 63 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20  nection,.** but 
83d0: 6e 6f 20 6e 65 77 20 73 6e 61 70 73 68 6f 74 20  no new snapshot 
83e0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
83f0: 20 69 6e 74 6f 20 73 68 61 72 65 64 20 6d 65 6d   into shared mem
8400: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ory..**.** This 
8410: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
8420: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
8430: 72 79 20 77 6f 72 6b 65 72 20 61 6e 64 20 63 6c  ry worker and cl
8440: 69 65 6e 74 20 73 6e 61 70 73 68 6f 74 73 20 77  ient snapshots w
8450: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
8460: 6e 61 70 73 68 6f 74 20 70 72 6f 64 75 63 65 64  napshot produced
8470: 20 62 79 20 74 68 65 20 77 6f 72 6b 20 70 65 72   by the work per
8480: 66 6f 72 6d 65 64 20 62 79 20 70 44 62 2e 0a 2a  formed by pDb..*
8490: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
84a0: 75 6c 2c 20 4c 53 4d 5f 4f 4b 20 69 73 20 72 65  ul, LSM_OK is re
84b0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
84c0: 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  e, if an error o
84d0: 63 63 75 72 73 2c 20 61 6e 20 4c 53 4d 0a 2a 2a  ccurs, an LSM.**
84e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
84f0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
8500: 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 53 61 76  lsmCheckpointSav
8510: 65 57 6f 72 6b 65 72 28 6c 73 6d 5f 64 62 20 2a  eWorker(lsm_db *
8520: 70 44 62 2c 20 69 6e 74 20 62 46 6c 75 73 68 29  pDb, int bFlush)
8530: 7b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 53  {.  Snapshot *pS
8540: 6e 61 70 20 3d 20 70 44 62 2d 3e 70 57 6f 72 6b  nap = pDb->pWork
8550: 65 72 3b 0a 20 20 53 68 6d 48 65 61 64 65 72 20  er;.  ShmHeader 
8560: 2a 70 53 68 6d 20 3d 20 70 44 62 2d 3e 70 53 68  *pShm = pDb->pSh
8570: 6d 68 64 72 3b 0a 20 20 76 6f 69 64 20 2a 70 20  mhdr;.  void *p 
8580: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
8590: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70  ;.  int rc;..  p
85a0: 53 6e 61 70 2d 3e 69 49 64 2b 2b 3b 0a 20 20 72  Snap->iId++;.  r
85b0: 63 20 3d 20 63 6b 70 74 45 78 70 6f 72 74 53 6e  c = ckptExportSn
85c0: 61 70 73 68 6f 74 28 70 44 62 2c 20 62 46 6c 75  apshot(pDb, bFlu
85d0: 73 68 2c 20 70 53 6e 61 70 2d 3e 69 49 64 2c 20  sh, pSnap->iId, 
85e0: 31 2c 20 26 70 2c 20 26 6e 29 3b 0a 20 20 69 66  1, &p, &n);.  if
85f0: 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72  ( rc!=LSM_OK ) r
8600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
8610: 72 74 28 20 63 6b 70 74 43 68 65 63 6b 73 75 6d  rt( ckptChecksum
8620: 4f 6b 28 28 75 33 32 20 2a 29 70 29 20 29 3b 0a  Ok((u32 *)p) );.
8630: 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 4c 53  .  assert( n<=LS
8640: 4d 5f 4d 45 54 41 5f 52 57 5f 50 41 47 45 5f 53  M_META_RW_PAGE_S
8650: 49 5a 45 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  IZE );.  memcpy(
8660: 70 53 68 6d 2d 3e 61 53 6e 61 70 32 2c 20 70 2c  pShm->aSnap2, p,
8670: 20 6e 29 3b 0a 20 20 6c 73 6d 53 68 6d 42 61 72   n);.  lsmShmBar
8680: 72 69 65 72 28 70 44 62 29 3b 0a 20 20 6d 65 6d  rier(pDb);.  mem
8690: 63 70 79 28 70 53 68 6d 2d 3e 61 53 6e 61 70 31  cpy(pShm->aSnap1
86a0: 2c 20 70 2c 20 6e 29 3b 0a 20 20 6c 73 6d 46 72  , p, n);.  lsmFr
86b0: 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 29  ee(pDb->pEnv, p)
86c0: 3b 0a 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  ;..  /* assert( 
86d0: 6c 73 6d 46 73 49 6e 74 65 67 72 69 74 79 43 68  lsmFsIntegrityCh
86e0: 65 63 6b 28 70 44 62 29 20 29 3b 20 2a 2f 0a 20  eck(pDb) ); */. 
86f0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a   return LSM_OK;.
8700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8710: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
8720: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
8730: 73 6e 61 70 73 68 6f 74 2d 69 64 20 6f 66 20 74  snapshot-id of t
8740: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8750: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
8760: 20 73 6e 61 70 73 68 6f 74 2e 20 56 61 72 69 61   snapshot. Varia
8770: 62 6c 65 20 53 68 6d 48 65 61 64 65 72 2e 69 4d  ble ShmHeader.iM
8780: 65 74 61 50 61 67 65 20 69 6e 64 69 63 61 74 65  etaPage indicate
8790: 73 20 77 68 69 63 68 20 6f 66 0a 2a 2a 20 74 68  s which of.** th
87a0: 65 20 74 77 6f 20 6d 65 74 61 2d 70 61 67 65 73  e two meta-pages
87b0: 20 73 61 69 64 20 73 6e 61 70 73 68 6f 74 20 72   said snapshot r
87c0: 65 73 69 64 65 73 20 6f 6e 20 28 69 66 20 61 6e  esides on (if an
87d0: 79 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  y). .**.** If su
87e0: 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
87f0: 75 6e 63 74 69 6f 6e 20 6c 6f 61 64 73 20 74 68  unction loads th
8800: 65 20 73 6e 61 70 73 68 6f 74 20 66 72 6f 6d 20  e snapshot from 
8810: 74 68 65 20 6d 65 74 61 2d 70 61 67 65 2c 20 0a  the meta-page, .
8820: 2a 2a 20 76 65 72 69 66 69 65 73 20 69 74 73 20  ** verifies its 
8830: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 73 65 74  checksum and set
8840: 73 20 2a 70 69 49 64 20 74 6f 20 74 68 65 20 73  s *piId to the s
8850: 6e 61 70 73 68 6f 74 2d 69 64 20 62 65 66 6f 72  napshot-id befor
8860: 65 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 4c  e returning.** L
8870: 53 4d 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68  SM_OK. Or, if th
8880: 65 20 63 68 65 63 6b 73 75 6d 20 61 74 74 65 6d  e checksum attem
8890: 70 74 20 66 61 69 6c 73 2c 20 2a 70 69 49 64 20  pt fails, *piId 
88a0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61  is set to zero a
88b0: 6e 64 0a 2a 2a 20 4c 53 4d 5f 4f 4b 20 72 65 74  nd.** LSM_OK ret
88c0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
88d0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 4c 53  or occurs, an LS
88e0: 4d 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  M error code is 
88f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 0a 2a 2a 20  returned and.** 
8900: 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  the final value 
8910: 6f 66 20 2a 70 69 49 64 20 69 73 20 75 6e 64 65  of *piId is unde
8920: 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 6c 73  fined..*/.int ls
8930: 6d 43 68 65 63 6b 70 6f 69 6e 74 53 79 6e 63 65  mCheckpointSynce
8940: 64 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69  d(lsm_db *pDb, i
8950: 36 34 20 2a 70 69 49 64 2c 20 69 36 34 20 2a 70  64 *piId, i64 *p
8960: 69 4c 6f 67 2c 20 75 33 32 20 2a 70 6e 57 72 69  iLog, u32 *pnWri
8970: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
8980: 4c 53 4d 5f 4f 4b 3b 0a 20 20 4d 65 74 61 50 61  LSM_OK;.  MetaPa
8990: 67 65 20 2a 70 50 67 3b 0a 20 20 75 33 32 20 69  ge *pPg;.  u32 i
89a0: 4d 65 74 61 3b 0a 0a 20 20 69 4d 65 74 61 20 3d  Meta;..  iMeta =
89b0: 20 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e 69   pDb->pShmhdr->i
89c0: 4d 65 74 61 50 61 67 65 3b 0a 20 20 69 66 28 20  MetaPage;.  if( 
89d0: 69 4d 65 74 61 3d 3d 31 20 7c 7c 20 69 4d 65 74  iMeta==1 || iMet
89e0: 61 3d 3d 32 20 29 7b 0a 20 20 20 20 72 63 20 3d  a==2 ){.    rc =
89f0: 20 6c 73 6d 46 73 4d 65 74 61 50 61 67 65 47 65   lsmFsMetaPageGe
8a00: 74 28 70 44 62 2d 3e 70 46 53 2c 20 30 2c 20 69  t(pDb->pFS, 0, i
8a10: 4d 65 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Meta, &pPg);.   
8a20: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
8a30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6b  ){.      int nCk
8a40: 70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44  pt;.      int nD
8a50: 61 74 61 3b 0a 20 20 20 20 20 20 75 38 20 2a 61  ata;.      u8 *a
8a60: 44 61 74 61 3b 20 0a 0a 20 20 20 20 20 20 61 44  Data; ..      aD
8a70: 61 74 61 20 3d 20 6c 73 6d 46 73 4d 65 74 61 50  ata = lsmFsMetaP
8a80: 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44  ageData(pPg, &nD
8a90: 61 74 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ata);.      asse
8aa0: 72 74 28 20 6e 44 61 74 61 3d 3d 4c 53 4d 5f 4d  rt( nData==LSM_M
8ab0: 45 54 41 5f 52 57 5f 50 41 47 45 5f 53 49 5a 45  ETA_RW_PAGE_SIZE
8ac0: 20 29 3b 0a 20 20 20 20 20 20 6e 43 6b 70 74 20   );.      nCkpt 
8ad0: 3d 20 6c 73 6d 47 65 74 55 33 32 28 26 61 44 61  = lsmGetU32(&aDa
8ae0: 74 61 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50  ta[CKPT_HDR_NCKP
8af0: 54 2a 73 69 7a 65 6f 66 28 75 33 32 29 5d 29 3b  T*sizeof(u32)]);
8b00: 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6b 70 74  .      if( nCkpt
8b10: 3c 28 4c 53 4d 5f 4d 45 54 41 5f 52 57 5f 50 41  <(LSM_META_RW_PA
8b20: 47 45 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 75  GE_SIZE/sizeof(u
8b30: 33 32 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  32)) ){.        
8b40: 75 33 32 20 2a 61 43 6f 70 79 20 3d 20 6c 73 6d  u32 *aCopy = lsm
8b50: 4d 61 6c 6c 6f 63 52 63 28 70 44 62 2d 3e 70 45  MallocRc(pDb->pE
8b60: 6e 76 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 20  nv, sizeof(u32) 
8b70: 2a 20 6e 43 6b 70 74 2c 20 26 72 63 29 3b 0a 20  * nCkpt, &rc);. 
8b80: 20 20 20 20 20 20 20 69 66 28 20 61 43 6f 70 79         if( aCopy
8b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
8ba0: 6d 63 70 79 28 61 43 6f 70 79 2c 20 61 44 61 74  mcpy(aCopy, aDat
8bb0: 61 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28  a, nCkpt*sizeof(
8bc0: 75 33 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  u32));.         
8bd0: 20 63 6b 70 74 43 68 61 6e 67 65 45 6e 64 69 61   ckptChangeEndia
8be0: 6e 6e 65 73 73 28 61 43 6f 70 79 2c 20 6e 43 6b  nness(aCopy, nCk
8bf0: 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pt);.          i
8c00: 66 28 20 63 6b 70 74 43 68 65 63 6b 73 75 6d 4f  f( ckptChecksumO
8c10: 6b 28 61 43 6f 70 79 29 20 29 7b 0a 20 20 20 20  k(aCopy) ){.    
8c20: 20 20 20 20 20 20 20 20 69 66 28 20 70 69 49 64          if( piId
8c30: 20 29 20 2a 70 69 49 64 20 3d 20 6c 73 6d 43 68   ) *piId = lsmCh
8c40: 65 63 6b 70 6f 69 6e 74 49 64 28 61 43 6f 70 79  eckpointId(aCopy
8c50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
8c60: 20 20 69 66 28 20 70 69 4c 6f 67 20 29 20 2a 70    if( piLog ) *p
8c70: 69 4c 6f 67 20 3d 20 28 6c 73 6d 43 68 65 63 6b  iLog = (lsmCheck
8c80: 70 6f 69 6e 74 4c 6f 67 4f 66 66 73 65 74 28 61  pointLogOffset(a
8c90: 43 6f 70 79 29 20 3e 3e 20 31 29 3b 0a 20 20 20  Copy) >> 1);.   
8ca0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 57           if( pnW
8cb0: 72 69 74 65 20 29 20 2a 70 6e 57 72 69 74 65 20  rite ) *pnWrite 
8cc0: 3d 20 61 43 6f 70 79 5b 43 4b 50 54 5f 48 44 52  = aCopy[CKPT_HDR
8cd0: 5f 4e 57 52 49 54 45 5d 3b 0a 20 20 20 20 20 20  _NWRITE];.      
8ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8cf0: 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e  lsmFree(pDb->pEn
8d00: 76 2c 20 61 43 6f 70 79 29 3b 0a 20 20 20 20 20  v, aCopy);.     
8d10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8d20: 20 20 20 6c 73 6d 46 73 4d 65 74 61 50 61 67 65     lsmFsMetaPage
8d30: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
8d40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28    }.  }..  if( (
8d50: 69 4d 65 74 61 21 3d 31 20 26 26 20 69 4d 65 74  iMeta!=1 && iMet
8d60: 61 21 3d 32 29 20 7c 7c 20 72 63 21 3d 4c 53 4d  a!=2) || rc!=LSM
8d70: 5f 4f 4b 20 7c 7c 20 70 44 62 2d 3e 70 53 68 6d  _OK || pDb->pShm
8d80: 68 64 72 2d 3e 69 4d 65 74 61 50 61 67 65 21 3d  hdr->iMetaPage!=
8d90: 69 4d 65 74 61 20 29 7b 0a 20 20 20 20 69 66 28  iMeta ){.    if(
8da0: 20 70 69 49 64 20 29 20 2a 70 69 49 64 20 3d 20   piId ) *piId = 
8db0: 30 3b 0a 20 20 20 20 69 66 28 20 70 69 4c 6f 67  0;.    if( piLog
8dc0: 20 29 20 2a 70 69 4c 6f 67 20 3d 20 30 3b 0a 20   ) *piLog = 0;. 
8dd0: 20 20 20 69 66 28 20 70 6e 57 72 69 74 65 20 29     if( pnWrite )
8de0: 20 2a 70 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20   *pnWrite = 0;. 
8df0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8e10: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2d 69  the checkpoint-i
8e20: 64 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  d of the checkpo
8e30: 69 6e 74 20 61 72 72 61 79 20 70 61 73 73 65 64  int array passed
8e40: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
8e50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8e60: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
8e70: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8e80: 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
8e90: 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20   assume.** that 
8ea0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
8eb0: 73 20 6d 61 64 65 20 75 70 20 6f 66 20 33 32 2d  s made up of 32-
8ec0: 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  bit big-endian i
8ed0: 6e 74 65 67 65 72 73 2e 20 49 66 20 69 74 0a 2a  ntegers. If it.*
8ee0: 2a 20 69 73 20 66 61 6c 73 65 2c 20 61 73 73 75  * is false, assu
8ef0: 6d 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65  me that the inte
8f00: 67 65 72 73 20 61 72 65 20 69 6e 20 6d 61 63 68  gers are in mach
8f10: 69 6e 65 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ine byte order..
8f20: 2a 2f 0a 69 36 34 20 6c 73 6d 43 68 65 63 6b 70  */.i64 lsmCheckp
8f30: 6f 69 6e 74 49 64 28 75 33 32 20 2a 61 43 6b 70  ointId(u32 *aCkp
8f40: 74 2c 20 69 6e 74 20 62 44 69 73 6b 29 7b 0a 20  t, int bDisk){. 
8f50: 20 69 36 34 20 69 49 64 3b 0a 20 20 69 66 28 20   i64 iId;.  if( 
8f60: 62 44 69 73 6b 20 29 7b 0a 20 20 20 20 75 38 20  bDisk ){.    u8 
8f70: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 61  *aData = (u8 *)a
8f80: 43 6b 70 74 3b 0a 20 20 20 20 69 49 64 20 3d 20  Ckpt;.    iId = 
8f90: 28 28 28 69 36 34 29 6c 73 6d 47 65 74 55 33 32  (((i64)lsmGetU32
8fa0: 28 26 61 44 61 74 61 5b 43 4b 50 54 5f 48 44 52  (&aData[CKPT_HDR
8fb0: 5f 49 44 5f 4d 53 57 2a 34 5d 29 29 20 3c 3c 20  _ID_MSW*4])) << 
8fc0: 33 32 29 3b 0a 20 20 20 20 69 49 64 20 2b 3d 20  32);.    iId += 
8fd0: 28 28 69 36 34 29 6c 73 6d 47 65 74 55 33 32 28  ((i64)lsmGetU32(
8fe0: 26 61 44 61 74 61 5b 43 4b 50 54 5f 48 44 52 5f  &aData[CKPT_HDR_
8ff0: 49 44 5f 4c 53 57 2a 34 5d 29 29 3b 0a 20 20 7d  ID_LSW*4]));.  }
9000: 65 6c 73 65 7b 0a 20 20 20 20 69 49 64 20 3d 20  else{.    iId = 
9010: 28 28 69 36 34 29 61 43 6b 70 74 5b 43 4b 50 54  ((i64)aCkpt[CKPT
9020: 5f 48 44 52 5f 49 44 5f 4d 53 57 5d 20 3c 3c 20  _HDR_ID_MSW] << 
9030: 33 32 29 20 2b 20 28 69 36 34 29 61 43 6b 70 74  32) + (i64)aCkpt
9040: 5b 43 4b 50 54 5f 48 44 52 5f 49 44 5f 4c 53 57  [CKPT_HDR_ID_LSW
9050: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
9060: 69 49 64 3b 0a 7d 0a 0a 75 33 32 20 6c 73 6d 43  iId;.}..u32 lsmC
9070: 68 65 63 6b 70 6f 69 6e 74 4e 42 6c 6f 63 6b 28  heckpointNBlock(
9080: 75 33 32 20 2a 61 43 6b 70 74 29 7b 0a 20 20 72  u32 *aCkpt){.  r
9090: 65 74 75 72 6e 20 61 43 6b 70 74 5b 43 4b 50 54  eturn aCkpt[CKPT
90a0: 5f 48 44 52 5f 4e 42 4c 4f 43 4b 5d 3b 0a 7d 0a  _HDR_NBLOCK];.}.
90b0: 0a 75 33 32 20 6c 73 6d 43 68 65 63 6b 70 6f 69  .u32 lsmCheckpoi
90c0: 6e 74 4e 57 72 69 74 65 28 75 33 32 20 2a 61 43  ntNWrite(u32 *aC
90d0: 6b 70 74 2c 20 69 6e 74 20 62 44 69 73 6b 29 7b  kpt, int bDisk){
90e0: 0a 20 20 69 66 28 20 62 44 69 73 6b 20 29 7b 0a  .  if( bDisk ){.
90f0: 20 20 20 20 72 65 74 75 72 6e 20 6c 73 6d 47 65      return lsmGe
9100: 74 55 33 32 28 28 75 38 20 2a 29 26 61 43 6b 70  tU32((u8 *)&aCkp
9110: 74 5b 43 4b 50 54 5f 48 44 52 5f 4e 57 52 49 54  t[CKPT_HDR_NWRIT
9120: 45 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E]);.  }else{.  
9130: 20 20 72 65 74 75 72 6e 20 61 43 6b 70 74 5b 43    return aCkpt[C
9140: 4b 50 54 5f 48 44 52 5f 4e 57 52 49 54 45 5d 3b  KPT_HDR_NWRITE];
9150: 0a 20 20 7d 0a 7d 0a 0a 69 36 34 20 6c 73 6d 43  .  }.}..i64 lsmC
9160: 68 65 63 6b 70 6f 69 6e 74 4c 6f 67 4f 66 66 73  heckpointLogOffs
9170: 65 74 28 75 33 32 20 2a 61 43 6b 70 74 29 7b 0a  et(u32 *aCkpt){.
9180: 20 20 72 65 74 75 72 6e 20 28 28 69 36 34 29 61    return ((i64)a
9190: 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 4c 4f  Ckpt[CKPT_HDR_LO
91a0: 5f 4d 53 57 5d 20 3c 3c 20 33 32 29 20 2b 20 28  _MSW] << 32) + (
91b0: 69 36 34 29 61 43 6b 70 74 5b 43 4b 50 54 5f 48  i64)aCkpt[CKPT_H
91c0: 44 52 5f 4c 4f 5f 4c 53 57 5d 3b 0a 7d 0a 0a 69  DR_LO_LSW];.}..i
91d0: 6e 74 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74  nt lsmCheckpoint
91e0: 50 67 73 7a 28 75 33 32 20 2a 61 43 6b 70 74 29  Pgsz(u32 *aCkpt)
91f0: 7b 20 72 65 74 75 72 6e 20 28 69 6e 74 29 61 43  { return (int)aC
9200: 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 50 47 53  kpt[CKPT_HDR_PGS
9210: 5a 5d 3b 20 7d 0a 0a 69 6e 74 20 6c 73 6d 43 68  Z]; }..int lsmCh
9220: 65 63 6b 70 6f 69 6e 74 42 6c 6b 73 7a 28 75 33  eckpointBlksz(u3
9230: 32 20 2a 61 43 6b 70 74 29 7b 20 72 65 74 75 72  2 *aCkpt){ retur
9240: 6e 20 28 69 6e 74 29 61 43 6b 70 74 5b 43 4b 50  n (int)aCkpt[CKP
9250: 54 5f 48 44 52 5f 42 4c 4b 53 5a 5d 3b 20 7d 0a  T_HDR_BLKSZ]; }.
9260: 0a 76 6f 69 64 20 6c 73 6d 43 68 65 63 6b 70 6f  .void lsmCheckpo
9270: 69 6e 74 4c 6f 67 6f 66 66 73 65 74 28 0a 20 20  intLogoffset(.  
9280: 75 33 32 20 2a 61 43 6b 70 74 2c 0a 20 20 44 62  u32 *aCkpt,.  Db
9290: 4c 6f 67 20 2a 70 4c 6f 67 0a 29 7b 20 0a 20 20  Log *pLog.){ .  
92a0: 70 4c 6f 67 2d 3e 61 52 65 67 69 6f 6e 5b 32 5d  pLog->aRegion[2]
92b0: 2e 69 53 74 61 72 74 20 3d 20 28 6c 73 6d 43 68  .iStart = (lsmCh
92c0: 65 63 6b 70 6f 69 6e 74 4c 6f 67 4f 66 66 73 65  eckpointLogOffse
92d0: 74 28 61 43 6b 70 74 29 20 3e 3e 20 31 29 3b 0a  t(aCkpt) >> 1);.
92e0: 0a 20 20 70 4c 6f 67 2d 3e 63 6b 73 75 6d 30 20  .  pLog->cksum0 
92f0: 3d 20 61 43 6b 70 74 5b 43 4b 50 54 5f 48 44 52  = aCkpt[CKPT_HDR
9300: 5f 4c 4f 5f 43 4b 53 55 4d 31 5d 3b 0a 20 20 70  _LO_CKSUM1];.  p
9310: 4c 6f 67 2d 3e 63 6b 73 75 6d 31 20 3d 20 61 43  Log->cksum1 = aC
9320: 6b 70 74 5b 43 4b 50 54 5f 48 44 52 5f 4c 4f 5f  kpt[CKPT_HDR_LO_
9330: 43 4b 53 55 4d 32 5d 3b 0a 20 20 70 4c 6f 67 2d  CKSUM2];.  pLog-
9340: 3e 69 53 6e 61 70 73 68 6f 74 49 64 20 3d 20 6c  >iSnapshotId = l
9350: 73 6d 43 68 65 63 6b 70 6f 69 6e 74 49 64 28 61  smCheckpointId(a
9360: 43 6b 70 74 2c 20 30 29 3b 0a 7d 0a 0a 76 6f 69  Ckpt, 0);.}..voi
9370: 64 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 5a  d lsmCheckpointZ
9380: 65 72 6f 4c 6f 67 6f 66 66 73 65 74 28 6c 73 6d  eroLogoffset(lsm
9390: 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 75 33 32  _db *pDb){.  u32
93a0: 20 6e 43 6b 70 74 3b 0a 0a 20 20 6e 43 6b 70 74   nCkpt;..  nCkpt
93b0: 20 3d 20 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f   = pDb->aSnapsho
93c0: 74 5b 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50 54  t[CKPT_HDR_NCKPT
93d0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6b  ];.  assert( nCk
93e0: 70 74 3e 43 4b 50 54 5f 48 44 52 5f 4e 43 4b 50  pt>CKPT_HDR_NCKP
93f0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  T );.  assert( n
9400: 43 6b 70 74 3d 3d 70 44 62 2d 3e 70 53 68 6d 68  Ckpt==pDb->pShmh
9410: 64 72 2d 3e 61 53 6e 61 70 31 5b 43 4b 50 54 5f  dr->aSnap1[CKPT_
9420: 48 44 52 5f 4e 43 4b 50 54 5d 20 29 3b 0a 20 20  HDR_NCKPT] );.  
9430: 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d  assert( 0==memcm
9440: 70 28 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74  p(pDb->aSnapshot
9450: 2c 20 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e  , pDb->pShmhdr->
9460: 61 53 6e 61 70 31 2c 20 6e 43 6b 70 74 2a 73 69  aSnap1, nCkpt*si
9470: 7a 65 6f 66 28 75 33 32 29 29 20 29 3b 0a 20 20  zeof(u32)) );.  
9480: 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d  assert( 0==memcm
9490: 70 28 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74  p(pDb->aSnapshot
94a0: 2c 20 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e  , pDb->pShmhdr->
94b0: 61 53 6e 61 70 32 2c 20 6e 43 6b 70 74 2a 73 69  aSnap2, nCkpt*si
94c0: 7a 65 6f 66 28 75 33 32 29 29 20 29 3b 0a 0a 20  zeof(u32)) );.. 
94d0: 20 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74 5b   pDb->aSnapshot[
94e0: 43 4b 50 54 5f 48 44 52 5f 4c 4f 5f 4d 53 57 5d  CKPT_HDR_LO_MSW]
94f0: 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 61 53 6e   = 0;.  pDb->aSn
9500: 61 70 73 68 6f 74 5b 43 4b 50 54 5f 48 44 52 5f  apshot[CKPT_HDR_
9510: 4c 4f 5f 4c 53 57 5d 20 3d 20 30 3b 0a 20 20 63  LO_LSW] = 0;.  c
9520: 6b 70 74 43 68 65 63 6b 73 75 6d 28 70 44 62 2d  kptChecksum(pDb-
9530: 3e 61 53 6e 61 70 73 68 6f 74 2c 20 6e 43 6b 70  >aSnapshot, nCkp
9540: 74 2c 20 0a 20 20 20 20 20 20 26 70 44 62 2d 3e  t, .      &pDb->
9550: 61 53 6e 61 70 73 68 6f 74 5b 6e 43 6b 70 74 2d  aSnapshot[nCkpt-
9560: 32 5d 2c 20 26 70 44 62 2d 3e 61 53 6e 61 70 73  2], &pDb->aSnaps
9570: 68 6f 74 5b 6e 43 6b 70 74 2d 31 5d 0a 20 20 29  hot[nCkpt-1].  )
9580: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 70 44 62 2d  ;..  memcpy(pDb-
9590: 3e 70 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 31  >pShmhdr->aSnap1
95a0: 2c 20 70 44 62 2d 3e 61 53 6e 61 70 73 68 6f 74  , pDb->aSnapshot
95b0: 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f 66 28 75  , nCkpt*sizeof(u
95c0: 33 32 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  32));.  memcpy(p
95d0: 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e 61 53 6e  Db->pShmhdr->aSn
95e0: 61 70 32 2c 20 70 44 62 2d 3e 61 53 6e 61 70 73  ap2, pDb->aSnaps
95f0: 68 6f 74 2c 20 6e 43 6b 70 74 2a 73 69 7a 65 6f  hot, nCkpt*sizeo
9600: 66 28 75 33 32 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  f(u32));.}../*.*
9610: 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
9620: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
9630: 20 6e 75 6d 62 65 72 20 6f 66 20 4b 42 20 6f 66   number of KB of
9640: 20 64 61 74 61 20 77 72 69 74 74 65 6e 20 69 6e   data written in
9650: 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
9660: 73 65 20 66 69 6c 65 20 73 69 6e 63 65 20 74 68  se file since th
9670: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 68  e most recent ch
9680: 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
9690: 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 53 69   lsmCheckpointSi
96a0: 7a 65 28 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 69  ze(lsm_db *db, i
96b0: 6e 74 20 2a 70 6e 4b 42 29 7b 0a 20 20 69 6e 74  nt *pnKB){.  int
96c0: 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
96d0: 75 33 32 20 6e 53 79 6e 63 65 64 3b 0a 0a 20 20  u32 nSynced;..  
96e0: 2f 2a 20 53 65 74 20 6e 53 79 6e 63 65 64 20 74  /* Set nSynced t
96f0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
9700: 70 61 67 65 73 20 74 68 61 74 20 68 61 64 20 62  pages that had b
9710: 65 65 6e 20 77 72 69 74 74 65 6e 20 77 68 65 6e  een written when
9720: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
9730: 61 73 65 20 77 61 73 20 6c 61 73 74 20 63 68 65  ase was last che
9740: 63 6b 70 6f 69 6e 74 65 64 2e 20 2a 2f 0a 20 20  ckpointed. */.  
9750: 72 63 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f 69  rc = lsmCheckpoi
9760: 6e 74 53 79 6e 63 65 64 28 64 62 2c 20 30 2c 20  ntSynced(db, 0, 
9770: 30 2c 20 26 6e 53 79 6e 63 65 64 29 3b 0a 0a 20  0, &nSynced);.. 
9780: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
9790: 29 7b 0a 20 20 20 20 75 33 32 20 6e 50 67 73 7a  ){.    u32 nPgsz
97a0: 20 3d 20 64 62 2d 3e 70 53 68 6d 68 64 72 2d 3e   = db->pShmhdr->
97b0: 61 53 6e 61 70 31 5b 43 4b 50 54 5f 48 44 52 5f  aSnap1[CKPT_HDR_
97c0: 50 47 53 5a 5d 3b 0a 20 20 20 20 75 33 32 20 6e  PGSZ];.    u32 n
97d0: 57 72 69 74 65 20 3d 20 64 62 2d 3e 70 53 68 6d  Write = db->pShm
97e0: 68 64 72 2d 3e 61 53 6e 61 70 31 5b 43 4b 50 54  hdr->aSnap1[CKPT
97f0: 5f 48 44 52 5f 4e 57 52 49 54 45 5d 3b 0a 20 20  _HDR_NWRITE];.  
9800: 20 20 2a 70 6e 4b 42 20 3d 20 28 69 6e 74 29 28    *pnKB = (int)(
9810: 28 20 28 28 69 36 34 29 28 6e 57 72 69 74 65 20  ( ((i64)(nWrite 
9820: 2d 20 6e 53 79 6e 63 65 64 29 20 2a 20 6e 50 67  - nSynced) * nPg
9830: 73 7a 29 20 2b 20 31 30 32 33 29 20 2f 20 31 30  sz) + 1023) / 10
9840: 32 34 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  24);.  }..  retu
9850: 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.