/ Hex Artifact Content
Login

Artifact d0c1f41b41d2b56a6fd0e1308a66518872f68ed5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 38  : pager.c,v 1.18
0350: 38 20 32 30 30 35 2f 30 32 2f 30 36 20 30 32 3a  8 2005/02/06 02:
0360: 34 35 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  45:42 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0380: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0390: 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75  de "os.h".#inclu
03a0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 54 52  #if 0.#define TR
0420: 41 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71  ACE1(X)       sq
0430: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0440: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
0450: 45 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69  E2(X,Y)     sqli
0460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0470: 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,Y).#define TRAC
0480: 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69  E3(X,Y,Z)   sqli
0490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
04a0: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52  ,Y,Z).#define TR
04b0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71  ACE4(X,Y,Z,W) sq
04c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
04d0: 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e  (X,Y,Z,W).#defin
04e0: 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57  e TRACE5(X,Y,Z,W
04f0: 2c 56 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,V) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56  Printf(X,Y,Z,W,V
0510: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
0520: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0530: 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  e TRACE2(X,Y).#d
0540: 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59  efine TRACE3(X,Y
0550: 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,Z).#define TRAC
0560: 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66  E4(X,Y,Z,W).#def
0570: 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a  ine TRACE5(X,Y,Z
0580: 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,W,V).#endif../*
0590: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
05a0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
05b0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
05c0: 20 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f 73   TRACEX() macros
05d0: 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69   above.** to pri
05e0: 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73 63  nt out file-desc
05f0: 72 69 70 74 6f 72 73 2e 20 54 68 65 79 20 61 72  riptors. They ar
0600: 65 20 72 65 71 75 69 72 65 64 20 73 6f 20 74 68  e required so th
0610: 61 74 20 74 72 61 63 69 6e 67 0a 2a 2a 20 63 61  at tracing.** ca
0620: 6e 20 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 77  n be turned on w
0630: 68 65 6e 20 75 73 69 6e 67 20 62 6f 74 68 20 74  hen using both t
0640: 68 65 20 72 65 67 75 6c 61 72 20 6f 73 5f 75 6e  he regular os_un
0650: 69 78 2e 63 20 61 6e 64 20 6f 73 5f 74 65 73 74  ix.c and os_test
0660: 2e 63 0a 2a 2a 20 62 61 63 6b 65 6e 64 73 2e 0a  .c.** backends..
0670: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
0680: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0690: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
06a0: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
06b0: 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63  nt. The.** assoc
06c0: 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72  iated file-descr
06d0: 69 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65  iptor is returne
06e0: 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  d. FILEHANDLEID(
06f0: 29 20 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c  ) takes an OsFil
0700: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
0710: 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  t's argument..*/
0720: 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a  .#ifdef OS_TEST.
0730: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0740: 70 29 20 28 70 2d 3e 66 64 2d 3e 66 64 2e 68 29  p) (p->fd->fd.h)
0750: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0760: 44 4c 45 49 44 28 66 64 29 20 28 66 64 2d 3e 66  DLEID(fd) (fd->f
0770: 64 2e 68 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  d.h).#else.#defi
0780: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70  ne PAGERID(p) (p
0790: 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65 20  ->fd.h).#define 
07a0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
07b0: 20 28 66 64 2e 68 29 0a 23 65 6e 64 69 66 0a 0a   (fd.h).#endif..
07c0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  /*.** The page c
07d0: 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20  ache as a whole 
07e0: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65  is always in one
07f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0800: 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  g.** states:.**.
0810: 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43  **   PAGER_UNLOC
0820: 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  K        The pag
0830: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63  e cache is not c
0840: 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67  urrently reading
0850: 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   or .**         
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
0870: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0880: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20  se file.  There 
0890: 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  is no.**        
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
08b0: 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  ata held in memo
08c0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ry.  This is the
08d0: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20   initial.**     
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
0900: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
0910: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0920: 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74  che is reading t
0930: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73        Writing is
0960: 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
0970: 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   There can be.**
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
09a0: 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e  readers accessin
09b0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
09c0: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
09e0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
09f0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  me..**.**   PAGE
0a00: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20  R_RESERVED      
0a10: 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73  This process has
0a20: 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61   reserved the da
0a30: 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69  tabase for writi
0a40: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
0a60: 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  has not yet made
0a70: 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f   any changes.  O
0a80: 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a  nly one process.
0a90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0aa0: 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69           at a ti
0ab0: 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74  me can reserve t
0ac0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
0ad0: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b00: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
0b10: 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72  odified so other
0b20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b30: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0b40: 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  ses may still be
0b50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d   reading the on-
0b60: 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  disk.**         
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0b80: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
0b90: 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55  **   PAGER_EXCLU
0ba0: 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67  SIVE     The pag
0bb0: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0bc0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0bd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0be0: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0bf0: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0c00: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0c10: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0c30: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0c50: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0c80: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  riting..**.**   
0c90: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
0ca0: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f      The pager mo
0cb0: 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74  ves to this stat
0cc0: 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43  e from PAGER_EXC
0cd0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20  LUSIVE.**       
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20  after all dirty 
0d00: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0d10: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
0d20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d30: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0d40: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
0d50: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
0d60: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0d80: 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65  isk. All that re
0d90: 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74  mains to do is t
0da0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20  o remove the.** 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
0dd0: 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  le and the trans
0de0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  action will be.*
0df0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0e00: 20 20 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65          committe
0e10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  d..**.** The pag
0e20: 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70  e cache comes up
0e30: 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
0e40: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0e50: 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  e a.** sqlite3pa
0e60: 67 65 72 5f 67 65 74 28 29 20 6f 63 63 75 72 73  ger_get() occurs
0e70: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0e80: 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52  sitions to PAGER
0e90: 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65  _SHARED..** Afte
0ea0: 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  r all pages have
0eb0: 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75   been released u
0ec0: 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65  sing sqlite_page
0ed0: 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65  _unref(),.** the
0ee0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ef0: 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ns back to PAGER
0f00: 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69  _UNLOCK.  The fi
0f10: 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74  rst time.** that
0f20: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
0f30: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0f40: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f50: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f60: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f70: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f  ote that sqlite_
0f80: 70 61 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e  page_write() can
0f90: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0fa0: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0fb0: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0fc0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0fd0: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0fe0: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0ff0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
1000: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
1010: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65  ESERVED.).** The
1020: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1030: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1040: 63 63 75 72 73 20 77 68 65 6e 20 62 65 66 6f 72  ccurs when befor
1050: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a  e any changes.**
1060: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1070: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1080: 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65   After an sqlite
1090: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
10a0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70  ).** or sqlite_p
10b0: 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74  ager_commit(), t
10c0: 68 65 20 73 74 61 74 65 20 67 6f 65 73 20 62 61  he state goes ba
10d0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
10e0: 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ED..*/.#define P
10f0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20  AGER_UNLOCK     
1100: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
1110: 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20  _SHARED      1  
1120: 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52   /* same as SHAR
1130: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1140: 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ne PAGER_RESERVE
1150: 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65  D    2   /* same
1160: 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   as RESERVED_LOC
1170: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1180: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34  ER_EXCLUSIVE   4
1190: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58     /* same as EX
11a0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a  CLUSIVE_LOCK */.
11b0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59  #define PAGER_SY
11c0: 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a  NCED      5../*.
11d0: 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
11e0: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
11f0: 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74  OCK macro is set
1200: 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70   to true at comp
1210: 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65  ile-time,.** the
1220: 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74  n failed attempt
1230: 73 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72  s to get a reser
1240: 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e  ved lock will in
1250: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
1260: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  llback..** This 
1270: 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c  is off by defaul
1280: 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20  t.  To see why, 
1290: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
12a0: 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
12b0: 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20  .** .** Suppose 
12c0: 74 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79  thread A already
12d0: 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
12e0: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72  ck and wants a r
12f0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a  eserved lock..**
1300: 20 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64   Thread B alread
1310: 79 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  y has a reserved
1320: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1330: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1340: 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74  k.  If.** both t
1350: 68 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67  hreads are using
1360: 20 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c   their busy call
1370: 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20  backs, it might 
1380: 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a  be a long time.*
1390: 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  * be for one of 
13a0: 74 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65  the threads give
13b0: 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74   up and allows t
13c0: 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63  he other to proc
13d0: 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  eed..** But if t
13e0: 68 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67  he thread trying
13f0: 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65   to get the rese
1400: 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20  rved lock gives 
1410: 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69  up quickly.** (i
1420: 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b  f it never invok
1430: 65 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c  es its busy call
1440: 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63  back) then the c
1450: 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62  ontention will b
1460: 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75  e.** resolved qu
1470: 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ickly..*/.#ifnde
1480: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  f SQLITE_BUSY_RE
1490: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65  SERVED_LOCK.# de
14a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59  fine SQLITE_BUSY
14b0: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30  _RESERVED_LOCK 0
14c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
14d0: 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73  his macro rounds
14e0: 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68   values up so th
14f0: 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  at if the value 
1500: 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74  is an address it
1510: 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65  .** is guarantee
1520: 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65  d to be an addre
1530: 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e  ss that is align
1540: 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20  ed to an 8-byte 
1550: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65  boundary..*/.#de
1560: 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e  fine FORCE_ALIGN
1570: 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b  MENT(X)   (((X)+
1580: 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61  7)&~7)../*.** Ea
1590: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61  ch in-memory ima
15a0: 67 65 20 6f 66 20 61 20 70 61 67 65 20 62 65 67  ge of a page beg
15b0: 69 6e 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c  ins with the fol
15c0: 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a  lowing header..*
15d0: 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 69 73  * This header is
15e0: 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f   only visible to
15f0: 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75   this pager modu
1600: 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a  le.  The client.
1610: 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c  ** code that cal
1620: 6c 73 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e  ls pager sees on
1630: 6c 79 20 74 68 65 20 64 61 74 61 20 74 68 61 74  ly the data that
1640: 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61   follows the hea
1650: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e  der..**.** Clien
1660: 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61  t code should ca
1670: 6c 6c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ll sqlite3pager_
1680: 77 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67  write() on a pag
1690: 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e  e prior to makin
16a0: 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63  g.** any modific
16b0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70  ations to that p
16c0: 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  age.  The first 
16d0: 74 69 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65  time sqlite3page
16e0: 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20  r_write().** is 
16f0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67  called, the orig
1700: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
1710: 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
1720: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
1730: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
1740: 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20  PgHdr.inJournal 
1750: 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79  and PgHdr.needSy
1760: 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74  nc are set.  Lat
1770: 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  er, once.** the 
1780: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73  journal page has
1790: 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68   made it onto th
17a0: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20  e disk surface, 
17b0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a  PgHdr.needSync.*
17c0: 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54  * is cleared.  T
17d0: 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65  he modified page
17e0: 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74   cannot be writt
17f0: 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
1800: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
1810: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
1820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
1830: 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  es has been sync
1840: 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74  ed to disk and t
1850: 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64  he.** PgHdr.need
1860: 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c  Sync has been cl
1870: 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eared..**.** The
1880: 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61   PgHdr.dirty fla
1890: 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71  g is set when sq
18a0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
18b0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
18c0: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
18d0: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
18e0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
18f0: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1900: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1910: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1920: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1930: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
1940: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
1950: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1970: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
1980: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
1990: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
19a0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
19b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
19c0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
19d0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
19e0: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
19f0: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
1a00: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
1a10: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
1a20: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
1a30: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
1a40: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
1a50: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
1a60: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
1a70: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a90: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
1aa0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1ab0: 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50   *pNextStmt, *pP
1ac0: 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73  revStmt;  /* Lis
1ad0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1af0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  nal */.  u8 inJo
1b00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1b20: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
1b30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
1b40: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
1b70: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1b80: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  ubjournal */.  u
1b90: 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20  8 dirty;        
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb0: 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64   TRUE if we need
1bc0: 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63   to write back c
1bd0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e  hanges */.  u8 n
1be0: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
1c00: 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  nc journal befor
1c10: 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70  e writing this p
1c20: 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  age */.  u8 alwa
1c30: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
1c40: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1c50: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1c60: 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  () for this page
1c70: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20   */.  short int 
1c80: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1c90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ca0: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1cb0: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1cc0: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
1cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 74           /* Dirt
1ce0: 79 20 70 61 67 65 73 20 73 6f 72 74 65 64 20 62  y pages sorted b
1cf0: 79 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  y PgHdr.pgno */.
1d00: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 73 41    /* pPager->psA
1d10: 6c 69 67 6e 65 64 20 62 79 74 65 73 20 6f 66 20  ligned bytes of 
1d20: 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77  page data follow
1d30: 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a   this header */.
1d40: 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72    /* Pager.nExtr
1d50: 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c  a bytes of local
1d60: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65   data follow the
1d70: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
1d80: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
1d90: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
1da0: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
1db0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1dc0: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
1dd0: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
1de0: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
1df0: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1e00: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
1e10: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
1e20: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
1e30: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
1e40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
1e50: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
1e60: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
1e70: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
1e80: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
1e90: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
1ea0: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
1eb0: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
1ec0: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
1ed0: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
1ee0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
1ef0: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
1f00: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
1f10: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
1f20: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
1f30: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
1f40: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
1f50: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
1f60: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
1f70: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
1f80: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
1f90: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
1fa0: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
1fb0: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
1fc0: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
1fd0: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
1fe0: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
1ff0: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
2000: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
2010: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
2020: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
2030: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
2040: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
2050: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
2060: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2070: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
2080: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d  t statement */.}
2090: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f  ;../*.** A macro
20a0: 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69   used for invoki
20b0: 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20  ng the codec if 
20c0: 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a  there is one.*/.
20d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
20e0: 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65  S_CODEC.# define
20f0: 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20   CODEC(P,D,N,X) 
2100: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b  if( P->xCodec ){
2110: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
2120: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
2130: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
2140: 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a   CODEC(P,D,N,X).
2150: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
2160: 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20  nvert a pointer 
2170: 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20  to a PgHdr into 
2180: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73  a pointer to its
2190: 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63   data.** and bac
21a0: 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66  k again..*/.#def
21b0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ine PGHDR_TO_DAT
21c0: 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26  A(P)  ((void*)(&
21d0: 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65  (P)[1])).#define
21e0: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44   DATA_TO_PGHDR(D
21f0: 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44  )  (&((PgHdr*)(D
2200: 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20  ))[-1]).#define 
2210: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47  PGHDR_TO_EXTRA(G
2220: 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63  ,P) ((void*)&((c
2230: 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b  har*)(&(G)[1]))[
2240: 28 50 29 2d 3e 70 73 41 6c 69 67 6e 65 64 5d 29  (P)->psAligned])
2250: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2260: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
2270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
2280: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
2290: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
22a0: 47 52 29 2d 3e 70 73 41 6c 69 67 6e 65 64 2b 28  GR)->psAligned+(
22b0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
22c0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
22d0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22e0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
22f0: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
2300: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
2310: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65  e number..*/.#de
2320: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32  fine N_PG_HASH 2
2330: 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  048../*.** Hash 
2340: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
2350: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
2360: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2370: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2380: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2390: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
23a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
23b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
23c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
23d0: 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  r {.  char *zFil
23e0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
23f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2400: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2410: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
2420: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2430: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
2440: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
2450: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
2460: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
2470: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
2480: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
2490: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f  nal files */.  O
24a0: 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20  sFile fd, jfd;  
24b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
24c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
24d0: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
24e0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46  journal */.  OsF
24f0: 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20  ile stfd;       
2500: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2510: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2520: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2530: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  bjournal*/.  int
2540: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2550: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2560: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2570: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2580: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2590: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
25a0: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
25b0: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
25c0: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
25f0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2600: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2610: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2630: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
2640: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
2650: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2680: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
2690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
26a0: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c0: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
26d0: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
26e0: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
26f0: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2710: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
2720: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
2730: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
2740: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
2750: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
2760: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
2770: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2780: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
2790: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
27a0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
27b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
27c0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
27d0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
27e0: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
27f0: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
2800: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
2810: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
2820: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2840: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2850: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2860: 20 20 69 6e 74 20 70 73 41 6c 69 67 6e 65 64 3b    int psAligned;
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 70 61 67 65 53 69 7a 65 20 72 6f 75 6e 64 65   pageSize rounde
2890: 64 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69 70  d up to a multip
28a0: 6c 65 20 6f 66 20 38 20 2a 2f 0a 20 20 69 6e 74  le of 8 */.  int
28b0: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
28d0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
28e0: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
28f0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2910: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2920: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2930: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2940: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2960: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2970: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2980: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
2990: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
29a0: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
29b0: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
29c0: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
29d0: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
29e0: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
29f0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2a00: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
2a10: 74 65 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ten */.  void (*
2a20: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
2a30: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
2a40: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
2a50: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
2a60: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
2a70: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
2a80: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
2a90: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
2aa0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2ab0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2ac0: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2ad0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2ae0: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
2af0: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
2b00: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
2b10: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
2b20: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
2b30: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
2b40: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2b50: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2b60: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2b70: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2b80: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ba0: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2bb0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2bc0: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2bd0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2be0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2bf0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2c00: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
2c10: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
2c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c30: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
2c40: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2c50: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2c60: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2c70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2c80: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2c90: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2ca0: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2cb0: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cd0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2ce0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
2cf0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
2d00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2d10: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
2d20: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
2d30: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
2d40: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d60: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2d70: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2d80: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2d90: 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20  .  u8 errMask;  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2db0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2dc0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2dd0: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2de0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2df0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2e00: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2e10: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
2e20: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
2e30: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2e40: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2e50: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2e60: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2e70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e80: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2e90: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2ea0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2eb0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2ec0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ed0: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2ee0: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2ef0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2f00: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2f10: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
2f20: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
2f30: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
2f40: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2f50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2f60: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2f70: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61  e I/O */.  u8 *a
2f80: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
2f90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
2fa0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
2fb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2fc0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
2fd0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
2fe0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2ff0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3000: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
3010: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3030: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3040: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3050: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3060: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
3070: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
3080: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
3090: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
30a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
30b0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
30c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
30d0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
30e0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
30f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3100: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3110: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3120: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3130: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3140: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3150: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3160: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
3170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3180: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
3190: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
31a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
31b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
31c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
31d0: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
31e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
31f0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
3200: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
3210: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
3220: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
3230: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
3240: 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66  .  i64 stmtHdrOf
3250: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3260: 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  * First journal 
3270: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74  header written t
3280: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
3290: 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d  .  i64 stmtCksum
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32b0: 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e  * cksumInit when
32c0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
32d0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tarted */.  int 
32e0: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3300: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3310: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
3320: 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68  /.  PgHdr *aHash
3330: 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20  [N_PG_HASH];    
3340: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
3350: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3360: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a   to PgHdr */.};.
3370: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
3380: 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62   bits that can b
3390: 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65  e set in Pager.e
33a0: 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69  rrMask..*/.#defi
33b0: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  ne PAGER_ERR_FUL
33c0: 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61  L     0x01  /* a
33d0: 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20   write() failed 
33e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
33f0: 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78  _ERR_MEM      0x
3400: 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20  02  /* malloc() 
3410: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
3420: 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  e PAGER_ERR_LOCK
3430: 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72       0x04  /* er
3440: 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ror in the locki
3450: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23  ng protocol */.#
3460: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3470: 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20  _CORRUPT  0x08  
3480: 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a  /* database or j
3490: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
34a0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  n */.#define PAG
34b0: 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20  ER_ERR_DISK     
34c0: 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c  0x10  /* general
34d0: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
34e0: 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65  - bad hard drive
34f0: 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  ? */../*.** Jour
3500: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
3510: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
3520: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
3530: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
3540: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3550: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
3560: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
3570: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
3580: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
3590: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
35a0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
35b0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
35c0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
35d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
35e0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
35f0: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
3600: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
3610: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
3620: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
3630: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
3640: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
3650: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
3660: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
3670: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
3680: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
3690: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
36a0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
36b0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
36c0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
36d0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
36e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
36f0: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
3700: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
3710: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
3720: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
3730: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
3740: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
3750: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3760: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
3770: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3780: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
3790: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
37a0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
37b0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
37c0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
37d0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
37e0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
37f0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3800: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3810: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3820: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
3830: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
3840: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
3850: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
3860: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
3870: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
3880: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
3890: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
38a0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
38b0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
38c0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
38d0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
38e0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
38f0: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3900: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3910: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3920: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3930: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3940: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3950: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3960: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3970: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3980: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3990: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
39a0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
39b0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
39c0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
39d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
39e0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
39f0: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3a00: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3a10: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3a20: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3a30: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
3a40: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
3a50: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3a60: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
3a70: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
3a80: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3a90: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ab0: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3ad0: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3ae0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3af0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3b00: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3b10: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3b20: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
3b30: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
3b40: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
3b50: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
3b60: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
3b70: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
3b80: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3b90: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3ba0: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3bb0: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3bc0: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3bd0: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3bf0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3c00: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3c10: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3c20: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
3c30: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
3c40: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
3c50: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3c60: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
3c70: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
3c80: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3c90: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3ca0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3cb0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3cc0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3cd0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3ce0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3cf0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3d00: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3d10: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
3d30: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
3d40: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
3d50: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
3d60: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
3d70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3d80: 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  e default size o
3d90: 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a  f a disk sector.
3da0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3db0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32  _SECTOR_SIZE 512
3dc0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
3dd0: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
3de0: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
3df0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
3e00: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
3e10: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
3e20: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
3e30: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
3e40: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
3e50: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
3e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3e70: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3e80: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3ea0: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3eb0: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
3ec0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
3ed0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
3ee0: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
3ef0: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
3f00: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
3f10: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
3f20: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
3f30: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
3f40: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3f50: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
3f60: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3f70: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
3f80: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
3f90: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
3fa0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
3fb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
3fc0: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
3fd0: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
3fe0: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
3ff0: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
4000: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
4010: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
4020: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
4030: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
4040: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
4050: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4060: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
4070: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
4080: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
4090: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
40a0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
40b0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
40c0: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
40d0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
40e0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
40f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4100: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4110: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4120: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4130: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4140: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4150: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
4160: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
4170: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
4180: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
4190: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
41a0: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
41b0: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
41c0: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
41d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
41e0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
41f0: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
4200: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
4210: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
4220: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
4230: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
4240: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4250: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
4260: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
4270: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
4280: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
4290: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
42a0: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
42b0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
42c0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
42d0: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
42e0: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
42f0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
4300: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
4310: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
4320: 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69  ead(fd, &res, si
4330: 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66  zeof(res));.  if
4340: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4350: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
4360: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20  char ac[4];.    
4370: 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c  memcpy(ac, &res,
4380: 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28   4);.    res = (
4390: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
43a0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
43b0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20  ]<<8) | ac[3];. 
43c0: 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73   }.  *pRes = res
43d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
43e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
43f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4400: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4410: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4420: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4430: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4440: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4450: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4460: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4470: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4480: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4490: 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67  32 val){.  unsig
44a0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
44b0: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
44c0: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
44d0: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
44e0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
44f0: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4500: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4510: 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72   & 0xff;.  retur
4520: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4530: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4540: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
4550: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27  32-bit integer '
4560: 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61  val' into the pa
4570: 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
4580: 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20   page header.** 
4590: 27 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f  'p' at offset 'o
45a0: 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69  ffset'..*/.stati
45b0: 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69  c void store32bi
45c0: 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64  ts(u32 val, PgHd
45d0: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
45e0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
45f0: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4600: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4610: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4620: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63  ))[offset];.  ac
4630: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
4640: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
4650: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
4660: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
4670: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
4680: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
4690: 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  xff;.}../*.** Re
46a0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
46b0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
46c0: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
46d0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
46e0: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
46f0: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4700: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4710: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4720: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4730: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4740: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4750: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4760: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4770: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
4780: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4790: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
47a0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
47b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
47c0: 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70  he bits in the p
47d0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69  Pager->errMask i
47e0: 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74  nto an approprat
47f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65  e.** return code
4800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4810: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61  pager_errcode(Pa
4820: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
4830: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4840: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
4850: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4860: 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20  R_ERR_LOCK )    
4870: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
4880: 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  OCOL;.  if( pPag
4890: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
48a0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20  GER_ERR_DISK )  
48b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
48c0: 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ERR;.  if( pPage
48d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
48e0: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20  ER_ERR_FULL )   
48f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
4900: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
4910: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4920: 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72  _ERR_MEM )     r
4930: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4940: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4950: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4960: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
4970: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4980: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
4990: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
49a0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
49b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
49c0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
49d0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
49e0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
49f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4a00: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  read from the en
4a10: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
4a20: 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  d .** written in
4a30: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4a40: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4a50: 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65  lloc(). *pzMaste
4a60: 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70  r is.** set to p
4a70: 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f  oint at the memo
4a80: 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
4a90: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
4aa0: 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71  aller must.** sq
4ab0: 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61  liteFree() *pzMa
4ac0: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ster..**.** If n
4ad0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
4ae0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
4af0: 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20  esent *pzMaster 
4b00: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
4b10: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
4b20: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
4b30: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
4b40: 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70  ournal(OsFile *p
4b50: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d  Jrnl, char **pzM
4b60: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
4b70: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
4b80: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
4b90: 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sum;.  int i;.  
4ba0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
4bb0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
4bc0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
4bd0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
4be0: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
4bf0: 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0;..  rc = sqlit
4c00: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
4c10: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
4c20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
4c30: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
4c40: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
4c50: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
4c60: 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66  l, szJ-16);.  if
4c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4c80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20  ) return rc;. . 
4c90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
4ca0: 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20  (pJrnl, &len);. 
4cb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4cc0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4cd0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
4ce0: 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d  ts(pJrnl, &cksum
4cf0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4d00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
4d10: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
4d20: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
4d30: 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69   aMagic, 8);.  i
4d40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4d50: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
4d60: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
4d70: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
4d80: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4d90: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
4da0: 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66  zJ-16-len);.  if
4db0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4dc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
4dd0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61  *pzMaster = (cha
4de0: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
4df0: 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21  (len+1);.  if( !
4e00: 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  *pzMaster ){.   
4e10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4e20: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
4e30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
4e40: 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c  Jrnl, *pzMaster,
4e50: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
4e60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4e70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
4e80: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
4e90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
4ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
4eb0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
4ec0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
4ed0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
4ee0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
4ef0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
4f00: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
4f10: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b   (*pzMaster)[i];
4f20: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
4f30: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
4f40: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
4f50: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
4f60: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
4f70: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
4f80: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
4f90: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
4fa0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
4fb0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
4fc0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
4fd0: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
4fe0: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
4ff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
5000: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
5010: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
5020: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
5030: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5040: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
5050: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5060: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
5070: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
5080: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  n] = '\0';.  }. 
5090: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
50a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
50b0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
50c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
50d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
50e0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
50f0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
5100: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
5110: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
5120: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
5130: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
5140: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
5150: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
5160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
5170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
5180: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
51a0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5230: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
5260: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f  tatic int seekJo
5270: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
5280: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
5290: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
52a0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
52b0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
52c0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
52d0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
52e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
52f0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
5300: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
5310: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
5320: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
5330: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
5340: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5350: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
5360: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
5370: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5380: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
5390: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
53a0: 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  set;.  return sq
53b0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
53c0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
53d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
53e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
53f0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
5400: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
5410: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5420: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
5430: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
5440: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
5450: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
5460: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5470: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
5480: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
5490: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
54a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
54b0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
54c0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
54d0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
54e0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
54f0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5500: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
5510: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
5520: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
5530: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
5540: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
5550: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
5560: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
5570: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
5580: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
5590: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
55a0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
55b0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
55c0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
55d0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
55e0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
55f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
5600: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
5610: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
5620: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
5630: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5640: 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72  Pager){..  int r
5650: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
5660: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
5670: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5680: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
5690: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
56a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
56b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
56c0: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
56d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
56e0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
56f0: 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20  urnalHdr;.  }.  
5700: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5710: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
5720: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
5730: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a   /* FIX ME: .  *
5740: 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  *.  ** Possibly 
5750: 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20  for a pager not 
5760: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
5770: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67   the journal mag
5780: 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20  ic should not.  
5790: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e  ** be written un
57a0: 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c  til nRec is fill
57b0: 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66  ed in as part of
57c0: 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61   next syncJourna
57d0: 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l(). .  **.  ** 
57e0: 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74  Actually maybe t
57f0: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
5800: 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62   header should b
5810: 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  e delayed until 
5820: 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e  that.  ** point.
5830: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
5840: 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
5850: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
5860: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
5870: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
5880: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
5890: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
58a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
58b0: 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64  * The nRec Field
58c0: 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72  . 0xFFFFFFFF for
58d0: 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c   no-sync journal
58e0: 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  s. */.    rc = w
58f0: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
5900: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5910: 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
5920: 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
5930: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5940: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
5950: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
5960: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
5970: 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61  / .    sqlite3Ra
5980: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
5990: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
59a0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
59b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20  umInit);.    rc 
59c0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
59d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
59e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
59f0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
5a10: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
5a20: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
5a30: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
5a40: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5a50: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
5a60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
5a70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5a80: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
5a90: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
5aa0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
5ab0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5ac0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5ad0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  fd, pPager->sect
5ae0: 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  orSize);.  }..  
5af0: 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  /* The journal h
5b00: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77  eader has been w
5b10: 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75  ritten successfu
5b20: 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f  lly. Seek the jo
5b30: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
5b40: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
5b50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5b60: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
5b70: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  or..  */.  if( r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
5ba0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5bb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5bc0: 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20  ff-1);.    rc = 
5bd0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
5be0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
5bf0: 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  00", 1);.  }.  r
5c00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5c10: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5c20: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5c30: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
5c40: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
5c50: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
5c60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5c70: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
5c80: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
5c90: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
5ca0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
5cb0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
5cc0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
5cd0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
5ce0: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5cf0: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
5d00: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
5d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
5d20: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
5d30: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
5d40: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
5d50: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
5d60: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
5d70: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
5d80: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
5d90: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
5da0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5db0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
5dc0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
5dd0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
5de0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5df0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
5e00: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5e10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
5e20: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
5e30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
5e40: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
5e50: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
5e60: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
5e70: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
5e80: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
5e90: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
5ea0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
5eb0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
5ec0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
5ed0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
5ee0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
5ef0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
5f00: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
5f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5f30: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
5f40: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
5f50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
5f60: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
5f70: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
5f80: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
5f90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5fa0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
5fb0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
5fc0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
5fd0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
5fe0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
5ff0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6000: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6010: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6020: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6030: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6040: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6060: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6070: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
6080: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6090: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
60a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
60b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
60c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
60d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
60e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
60f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6100: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6110: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6120: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6130: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
6140: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6150: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6160: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6170: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6180: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
6190: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
61a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
61b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53  Pager->jfd, pDbS
61c0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
61d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
61e0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
61f0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
6200: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
6210: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
6220: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
6230: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
6240: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
6250: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
6260: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
6270: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
6280: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
6290: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
62a0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
62b0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
62c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
62d0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
62e0: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
62f0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
6300: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
6310: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
6320: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
6330: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
6340: 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70  ->jfd, (u32 *)&p
6350: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6360: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
6370: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61  eturn rc;..  pPa
6380: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6390: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
63a0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  Z(pPager);.  rc 
63b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
63c0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
63d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
63e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
63f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
6400: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
6410: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6420: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6430: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
6440: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
6450: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6460: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
6470: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
6480: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
6490: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
64a0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
64b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
64c0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
64d0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
64e0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
64f0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
6500: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
6510: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
6520: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
6530: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
6540: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
6550: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
6560: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
6570: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
6580: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6590: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
65a0: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
65b0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
65c0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
65d0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
65e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
65f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
6600: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
6610: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
6620: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
6630: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
6640: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
6650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6660: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6690: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
66a0: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
66b0: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
66c0: 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a   = 0; ..  if( !z
66d0: 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72  Master || pPager
66e0: 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74  ->setMaster) ret
66f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6700: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6710: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
6720: 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29   strlen(zMaster)
6730: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
6740: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
6750: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
6760: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
6770: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
6780: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
6790: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
67a0: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
67b0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
67c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
67d0: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
67e0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
67f0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
6800: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
6810: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
6820: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
6830: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
6840: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
6850: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6860: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
6870: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6880: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6890: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
68a0: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
68b0: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
68c0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
68d0: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
68e0: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
68f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6900: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6910: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6920: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
6930: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
6940: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6950: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
6960: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
6970: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6980: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
6990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
69a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
69b0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
69c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d  ager->jfd, cksum
69d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
69e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
69f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6a00: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
6a10: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
6a20: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6a30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
6a40: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
6a50: 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  nc = 1;.  return
6a60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
6a70: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
6a80: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
6a90: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
6aa0: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
6ab0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6ac0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
6ad0: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
6ae0: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
6af0: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
6b00: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
6b10: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
6b20: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
6b30: 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
6b40: 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a  stmt_commit().**
6b50: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
6b60: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
6b70: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
6b80: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
6b90: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
6ba0: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
6bb0: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
6bc0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
6bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6be0: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
6bf0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
6c00: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
6c10: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
6c20: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
6c30: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
6c40: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
6c50: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
6c60: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
6c70: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
6c80: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
6c90: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
6ca0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
6cb0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
6cc0: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
6cd0: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
6ce0: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
6cf0: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
6d00: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
6d10: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
6d20: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
6d30: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
6d40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
6d50: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
6d60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
6d70: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
6d80: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6d90: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
6da0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
6db0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
6dc0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
6dd0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
6de0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6df0: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
6e00: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
6e10: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
6e20: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
6e30: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
6e40: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
6e50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
6e60: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
6e70: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
6e80: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
6e90: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
6ea0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
6eb0: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
6ec0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
6ed0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
6ee0: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
6ef0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
6f00: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
6f10: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
6f20: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
6f30: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
6f40: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
6f50: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
6f60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
6f70: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
6f80: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
6f90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
6fa0: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50  .  PgHdr *p = pP
6fb0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65  ager->aHash[page
6fc0: 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20  r_hash(pgno)];. 
6fd0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
6fe0: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
6ff0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
7000: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
7010: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
7020: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7030: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
7040: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
7050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
7060: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
7070: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
7080: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
7090: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
70a0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
70b0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
70c0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
70d0: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
70e0: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
70f0: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
7100: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
7110: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
7120: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
7130: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
7140: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
7150: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
7160: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
7170: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7180: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
7190: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
71a0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
71b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
71c0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
71d0: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
71e0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
71f0: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
7200: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
7210: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
7220: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
7230: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
7240: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
7250: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  ));.  pPager->nP
7260: 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
7270: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
7280: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
7290: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
72a0: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
72b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
72c0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
72d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
72e0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
72f0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7300: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7310: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
7320: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73  >nRef = 0;.  ass
7330: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
7340: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d  rnalOpen==0 );.}
7350: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7360: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7370: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7380: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7390: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
73a0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
73b0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
73c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
73d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
73e0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
73f0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7400: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7410: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7420: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7430: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7440: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7450: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7460: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7480: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
7490: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
74a0: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
74b0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
74c0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
74d0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
74e0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
74f0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
7500: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7510: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
7520: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
7530: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7540: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
7550: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
7560: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7570: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
7580: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
7590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
75a0: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
75b0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
75c0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
75d0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
75e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
75f0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
7600: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
7610: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
7620: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7630: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
7640: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7650: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
7660: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
7670: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
7680: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7690: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
76a0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
76b0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
76c0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
76d0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
76e0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
76f0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7700: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
7710: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
7720: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7730: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7740: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7750: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
7770: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
7780: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
7790: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
77a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
77b0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
77c0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
77d0: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
77e0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
77f0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
7800: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
7810: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7820: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
7830: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
7840: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
7850: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
7860: 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75  ster = 0;.  retu
7870: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7880: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
7890: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
78a0: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
78b0: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
78c0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
78d0: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
78e0: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
78f0: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
7900: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
7910: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
7920: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
7930: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
7940: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
7950: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
7960: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
7970: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
7980: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
7990: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
79a0: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
79b0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
79c0: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
79d0: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
79e0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
79f0: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
7a00: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
7a10: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
7a20: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
7a30: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
7a40: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
7a50: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
7a60: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
7a70: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
7a80: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
7a90: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
7aa0: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
7ab0: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
7ac0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7ad0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
7ae0: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
7af0: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
7b00: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
7b10: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
7b20: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
7b30: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
7b40: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
7b50: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
7b60: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
7b70: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
7b80: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
7b90: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
7ba0: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
7bb0: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
7bc0: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
7bd0: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
7be0: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
7bf0: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
7c00: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
7c10: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
7c20: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
7c30: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
7c40: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
7c50: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
7c60: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
7c70: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
7c80: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
7c90: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
7ca0: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
7cb0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e  , Pgno pgno, con
7cc0: 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b  st char *aData){
7cd0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
7ce0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7cf0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
7d00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
7d10: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
7d20: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
7d30: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
7d40: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
7d50: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
7d60: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
7d70: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
7d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7d90: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
7da0: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
7db0: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
7dc0: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
7dd0: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
7de0: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
7df0: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
7e00: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
7e10: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
7e20: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
7e30: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
7e40: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
7e50: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
7e60: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
7e70: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
7e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7e90: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
7ea0: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
7eb0: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
7ec0: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
7ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
7ee0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7f00: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
7f10: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
7f20: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
7f50: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
7f60: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
7f70: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
7f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
7f90: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
7fa0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
7fb0: 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51  */.  u8 aData[SQ
7fc0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
7fd0: 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74  ZE];  /* Temp st
7fe0: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
7ff0: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   */..  rc = read
8000: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
8010: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
8020: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8030: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
8040: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
8050: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8060: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
8070: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8080: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
80a0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
80b0: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
80c0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
80d0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
80e0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
80f0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
8100: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
8110: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
8120: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
8130: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
8140: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
8150: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
8160: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
8170: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
8180: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8190: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
81a0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
81b0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
81c0: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
81d0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
81e0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
81f0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8200: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8210: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8240: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8250: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8260: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8270: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8280: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8290: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
82a0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
82b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
82c0: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
82d0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
82e0: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
82f0: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
8300: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
8310: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8320: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8330: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
8340: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8350: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8360: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8370: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8380: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8390: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
83a0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
83b0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
83c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
83d0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
83e0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
83f0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
8400: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8410: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
8420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8430: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8440: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
8450: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8460: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8470: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8480: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8490: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
84a0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
84b0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
84c0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
84d0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
84e0: 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   dirty..  */.  p
84f0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
8500: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
8510: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8520: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
8530: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
8540: 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c   );.  TRACE3("PL
8550: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
8560: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
8570: 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20  ager), pgno);.  
8580: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8590: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
85a0: 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  VE ){.    sqlite
85b0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
85c0: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
85d0: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
85e0: 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ize);.    rc = s
85f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
8600: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
8610: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8620: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ze);.  }.  if( p
8630: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
8640: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
8650: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
8660: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
8670: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
8680: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
8690: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
86a0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
86b0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
86c0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
86d0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
86e0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
86f0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
8700: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
8710: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
8720: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
8730: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
8740: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
8750: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
8760: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
8770: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
8780: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
8790: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
87a0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
87b0: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
87c0: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
87d0: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
87e0: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
87f0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
8800: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
8810: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
8820: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
8830: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
8840: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
8850: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
8860: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
8870: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
8880: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
8890: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
88a0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
88b0: 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 50  SIVE ){.      pP
88c0: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
88d0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
88e0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
88f0: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
8900: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
8910: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
8920: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
8930: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
8940: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8950: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
8960: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
8970: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
8980: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
8990: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
89a0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
89b0: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
89c0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
89d0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
89e0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
89f0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
8a00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
8a10: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
8a20: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
8a30: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8a40: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
8a50: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
8a60: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
8a70: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
8a80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8a90: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
8aa0: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
8ab0: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
8ac0: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
8ad0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
8ae0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
8af0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
8b00: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
8b10: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
8b20: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
8b30: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
8b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8b50: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
8b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
8b70: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
8b80: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
8b90: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d   = 0;.  OsFile m
8ba0: 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  aster;.  char *z
8bb0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
8bc0: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
8bd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
8bf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
8c00: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8c10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8c20: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
8c30: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
8c40: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
8c50: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
8c60: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
8c70: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
8c80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
8c90: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
8ca0: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
8cb0: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
8cc0: 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65 72    memset(&master
8cd0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74  , 0, sizeof(mast
8ce0: 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er));.  rc = sql
8cf0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
8d00: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
8d10: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
8d20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
8d30: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8d40: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
8d50: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
8d60: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73  3OsFileSize(&mas
8d70: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
8d80: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
8d90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
8da0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
8db0: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
8dc0: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
8dd0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
8de0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
8df0: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
8e00: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
8e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8e20: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
8e30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
8e40: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
8e50: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
8e60: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
8e70: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
8e80: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
8e90: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
8ea0: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
8eb0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
8ec0: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
8ed0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
8ee0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8ef0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
8f00: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
8f10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8f20: 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d  Read(&master, zM
8f30: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
8f40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
8f50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8f60: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
8f70: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
8f80: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
8f90: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
8fa0: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
8fb0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
8fc0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
8fd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8fe0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8ff0: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
9000: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
9010: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
9020: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
9030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
9040: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
9050: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
9060: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
9070: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
9080: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
9090: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
90a0: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
90b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
90c0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
90d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
90e0: 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  le journal;.    
90f0: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
9100: 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72      memset(&jour
9110: 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a  nal, 0, sizeof(j
9120: 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20  ournal));.      
9130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9140: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
9150: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
9160: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9180: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9190: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
91a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
91b0: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
91c0: 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c  ournal(&journal,
91d0: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
91e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
91f0: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
9200: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9220: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9230: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9240: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
9250: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30   = zMasterPtr!=0
9260: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
9270: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
9280: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
9290: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74  teFree(zMasterPt
92a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
92b0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
92c0: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
92d0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
92e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
92f0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
9300: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9310: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9320: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9330: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
9340: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
9350: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
9360: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
9370: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
9380: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
9390: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
93a0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
93b0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
93c0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
93d0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
93e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
93f0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
9400: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9410: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
9420: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
9430: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
9440: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
9450: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9460: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
9470: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
9480: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9490: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
94a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
94b0: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
94c0: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
94d0: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
94e0: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
94f0: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
9500: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
9510: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
9520: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
9530: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
9540: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
9550: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
9560: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
9570: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
9580: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
9590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
95a0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
95b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95c0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
95d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
95e0: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
95f0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
9600: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
9610: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
9620: 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  Buf[SQLITE_MAX_P
9630: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69  AGE_SIZE];.    i
9640: 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29  f( !pPg->dirty )
9650: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9660: 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
9670: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
9680: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
9690: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
96a0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
96b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
96c0: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
96d0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
96e0: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
96f0: 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
9700: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9710: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
9720: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
9730: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
9740: 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
9750: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
9760: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
9770: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
9780: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
9790: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
97a0: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
97b0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
97c0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
97d0: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
97e0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
97f0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
9800: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
9810: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
9820: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
9830: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
9840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9850: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
9860: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
9870: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
9880: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
9890: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
98a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
98b0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
98c0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
98d0: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
98e0: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
98f0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
9900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9910: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
9920: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
9930: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
9940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9950: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
9960: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
9970: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
9980: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9990: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
99a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
99b0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
99c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
99d0: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72 65 74  nt nPage){.  ret
99e0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75  urn sqlite3OsTru
99f0: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
9a00: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
9a10: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
9a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
9a30: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
9a40: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
9a50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9a60: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
9a70: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
9a80: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
9a90: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
9aa0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
9ab0: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
9ac0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
9ad0: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
9ae0: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
9af0: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
9b00: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
9b10: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
9b20: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
9b30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
9b40: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
9b50: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
9b60: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
9b70: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
9b80: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
9b90: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
9ba0: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
9bb0: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
9bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
9bd0: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
9be0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
9bf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
9c00: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
9c10: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
9c20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
9c30: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
9c40: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
9c50: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9c60: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
9c70: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
9c80: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
9c90: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
9ca0: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
9cb0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
9cc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9cd0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
9ce0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
9cf0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
9d00: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
9d10: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
9d20: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
9d30: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
9d40: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
9d50: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
9d60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9d70: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
9d80: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
9d90: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
9da0: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
9db0: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
9dc0: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
9dd0: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
9de0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
9df0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
9e00: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
9e10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
9e20: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
9e30: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
9e40: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
9e50: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
9e60: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
9e70: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
9e80: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
9e90: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
9ea0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
9eb0: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
9ec0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
9ed0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
9ee0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
9ef0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
9f00: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
9f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9f20: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
9f30: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
9f40: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
9f50: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
9f60: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
9f70: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
9f80: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
9f90: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
9fa0: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
9fb0: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
9fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
9fd0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
9fe0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
9ff0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
a000: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
a010: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
a020: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
a030: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
a040: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
a050: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
a060: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
a070: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
a080: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
a090: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
a0a0: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
a0b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a0c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
a0d0: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
a0e0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
a0f0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
a100: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
a110: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
a120: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
a130: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
a140: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
a150: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
a160: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
a170: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
a180: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
a190: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
a1a0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
a1b0: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
a1c0: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
a1d0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
a1e0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
a1f0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
a200: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
a210: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
a220: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
a230: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
a240: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
a250: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
a260: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
a270: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
a280: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
a290: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
a2a0: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
a2b0: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
a2c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a2d0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
a2e0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
a2f0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
a300: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
a310: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
a320: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
a330: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
a340: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
a350: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
a360: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
a370: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
a380: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
a390: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
a3a0: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
a3b0: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
a3c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
a3d0: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
a3e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
a3f0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
a400: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
a410: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
a420: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
a430: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
a440: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
a450: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
a460: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
a470: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
a480: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
a490: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
a4a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
a4b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
a4c0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
a4d0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
a4e0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a500: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
a510: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
a520: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
a530: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a540: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
a550: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
a560: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
a570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a580: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a590: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
a5a0: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
a5b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a5c0: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
a5d0: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
a5e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a5f0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
a600: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
a610: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
a620: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
a630: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
a640: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a650: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
a660: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
a670: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
a680: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
a690: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
a6a0: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
a6b0: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
a6c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
a6d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
a6e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
a6f0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
a700: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
a710: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
a730: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a740: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
a750: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a760: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
a770: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
a780: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
a790: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
a7a0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
a7b0: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
a7c0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
a7d0: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
a7e0: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
a7f0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
a800: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
a810: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
a820: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
a830: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
a840: 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65 72  rJournal(&pPager
a850: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
a860: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
a870: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
a880: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a890: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
a8a0: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
a8b0: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
a8c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
a8d0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
a8e0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
a8f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a900: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
a910: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
a920: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a930: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
a940: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
a950: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
a960: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
a970: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
a980: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
a990: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
a9a0: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
a9b0: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
a9c0: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
a9d0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
a9e0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
a9f0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
aa00: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
aa10: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
aa20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
aa30: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
aa40: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
aa50: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
aa60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
aa70: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
aa80: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
aa90: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
aaa0: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
aab0: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
aac0: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
aad0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
aae0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
aaf0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
ab00: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
ab10: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
ab20: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
ab30: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
ab40: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
ab50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
ab60: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ab70: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
ab80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ab90: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
aba0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
abb0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
abc0: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
abd0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
abe0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
abf0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
ac00: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
ac10: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
ac20: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
ac30: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
ac40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
ac50: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
ac60: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
ac70: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
ac80: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
ac90: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
aca0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
acb0: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
acc0: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
acd0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
ace0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
acf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ad00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
ad10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ad20: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
ad30: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
ad40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ad50: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
ad60: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
ad70: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ad80: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
ad90: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
ada0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
adb0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
adc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
add0: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
ade0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
adf0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
ae00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
ae10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ae20: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
ae30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
ae40: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
ae50: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ae60: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
ae70: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
ae80: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
ae90: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
aea0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
aeb0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
aec0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
aed0: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
aee0: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
aef0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20     }..    /* rc 
af00: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
af10: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f  &pPager->jfd, JO
af20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
af30: 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ger)); */.    if
af40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
af50: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
af60: 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  ack;.  .    /* C
af70: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
af80: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
af90: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
afa0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
afb0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
afc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
afd0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
afe0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
aff0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
b000: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
b010: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
b020: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
b040: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
b050: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
b060: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b070: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
b080: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
b090: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b0a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b0b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
b0c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
b0d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b0e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
b0f0: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
b100: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
b110: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
b120: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
b130: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
b140: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
b150: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
b160: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
b170: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
b180: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
b190: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
b1a0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
b1b0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
b1c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67  LITE_OK );.  pag
b1d0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
b1e0: 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c  pPager);..end_pl
b1f0: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
b200: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b210: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
b220: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
b230: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
b240: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
b250: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
b260: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
b270: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
b280: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
b290: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
b2a0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b2b0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
b2c0: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
b2d0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
b2e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b2f0: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
b300: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
b310: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b320: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
b330: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
b340: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
b350: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
b360: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
b370: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
b380: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
b390: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
b3a0: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
b3b0: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
b3c0: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
b3d0: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
b3e0: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
b3f0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
b400: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
b410: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
b420: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
b430: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b440: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
b450: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b460: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
b470: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
b480: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
b490: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
b4a0: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
b4b0: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
b4c0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
b4d0: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
b4e0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
b4f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
b500: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
b510: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
b520: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
b530: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
b540: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
b550: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
b560: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
b570: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
b580: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
b590: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
b5a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
b5b0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
b5c0: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
b5d0: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
b5e0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
b5f0: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
b600: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
b610: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
b620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b630: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
b640: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
b650: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b670: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
b680: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
b690: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
b6a0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
b6b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b6c0: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
b6d0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b6f0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
b700: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
b710: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b720: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
b730: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
b740: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
b750: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b760: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
b770: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
b780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b790: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
b7a0: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
b7b0: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
b7c0: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
b7d0: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
b7e0: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
b7f0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
b800: 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68   written.  ** th
b810: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
b820: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65  nsaction, or the
b830: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
b840: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
b850: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
b860: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
b870: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
b880: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
b890: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
b8a0: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
b8b0: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
b8c0: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
b8d0: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a   = szJ;.  }.  ..
b8e0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
b8f0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
b900: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
b910: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
b920: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
b930: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
b940: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50  >stmtSize);.  pP
b950: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
b960: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
b970: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
b980: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
b990: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
b9a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b9b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b9c0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
b9d0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
b9e0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
b9f0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
ba00: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
ba10: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
ba20: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
ba30: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
ba40: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
ba50: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ba60: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
ba70: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
ba80: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
ba90: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
baa0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
bab0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
bac0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
bad0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
bae0: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
baf0: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
bb00: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
bb10: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
bb20: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
bb30: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
bb40: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
bb50: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
bb60: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  er, &pPager->stf
bb70: 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 0);.    asser
bb80: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
bb90: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
bba0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
bbb0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
bbc0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
bbd0: 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
bbe0: 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
bbf0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
bc00: 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
bc10: 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
bc20: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bc30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
bc40: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
bc50: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
bc60: 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
bc70: 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
bc80: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
bc90: 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
bca0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
bcb0: 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
bcc0: 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
bcd0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
bce0: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
bcf0: 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
bd00: 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
bd10: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
bd20: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
bd30: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
bd40: 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
bd50: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
bd60: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
bd70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
bd80: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
bd90: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
bda0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
bdb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bdc0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
bdd0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
bde0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bdf0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
be00: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
be10: 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
be20: 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
be30: 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c   assert( JOURNAL
be40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c  _HDR_SZ(pPager)<
be50: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
be60: 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28  e+8) );.  while(
be70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
be80: 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28  Off <= (hdrOff-(
be90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bea0: 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  +8)) ){.    rc =
beb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
bec0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
bed0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
bee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
bef0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
bf00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
bf10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
bf20: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
bf30: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
bf40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bf50: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
bf60: 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33  u32 nRec;.    u3
bf70: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
bf80: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
bf90: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
bfa0: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
bfb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bfc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
bfd0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
bfe0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
bff0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c000: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
c010: 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20  if( nRec==0 ){. 
c020: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c030: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
c040: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
c050: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
c060: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
c070: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
c080: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c090: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
c0a0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
c0b0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
c0c0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
c0d0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
c0e0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
c0f0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
c100: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c110: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
c120: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
c130: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
c140: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c150: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
c160: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
c170: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c180: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
c190: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
c1a0: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
c1b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
c1c0: 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43  RUPT;  /* bkpt-C
c1d0: 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73  ORRUPT */.  }els
c1e0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
c1f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
c200: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
c210: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
c220: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
c230: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c240: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
c250: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
c260: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
c270: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
c280: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
c290: 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  m number is the 
c2a0: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
c2b0: 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72  f the mxPage par
c2c0: 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78  ameter..** If mx
c2d0: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
c2e0: 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61  , the noSync fla
c2f0: 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20  g is also set.  
c300: 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a  noSync bypasses.
c310: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
c320: 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68  te3OsSync().  Th
c330: 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63  e pager runs muc
c340: 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f  h faster with no
c350: 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20  Sync on,.** but 
c360: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
c370: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
c380: 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  or there is an a
c390: 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20  brupt power .** 
c3a0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74  failure, the dat
c3b0: 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74  abase file might
c3c0: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
c3d0: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a  nconsistent and.
c3e0: 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20  ** unrepairable 
c3f0: 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64  state.  .*/.void
c400: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
c410: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
c420: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
c430: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
c440: 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Page>=0 ){.    p
c450: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
c460: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c470: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c480: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
c490: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
c4a0: 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70   .  }else{.    p
c4b0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
c4c0: 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20  1;.    mxPage = 
c4d0: 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  -mxPage;.  }.  i
c4e0: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
c4f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
c500: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
c510: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
c520: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
c530: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
c540: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
c550: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
c560: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
c570: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
c580: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
c590: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
c5a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
c5b0: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
c5c0: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
c5d0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
c5e0: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
c5f0: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
c600: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
c610: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
c620: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
c630: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
c650: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
c660: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
c670: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
c680: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
c690: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
c6a0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
c6b0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
c6c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
c6d0: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
c6e0: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
c6f0: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
c700: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
c710: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
c720: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
c730: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
c740: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
c750: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
c760: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
c770: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
c780: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
c790: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
c7a0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
c7b0: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
c7c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
c7d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c7e0: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
c7f0: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
c800: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
c810: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
c820: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
c830: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
c840: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
c850: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
c860: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
c870: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
c880: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
c8a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
c8b0: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
c8c0: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
c8d0: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
c8e0: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
c8f0: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
c900: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
c910: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
c920: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
c930: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
c940: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
c950: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
c960: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
c970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
c980: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
c990: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
c9a0: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
c9b0: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
c9c0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
c9d0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
c9e0: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
c9f0: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
ca00: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
ca10: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
ca20: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
ca30: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
ca40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ca50: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
ca60: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
ca70: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
ca80: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
ca90: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
caa0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
cab0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
cac0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
cad0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
cae0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
caf0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
cb00: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
cb10: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
cb20: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
cb30: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
cb40: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
cb50: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
cb60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
cb70: 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a  le into zName.**
cb80: 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20   (zName must be 
cb90: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
cba0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
cbb0: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
cbc0: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
cbd0: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
cbe0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
cbf0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
cc00: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
cc10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
cc20: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
cc30: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
cc40: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
cc50: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
cc60: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
cc70: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
cc80: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
cc90: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
cca0: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
ccb0: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
ccc0: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
ccd0: 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a   do{.    cnt--;.
cce0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
ccf0: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
cd00: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
cd10: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
cd20: 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b  e(zFile, fd, 1);
cd30: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
cd40: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
cd50: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
cd60: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
cd70: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
cd80: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
cd90: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
cda0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cdb0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
cdc0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
cdd0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
cde0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
cdf0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
ce00: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
ce10: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
ce20: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
ce30: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
ce40: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
ce50: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
ce60: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
ce70: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
ce80: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
ce90: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
cea0: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
ceb0: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
cec0: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
ced0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
cee0: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
cef0: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
cf00: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
cf10: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
cf20: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
cf30: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
cf40: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
cf50: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
cf60: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
cf70: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
cf80: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
cf90: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
cfa0: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
cfb0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
cfc0: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
cfd0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
cfe0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
cff0: 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  open(.  Pager **
d000: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
d010: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
d020: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
d030: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
d040: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
d050: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
d060: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
d070: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
d080: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
d090: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
d0a0: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
d0b0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
d0c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
d0f0: 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
d100: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
d110: 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46  ager;.  char *zF
d120: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
d130: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a  .  int nameLen;.
d140: 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69    OsFile fd;.  i
d150: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d160: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
d170: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
d180: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
d190: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
d1a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
d1b0: 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
d1c0: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
d1d0: 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
d1e0: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
d1f0: 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
d200: 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68  ADLOCK)!=0;.  ch
d210: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
d220: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
d230: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
d240: 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30  .  memset(&fd, 0
d250: 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20  , sizeof(fd));. 
d260: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
d270: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
d280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d290: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
d2a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
d2b0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
d2c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d2d0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
d2e0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
d2f0: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
d300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
d310: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
d320: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
d330: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
d340: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d350: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  _OK;.    }else.#
d360: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
d370: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
d380: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
d390: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
d3a0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  e);.      if( zF
d3b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
d3c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d3d0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
d3e0: 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  te(zFullPathname
d3f0: 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79  , &fd, &readOnly
d400: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d420: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
d430: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
d440: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
d450: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
d460: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
d470: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
d480: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
d490: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d4a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d4b0: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
d4c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d4d0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
d4e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
d4f0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72  lose(&fd);.    r
d500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d510: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  EM;.  }.  if( rc
d520: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d530: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
d540: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
d550: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
d560: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
d570: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  n rc;.  }.  name
d580: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
d590: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70  llPathname);.  p
d5a0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Pager = sqliteMa
d5b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
d5c0: 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a  ager) + nameLen*
d5d0: 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20  3 + 30 );.  if( 
d5e0: 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
d5f0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
d600: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
d610: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
d620: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d640: 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  }.  TRACE3("OPEN
d650: 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
d660: 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75  ANDLEID(fd), zFu
d670: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70  llPathname);.  p
d680: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
d690: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
d6a0: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
d6b0: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
d6c0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
d6d0: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
d6e0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
d6f0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
d700: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
d710: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
d720: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
d730: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
d740: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
d750: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
d760: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  athname);.  for(
d770: 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
d780: 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
d790: 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
d7a0: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
d7b0: 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
d7c0: 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
d7d0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
d7e0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
d7f0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Pathname);.  sql
d800: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
d810: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
d820: 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
d830: 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a  al[nameLen], "-j
d840: 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67  ournal");.  pPag
d850: 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66  er->fd = fd;.#if
d860: 20 4f 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65   OS_UNIX.  pPage
d870: 72 2d 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70  r->fd.pPager = p
d880: 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
d890: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d8a0: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
d8b0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
d8c0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
d8d0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
d8e0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
d8f0: 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
d900: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  nly;.  pPager->s
d910: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  tmtOpen = 0;.  p
d920: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
d930: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d940: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  nRef = 0;.  pPag
d950: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
d960: 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
d970: 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54  pageSize = SQLIT
d980: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
d990: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
d9a0: 73 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45  sAligned = FORCE
d9b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
d9c0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
d9d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
d9e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d9f0: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  stmtJSize = 0;. 
da00: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
da10: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
da20: 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50  Page = 100;.  pP
da30: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
da40: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50  GER_UNLOCK;.  pP
da50: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
da60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  0;.  pPager->tem
da70: 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
da80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
da90: 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  b = memDb;.  pPa
daa0: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
dab0: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
dac0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
dad0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
dae0: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
daf0: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
db00: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
db10: 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
db20: 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
db30: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
db40: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
db50: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
db60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
db70: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
db80: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
db90: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
dba0: 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  a);.  pPager->se
dbb0: 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52  ctorSize = PAGER
dbc0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
dbd0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
dbe0: 64 6c 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  dler = 0;.  mems
dbf0: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
dc00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
dc10: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a  er->aHash));.  *
dc20: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
dc30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
dc50: 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
dc60: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
dc70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
dc80: 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c  er_set_busyhandl
dc90: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
dca0: 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
dcb0: 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
dcc0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
dcd0: 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
dce0: 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
dcf0: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
dd00: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
dd10: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
dd20: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
dd30: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
dd40: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
dd50: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
dd60: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
dd70: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
dd80: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
dd90: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
dda0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
ddb0: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
ddc0: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
ddd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
dde0: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
ddf0: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
de00: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
de10: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
de20: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
de30: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
de40: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
de50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
de60: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
de70: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
de80: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
de90: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
dea0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
deb0: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
dec0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
ded0: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
dee0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
def0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
df00: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
df10: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
df20: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
df30: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
df40: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
df50: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
df60: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
df70: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
df80: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
df90: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
dfa0: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
dfb0: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
dfc0: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
dfd0: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
dfe0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
dff0: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
e000: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
e010: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
e020: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
e030: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
e040: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
e050: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
e060: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
e070: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
e080: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ize..**.** The p
e090: 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 6f 6e  age size must on
e0a0: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 77 68  ly be changed wh
e0b0: 65 6e 20 74 68 65 20 63 61 63 68 65 20 69 73 20  en the cache is 
e0c0: 65 6d 70 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  empty..*/.void s
e0d0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
e0e0: 70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  pagesize(Pager *
e0f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65  pPager, int page
e100: 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
e110: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
e120: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
e130: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
e140: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61   );.  pPager->pa
e150: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
e160: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41  e;.  pPager->psA
e170: 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41  ligned = FORCE_A
e180: 4c 49 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a  LIGNMENT(pageSiz
e190: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
e1a0: 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
e1b0: 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
e1c0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
e1d0: 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
e1e0: 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
e1f0: 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f  nts to.  No erro
e200: 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
e210: 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ne..*/.void sqli
e220: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
e230: 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
e240: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
e250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
e260: 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  est){.  memset(p
e270: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
e280: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
e290: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
e2a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  (&pPager->fd, 0)
e2b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52  ;.    sqlite3OsR
e2c0: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ead(&pPager->fd,
e2d0: 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a   pDest, N);.  }.
e2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e2f0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
e300: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
e310: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
e320: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
e330: 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
e340: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
e350: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
e360: 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61  r){.  i64 n;.  a
e370: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
e380: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e390: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
e3a0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
e3b0: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
e3c0: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
e3d0: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
e3e0: 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f  d, &n)!=SQLITE_O
e3f0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
e400: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
e410: 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20  R_ERR_DISK;.    
e420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
e430: 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
e440: 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 4d 45  eSize;.  if( !ME
e450: 4d 44 42 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e  MDB && n==PENDIN
e460: 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
e470: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e  ageSize ){.    n
e480: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ++;.  }.  if( pP
e490: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
e4a0: 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
e4b0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
e4c0: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
e4d0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  n n;.}../*.** Fo
e4e0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
e4f0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
e500: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
e510: 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  r*);.../*.** Unl
e520: 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
e530: 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
e540: 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
e550: 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
e560: 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
e570: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
e580: 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
e590: 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
e5a0: 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
e5b0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
e5c0: 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20  ager_movepage() 
e5d0: 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76  routine can leav
e5e0: 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  e a page in the 
e5f0: 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50  .** pNextFree/pP
e600: 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61  revFree list tha
e610: 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20  t is not a part 
e620: 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69  of any hash-chai
e630: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
e640: 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69  d unlinkHashChai
e650: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
e660: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
e670: 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30  if( pPg->pgno==0
e680: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
e690: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
e6a0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
e6b0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
e6c0: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
e6d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
e6e0: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
e6f0: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
e700: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
e710: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
e720: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
e730: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
e740: 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
e750: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
e760: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d  [pager_hash(pPg-
e770: 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a  >pgno)]!=pPg );.
e780: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
e790: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
e7a0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
e7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
e7c0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
e7d0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
e7e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e7f0: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
e800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
e810: 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
e820: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70  xtHash;.  }..  p
e830: 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
e840: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
e850: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
e860: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
e870: 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
e880: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
e890: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
e8a0: 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
e8b0: 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
e8c0: 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
e8d0: 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
e8e0: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
e8f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
e900: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e910: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
e920: 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20  ..  /* Keep the 
e930: 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69  pFirstSynced poi
e940: 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  nter pointing at
e950: 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68   the first synch
e960: 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a  ronized page */.
e970: 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
e980: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
e990: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
e9a0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
e9b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  ;.    while( p &
e9c0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
e9d0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
e9e0: 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d  e; }.    pPager-
e9f0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
ea00: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  p;.  }..  /* Unl
ea10: 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ink from the fre
ea20: 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70  elist */.  if( p
ea30: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
ea40: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
ea50: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
ea60: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ea70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ea80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
ea90: 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irst==pPg );.   
eaa0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
eab0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
eac0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
ead0: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
eae0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
eaf0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
eb00: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
eb10: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
eb20: 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
eb30: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
eb40: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
eb50: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
eb60: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  .  pPg->pNextFre
eb70: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
eb80: 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e  ee = 0;..  /* Un
eb90: 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
eba0: 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
ebb0: 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
ebc0: 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
ebd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ebe0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
ebf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ec00: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
ec10: 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65  runcate an in-me
ec20: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
ec30: 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61  Delete.** all pa
ec40: 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
ec50: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
ec60: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
ec70: 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
ec80: 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
ec90: 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
eca0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
ecb0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
ecc0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
ecd0: 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
ece0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
ecf0: 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
ed00: 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
ed10: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
ed20: 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
ed30: 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
ed40: 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
ed50: 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
ed60: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
ed70: 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
ed80: 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
ed90: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
eda0: 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
edb0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
edc0: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
edd0: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
ede0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
edf0: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
ee00: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
ee10: 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
ee20: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
ee30: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
ee40: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  e(pPg);.      sq
ee50: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
ee60: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
ee70: 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
ee80: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
ee90: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
eea0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
eeb0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
eec0: 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
eed0: 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
eee0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
eef0: 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
ef00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ef10: 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
ef20: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
ef30: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
ef40: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
ef50: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
ef60: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
ef70: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
ef80: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
ef90: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
efa0: 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
efb0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
efc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
efd0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
efe0: 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
eff0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
f000: 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
f010: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
f020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
f030: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
f040: 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
f050: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
f060: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f070: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f080: 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  }.  rc = pager_t
f090: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
f0a0: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
f0b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f0c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
f0d0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
f0e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f0f0: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
f100: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
f110: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
f120: 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
f130: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
f140: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
f150: 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
f160: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f170: 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
f180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
f190: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
f1a0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
f1b0: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
f1c0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
f1d0: 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
f1e0: 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
f1f0: 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
f200: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
f210: 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
f220: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
f230: 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
f240: 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
f250: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
f260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
f270: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
f280: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
f290: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
f2a0: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
f2b0: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
f2c0: 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ase PAGER_RESERV
f2d0: 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47  ED:.    case PAG
f2e0: 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20  ER_SYNCED: .    
f2f0: 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55  case PAGER_EXCLU
f300: 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SIVE: {.      /*
f310: 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49   We ignore any I
f320: 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63  O errors that oc
f330: 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72  cur during the r
f340: 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
f350: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64   operation. So d
f360: 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20  isable IO error 
f370: 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68  simulation so th
f380: 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20  at testing.     
f390: 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65   ** works more e
f3a0: 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  asily..      */.
f3b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
f3c0: 54 45 5f 54 45 53 54 29 20 26 26 20 28 64 65 66  TE_TEST) && (def
f3d0: 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c  ined(OS_UNIX) ||
f3e0: 20 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29   defined(OS_WIN)
f3f0: 29 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69  ).      extern i
f400: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
f410: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20  ror_pending;.   
f420: 20 20 20 69 6e 74 20 69 6f 65 72 72 5f 63 6e 74     int ioerr_cnt
f430: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
f440: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20  ror_pending;.   
f450: 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72     sqlite3_io_er
f460: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
f470: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  ;.#endif.      s
f480: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
f490: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 23 69  back(pPager);.#i
f4a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
f4b0: 5f 54 45 53 54 29 20 26 26 20 28 64 65 66 69 6e  _TEST) && (defin
f4c0: 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64  ed(OS_UNIX) || d
f4d0: 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a  efined(OS_WIN)).
f4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f        sqlite3_io
f4f0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
f500: 20 69 6f 65 72 72 5f 63 6e 74 3b 0a 23 65 6e 64   ioerr_cnt;.#end
f510: 69 66 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45  if.      if( !ME
f520: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MDB ){.        s
f530: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
f540: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
f550: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
f560: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f570: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
f580: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
f590: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f5a0: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
f5b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
f5c0: 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
f5d0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
f5e0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
f5f0: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
f600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f610: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f620: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
f630: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
f640: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
f650: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
f660: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
f670: 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
f680: 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d  EBUG.    if( MEM
f690: 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  DB ){.      PgHi
f6a0: 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
f6b0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
f6c0: 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
f6d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
f6e0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
f6f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
f700: 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
f710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f720: 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
f730: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f740: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
f750: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
f760: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
f770: 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
f780: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
f790: 50 61 67 65 72 29 29 3b 0a 20 20 73 71 6c 69 74  Pager));.  sqlit
f7a0: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
f7b0: 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74  r->fd);.  assert
f7c0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f7d0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a  lOpen==0 );.  /*
f7e0: 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
f7f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
f800: 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
f810: 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
f820: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
f830: 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
f840: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
f850: 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
f860: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 46 72 65   */..  sqliteFre
f870: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
f880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f8a0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
f8b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
f8c0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
f8d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f8e0: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
f8f0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
f900: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
f910: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
f920: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
f930: 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
f940: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
f950: 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
f960: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
f970: 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
f980: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
f990: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
f9a0: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
f9b0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
f9c0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
f9d0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
f9e0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
f9f0: 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
fa00: 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
fa10: 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
fa20: 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
fa30: 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
fa40: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
fa50: 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
fa60: 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
fa70: 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
fa80: 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
fa90: 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
faa0: 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
fab0: 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
fac0: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
fad0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
fae0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
faf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
fb00: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
fb10: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
fb20: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
fb30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
fb40: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
fb50: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
fb60: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
fb70: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
fb80: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
fb90: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
fba0: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
fbb0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
fbc0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
fbd0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
fbe0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
fbf0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
fc00: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
fc10: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
fc20: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
fc30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
fc40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
fc50: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
fc60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fc70: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
fc80: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
fc90: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
fca0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
fcb0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
fcc0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
fcd0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
fce0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
fcf0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
fd00: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
fd10: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
fd20: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
fd30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
fd40: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
fd50: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
fd60: 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
fd70: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
fd80: 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
fd90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fda0: 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
fdb0: 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
fdc0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
fdd0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
fde0: 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
fdf0: 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
fe00: 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
fe10: 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
fe20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
fe30: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
fe40: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
fe50: 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
fe60: 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
fe70: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
fe80: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
fe90: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
fea0: 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
feb0: 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
fec0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
fed0: 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
fee0: 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
fef0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ff00: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
ff10: 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
ff20: 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
ff30: 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
ff40: 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
ff50: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
ff60: 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
ff70: 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
ff80: 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
ff90: 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
ffa0: 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
ffb0: 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
ffc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
ffd0: 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
ffe0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
fff0: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
10000 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
10010 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
10020 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
10030 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
10040 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
10050 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
10060 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
10070 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
10080 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
10090 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
100a0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
100b0 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
100c0 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
100d0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
100e0 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
100f0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
10100 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
10110 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
10120 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
10130 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
10140 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
10150 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
10160 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
10170 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10180 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
10190 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
101a0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
101b0 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
101c0 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
101d0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
101e0 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
101f0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
10200 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
10210 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
10220 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
10230 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
10240 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
10250 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
10260 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
10270 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
10280 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
10290 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
102a0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
102b0 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
102c0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
102d0 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
102e0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
102f0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
10300 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
10310 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
10320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10330 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
10340 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
10350 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
10360 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
10370 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
10380 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
10390 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
103a0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
103b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
103c0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
103d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
103e0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
103f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10400 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
10410 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
10420 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
10430 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
10440 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
10450 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
10460 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
10470 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
10480 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
10490 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
104a0 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
104b0 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
104c0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
104d0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
104e0 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
104f0 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
10500 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
10510 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
10520 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
10530 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10540 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
10550 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
10560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10570 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10580 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  &pPager->jfd, &j
10590 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
105a0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
105b0 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
105c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
105d0 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
105e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
105f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
10600 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
10610 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
10620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
10630 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
10640 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
10650 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
10660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
10670 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
10680 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
10690 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
106a0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
106b0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
106c0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
106d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
106e0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
106f0 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20  r rollback. .   
10700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10710 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
10720 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
10730 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
10740 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
10750 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
10760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
10770 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
10780 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
10790 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
107a0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
107b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
107c0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
107d0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
107e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
107f0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
10800 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
10810 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
10820 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
10830 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
10840 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
10850 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
10860 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
10870 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
10880 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10890 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lOff);.      }. 
108a0 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
108b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
108c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
108d0 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er));.      rc =
108e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
108f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
10900 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
10910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10920 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10930 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
10940 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
10950 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
10960 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
10970 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
10980 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
10990 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
109a0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
109b0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
109c0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
109d0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
109e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
109f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10a00 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
10a10 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
10a20 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
10a30 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
10a40 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
10a50 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
10a60 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
10a70 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
10a80 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
10a90 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
10aa0 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
10ab0 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
10ac0 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
10ad0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
10ae0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
10af0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
10b00 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
10b10 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
10b20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
10b30 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
10b40 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
10b50 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
10b60 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
10b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
10b80 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
10b90 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
10ba0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
10bb0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
10bc0 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
10bd0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
10be0 20 52 65 70 65 61 74 65 20 75 6e 74 69 6c 20 74   Repeate until t
10bf0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
10c00 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
10c10 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
10c20 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
10c30 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10c40 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
10c50 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
10c60 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
10c70 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
10c80 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
10c90 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10ca0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
10cb0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
10cc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
10cd0 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
10ce0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
10cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
10d00 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
10d10 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
10d20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
10d30 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
10d40 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  VE_LOCK );.  if(
10d50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
10d60 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
10d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10d90 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64   busy = 1;.    d
10da0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
10db0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
10dc0 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
10dd0 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
10de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10df0 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
10e00 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10e10 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  r && .        pP
10e20 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
10e30 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
10e40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
10e50 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
10e60 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
10e70 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
10e80 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20  sy++).    );.   
10e90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10ea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
10eb0 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
10ec0 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
10ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10ee0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
10ef0 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
10f00 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
10f10 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
10f20 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
10f30 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
10f40 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
10f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
10f60 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
10f70 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
10f80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10f90 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
10fa0 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
10fb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
10fc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
10fd0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
10fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ff0 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
11000 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
11010 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
11020 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
11030 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
11040 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11050 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
11060 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
11070 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
11080 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
11090 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
110a0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
110b0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
110c0 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
110d0 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
110e0 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
110f0 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
11100 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
11110 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
11120 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
11130 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
11140 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
11150 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
11160 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
11170 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
11180 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
11190 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
111a0 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
111b0 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
111c0 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
111d0 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
111e0 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
111f0 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
11200 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
11210 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
11220 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
11230 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
11240 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
11250 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
11260 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
11270 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
11280 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
11290 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
112a0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
112b0 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
112c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
112d0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
112e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
112f0 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
11300 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
11310 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
11320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11330 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
11340 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
11350 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
11360 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
11370 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
11380 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
11390 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
113a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
113b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
113c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
113d0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
113e0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
113f0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
11400 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c  dirty );.    sql
11410 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
11420 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
11430 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
11440 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
11450 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11460 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
11470 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
11480 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
11490 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
114a0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
114b0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
114c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
114d0 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
114e0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
114f0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
11500 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
11510 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
11520 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
11530 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
11540 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
11550 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
11560 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
11570 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
11580 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28   ){.      CODEC(
11590 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
115a0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
115b0 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
115c0 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f       TRACE3("STO
115d0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
115e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
115f0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
11600 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11610 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
11620 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
11630 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50  _DATA(pList), pP
11640 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
11650 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
11660 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
11670 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
11680 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
11690 20 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65    pPager->nWrite
116a0 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ++;.    }.#ifnde
116b0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
116c0 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  e{.      TRACE3(
116d0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
116e0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
116f0 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
11700 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
11710 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
11720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11730 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
11740 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
11750 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
11760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11770 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
11780 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
11790 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
117a0 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
117b0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
117c0 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
117d0 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
117e0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
117f0 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
11800 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
11810 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
11820 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
11830 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
11840 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11850 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c  .  PgHdr *p, *pL
11860 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30  ist;.  pList = 0
11870 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
11880 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
11890 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
118a0 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  f( p->dirty ){. 
118b0 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d       p->pDirty =
118c0 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c   pList;.      pL
118d0 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ist = p;.    }. 
118e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
118f0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  t;.}../*.** Acqu
11900 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
11910 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
11920 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
11930 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
11940 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
11950 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
11960 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
11970 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
11980 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
11990 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
119a0 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
119b0 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
119c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
119d0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
119e0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
119f0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
11a00 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
11a10 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
11a20 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
11a30 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
11a40 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
11a50 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
11a60 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
11a70 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
11a80 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
11a90 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
11aa0 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
11ab0 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
11ac0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
11ad0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
11ae0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
11af0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
11b00 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
11b10 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
11b20 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
11b30 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
11b40 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
11b50 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
11b60 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
11b70 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
11b80 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
11b90 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
11ba0 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
11bb0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
11bc0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
11bd0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
11be0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
11bf0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
11c00 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
11c10 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
11c20 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
11c30 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
11c40 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
11c50 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
11c60 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
11c70 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
11c80 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
11c90 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
11ca0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
11cb0 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
11cc0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
11cd0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
11ce0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
11cf0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
11d00 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
11d10 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
11d20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
11d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
11d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11d50 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
11d60 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11d70 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
11d80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
11d90 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 0a 20 20    int rc, n;..  
11da0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
11db0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
11dc0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
11dd0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
11de0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
11df0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
11e00 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
11e10 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
11e20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
11e30 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
11e40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
11e50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11e60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
11e70 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
11e80 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
11e90 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
11ea0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11eb0 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
11ec0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
11ed0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
11ee0 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
11ef0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
11f00 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
11f10 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
11f20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
11f30 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
11f40 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
11f50 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
11f60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
11f70 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
11f80 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
11f90 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
11fa0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
11fb0 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
11fc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
11fd0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
11fe0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
11ff0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12010 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12030 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
12040 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
12050 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
12060 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
12070 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
12080 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
12090 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
120a0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
120b0 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
120c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
120d0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
120e0 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
120f0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
12100 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
12110 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c   &&.        !sql
12120 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
12130 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  vedLock(&pPager-
12140 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  >fd) .    ){.   
12150 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
12160 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
12170 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
12180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12190 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
121a0 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a   it is.       **
121b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
121c0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
121d0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
121e0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
121f0 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  e.       ** EXCL
12200 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
12210 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
12220 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
12230 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  en the.       **
12240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
12250 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
12260 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
12270 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
12280 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
12290 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
122a0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
122b0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
122c0 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
122d0 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
122e0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20    ** .       ** 
122f0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
12300 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
12310 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
12320 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
12330 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
12340 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
12350 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
12360 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
12370 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f  l to.       ** o
12380 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
12390 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
123a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
123b0 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  le..       */.  
123c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
123d0 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
123e0 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
123f0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28  OCK);.       if(
12400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12410 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
12420 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
12430 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
12440 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
12450 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
12460 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
12470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
12490 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
124a0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
124b0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
124c0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
124d0 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
124e0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
124f0 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
12500 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
12510 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
12520 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
12530 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
12540 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
12550 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
12560 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
12570 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
12580 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
12590 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
125a0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
125b0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
125c0 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
125d0 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
125e0 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
125f0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
12600 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
12610 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
12620 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
12630 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
12640 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
12650 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
12660 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
12670 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
12680 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
12690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
126a0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
126b0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
126c0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
126d0 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
126e0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
126f0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
12700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12710 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
12720 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
12730 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
12740 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
12750 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
12760 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
12770 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12780 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
12790 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
127a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
127b0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a  ournalHdr = 0;..
127c0 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
127d0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
127e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
127f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
12800 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
12810 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
12820 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12830 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12840 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
12850 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
12860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
128a0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
128b0 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
128c0 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
128d0 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
128e0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
128f0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
12900 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
12910 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
12920 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
12930 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
12940 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
12950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12960 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
12970 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
12980 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
12990 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
129a0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
129b0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
129c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
129d0 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
129e0 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d  xPage || pPager-
129f0 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45  >pFirst==0 || ME
12a00 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
12a10 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
12a20 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d  e */.      pPg =
12a30 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
12a40 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
12a50 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e   pPager->psAlign
12a60 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
12a90 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
12ac0 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
12ad0 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  istory) );.     
12ae0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
12af0 20 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44         if( !MEMD
12b00 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  B ){.          p
12b10 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
12b20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12b30 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
12b40 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
12b50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
12b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12b70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12b80 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
12b90 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
12ba0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
12bb0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
12bc0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12bd0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
12be0 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
12bf0 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
12c00 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
12c10 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
12c20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
12c30 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
12c40 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
12c50 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
12c60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
12c70 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
12c80 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20        /* Find a 
12c90 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
12ca0 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
12cb0 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
12cc0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
12cd0 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
12ce0 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
12cf0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
12d00 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  */.      pPg = p
12d10 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12d20 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ced;..      /* I
12d30 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
12d40 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
12d50 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
12d60 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20   an fsync().    
12d70 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
12d80 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
12d90 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
12da0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
12db0 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73  .      ** very s
12dc0 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
12dd0 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
12de0 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
12df0 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20   sometimes.     
12e00 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
12e10 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f  helped..      */
12e20 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
12e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
12e40 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
12e50 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
12e60 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
12e70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12e80 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
12e90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12eb0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
12ec0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
12ed0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
12ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
12ef0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
12f00 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
12f10 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12f20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a  into the..  ** j
12f30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12f40 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
12f50 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
12f60 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a  g a journal..  *
12f70 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
12f80 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
12f90 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
12fa0 65 73 20 74 68 61 74 20 68 61 76 65 0a 09 20 20  es that have..  
12fb0 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
12fc0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
12fd0 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
12fe0 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 09   the header is..
12ff0 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
13000 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
13010 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
13020 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13030 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
13040 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
13050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13060 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
13070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
13080 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
13090 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
130a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
130b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
130c0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
130d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
130e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
130f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
13100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13110 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20    }.        pPg 
13120 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
13130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13140 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
13150 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  f==0 );..      /
13160 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
13170 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13180 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
13190 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  irty..      */. 
131a0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69       if( pPg->di
131b0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
131c0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
131d0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
131e0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
131f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
13200 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
13210 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
13220 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13240 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
13250 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
13260 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
13270 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13280 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
13290 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
132a0 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
132b0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
132c0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
132d0 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
132e0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
132f0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20  llback, then.   
13300 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c     ** set the gl
13310 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
13320 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
13330 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20  isabling the.   
13340 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e     ** sqlite_don
13350 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  t_rollback() opt
13360 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
13370 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
13380 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
13390 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
133a0 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
133b0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
133c0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
133d0 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
133e0 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
133f0 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
13400 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
13410 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
13420 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  ember.      ** t
13430 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
13440 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
13450 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
13460 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
13470 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61  t.      ** be ma
13480 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
13490 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
134a0 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a   on out..      *
134b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
134c0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
134d0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
134e0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
134f0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  k = 1;.      }..
13500 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20        /* Unlink 
13510 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
13520 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
13530 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
13540 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
13550 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
13560 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
13570 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  >nOvfl++;.    }.
13580 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
13590 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
135a0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
135b0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
135c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
135d0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
135e0 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
135f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
13600 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
13610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13620 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
13630 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
13640 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
13650 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
13660 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
13670 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
13680 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
13690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
136a0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
136b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
136c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
136d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
136e0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
136f0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
13700 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
13710 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
13720 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
13730 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
13740 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
13750 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
13760 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
13770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
13780 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
13790 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
137a0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
137b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
137c0 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
137d0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
137e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
137f0 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72  +;.    h = pager
13800 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20  _hash(pgno);.   
13810 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
13820 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
13830 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
13840 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
13850 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
13860 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
13870 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
13880 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
13890 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
138a0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
138b0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
138c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
138d0 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
138e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
138f0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
13900 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
13910 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
13920 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 73 71 6c     }.    n = sql
13930 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
13940 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
13950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13960 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
13970 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
13980 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
13990 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
139a0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
139b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
139c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
139d0 7d 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  }.    if( n<(int
139e0 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d  )pgno ){.      m
139f0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
13a00 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
13a10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a30 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61   int rc;.      a
13a40 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
13a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13a60 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
13a70 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
13a80 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
13a90 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
13aa0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
13ab0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
13ac0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
13ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13ae0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
13af0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
13b00 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13b10 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
13b20 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
13b30 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
13b40 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
13b50 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
13b60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13b70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
13b80 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
13b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
13ba0 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
13bb0 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
13bc0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
13bd0 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
13be0 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
13bf0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
13c00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c10 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
13c20 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
13c30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
13c40 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n rc;.        }e
13c50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
13c60 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
13c70 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
13c80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13cb0 50 61 67 65 72 2d 3e 6e 52 65 61 64 2b 2b 3b 0a  Pager->nRead++;.
13cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
13ce0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
13cf0 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
13d00 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50  cache. */.    pP
13d10 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20  ager->nHit++;.  
13d20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
13d30 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
13d40 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
13d50 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
13d60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13d70 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
13d80 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
13d90 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
13da0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
13db0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
13dc0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
13dd0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
13de0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
13df0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
13e00 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
13e10 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
13e20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
13e30 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
13e40 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
13e50 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
13e60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
13e70 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
13e80 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
13e90 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
13ea0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
13eb0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
13ec0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
13ed0 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
13ee0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
13ef0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
13f00 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
13f10 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
13f20 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
13f30 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76  r happened..*/.v
13f40 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65  oid *sqlite3page
13f50 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
13f60 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
13f70 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
13f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
13f90 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
13fa0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
13fb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13fc0 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
13fd0 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
13fe0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
13ff0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
14000 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
14010 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
14020 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
14030 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
14040 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
14050 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
14060 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
14070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
14080 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
14090 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
140a0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
140b0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
140c0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
140d0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
140e0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
140f0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
14100 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
14110 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
14120 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
14130 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
14140 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
14150 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
14160 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
14170 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14180 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
14190 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
141a0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
141b0 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
141c0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
141d0 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
141e0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
141f0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
14200 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
14210 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
14220 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
14230 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
14240 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
14250 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
14260 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
14270 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
14280 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
14290 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
142a0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
142b0 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
142c0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
142d0 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
142e0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
142f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
14300 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
14310 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
14320 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
14330 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
14340 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
14350 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
14360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
14370 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
14380 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
14390 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
143a0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
143b0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
143c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
143d0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
143e0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
143f0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
14400 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
14410 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
14420 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
14430 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14440 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
14450 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
14460 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
14470 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
14480 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
14490 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
144a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
144b0 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
144c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
144d0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
144e0 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
144f0 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a  =0 && !MEMDB ){.
14500 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
14510 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
14520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14530 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14540 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
14550 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
14560 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
14570 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
14580 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
14590 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
145a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
145b0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
145c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
145d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
145e0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
145f0 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
14600 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
14610 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
14620 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
14630 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
14640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14650 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
14660 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
14670 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
14680 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
14690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
146a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
146b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
146c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
146d0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
146e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
146f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
14700 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
14710 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
14720 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
14730 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
14740 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
14750 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
14760 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
14770 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
14780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
14790 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
147a0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
147b0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
147c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
147d0 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
147e0 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
147f0 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65  ->jfd,pPager->te
14800 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
14810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14820 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
14830 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
14840 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
14850 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
14860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14870 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
14880 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
14890 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  }.  sqlite3OsOpe
148a0 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
148b0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26  r->zDirectory, &
148c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
148d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
148e0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
148f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
14900 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
14910 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
14920 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
14930 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
14940 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
14950 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14960 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
14970 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
14980 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
14990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
149a0 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
149b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
149c0 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
149d0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
149e0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
149f0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
14a00 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
14a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
14a20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
14a30 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
14a40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
14a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14a60 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
14a70 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
14a80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14a90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
14ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14ac0 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
14ad0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
14ae0 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
14af0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
14b00 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
14b10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14b20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
14b30 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
14b40 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
14b50 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
14b60 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  NLOCK;.  return 
14b70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
14b80 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
14b90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14ba0 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
14bb0 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
14bc0 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
14bd0 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
14be0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
14bf0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
14c00 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
14c10 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
14c20 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  r_rollback() is 
14c30 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
14c40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
14c50 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
14c60 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
14c70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
14c80 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
14c90 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
14ca0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
14cb0 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
14cc0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
14cd0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
14ce0 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
14cf0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14d00 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
14d10 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
14d20 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
14d30 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
14d40 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
14d50 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
14d60 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
14d70 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
14d80 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
14d90 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
14da0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
14db0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
14dc0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
14dd0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
14de0 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
14df0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
14e00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
14e10 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
14e20 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
14e30 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
14e40 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
14e50 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
14e60 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
14e70 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
14e80 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
14e90 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
14ea0 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
14eb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
14ec0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
14ed0 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
14ee0 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
14ef0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
14f00 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
14f10 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
14f20 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
14f30 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
14f40 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14f50 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
14f60 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
14f70 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
14f80 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
14f90 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
14fa0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
14fb0 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
14fc0 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
14fd0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
14fe0 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
14ff0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
15000 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
15010 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
15020 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15030 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
15040 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  ata, int exFlag)
15050 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
15060 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
15070 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
15080 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
15090 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
150a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
150b0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
150c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
150d0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
150e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
150f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
15100 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
15110 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15120 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15130 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
15140 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
15150 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15160 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
15170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
15180 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
15190 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
151a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
151b0 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
151c0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 78 46  RVED_LOCK || exF
151d0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
151e0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
151f0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 52  n_lock(pPager, R
15200 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
15210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15230 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
15240 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
15250 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
15260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
15280 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15290 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
152a0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
152b0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
152c0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
152d0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
152e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
152f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15300 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
15310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
15340 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
15350 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
15360 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
15370 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
15380 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
15390 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
153a0 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
153b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
153c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
153d0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
153e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
153f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
15410 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
15420 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
15430 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
15440 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
15450 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
15460 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
15470 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
15480 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
15490 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
154a0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
154b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
154c0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
154d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
154e0 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
154f0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
15500 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
15510 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15520 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15530 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
15540 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
15550 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
15560 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
15570 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
15580 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
15590 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
155a0 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
155b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
155c0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
155d0 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
155e0 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
155f0 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
15600 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
15610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
15620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
15630 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
15640 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
15650 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
15660 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
15670 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
15680 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
15690 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
156a0 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
156b0 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
156c0 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
156d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
156e0 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
156f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
15700 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f  pager_commit() o
15710 72 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  r sqlite3pager_r
15720 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
15730 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  reset..*/.int sq
15740 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
15750 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
15760 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
15770 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
15780 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
15790 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
157a0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
157b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
157c0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
157d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
157e0 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20  r->errMask ){ . 
157f0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15800 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
15810 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
15820 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
15830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15840 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
15850 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
15860 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 2f  etMaster );..  /
15870 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
15880 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
15890 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
158a0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
158b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
158c0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
158d0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
158e0 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64  y..  */.  pPg->d
158f0 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  irty = 1;.  if( 
15900 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
15910 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c  & (pPg->inStmt |
15920 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
15930 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
15940 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
15950 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
15960 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
15970 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
15980 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
15990 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
159a0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
159b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
159c0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
159d0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
159e0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
159f0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
15a00 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
15a10 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
15a20 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
15a30 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
15a40 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
15a50 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
15a60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15a70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
15a80 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
15a90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
15aa0 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61  ager_begin(pData
15ab0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15ad0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15ae0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15af0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
15b00 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
15b10 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
15b20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15b30 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
15b40 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
15b50 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
15b60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
15b70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15b80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15b90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
15ba0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
15bb0 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
15bc0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
15bd0 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
15be0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
15bf0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
15c00 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
15c10 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
15c20 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
15c30 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
15c40 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
15c50 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
15c60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
15c70 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
15c80 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
15c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
15ca0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
15cb0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
15cc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15cd0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
15ce0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
15cf0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
15d00 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
15d10 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
15d20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
15d30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
15d40 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  nt szPg;.       
15d50 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20   u32 saved;.    
15d60 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
15d70 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
15d80 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
15d90 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
15da0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
15db0 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
15dc0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
15dd0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
15de0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
15df0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15e00 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
15e10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
15e20 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
15e30 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
15e40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15e60 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
15e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
15e80 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
15e90 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
15ea0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
15eb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
15ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
15ed0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
15ee0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
15ef0 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
15f00 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
15f10 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
15f20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
15f30 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67  ksum(pPager, pPg
15f40 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a  ->pgno, pData);.
15f50 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
15f60 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54  = *(u32*)PGHDR_T
15f70 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
15f80 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
15f90 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75  store32bits(cksu
15fa0 6d 2c 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  m, pPg, pPager->
15fb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
15fc0 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67       szPg = pPag
15fd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a  er->pageSize+8;.
15fe0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
15ff0 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
16000 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
16010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16020 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
16030 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29  ->jfd, &((char*)
16040 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67  pData)[-4], szPg
16050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
16060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
16070 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
16080 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e     TRACE4("JOURN
16090 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
160a0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
160d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
160e0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
160f0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
16100 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
16110 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
16120 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52      *(u32*)PGHDR
16130 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
16140 50 61 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a  Pager) = saved;.
16150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16180 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
16190 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
161a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
161b0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
161c0 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
161d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
161e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
161f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
16200 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
16210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16220 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
16230 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
16240 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
16250 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
16260 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
16270 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
16280 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
16290 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
162a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
162b0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
162c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
162d0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
162e0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
162f0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
16300 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
16310 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
16320 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
16330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
16350 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
16360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
16370 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
16380 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
16390 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e     TRACE4("APPEN
163a0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
163b0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
163d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
163e0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
163f0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
16400 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
16410 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
16420 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
16430 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
16440 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
16450 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
16460 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
16470 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
16480 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
16490 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
164a0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
164b0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
164c0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
164d0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
164e0 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
164f0 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
16500 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
16510 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
16520 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
16530 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
16540 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
16550 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
16560 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
16570 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
16580 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
16590 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
165a0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
165b0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
165c0 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  tmtSize ){.     
165d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
165e0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
165f0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
16600 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
16610 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
16620 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
16630 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
16640 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
16650 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
16660 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
16670 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
16680 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
16690 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
166a0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
166b0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
166c0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
166d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
166e0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
166f0 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
16700 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
16710 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
16730 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
16740 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
16750 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16760 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
16770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16780 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
16790 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
167a0 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
167b0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
167c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
167d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
167e0 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
167f0 67 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72  ger->stfd,((char
16800 2a 29 70 44 61 74 61 29 2d 34 2c 20 70 50 61 67  *)pData)-4, pPag
16810 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b  er->pageSize+4);
16820 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
16830 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
16840 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
16850 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
16860 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
16870 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
16880 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
16890 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
168a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
168b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
168c0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
168d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
168e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
168f0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
16900 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
16910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16930 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
16940 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
16950 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
16960 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
16970 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
16980 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
16990 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
169a0 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
169b0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
169c0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
169d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
169e0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
169f0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
16a00 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
16a10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
16a20 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
16a30 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
16a40 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
16a50 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
16a60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
16a70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
16a80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
16a90 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
16aa0 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
16ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16ad0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
16ae0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
16af0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
16b00 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
16b10 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
16b20 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  _write().  In ot
16b30 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
16b40 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
16b50 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
16b60 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
16b70 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  he page..*/.int 
16b80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
16b90 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
16ba0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16bb0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
16bc0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
16bd0 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
16be0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16bf0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
16c00 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
16c10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
16c20 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
16c30 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
16c40 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
16c50 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
16c60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
16c70 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
16c80 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
16c90 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
16ca0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
16cb0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
16cc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
16cd0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16ce0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
16cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
16d10 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
16d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d40 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
16d50 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
16d60 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
16d70 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
16d80 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
16d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16da0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16db0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
16dc0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
16dd0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
16de0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
16df0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
16e00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
16e10 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
16e20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
16e30 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
16e40 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
16e50 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
16e60 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
16e70 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
16e80 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
16e90 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
16ea0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
16eb0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
16ec0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
16ed0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
16ee0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
16ef0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
16f00 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
16f10 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
16f20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
16f30 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
16f40 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
16f50 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
16f60 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
16f70 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
16f80 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
16f90 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
16fa0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
16fb0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
16fc0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
16fd0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
16fe0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
16ff0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
17000 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
17010 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
17020 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
17030 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
17040 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
17050 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
17060 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
17070 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
17080 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
17090 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
170a0 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
170b0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
170c0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
170d0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
170e0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
170f0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
17100 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
17110 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
17120 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
17130 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
17140 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
17150 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
17160 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
17170 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
17180 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
17190 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
171a0 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
171b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
171c0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
171d0 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
171e0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
171f0 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
17200 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
17210 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
17220 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
17230 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
17240 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
17250 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
17260 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
17270 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
17280 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
17290 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
172a0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
172b0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
172c0 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  *pPg;..  if( MEM
172d0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  DB ) return;..  
172e0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
172f0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
17300 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
17310 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
17320 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
17330 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20  irty ){.    if( 
17340 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
17350 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
17360 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
17370 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
17380 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
17390 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
173a0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
173b0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
173c0 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
173d0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
173e0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
173f0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
17400 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
17410 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
17420 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
17430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
17440 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
17450 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
17460 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
17470 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
17480 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
17490 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
174a0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
174b0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
174c0 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
174d0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
174e0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
174f0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
17500 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
17510 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
17520 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
17530 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
17540 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
17550 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
17560 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
17570 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
17580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17590 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
175a0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
175b0 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
175c0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
175d0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
175e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
175f0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
17600 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
17610 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
17620 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
17630 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
17640 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
17650 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
17660 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
17670 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
17680 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
17690 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
176a0 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
176b0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
176c0 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
176d0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
176e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
176f0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64  nt_rollback(void
17700 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
17710 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
17720 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
17730 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
17740 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
17750 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
17760 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te!=PAGER_EXCLUS
17770 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  IVE || pPager->j
17780 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
17790 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
177a0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
177b0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
177c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
177d0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
177e0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
177f0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
17800 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
17810 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
17820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17830 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
17840 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17850 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
17860 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
17870 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
17880 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
17890 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
178a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
178b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
178c0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
178d0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
178e0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
178f0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
17900 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
17910 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44   }.    TRACE3("D
17920 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
17930 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
17940 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
17950 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  D(pPager));.  }.
17960 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17970 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
17980 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
17990 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
179a0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
179b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
179c0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
179d0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
179e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
179f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
17a00 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
17a10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17a20 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
17a30 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
17a40 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
17a50 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
17a60 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ist(pPg);.  }.}.
17a70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17a80 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
17a90 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
17aa0 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
17ab0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
17ac0 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
17ad0 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
17ae0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
17af0 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
17b00 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
17b10 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
17b20 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
17b30 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
17b40 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
17b50 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
17b60 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  if../*.** Commit
17b70 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
17b80 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
17b90 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
17ba0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
17bb0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
17bc0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
17bd0 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
17be0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
17bf0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
17c00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17c10 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
17c20 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
17c30 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
17c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17c50 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
17c60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
17c70 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
17c80 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
17c90 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
17ca0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
17cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
17cc0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
17cd0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
17ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17cf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17d00 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
17d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17d30 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
17d40 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
17d50 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
17d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
17d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
17d80 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
17d90 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
17da0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17db0 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
17dc0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
17dd0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
17de0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
17df0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
17e00 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
17e10 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
17e20 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
17e30 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
17e40 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
17e50 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
17e60 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
17e70 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
17e80 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
17e90 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
17ea0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
17eb0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
17ec0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
17ed0 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
17ee0 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  rty;.    }.#ifnd
17ef0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
17f00 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
17f10 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
17f20 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
17f30 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
17f40 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
17f50 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
17f60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17f70 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
17f80 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
17f90 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
17fa0 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
17fb0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
17fc0 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
17fd0 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
17fe0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
17ff0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
18000 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
18010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18020 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
18030 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
18040 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
18050 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
18060 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
18070 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
18080 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
18090 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
180a0 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
180b0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
180c0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
180d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
180e0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
180f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18100 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
18110 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
18120 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
18130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18150 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
18160 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18170 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65  pager_sync(pPage
18180 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
18190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
181a0 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  .    goto commit
181b0 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63  _abort;.  }.  rc
181c0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
181d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
181e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
181f0 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
18200 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
18210 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
18220 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20  es wrong during 
18230 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
18240 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f  ss..  */.commit_
18250 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33  abort:.  sqlite3
18260 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
18270 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
18280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
18290 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
182a0 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
182b0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
182c0 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
182d0 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
182e0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
182f0 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
18300 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
18310 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
18320 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
18330 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
18340 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
18350 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
18360 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
18370 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
18380 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
18390 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
183a0 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
183b0 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
183c0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
183d0 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
183e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
183f0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
18400 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
18410 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
18420 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
18430 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
18440 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
18450 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
18460 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
18470 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
18480 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
18490 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
184a0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
184b0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
184c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
184d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
184e0 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
184f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18500 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
18510 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
18520 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
18530 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
18540 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
18550 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18560 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
18570 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
18580 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
18590 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
185a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
185b0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
185c0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
185d0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
185e0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
185f0 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
18600 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
18610 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
18620 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
18630 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
18640 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
18650 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
18660 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
18670 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
18680 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
18690 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
186a0 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
186b0 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
186c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54  Size);.        T
186d0 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
186e0 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
186f0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
18700 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18720 20 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25    TRACE3("PAGE %
18730 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
18740 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
18750 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
18770 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
18780 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
18790 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
187a0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
187b0 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
187c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
187d0 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
187e0 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  tStmt = 0;..    
187f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
18800 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
18810 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
18820 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41  iter(PGHDR_TO_DA
18830 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70  TA(p), pPager->p
18840 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
18850 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  }.      .    }. 
18860 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
18870 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
18880 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
18890 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
188a0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
188b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
188c0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
188d0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
188e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
188f0 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
18900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18910 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
18920 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
18930 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
18940 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
18950 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
18960 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18980 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
18990 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
189a0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
189b0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
189c0 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f  Mask!=PAGER_ERR_
189d0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
189e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
189f0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
18a00 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
18a10 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
18a20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18a30 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
18a40 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
18a50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18a60 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18a70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 2c 20  ){.    int rc2, 
18a80 72 63 33 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc3;.    rc = pa
18a90 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
18aa0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
18ab0 32 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  2 = pager_trunca
18ac0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
18ad0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a  r->origDbSize);.
18ae0 20 20 20 20 72 63 33 20 3d 20 70 61 67 65 72 5f      rc3 = pager_
18af0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
18b00 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
18b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18b20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
18b30 20 20 20 20 69 66 28 20 72 63 33 20 29 20 72 63      if( rc3 ) rc
18b40 20 3d 20 72 63 33 3b 0a 20 20 20 20 7d 0a 20 20   = rc3;.    }.  
18b50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
18b60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
18b70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
18b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18ba0 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20  TE_CORRUPT;  /* 
18bb0 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
18bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
18bd0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
18be0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
18bf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18c00 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
18c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18c20 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
18c30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
18c40 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
18c50 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
18c60 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
18c70 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
18c80 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
18c90 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
18ca0 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
18cb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
18cc0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
18cd0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nly;.}../*.** Th
18ce0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
18cf0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
18d00 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
18d10 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
18d20 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67  3pager_stats(Pag
18d30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
18d40 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
18d50 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
18d60 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
18d70 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
18d80 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
18d90 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
18da0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18db0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
18dc0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
18dd0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
18de0 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
18df0 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
18e00 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
18e10 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
18e20 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39  er->nOvfl;.  a[9
18e30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
18e40 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
18e50 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
18e60 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
18e70 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
18e80 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
18e90 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
18ea0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
18eb0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
18ec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
18ed0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
18ee0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
18ef0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
18f00 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
18f10 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
18f20 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
18f30 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
18f40 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
18f50 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
18f60 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
18f70 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
18f80 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
18f90 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
18fa0 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
18fb0 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
18fc0 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
18fd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
18fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
18ff0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
19000 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
19010 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
19020 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
19030 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
19040 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
19050 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
19060 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
19070 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
19090 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
190a0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
190b0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
190c0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
190d0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
190e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
190f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
19100 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19110 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
19120 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
19130 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
19140 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
19150 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
19160 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
19170 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
19180 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
19190 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OCK);.    return
191a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
191b0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
191c0 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
191d0 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
191e0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
191f0 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
19200 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
19210 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
19220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19230 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
19240 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19250 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
19260 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
19270 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
19280 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
19290 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
192a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
192b0 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
192c0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
192d0 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
192e0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
192f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
19300 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
19310 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19320 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
19330 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
19340 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
19350 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
19360 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
19370 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
19380 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
19390 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
193a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
193b0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
193c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
193d0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
193e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
193f0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
19400 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
19410 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
19420 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
19430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
19450 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
19460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19470 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
19480 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19490 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
194a0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
194b0 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
194c0 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
194d0 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
194e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
194f0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
19500 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
19510 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
19520 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
19530 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
19540 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
19550 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
19560 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
19570 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
19580 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
19590 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
195a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
195b0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
195c0 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
195d0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
195e0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
195f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
19600 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
19610 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
19620 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
19630 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
19640 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
19650 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19660 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
19670 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
19680 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
19690 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
196a0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
196b0 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
196c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
196d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
196e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
196f0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
19700 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
19710 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
19720 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
19730 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
19740 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
19750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
19770 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
19780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19790 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
197a0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
197b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
197c0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
197d0 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45  Use ){.    TRACE
197e0 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
197f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19800 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
19810 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
19820 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
19830 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
19840 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
19850 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  Pg=pPg->pNextStm
19860 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69  t){.        PgHi
19870 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
19880 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
19890 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
198a0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
198b0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
198c0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
198d0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
198e0 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
198f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19900 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
19910 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
19920 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
19930 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
19940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19950 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
19960 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
19970 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65  mtSize;.      me
19980 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
19990 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
199a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
199b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
199c0 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
199d0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
199e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
199f0 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
19a00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
19a10 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
19a20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
19a30 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
19a40 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
19a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19a60 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
19a70 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
19a80 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
19a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
19aa0 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d  te3pager_filenam
19ab0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
19ac0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
19ad0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
19ae0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19af0 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
19b00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19b10 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
19b20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69  *sqlite3pager_di
19b30 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
19b40 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
19b50 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
19b60 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
19b70 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
19b80 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
19b90 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
19ba0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
19bb0 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d  pager_journalnam
19bc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
19bd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
19be0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
19bf0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
19c00 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
19c10 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
19c20 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65  e3pager_set_code
19c30 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
19c40 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  er,.  void (*xCo
19c50 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
19c60 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
19c70 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
19c80 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
19c90 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
19ca0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
19cb0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
19cc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19cd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
19ce0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
19cf0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
19d00 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
19d10 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
19d20 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
19d30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
19d40 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
19d50 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
19d60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
19d70 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
19d80 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
19d90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
19da0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
19db0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
19dc0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
19dd0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
19de0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
19df0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
19e00 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
19e10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
19e20 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
19e30 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
19e40 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
19e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19e60 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
19e70 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
19e80 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
19e90 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
19ea0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
19eb0 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
19ec0 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
19ed0 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
19ee0 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
19ef0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
19f00 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
19f10 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
19f20 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
19f30 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
19f40 73 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e  store32bits(chan
19f50 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48  ge_counter, pPgH
19f60 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52  dr, 24);..  /* R
19f70 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
19f80 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
19f90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
19fa0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
19fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19fc0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
19fd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
19fe0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
19ff0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1a000 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1a010 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1a020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1a030 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1a040 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1a050 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1a060 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1a070 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1a080 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1a090 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1a0a0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1a0b0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1a0c0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1a0d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1a0e0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1a0f0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1a100 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1a110 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1a120 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a130 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1a140 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1a150 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1a160 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1a170 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1a180 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1a190 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1a1a0 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1a1b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a1c0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1a1d0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1a1e0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1a1f0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1a200 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1a210 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1a220 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1a230 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1a240 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1a250 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1a260 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1a270 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1a280 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1a290 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1a2a0 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1a2b0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1a2c0 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1a2d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1a2e0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1a2f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1a300 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1a310 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1a320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1a330 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1a340 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1a350 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1a360 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1a370 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1a380 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1a390 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a3a0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1a3b0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1a3c0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1a3d0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1a3e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1a3f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1a400 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1a410 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1a420 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1a430 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1a440 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1a450 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1a460 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1a470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a480 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1a490 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1a4a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a4b0 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1a4c0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1a4d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1a4e0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1a4f0 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1a500 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1a510 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1a520 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1a530 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1a540 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1a550 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1a560 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1a570 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1a580 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1a590 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1a5a0 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1a5b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1a5c0 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1a5d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1a5e0 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1a5f0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1a600 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1a610 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a620 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1a630 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1a640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a650 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1a660 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1a670 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a680 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1a690 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1a6a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1a6b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1a6c0 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1a6d0 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1a6e0 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1a6f0 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1a700 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1a710 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1a720 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1a730 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1a740 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1a750 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1a760 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1a770 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 66  pPage;.        f
1a780 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1a790 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1a7a0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1a7b0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1a7c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a7d0 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1a7e0 29 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ))) ){.         
1a7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1a800 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1a810 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
1a820 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1a830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a840 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1a850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1a860 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1a870 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1a880 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
1a890 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a8b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a8c0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a8d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a8e0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1a8f0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1a900 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1a910 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1a920 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1a930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a940 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a950 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1a960 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1a970 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a980 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1a990 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1a9a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a9b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a9c0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1a9d0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a9e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
1a9f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1aa00 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1aa10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1aa30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1aa40 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1aa50 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1aa60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa70 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1aa80 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1aa90 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1aaa0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1aab0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1aac0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1aad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1aae0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
1aaf0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
1ab00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1ab10 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1ab20 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1ab30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1ab40 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
1ab50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1ab60 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1ab70 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
1ab80 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
1ab90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1aba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1abb0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
1abc0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64  Move the page id
1abd0 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74  entified by pDat
1abe0 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  a to location pg
1abf0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  no in the file. 
1ac00 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1ac10 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
1ac20 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  es to the curren
1ac30 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20  t page pgno. If 
1ac40 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  current page.** 
1ac50 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
1ac60 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ady in the rollb
1ac70 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
1ac80 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  is not written t
1ac90 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68  here by.** by th
1aca0 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20  is routine. The 
1acb0 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  same applies to 
1acc0 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72  the page pData r
1acd0 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72  efers to on entr
1ace0 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  y to.** this rou
1acf0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
1ad00 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1ad10 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ge refered to by
1ad20 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61   pData remain va
1ad30 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
1ad40 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
1ad50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1ad60 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20  age pData (i.e. 
1ad70 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
1ad80 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
1ad90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
1ada0 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
1adb0 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
1adc0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1add0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
1ade0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1adf0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
1ae00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ae10 61 6c 6c 65 64 2c 20 68 6f 77 65 76 65 72 20 69  alled, however i
1ae20 74 20 69 73 20 0a 2a 2a 20 69 6c 6c 65 67 61 6c  t is .** illegal
1ae30 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f   to call this ro
1ae40 75 74 69 6e 65 20 69 66 20 61 20 73 74 61 74 6d  utine if a statm
1ae50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1ae60 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
1ae70 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  t sqlite3pager_m
1ae80 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
1ae90 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61  Pager, void *pDa
1aea0 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  ta, Pgno pgno){.
1aeb0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1aec0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1aed0 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta);.  PgHdr *pP
1aee0 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a  gOld; .  int h;.
1aef0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
1af00 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
1af10 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
1af20 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
1af30 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1af40 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f  );..  TRACE5("MO
1af50 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
1af60 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
1af70 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
1af80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1af90 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1afa0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
1afb0 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  no);..  if( pPg-
1afc0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1afd0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1afe0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
1aff0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1b000 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
1b010 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
1b020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b030 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1b040 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
1b050 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
1b060 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
1b070 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1b080 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
1b090 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
1b0a0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
1b0b0 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
1b0c0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
1b0d0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
1b0e0 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
1b0f0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
1b100 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
1b110 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
1b120 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
1b130 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
1b140 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
1b150 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
1b160 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
1b170 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
1b180 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
1b190 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1b1a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1b1b0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
1b1c0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
1b1d0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
1b1e0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1b1f0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
1b200 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20  pPgOld->dirty = 
1b210 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  0;.    if( pPgOl
1b220 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
1b230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1b240 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
1b250 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1b260 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1b270 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1b280 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
1b290 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1b2a0 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
1b2b0 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
1b2c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1b2d0 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
1b2e0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
1b2f0 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
1b300 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1b310 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65 72 5f  no;.  h = pager_
1b320 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66  hash(pgno);.  if
1b330 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1b340 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
1b350 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1b360 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
1b370 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1b380 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1b390 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
1b3a0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1b3b0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1b3c0 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
1b3d0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1b3e0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
1b3f0 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74   0;..  pPg->dirt
1b400 79 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  y = 1;.  pPager-
1b410 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1b420 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
1b430 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
1b440 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
1b450 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1b460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b470 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
1b480 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
1b490 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1b4a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
1b4b0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
1b4c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
1b4d0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
1b4e0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
1b4f0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
1b500 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
1b510 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
1b520 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
1b530 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
1b540 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
1b550 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
1b560 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
1b570 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
1b580 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
1b590 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1b5a0 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
1b5b0 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
1b5c0 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c  3pager_get() cal
1b5d0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
1b5e0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
1b5f0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
1b600 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
1b610 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1b620 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
1b630 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b640 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b  void *pNeedSync;
1b650 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b660 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1b670 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b680 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1b690 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
1b6a0 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20   &pNeedSync);.  
1b6b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b6c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b6d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1b6e0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1b6f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1b700 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e  edSync)->needSyn
1b710 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1b720 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1b730 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  nc)->inJournal =
1b740 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1b750 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1b760 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1b770 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1b780 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a  ref(pNeedSync);.
1b790 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b7a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1b7b0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1b7c0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1b7d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b7e0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1b7f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
1b800 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
1b810 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
1b820 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
1b830 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1b840 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
1b850 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
1b860 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
1b870 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
1b880 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
1b890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b8a0 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50  ager_lockstate(P
1b8b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
1b8c0 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20  ifdef OS_TEST.  
1b8d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
1b8e0 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a  d->fd.locktype;.
1b8f0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70  #else.  return p
1b900 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79  Pager->fd.lockty
1b910 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  pe;.#endif.}.#en
1b920 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1b930 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
1b940 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
1b950 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
1b960 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
1b970 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
1b980 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1b990 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
1b9a0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
1b9b0 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
1b9c0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1b9d0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1b9e0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
1b9f0 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
1ba00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
1ba10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ba20 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
1ba30 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
1ba40 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
1ba50 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1ba60 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
1ba70 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.