/ Hex Artifact Content
Login

Artifact bac21a13353a91cf8342e3c5ee7bd89a50e46917:


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 39  : pager.c,v 1.19
0350: 35 20 32 30 30 35 2f 30 33 2f 32 30 20 31 39 3a  5 2005/03/20 19:
0360: 31 30 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a  10:12 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: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1d10: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
1d20: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
1d30: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 73  .  /* pPager->ps
1d40: 41 6c 69 67 6e 65 64 20 62 79 74 65 73 20 6f 66  Aligned bytes of
1d50: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1d60: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1d70: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
1d80: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
1d90: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
1da0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
1db0: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
1dc0: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
1dd0: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1de0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1df0: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1e00: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1e10: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1e20: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1e30: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1e40: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1e50: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1e60: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1e70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
1e80: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
1e90: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
1ea0: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
1eb0: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
1ec0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
1ed0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1ee0: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1ef0: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1f00: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1f10: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1f20: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1f30: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1f40: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1f50: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
1f60: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
1f70: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
1f80: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
1f90: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
1fa0: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
1fb0: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
1fc0: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
1fd0: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
1fe0: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
1ff0: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
2000: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
2010: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
2020: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
2030: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
2040: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
2050: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
2060: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
2070: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
2080: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
2090: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
20a0: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
20b0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
20c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
20d0: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
20e0: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
20f0: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
2100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2110: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
2120: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
2130: 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 29   if( P->xCodec )
2140: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
2150: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
2160: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
2170: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
2180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2190: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
21a0: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
21c0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
21d0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
21e0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
21f0: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
2200: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
2210: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
2220: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
2230: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
2240: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
2250: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
2260: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
2270: 5b 28 50 29 2d 3e 70 73 41 6c 69 67 6e 65 64 5d  [(P)->psAligned]
2280: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
2290: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
22a0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
22b0: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
22c0: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
22d0: 50 47 52 29 2d 3e 70 73 41 6c 69 67 6e 65 64 2b  PGR)->psAligned+
22e0: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
22f0: 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74  ./*.** How big t
2300: 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
2310: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c  table used for l
2320: 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72  ocating in-memor
2330: 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61  y pages.** by pa
2340: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64  ge number..*/.#d
2350: 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20  efine N_PG_HASH 
2360: 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68  2048../*.** Hash
2370: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a   a page number.*
2380: 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  /.#define pager_
2390: 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26  hash(PN)  ((PN)&
23a0: 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a  (N_PG_HASH-1))..
23b0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
23c0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
23d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
23e0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
23f0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  e..*/.struct Pag
2400: 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  er {.  char *zFi
2410: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2420: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2430: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2440: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2450: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2460: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2480: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
2490: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
24a0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
24b0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
24c0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
24d0: 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20  OsFile fd, jfd; 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2500: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
2510: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
2520: 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20  File stfd;      
2530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
2540: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
2550: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
2560: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e  ubjournal*/.  in
2570: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
2580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2590: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
25a0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
25b0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
25c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
25d0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
25e0: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
25f0: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2610: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2620: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2630: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2640: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
2650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2660: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
2670: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
2680: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26b0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
26c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
26d0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
2700: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
2710: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
2720: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
2750: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
2760: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
2770: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
2780: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
2790: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
27a0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
27b0: 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  age */.  void (*
27c0: 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69  xDestructor)(voi
27d0: 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  d*,int); /* Call
27e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
27f0: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
2800: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2810: 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e  initer)(void*,in
2820: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
2830: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2840: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
2850: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2870: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2880: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2890: 0a 20 20 69 6e 74 20 70 73 41 6c 69 67 6e 65 64  .  int psAligned
28a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28b0: 2a 20 70 61 67 65 53 69 7a 65 20 72 6f 75 6e 64  * pageSize round
28c0: 65 64 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69  ed up to a multi
28d0: 70 6c 65 20 6f 66 20 38 20 2a 2f 0a 20 20 69 6e  ple of 8 */.  in
28e0: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
28f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2900: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  al number of in-
2910: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a  memory pages */.
2920: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2940: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
2950: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
2960: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
2970: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2990: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
29a0: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
29b0: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69   in cache */.  i
29c0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20  nt nHit, nMiss, 
29d0: 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61  nOvfl;     /* Ca
29e0: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e  che hits, missin
29f0: 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66  g, and LRU overf
2a00: 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  lows */.  int nR
2a10: 65 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20  ead,nWrite;     
2a20: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2a30: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
2a40: 74 74 65 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tten */.  void (
2a50: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2a60: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
2a70: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
2a80: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
2a90: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
2aa0: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
2ab0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
2ac0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
2ad0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
2ae0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2af0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2b00: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
2b10: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
2b20: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
2b30: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
2b40: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
2b50: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
2b60: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
2b70: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2b80: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
2b90: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2ba0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
2bb0: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd0: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2be0: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2bf0: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
2c00: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2c20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2c30: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2c40: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
2c50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2c60: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
2c70: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
2c80: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
2c90: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
2ca0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
2cb0: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2cc0: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2cd0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2ce0: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2d10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2d20: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2d30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2d40: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2d50: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
2d60: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
2d70: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ess */.  u8 stat
2d80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d90: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
2da0: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
2db0: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2dc0: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2df0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2e00: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
2e10: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2e20: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2e30: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2e40: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2e50: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2e60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2e70: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2e80: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
2e90: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2ea0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2eb0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2ec0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2ed0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2ee0: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2ef0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f00: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
2f10: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2f20: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2f30: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
2f40: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
2f50: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
2f60: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
2f70: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2f80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2f90: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2fa0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a  le I/O */.  u8 *
2fb0: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
2fc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2fd0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2fe0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ff0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
3000: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
3010: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
3020: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
3030: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3040: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
3050: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3060: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
3070: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
3080: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
3090: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
30a0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
30b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
30c0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
30d0: 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  r */.  PgHdr *pF
30e0: 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20  irst, *pLast;   
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
3100: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
3110: 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65  Hdr *pFirstSynce
3120: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d;        /* Fir
3130: 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74  st free page wit
3140: 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  h PgHdr.needSync
3150: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
3160: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
3170: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3180: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
3190: 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20  gHdr *pStmt;    
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
31b0: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
31c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
31d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
31e0: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
31f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
3200: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
3210: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
3220: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
3230: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
3240: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
3250: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
3260: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
3270: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
3280: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
3290: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
32a0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
32b0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
32c0: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
32d0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
32e0: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
32f0: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
3300: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  started */.  int
3310: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
3330: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
3340: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
3350: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73  */.  PgHdr *aHas
3360: 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20  h[N_PG_HASH];   
3370: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74   /* Hash table t
3380: 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  o map page numbe
3390: 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b  r to PgHdr */.};
33a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
33b0: 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20  e bits that can 
33c0: 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e  be set in Pager.
33d0: 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66  errMask..*/.#def
33e0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55  ine PAGER_ERR_FU
33f0: 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20  LL     0x01  /* 
3400: 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64  a write() failed
3410: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
3420: 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30  R_ERR_MEM      0
3430: 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29  x02  /* malloc()
3440: 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69   failed */.#defi
3450: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43  ne PAGER_ERR_LOC
3460: 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65  K     0x04  /* e
3470: 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b  rror in the lock
3480: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ing protocol */.
3490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
34a0: 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20  R_CORRUPT  0x08 
34b0: 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20   /* database or 
34c0: 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
34d0: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  on */.#define PA
34e0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20  GER_ERR_DISK    
34f0: 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61   0x10  /* genera
3500: 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  l disk I/O error
3510: 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76   - bad hard driv
3520: 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  e? */../*.** Jou
3530: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3540: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3550: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3560: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3570: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3580: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3590: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
35a0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
35b0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
35c0: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
35d0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
35e0: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
35f0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3600: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3610: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3620: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3630: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3640: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3650: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3660: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3670: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3680: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3690: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
36a0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
36b0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
36c0: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
36d0: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
36e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
36f0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3700: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3710: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3720: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3730: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3740: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3750: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3760: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3770: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3780: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3790: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
37a0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
37b0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
37c0: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
37d0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
37e0: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
37f0: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3800: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3810: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3820: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3830: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3840: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3850: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3860: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3870: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3880: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3890: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
38a0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
38b0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
38c0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
38d0: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
38e0: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
38f0: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3900: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3910: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3920: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3930: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3940: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3950: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3960: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3970: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3980: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3990: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
39a0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
39b0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
39c0: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
39d0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
39e0: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
39f0: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
3a00: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
3a10: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
3a20: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
3a30: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
3a40: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
3a50: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
3a60: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
3a70: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
3a80: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
3a90: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
3aa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
3ab0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
3ac0: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
3ad0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
3ae0: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
3af0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
3b00: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
3b10: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
3b20: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
3b30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
3b40: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
3b50: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
3b60: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
3b70: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
3b80: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
3b90: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
3ba0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
3bb0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
3bc0: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
3bd0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
3be0: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
3bf0: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
3c00: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
3c10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
3c20: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
3c30: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
3c40: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
3c50: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
3c60: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
3c70: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
3c80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3c90: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
3ca0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
3cb0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
3cc0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3cd0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
3ce0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
3cf0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
3d00: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
3d10: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
3d20: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
3d30: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
3d40: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
3d50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
3d60: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
3d70: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
3d80: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
3d90: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
3da0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3db0: 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  he default size 
3dc0: 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  of a disk sector
3dd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
3de0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31  R_SECTOR_SIZE 51
3df0: 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  2../*.** Page nu
3e00: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
3e10: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
3e20: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
3e30: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
3e40: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
3e50: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
3e60: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
3e70: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
3e80: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
3e90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
3ea0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
3eb0: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
3ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
3ed0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
3ee0: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
3ef0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
3f00: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
3f10: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
3f20: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
3f30: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
3f40: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
3f50: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
3f60: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
3f70: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
3f80: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
3f90: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3fa0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
3fb0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
3fc0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
3fd0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
3fe0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
3ff0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
4000: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
4010: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
4020: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
4030: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
4040: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
4050: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
4060: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
4070: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
4080: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4090: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
40a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
40b0: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
40c0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
40d0: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
40e0: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
40f0: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
4100: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
4110: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
4120: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
4130: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
4140: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
4150: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70  =%d\n",.       p
4160: 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
4170: 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65  _DATA(p), p->nRe
4180: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
4190: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
41a0: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
41b0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
41c0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
41d0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
41e0: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
41f0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
4200: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4210: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
4220: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
4230: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4240: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
4250: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4260: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4270: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4280: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4290: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
42a0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
42b0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
42c0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
42d0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
42e0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
42f0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
4300: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
4310: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4320: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32  32 *pRes){.  u32
4330: 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   res;.  int rc;.
4340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4350: 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73  Read(fd, &res, s
4360: 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69  izeof(res));.  i
4370: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4380: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
4390: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20   char ac[4];.   
43a0: 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73   memcpy(ac, &res
43b0: 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  , 4);.    res = 
43c0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
43d0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
43e0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
43f0: 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65    }.  *pRes = re
4400: 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  s;.  return rc;.
4410: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4420: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4430: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4440: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4450: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4460: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4470: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4480: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4490: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
44a0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
44b0: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
44c0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69  u32 val){.  unsi
44d0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
44e0: 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e  .  ac[0] = (val>
44f0: 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >24) & 0xff;.  a
4500: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
4510: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d   & 0xff;.  ac[2]
4520: 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78   = (val>>8) & 0x
4530: 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61  ff;.  ac[3] = va
4540: 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75  l & 0xff;.  retu
4550: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
4560: 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a  e(fd, ac, 4);.}.
4570: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
4580: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4590: 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70  'val' into the p
45a0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
45b0: 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a  y page header.**
45c0: 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20 27   'p' at offset '
45d0: 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74  offset'..*/.stat
45e0: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62  ic void store32b
45f0: 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48  its(u32 val, PgH
4600: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
4610: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
4620: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
4630: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
4640: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
4650: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61  p))[offset];.  a
4660: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4670: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4680: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4690: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
46a0: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
46b0: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
46c0: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xff;.}../*.** R
46d0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
46e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27  eger at offset '
46f0: 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65  offset' from the
4700: 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
4710: 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64   by.** page head
4720: 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69  er 'p'..*/.stati
4730: 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32  c u32 retrieve32
4740: 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69  bits(PgHdr *p, i
4750: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4760: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4770: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4780: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4790: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
47a0: 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61  et];.  return (a
47b0: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
47c0: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
47d0: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a  <<8) | ac[3];.}.
47e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
47f0: 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
4800: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4810: 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61  into an appropra
4820: 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64  te.** return cod
4830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4840: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50   pager_errcode(P
4850: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
4860: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4870: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
4880: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4890: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20  ER_ERR_LOCK )   
48a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
48b0: 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61  TOCOL;.  if( pPa
48c0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
48d0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20  AGER_ERR_DISK ) 
48e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
48f0: 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67  OERR;.  if( pPag
4900: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4910: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
4920: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
4930: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
4940: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4950: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
4960: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4970: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
4980: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4990: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
49a0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
49b0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
49c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
49d0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
49e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
49f0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4a00: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4a10: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4a20: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4a30: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4a40: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4a50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4a60: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4a70: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4a80: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4a90: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4aa0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4ab0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4ac0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4ad0: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4ae0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4af0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4b00: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4b10: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4b20: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4b30: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4b40: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4b50: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4b60: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4b70: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4b80: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4b90: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4ba0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4bb0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4bc0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4bd0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4be0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4bf0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4c00: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4c10: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4c20: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4c30: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4c40: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4c50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4c60: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4c70: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4c80: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4c90: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4ca0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4cb0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4cc0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4cd0: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
4ce0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4cf0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4d00: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4d10: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4d20: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4d30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4d40: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
4d50: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
4d60: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
4d70: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
4d80: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
4d90: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4da0: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
4db0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
4dc0: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
4dd0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
4de0: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
4df0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
4e00: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
4e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
4e20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4e30: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
4e40: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
4e50: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
4e60: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
4e70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4e80: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
4e90: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
4ea0: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
4eb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
4ec0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
4ed0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
4ee0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4ef0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
4f00: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
4f10: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
4f20: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
4f30: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
4f40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4f50: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
4f60: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
4f70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
4f80: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
4f90: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4fa0: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
4fb0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
4fc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4fd0: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
4fe0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
4ff0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
5000: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5010: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5030: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5040: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5050: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5060: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5070: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5080: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5090: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
50a0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
50b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
50c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
50d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
50e0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
50f0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
5100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5110: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5120: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5130: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5140: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5150: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5160: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5170: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5180: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5190: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
51a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
51b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
51c0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
51d0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
51e0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
51f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
5200: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5210: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5220: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5230: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5240: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5250: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5260: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5270: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5280: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5290: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
52a0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
52b0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
52c0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
52d0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
52e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
52f0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
5300: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5310: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5320: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5330: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5340: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5350: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5360: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5370: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5380: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5390: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
53a0: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
53b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
53c0: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
53d0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
53e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
53f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
5400: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5410: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5420: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5430: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5440: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5450: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5460: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5470: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5480: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5490: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
54a0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
54b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
54c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
54d0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
54e0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
54f0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5540: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5560: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5580: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
55a0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
55b0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
55c0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
55d0: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
55e0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
55f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5600: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5610: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5620: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5630: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5640: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5650: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5660: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5670: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5680: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5690: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
56a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
56b0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
56c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
56d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
56e0: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
56f0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5700: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
5710: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
5720: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
5730: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5740: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5750: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5760: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5770: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5780: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5790: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
57a0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
57b0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
57c0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
57d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
57e0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
57f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5800: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5810: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5820: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5830: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5840: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5850: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5860: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5870: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
5880: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
5890: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
58a0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
58b0: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
58c0: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
58d0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
58e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
58f0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
5900: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
5910: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
5920: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
5930: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
5940: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
5950: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
5960: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
5970: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
5980: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5990: 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  r){..  int rc = 
59a0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
59b0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
59c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
59d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
59e0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
59f0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
5a00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5a10: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
5a20: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
5a30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5a40: 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67  lHdr;.  }.  pPag
5a50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
5a60: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
5a70: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
5a80: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
5a90: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
5aa0: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
5ab0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
5ac0: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
5ad0: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
5ae0: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
5af0: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
5b00: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
5b10: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
5b20: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
5b30: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
5b40: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
5b50: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
5b60: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
5b70: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
5b80: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
5b90: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
5ba0: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
5bb0: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
5bc0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
5bd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
5be0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5bf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
5c00: 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78  e nRec Field. 0x
5c10: 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d  FFFFFFFF for no-
5c20: 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  sync journals. *
5c30: 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
5c40: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5c50: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  jfd, pPager->noS
5c60: 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66  ync ? 0xffffffff
5c70: 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28   : 0);.  }.  if(
5c80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5c90: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e  {.    /* The ran
5ca0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
5cb0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
5cc0: 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d     sqlite3Random
5cd0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
5ce0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
5cf0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
5d00: 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  it);.    rc = wr
5d10: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5d20: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5d30: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a  cksumInit);.  }.
5d40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
5d60: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
5d70: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72  se size */.    r
5d80: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
5d90: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
5da0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
5db0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5dc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5dd0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
5de0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
5df0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  s process */.   
5e00: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5e10: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5e20: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5e30: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
5e40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5e50: 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  r has been writt
5e60: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  en successfully.
5e70: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
5e80: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63  l.  ** file desc
5e90: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e  riptor to the en
5ea0: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
5eb0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
5ec0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
5ed0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5ee0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
5ef0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5f00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
5f10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5f20: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
5f30: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
5f40: 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
5f50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5f60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5f70: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5f80: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5f90: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
5fa0: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
5fb0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
5fc0: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
5fd0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
5fe0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
5ff0: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
6000: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
6010: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
6020: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
6030: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
6040: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
6050: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
6060: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
6070: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
6080: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
6090: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
60a0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
60b0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
60c0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
60d0: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
60e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
60f0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
6100: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
6110: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
6120: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
6130: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
6140: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
6150: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
6160: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6170: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
6180: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
6190: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
61a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
61b0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
61c0: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
61d0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
61e0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
61f0: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
6200: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
6210: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
6220: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
6230: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
6240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6250: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
6260: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6270: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
6280: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
6290: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
62a0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
62b0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
62c0: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
62d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
62e0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
62f0: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
6300: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
6310: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
6320: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6330: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6340: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6350: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
6360: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
6370: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6380: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
6390: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
63a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
63b0: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
63c0: 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
63d0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
63e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
63f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6400: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
6410: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6420: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6430: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6440: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6450: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6460: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
6470: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52  pPager->jfd, pNR
6480: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
6490: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
64a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
64b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
64c0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
64d0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
64e0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
64f0: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
6500: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6510: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6520: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6530: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6540: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6550: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6560: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6570: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6580: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6590: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
65a0: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
65b0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
65c0: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
65d0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
65e0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
65f0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6600: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6610: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6620: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6630: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6640: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
6650: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
6660: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
6670: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
6680: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6690: 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  d, (u32 *)&pPage
66a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
66b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
66c0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
66d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
66e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66f0: 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
6700: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
6710: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
6720: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
6730: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
6740: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
6750: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
6760: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
6770: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6780: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
6790: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
67a0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
67b0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
67c0: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
67d0: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
67e0: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
67f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
6800: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
6810: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
6820: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6830: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
6840: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
6850: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
6860: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
6870: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
6880: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
6890: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
68a0: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
68b0: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
68c0: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
68d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
68e0: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
68f0: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
6900: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
6910: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
6920: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
6930: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
6940: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
6950: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
6960: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
6970: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
6980: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
6990: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  rnal name..*/.st
69a0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
69b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
69c0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
69d0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
69e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
69f0: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
6a00: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
6a10: 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ; ..  if( !zMast
6a20: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
6a30: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
6a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
6a50: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
6a60: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
6a70: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
6a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
6a90: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
6aa0: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
6ab0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
6ac0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
6ad0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
6ae0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
6af0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
6b00: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
6b10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
6b20: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
6b30: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
6b40: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
6b50: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
6b60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
6b70: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
6b80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
6b90: 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a  {.    rc = seekJ
6ba0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6bb0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6bc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6bd0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
6be0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
6bf0: 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72  = (len+20);..  r
6c00: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
6c10: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41  &pPager->jfd, PA
6c20: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
6c30: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
6c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
6c50: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
6c60: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
6c70: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
6c80: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
6c90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6ca0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6cb0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
6cc0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65  &pPager->jfd, le
6cd0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6ce0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6cf0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69   rc;..  rc = wri
6d00: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6d10: 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20  ->jfd, cksum);. 
6d20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6d30: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
6d40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6d50: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
6d60: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
6d70: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6d80: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
6d90: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
6da0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
6db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
6dc0: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
6dd0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
6de0: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
6df0: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
6e00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
6e10: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
6e20: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
6e30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
6e40: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
6e50: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
6e60: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
6e70: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
6e80: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
6e90: 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  _commit().** rou
6ea0: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
6eb0: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
6ec0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
6ed0: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
6ee0: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
6ef0: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
6f00: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
6f10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
6f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
6f30: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
6f40: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
6f50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6f60: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6f70: 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74   if( pPg->inStmt
6f80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
6f90: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
6fa0: 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  tmt==0 && pPg->p
6fb0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
6fc0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
6fd0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
6fe0: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
6ff0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70  pPager->pStmt->p
7000: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
7010: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7020: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
7030: 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Stmt;.  pPager->
7040: 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70  pStmt = pPg;.  p
7050: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  Pg->inStmt = 1;.
7060: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
7070: 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
7080: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
7090: 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67  pPg){.  if( !pPg
70a0: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
70b0: 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  n;.  if( pPg->pP
70c0: 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  revStmt ){.    a
70d0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
70e0: 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74  vStmt->pNextStmt
70f0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
7100: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
7110: 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  xtStmt = pPg->pN
7120: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65  extStmt;.  }else
7130: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7140: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
7150: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
7160: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ->pPager->pStmt 
7170: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
7180: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
7190: 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20  >pNextStmt ){.  
71a0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
71b0: 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53  NextStmt->pPrevS
71c0: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
71d0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
71e0: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
71f0: 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a  >pPrevStmt;.  }.
7200: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7210: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72   = 0;.  pPg->pPr
7220: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  evStmt = 0;.  pP
7230: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d  g->inStmt = 0;.}
7240: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
7250: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
7260: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
7270: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65  page number.  Re
7280: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
7290: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
72a0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
72b0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  nd..*/.static Pg
72c0: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
72d0: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
72e0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
72f0: 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72  gHdr *p = pPager
7300: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
7310: 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69  sh(pgno)];.  whi
7320: 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f  le( p && p->pgno
7330: 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20  !=pgno ){.    p 
7340: 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  = p->pNextHash;.
7350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7360: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
7370: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
7380: 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65   clear the in-me
7390: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69  mory cache.  Thi
73a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74  s routine.** set
73b0: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
73c0: 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
73d0: 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65   what it was whe
73e0: 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a  n it was first.*
73f0: 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f  * opened.  Any o
7400: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
7410: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7420: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
7430: 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61  attempts.** to a
7440: 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65  ccess those page
7450: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  s will likely re
7460: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
7470: 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mp..*/.static vo
7480: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
7490: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
74a0: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
74b0: 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ext;.  for(pPg=p
74c0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
74d0: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
74e0: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
74f0: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
7500: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
7510: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  }.  pPager->pFir
7520: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7530: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7540: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
7550: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
7560: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d  r->pAll = 0;.  m
7570: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
7580: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
7590: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a  Pager->aHash));.
75a0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
75b0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
75c0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
75d0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
75e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
75f0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
7600: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e   }.  sqlite3OsUn
7610: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
7620: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  , NO_LOCK);.  pP
7630: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
7640: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50  GER_UNLOCK;.  pP
7650: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
7660: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  1;.  pPager->nRe
7670: 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  f = 0;.  assert(
7680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7690: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Open==0 );.}../*
76a0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
76b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
76c0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
76d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
76e0: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
76f0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
7700: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
7710: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
7720: 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73  routine releases
7730: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
7740: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
7750: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
7760: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20   in its place.  
7770: 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  The journal.** f
7780: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61  ile is deleted a
7790: 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  nd closed..**.**
77a0: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
77b0: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
77c0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
77d0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
77e0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
77f0: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
7800: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
7810: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
7820: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
7830: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
7840: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
7850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7860: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
7870: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
7880: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
7890: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
78a0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
78b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
78c0: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
78d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
78e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
78f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
7900: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
7910: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7920: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
7930: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7940: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
7950: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
7960: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
7970: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7980: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
7990: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
79a0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
79b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
79c0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
79d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
79e0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
79f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
7a00: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7a10: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
7a20: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
7a30: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
7a40: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7a50: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7a60: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
7a70: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
7a80: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
7a90: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7aa0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69  needSync = 0;.#i
7ab0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
7ac0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
7ad0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
7ae0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
7af0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7b00: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
7b10: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
7b20: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
7b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7b40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
7b50: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
7b60: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
7b70: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72  al==0 );.  }.  r
7b80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  c = sqlite3OsUnl
7b90: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
7ba0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
7bb0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7bc0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
7bd0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
7be0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
7bf0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
7c00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7c10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7c20: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
7c30: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
7c40: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
7c50: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
7c60: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
7c70: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
7c80: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
7c90: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
7ca0: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
7cb0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
7cc0: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
7cd0: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
7ce0: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
7cf0: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
7d00: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
7d10: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
7d20: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
7d30: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
7d40: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
7d50: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
7d60: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
7d70: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
7d80: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
7d90: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
7da0: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
7db0: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
7dc0: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
7dd0: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
7de0: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
7df0: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
7e00: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
7e10: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
7e20: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
7e30: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
7e40: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
7e50: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
7e60: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
7e70: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
7e80: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
7e90: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
7ea0: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
7eb0: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
7ec0: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
7ed0: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
7ee0: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
7ef0: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
7f00: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
7f10: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
7f20: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
7f30: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
7f40: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
7f50: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
7f60: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
7f70: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
7f80: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
7f90: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
7fa0: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
7fb0: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
7fc0: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
7fd0: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
7fe0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
7ff0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8000: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
8010: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
8030: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
8040: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
8050: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
8060: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
8070: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
8080: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
8090: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
80a0: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
80b0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
80c0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
80d0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
80e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
80f0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
8100: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
8110: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
8120: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
8130: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
8140: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
8150: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
8160: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
8170: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
8180: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
8190: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
81a0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
81b0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
81c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
81d0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
81e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
81f0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
8200: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
8210: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
8220: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
8230: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
8240: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
8250: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
8260: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
8270: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
8280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8290: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
82a0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
82b0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
82c0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
82e0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
82f0: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
8300: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
8330: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
8340: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
8350: 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58  aData[SQLITE_MAX
8360: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a  _PAGE_SIZE];  /*
8370: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
8380: 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 72  r a page */..  r
8390: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
83a0: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
83b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
83c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
83d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
83e0: 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70  d(jfd, &aData, p
83f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8400: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8410: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8420: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
8430: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
8440: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
8450: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
8460: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
8470: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
8480: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
8490: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
84a0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
84b0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
84c0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
84d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
84e0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
84f0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
8500: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
8510: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
8520: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
8530: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
8540: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
8550: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
8560: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
8570: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
8580: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
8590: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
85a0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
85b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
85c0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
85d0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
85e0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
85f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
8600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8610: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
8620: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
8630: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
8640: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8650: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
8660: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8670: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
8680: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
8690: 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  er, pgno, aData)
86a0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
86b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
86c0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
86d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
86e0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
86f0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
8700: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
8710: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
8720: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8730: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
8740: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
8750: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
8760: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
8770: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
8780: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
8790: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
87a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
87b0: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
87c0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
87d0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
87e0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
87f0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
8800: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
8810: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
8820: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
8830: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
8840: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
8850: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
8860: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
8870: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
8880: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
8890: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
88a0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
88b0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
88c0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
88d0: 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52  E || pPg );.  TR
88e0: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
88f0: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
8900: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
8910: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
8920: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
8930: 20 3f 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 20   ? &pPager->jfd 
8940: 3a 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  : &pPager->stfd)
8950: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
8960: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8970: 58 43 4c 55 53 49 56 45 20 26 26 20 28 75 73 65  XCLUSIVE && (use
8980: 43 6b 73 75 6d 20 7c 7c 20 21 70 50 67 20 7c 7c  Cksum || !pPg ||
8990: 20 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29   !pPg->needSync)
89a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
89b0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
89c0: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
89d0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
89e0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
89f0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
8a00: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
8a10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8a20: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
8a30: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
8a40: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
8a50: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
8a60: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
8a70: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
8a80: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
8a90: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
8aa0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
8ab0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
8ac0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
8ad0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
8ae0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
8af0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
8b00: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
8b10: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
8b20: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
8b30: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
8b40: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
8b50: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 70  .    ** sqlite3p
8b60: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e  ager_rollback().
8b70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
8b80: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
8b90: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
8ba0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
8bb0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
8bc0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
8bd0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
8be0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
8bf0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
8c00: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
8c10: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
8c20: 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20  or ){  /*** FIX 
8c30: 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73  ME:  Should this
8c40: 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a   be xReinit? ***
8c50: 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
8c60: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
8c70: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
8c80: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
8c90: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8ca0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
8cb0: 56 45 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  VE ){.      pPg-
8cc0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
8cd0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
8ce0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
8cf0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
8d00: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
8d10: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
8d20: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
8d30: 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45 43  .    }.    CODEC
8d40: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
8d50: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
8d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
8d80: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
8d90: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
8da0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8db0: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
8dc0: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
8dd0: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
8de0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8df0: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
8e00: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
8e10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8e20: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
8e30: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
8e40: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8e50: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
8e60: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
8e70: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  s..**.** The mas
8e80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8e90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
8ea0: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
8eb0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
8ec0: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
8ed0: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
8ee0: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
8ef0: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
8f00: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
8f10: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
8f20: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
8f30: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
8f40: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
8f50: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
8f60: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
8f70: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
8f80: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
8f90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
8fa0: 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63  elmaster(const c
8fb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
8fc0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
8fd0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
8fe0: 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b    OsFile master;
8ff0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
9000: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
9010: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
9020: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9030: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
9040: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
9050: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
9060: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
9070: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
9080: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9090: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
90a0: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
90b0: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
90c0: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
90d0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
90e0: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
90f0: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
9100: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  nce..  */.  mems
9110: 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20 73  et(&master, 0, s
9120: 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a  izeof(master));.
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 4d 61  OpenReadOnly(zMa
9150: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a  ster, &master);.
9160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9170: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
9180: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
9190: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
91a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
91b0: 65 53 69 7a 65 28 26 6d 61 73 74 65 72 2c 20 26  eSize(&master, &
91c0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
91d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
91e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
91f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
9200: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
9210: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
9220: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
9230: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
9240: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   0;..    /* Load
9250: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
9260: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9270: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
9280: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
9290: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
92a0: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
92b0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
92c0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
92d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
92e0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
92f0: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
9300: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  l);.    if( !zMa
9310: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9320: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9330: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
9340: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9360: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
9370: 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  master, zMasterJ
9380: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
9390: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
93a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
93b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
93c0: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
93d0: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
93e0: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
93f0: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
9400: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
9410: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
9420: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
9430: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
9440: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
9450: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
9460: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
9470: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
9480: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
9490: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
94a0: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
94b0: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
94c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
94d0: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
94e0: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
94f0: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
9500: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9510: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
9520: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75        OsFile jou
9530: 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  rnal;.        in
9540: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  t c;..        me
9550: 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30  mset(&journal, 0
9560: 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c  , sizeof(journal
9570: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
9580: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
9590: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
95a0: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
95b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
95c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
95d0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
95e0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
95f0: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
9600: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
9610: 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  (&journal, &zMas
9620: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
9630: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
9640: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
9650: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9660: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9670: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9680: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
9690: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
96a0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
96b0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
96c0: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
96d0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
96e0: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
96f0: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
9700: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
9710: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
9720: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
9730: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9740: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
9750: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9760: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
9770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
9780: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
9790: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
97a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
97b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d  lite3OsDelete(zM
97c0: 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74  aster);..delmast
97d0: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
97e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
97f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9800: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9810: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
9820: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
9830: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
9840: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
9850: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9860: 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67  * Make every pag
9870: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61  e in the cache a
9880: 67 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69  gree with what i
9890: 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f  s on disk.  In o
98a0: 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72  ther words,.** r
98b0: 65 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74  eread the disk t
98c0: 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
98d0: 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a  e of the cache..
98e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
98f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
9900: 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e  er a rollback in
9910: 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74   which some of t
9920: 68 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a  he dirty cache.*
9930: 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65  * pages had neve
9940: 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f  r been written o
9950: 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20  ut to disk.  We 
9960: 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  need to roll bac
9970: 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63  k the.** cache c
9980: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65  ontent and the e
9990: 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f  asiest way to do
99a0: 20 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65   that is to rere
99b0: 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65  ad the old conte
99c0: 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20  nt.** back from 
99d0: 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61  the disk..*/.sta
99e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
99f0: 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72  load_cache(Pager
9a00: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
9a10: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
9a20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9a30: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
9a40: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
9a50: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
9a60: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51      char zBuf[SQ
9a70: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
9a80: 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ZE];.    if( !pP
9a90: 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  g->dirty ) conti
9aa0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e  nue;.    if( (in
9ab0: 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
9ac0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
9ad0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
9ae0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
9af0: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
9b00: 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67  geSize*(i64)(pPg
9b10: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
9b20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9b30: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
9b40: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
9b50: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
9b60: 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48   TRACE3("REFETCH
9b70: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
9b80: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
9b90: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
9ba0: 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
9bb0: 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  k;.      CODEC(p
9bc0: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
9bd0: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
9be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
9bf0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61  set(zBuf, 0, pPa
9c00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9c10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9c20: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
9c30: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
9c40: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
9c50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9c60: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
9c70: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
9c80: 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  Pg), zBuf, pPage
9c90: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9ca0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9cb0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
9cc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
9cd0: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
9ce0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
9cf0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9d00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d10: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
9d20: 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
9d30: 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
9d40: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
9d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
9d60: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
9d70: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
9d80: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
9d90: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
9da0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
9db0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
9dc0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
9dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9de0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
9df0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
9e00: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
9e10: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
9e20: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
9e30: 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cated..*/.static
9e40: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
9e50: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
9e60: 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  r, int nPage){. 
9e70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9e80: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9e90: 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72 65 74  CLUSIVE );.  ret
9ea0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75  urn sqlite3OsTru
9eb0: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
9ec0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
9ed0: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
9ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
9ef0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
9f00: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
9f10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9f20: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
9f30: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
9f40: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
9f50: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
9f60: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
9f70: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
9f80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
9f90: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
9fa0: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
9fb0: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
9fc0: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
9fd0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
9fe0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
9ff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
a000: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
a010: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
a020: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
a030: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
a040: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
a050: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
a060: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
a070: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
a080: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
a090: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
a0a0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a0b0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a0c0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
a0d0: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
a0e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
a0f0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
a100: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
a110: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a120: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
a130: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
a140: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
a150: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
a160: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
a170: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
a180: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a190: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
a1a0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
a1b0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
a1c0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
a1d0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
a1e0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
a1f0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
a200: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
a210: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
a220: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a230: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
a240: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
a250: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
a260: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
a270: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
a280: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
a290: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
a2a0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
a2b0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
a2c0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
a2d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
a2e0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
a2f0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
a300: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
a310: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
a320: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
a330: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
a340: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
a350: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
a360: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
a370: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
a380: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
a390: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
a3a0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
a3b0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
a3c0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
a3d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a3e0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
a3f0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
a400: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
a410: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
a420: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
a430: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
a440: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
a450: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
a460: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
a470: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
a480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
a490: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
a4a0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
a4b0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
a4c0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
a4d0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
a4e0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
a4f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
a500: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
a510: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
a520: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
a530: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
a540: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
a550: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
a560: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
a570: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
a590: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
a5a0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
a5b0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
a5c0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
a5d0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
a5e0: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
a5f0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
a600: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
a610: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
a620: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
a630: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
a640: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
a650: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
a660: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
a670: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
a680: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
a690: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
a6a0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
a6b0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
a6c0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
a6d0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
a6e0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
a6f0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
a700: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
a710: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
a720: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
a730: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
a740: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
a750: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
a760: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
a770: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
a780: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a790: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
a7a0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
a7b0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
a7c0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
a7d0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
a7e0: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
a7f0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
a800: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
a810: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
a820: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
a830: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
a840: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
a850: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
a860: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
a870: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
a880: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
a890: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
a8a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
a8b0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
a8c0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
a8d0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
a8e0: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
a8f0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
a900: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
a910: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
a920: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
a930: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
a940: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
a950: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
a960: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
a970: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
a980: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
a990: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
a9a0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9c0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
a9d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
a9e0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
a9f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
aa00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
aa10: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
aa20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
aa30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aa50: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
aa60: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
aa70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
aa80: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
aa90: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
aaa0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
aab0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
aac0: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
aad0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
aae0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
aaf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
ab00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ab10: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
ab20: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
ab30: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
ab40: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
ab50: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
ab60: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
ab70: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
ab80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
ab90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
aba0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
abb0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
abc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
abd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
abe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
abf0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
ac00: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
ac10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ac20: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
ac30: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
ac40: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
ac50: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
ac60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
ac70: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
ac80: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
ac90: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
aca0: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
acb0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
acc0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
acd0: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
ace0: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
acf0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
ad00: 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65 72  rJournal(&pPager
ad10: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
ad20: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
ad30: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ad40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ad50: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
ad60: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
ad70: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
ad80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
ad90: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
ada0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
adb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
adc0: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
add0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
ade0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
adf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
ae00: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
ae10: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
ae20: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
ae30: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
ae40: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
ae50: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
ae60: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
ae70: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
ae80: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
ae90: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
aea0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
aeb0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
aec0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
aed0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
aee0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
aef0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
af00: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
af10: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
af30: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
af40: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
af50: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
af60: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
af70: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
af80: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
af90: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
afa0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
afb0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
afc0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
afd0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
afe0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
aff0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
b000: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
b010: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
b020: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b030: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
b040: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b050: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b060: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b070: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
b080: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
b090: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
b0a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
b0b0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
b0c0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
b0d0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
b0e0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
b0f0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
b100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
b110: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
b120: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
b130: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
b140: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
b150: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
b160: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
b170: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
b180: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
b190: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
b1a0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
b1b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b1c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
b1d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b1e0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
b1f0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
b200: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
b210: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
b220: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
b230: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
b240: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
b250: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
b260: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
b270: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
b280: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
b290: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
b2a0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
b2b0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b2c0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
b2d0: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
b2e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
b2f0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
b300: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
b310: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b320: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
b330: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
b340: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
b350: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
b360: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
b370: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
b380: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
b390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b3a0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b3b0: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
b3c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
b3d0: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
b3e0: 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c  .    /* rc = sql
b3f0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
b400: 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c  er->jfd, JOURNAL
b410: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
b420: 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21  ; */.    if( rc!
b430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b440: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b450: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f    .    /* Copy o
b460: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
b470: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
b480: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
b490: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b4a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
b4b0: 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
b4c0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
b4d0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
b4e0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
b4f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
b500: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
b510: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b520: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b530: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
b540: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b550: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
b560: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b570: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b5a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b5b0: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
b5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b5d0: 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68  }..  /* Pages th
b5e0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  at have been wri
b5f0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
b600: 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79  nal but never sy
b610: 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20  nced.  ** where 
b620: 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20  not restored by 
b630: 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20  the loop above. 
b640: 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74   We have to rest
b650: 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70  ore those.  ** p
b660: 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20  ages by reading 
b670: 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74  them back from t
b680: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
b690: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  base..  */.  ass
b6a0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
b6b0: 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65  OK );.  pager_re
b6c0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
b6d0: 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63  r);..end_playbac
b6e0: 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
b6f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
b700: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
b710: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
b720: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
b730: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
b740: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
b750: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
b760: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
b770: 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a  turn true,.    *
b780: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
b790: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
b7a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
b7b0: 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
b7c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b7d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
b7e0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
b7f0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d  (zMaster);.    }
b800: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
b810: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
b820: 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
b830: 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
b840: 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
b850: 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
b860: 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
b870: 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
b880: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
b890: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
b8a0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
b8b0: 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  E.  ** value. Re
b8c0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
b8d0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
b8e0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
b8f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  */.  pPager->sec
b900: 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f  torSize = PAGER_
b910: 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72  SECTOR_SIZE;.  r
b920: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b930: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
b940: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b950: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
b960: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
b970: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
b980: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
b990: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
b9a0: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
b9b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
b9c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
b9d0: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
b9e0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
b9f0: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
ba00: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
ba10: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
ba20: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
ba30: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
ba40: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
ba50: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
ba60: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
ba70: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
ba80: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
ba90: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
baa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
bab0: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
bac0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
bad0: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
bae0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
baf0: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
bb00: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
bb10: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bb20: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
bb30: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
bb40: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
bb50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bb60: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
bb70: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
bb80: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
bb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
bbb0: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
bbc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bbd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bbe0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
bbf0: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
bc00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
bc10: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
bc20: 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
bc30: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
bc40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
bc50: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
bc60: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
bc70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
bc80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
bc90: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
bca0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
bcb0: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
bcc0: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
bcd0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  to the first jou
bce0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
bcf0: 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74  ten.  ** this st
bd00: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
bd10: 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ion, or the end 
bd20: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
bd30: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
bd40: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
bd50: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
bd60: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
bd70: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
bd80: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
bd90: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
bda0: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
bdb0: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
bdc0: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
bdd0: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
bde0: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
bdf0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
be00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
be10: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
be20: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
be30: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
be40: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
be50: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
be60: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
be70: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
be80: 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  tmtSize;..  /* F
be90: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bea0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
beb0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
bec0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
bed0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bee0: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
bef0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bf00: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
bf10: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
bf20: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
bf30: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
bf40: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
bf50: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
bf60: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
bf70: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
bf80: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
bf90: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
bfa0: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
bfb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
bfc0: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
bfd0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
bfe0: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
bff0: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
c000: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
c010: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
c020: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
c030: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
c040: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
c050: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
c060: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
c070: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
c080: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
c090: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
c0a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
c0b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c0c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
c0d0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
c0e0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
c0f0: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
c100: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
c110: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
c120: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
c130: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
c140: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c150: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
c160: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
c170: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
c180: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
c190: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
c1a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
c1b0: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
c1c0: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
c1d0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
c1e0: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
c1f0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
c200: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
c210: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
c220: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c230: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
c240: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
c250: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
c260: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
c270: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
c280: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
c290: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
c2a0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
c2b0: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
c2c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c2d0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
c2e0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
c2f0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
c300: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
c310: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
c320: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
c330: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
c340: 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28  Cksum;.  assert(
c350: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c360: 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d  pPager)<(pPager-
c370: 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a  >pageSize+8) );.
c380: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
c390: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28  >journalOff <= (
c3a0: 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e  hdrOff-(pPager->
c3b0: 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a  pageSize+8)) ){.
c3c0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c3d0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c3e0: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
c3f0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
c400: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c410: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
c420: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c430: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
c440: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
c450: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
c460: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
c470: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63   ){.    u32 nRec
c480: 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  ;.    u32 dummy;
c490: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
c4a0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
c4b0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75   szJ, &nRec, &du
c4c0: 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
c4d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
c4f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
c500: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
c510: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
c520: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63    }.    if( nRec
c530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ==0 ){.      nRe
c540: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c550: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c560: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
c570: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
c580: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
c590: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
c5a0: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
c5b0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
c5c0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
c5d0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
c5e0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
c5f0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
c600: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
c610: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
c620: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
c630: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
c640: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
c650: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
c660: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
c670: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
c680: 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ck:.  if( rc!=SQ
c690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
c6a0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
c6b0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
c6c0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
c6d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f  LITE_CORRUPT;  /
c6e0: 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a  * bkpt-CORRUPT *
c6f0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
c700: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c710: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
c720: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
c730: 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
c740: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c750: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
c760: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
c770: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
c780: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
c790: 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  llowed..**.** Th
c7a0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
c7b0: 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65   is the absolute
c7c0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78   value of the mx
c7d0: 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  Page parameter..
c7e0: 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  ** If mxPage is 
c7f0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f  negative, the no
c800: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73  Sync flag is als
c810: 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62  o set.  noSync b
c820: 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73  ypasses.** calls
c830: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e   to sqlite3OsSyn
c840: 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20  c().  The pager 
c850: 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72  runs much faster
c860: 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c   with noSync on,
c870: 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f  .** but if the o
c880: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c890: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
c8a0: 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f   is an abrupt po
c8b0: 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c  wer .** failure,
c8c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c8d0: 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  le might be left
c8e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
c8f0: 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70  ent and.** unrep
c900: 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20  airable state.  
c910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c920: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
c930: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
c940: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
c950: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20    if( mxPage>=0 
c960: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
c970: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
c980: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66  tempFile;.    if
c990: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
c9a0: 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
c9b0: 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73  ync = 0; .  }els
c9c0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
c9d0: 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d  oSync = 1;.    m
c9e0: 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b  xPage = -mxPage;
c9f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67  .  }.  if( mxPag
ca00: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
ca10: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
ca20: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
ca30: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
ca40: 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
ca50: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
ca60: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
ca70: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
ca80: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
ca90: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
caa0: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
cab0: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
cac0: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
cad0: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
cae0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
caf0: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
cb00: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
cb10: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
cb20: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
cb30: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
cb40: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
cb50: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
cb60: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
cb70: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
cb80: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
cb90: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
cba0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
cbb0: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
cbc0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
cbd0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
cbe0: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
cbf0: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
cc00: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
cc10: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
cc20: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
cc30: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
cc40: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
cc50: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
cc60: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
cc70: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
cc80: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
cc90: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
cca0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
ccb0: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
ccc0: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
ccd0: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
cce0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
ccf0: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
cd00: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
cd10: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
cd20: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
cd30: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
cd40: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
cd50: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
cd60: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
cd70: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
cd80: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
cd90: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
cda0: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
cdb0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
cdc0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
cdd0: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
cde0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
cdf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
ce00: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
ce10: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
ce20: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
ce30: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
ce40: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
ce50: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
ce60: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
ce70: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
ce80: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
ce90: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
cea0: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
ceb0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
cec0: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
ced0: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
cee0: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
cef0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
cf00: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
cf10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
cf20: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
cf30: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
cf40: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
cf50: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
cf60: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
cf70: 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
cf80: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66  te3pager_set_saf
cf90: 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20  ety_level(Pager 
cfa0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
cfb0: 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  el){.  pPager->n
cfc0: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
cfd0: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
cfe0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
cff0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
d000: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
d010: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
d020: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d030: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
d040: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
d050: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
d060: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
d070: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
d080: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
d090: 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20  zName.** (zName 
d0a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
d0b0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
d0c0: 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67  _SIZE bytes long
d0d0: 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  .)  Write.** the
d0e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d0f0: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
d100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
d110: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
d120: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
d130: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
d140: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
d150: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
d160: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
d170: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
d180: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
d190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
d1a0: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
d1b0: 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c  emp(char *zFile,
d1c0: 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20   OsFile *fd){.  
d1d0: 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69  int cnt = 8;.  i
d1e0: 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20  nt rc;.  do{.   
d1f0: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
d200: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
d210: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
d220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d230: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
d240: 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c   fd, 1);.  }whil
d250: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
d260: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
d270: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
d280: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d290: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
d2a0: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
d2b0: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
d2c0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
d2d0: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
d2e0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
d2f0: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
d300: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
d310: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
d320: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
d330: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
d340: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61  te3pager_get() a
d350: 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
d360: 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
d370: 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
d380: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
d390: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
d3a0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
d3b0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
d3c0: 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
d3d0: 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
d3e0: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
d3f0: 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
d400: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
d410: 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
d420: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
d430: 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
d440: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
d450: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
d460: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
d470: 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66  y:" then all inf
d480: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
d490: 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74   in cache..** It
d4a0: 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
d4b0: 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73  n to disk.  This
d4c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
d4d0: 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20  implement an.** 
d4e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
d4f0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
d500: 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20  e3pager_open(.  
d510: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
d520: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
d530: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
d540: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
d550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d560: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
d570: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d580: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
d590: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5b0: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
d5c0: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
d5d0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
d5e0: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
d5f0: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
d600: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
d610: 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  s file */.){.  P
d620: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
d630: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
d640: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
d650: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
d660: 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   fd;.  int rc = 
d670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
d680: 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
d690: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
d6a0: 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
d6b0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
d6c0: 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
d6d0: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
d6e0: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
d6f0: 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
d700: 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
d710: 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
d720: 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  =0;.  char zTemp
d730: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
d740: 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61  _SIZE];..  *ppPa
d750: 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  ger = 0;.  memse
d760: 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&fd, 0, sizeof
d770: 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  (fd));.  if( sql
d780: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
d790: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
d7a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d7b0: 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61   }.  if( zFilena
d7c0: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
d7d0: 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  0] ){.#ifndef SQ
d7e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
d7f0: 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
d800: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
d810: 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
d820: 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
d830: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
d840: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
d850: 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20  p("");.      rc 
d860: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d870: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
d880: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
d890: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
d8a0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
d8b0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d8c0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
d8d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
d8e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d8f0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
d900: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
d910: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
d920: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
d930: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d940: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
d950: 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20  (zTemp, &fd);.  
d960: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54    zFilename = zT
d970: 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61  emp;.    zFullPa
d980: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
d990: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
d9a0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
d9b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d9c0: 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69   ){.      tempFi
d9d0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
d9e0: 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61  }.  if( !zFullPa
d9f0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  thname ){.    sq
da00: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
da10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
da20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
da30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
da40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
da50: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
da60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
da70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
da80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
da90: 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74  }.  nameLen = st
daa0: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
dab0: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  me);.  pPager = 
dac0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
dad0: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
dae0: 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
daf0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  ;.  if( pPager==
db00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
db10: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
db20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
db30: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
db40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
db50: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43  OMEM;.  }.  TRAC
db60: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
db70: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
db80: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
db90: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  me);.  pPager->z
dba0: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
dbb0: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
dbc0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
dbd0: 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
dbe0: 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b  ilename[nameLen+
dbf0: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
dc00: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
dc10: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d  ->zDirectory[nam
dc20: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70  eLen+1];.  strcp
dc30: 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
dc40: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
dc50: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
dc60: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
dc70: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
dc80: 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65  ;.  for(i=nameLe
dc90: 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  n; i>0 && pPager
dca0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
dcb0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
dcc0: 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
dcd0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
dce0: 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79  1] = 0;.  strcpy
dcf0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
dd00: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
dd10: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
dd20: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
dd30: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
dd40: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
dd50: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
dd60: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
dd70: 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58   fd;.#if OS_UNIX
dd80: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50  .  pPager->fd.pP
dd90: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
dda0: 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
ddb0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
ddc0: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
ddd0: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
dde0: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
ddf0: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
de00: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
de10: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70  && readOnly;.  p
de20: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
de30: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
de40: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
de50: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
de60: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
de70: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
de80: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
de90: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
dea0: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70  T_PAGE_SIZE;.  p
deb0: 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
dec0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
ded0: 4e 54 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  NT(pPager->pageS
dee0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
def0: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
df00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
df10: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
df20: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
df30: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
df40: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
df50: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
df60: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
df70: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
df80: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
df90: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
dfa0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
dfb0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
dfc0: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
dfd0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
dfe0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
dff0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
e000: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
e010: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
e020: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e030: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
e040: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
e050: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
e060: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e070: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
e080: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
e090: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
e0a0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
e0b0: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
e0c0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e0d0: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
e0e0: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
e0f0: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
e100: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
e110: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
e120: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
e130: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
e140: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
e150: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e160: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
e170: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
e180: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
e190: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
e1a0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
e1b0: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
e1c0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
e1d0: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
e1e0: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
e1f0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
e200: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
e210: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
e220: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
e230: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
e240: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
e250: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
e260: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
e270: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
e280: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
e290: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
e2a0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
e2b0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
e2c0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
e2d0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
e2e0: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
e2f0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
e300: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
e310: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
e320: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
e330: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
e340: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
e350: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
e360: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
e370: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
e380: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
e390: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
e3a0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
e3b0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
e3c0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
e3d0: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
e3e0: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
e3f0: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
e400: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
e410: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
e420: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
e430: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
e440: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
e450: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
e460: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
e470: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
e480: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
e490: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
e4a0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
e4b0: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
e4c0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
e4d0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
e4e0: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
e4f0: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
e500: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
e510: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
e520: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
e530: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
e540: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
e550: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
e560: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
e570: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
e580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e590: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
e5a0: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
e5b0: 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68   must only be ch
e5c0: 61 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63  anged when the c
e5d0: 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  ache is empty..*
e5e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
e5f0: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
e600: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e610: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
e620: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
e630: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
e640: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
e650: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50  AGE_SIZE );.  pP
e660: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
e670: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61   pageSize;.  pPa
e680: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d  ger->psAligned =
e690: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
e6a0: 28 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  (pageSize);.}../
e6b0: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
e6c0: 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
e6d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e6e0: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
e6f0: 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
e700: 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
e710: 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
e720: 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76  ng is done..*/.v
e730: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
e740: 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72  _read_fileheader
e750: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e760: 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
e770: 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
e780: 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
e790: 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
e7a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e7b0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
e7c0: 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->fd, 0);.    sq
e7d0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
e7e0: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
e7f0: 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  N);.  }.}../*.**
e800: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
e810: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
e820: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
e830: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e840: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f  th.** pPager..*/
e850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e860: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
e870: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
e880: 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 n;.  assert( p
e890: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
e8a0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
e8b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
e8c0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
e8d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
e8e0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
e8f0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
e900: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e910: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e920: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
e930: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
e940: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61  ;.  }.  n /= pPa
e950: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
e960: 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
e970: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
e980: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e990: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
e9a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e9b0: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
e9c0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
e9d0: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
e9e0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
e9f0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
ea00: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
ea10: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
ea20: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
ea30: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
ea40: 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
ea50: 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
ea60: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
ea70: 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
ea80: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
ea90: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
eaa0: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
eab0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
eac0: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
ead0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76  sqlite3pager_mov
eae0: 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
eaf0: 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
eb00: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
eb10: 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
eb20: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
eb30: 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
eb40: 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
eb50: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
eb60: 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
eb70: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
eb80: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
eb90: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
eba0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
ebb0: 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  umber is zero, t
ebc0: 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
ebd0: 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68   not in any hash
ebe0: 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72   chain. */.    r
ebf0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
ec00: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
ec10: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
ec20: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
ec30: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
ec40: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
ec50: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
ec60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ec70: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
ec80: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21  ash(pPg->pgno)]!
ec90: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
eca0: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
ecb0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
ecc0: 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
ecd0: 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67  .    int h = pag
ece0: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
ecf0: 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
ed00: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
ed10: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
ed20: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
ed30: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
ed40: 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f    }..  pPg->pgno
ed50: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
ed60: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
ed70: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
ed80: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
ed90: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
eda0: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
edb0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
edc0: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
edd0: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
ede0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
edf0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
ee00: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
ee10: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
ee20: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ee30: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
ee40: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
ee50: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
ee60: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
ee70: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
ee80: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
ee90: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
eea0: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
eeb0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
eec0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
eed0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
eee0: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
eef0: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
ef00: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
ef10: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
ef20: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
ef30: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
ef40: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
ef50: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
ef60: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
ef70: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
ef80: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
ef90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
efa0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
efb0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
efc0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
efd0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
efe0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
eff0: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
f000: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
f010: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
f020: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
f030: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f040: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
f050: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
f060: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
f070: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
f080: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
f090: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
f0a0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
f0b0: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
f0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
f0d0: 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
f0e0: 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e  r, pPg);.}..#ifn
f0f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f100: 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54  MEMORYDB./*.** T
f110: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
f120: 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
f130: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
f140: 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a  abase.  Delete.*
f150: 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  * all pages whos
f160: 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72  e pgno is larger
f170: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
f180: 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
f190: 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66  ferenced..** Ref
f1a0: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
f1b0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
f1c0: 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
f1d0: 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oed..*/.static v
f1e0: 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  oid memoryTrunca
f1f0: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
f200: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
f210: 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
f220: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
f230: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
f240: 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
f250: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
f260: 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
f270: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
f280: 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
f290: 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
f2a0: 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
f2b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
f2c0: 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
f2d0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
f2e0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
f2f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f300: 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
f310: 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
f320: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f330: 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
f340: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75  NextAll;.      u
f350: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
f360: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
f370: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
f380: 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
f390: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
f3a0: 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72  #define memoryTr
f3b0: 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66  uncate(p).#endif
f3c0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
f3d0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
f3e0: 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
f3f0: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
f400: 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
f410: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
f420: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
f430: 70 65 61 74 65 20 75 6e 74 69 6c 20 74 68 65 20  peate until the 
f440: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
f450: 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
f460: 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
f470: 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
f480: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f490: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
f4a0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f4b0: 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
f4c0: 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
f4d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
f4e0: 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
f4f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f500: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
f510: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
f520: 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
f530: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
f540: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
f550: 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
f560: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
f570: 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
f580: 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
f590: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
f5a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
f5b0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
f5c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
f5d0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 75  else{.    int bu
f5e0: 73 79 20 3d 20 31 3b 0a 20 20 20 20 42 75 73 79  sy = 1;.    Busy
f5f0: 48 61 6e 64 6c 65 72 20 2a 70 48 3b 0a 20 20 20  Handler *pH;.   
f600: 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
f610: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
f620: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
f630: 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
f640: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
f650: 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 28  SY && .        (
f660: 70 48 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75  pH = pPager->pBu
f670: 73 79 48 61 6e 64 6c 65 72 29 21 3d 30 20 26 26  syHandler)!=0 &&
f680: 20 0a 20 20 20 20 20 20 20 20 70 48 2d 3e 78 46   .        pH->xF
f690: 75 6e 63 20 26 26 20 70 48 2d 3e 78 46 75 6e 63  unc && pH->xFunc
f6a0: 28 70 48 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  (pH->pArg, busy+
f6b0: 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  +).    );.    if
f6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f6d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
f6e0: 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70  >state = locktyp
f6f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
f700: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f710: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
f720: 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
f730: 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
f740: 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
f750: 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
f760: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
f770: 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
f780: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
f790: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
f7a0: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
f7b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
f7c0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
f7d0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
f7e0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
f7f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
f800: 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
f810: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
f820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f830: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
f840: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
f850: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f860: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
f870: 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
f880: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
f890: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
f8a0: 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
f8b0: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
f8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f8d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f8e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
f8f0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
f900: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
f910: 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
f920: 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
f930: 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
f940: 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
f950: 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
f960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f970: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f980: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
f990: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
f9a0: 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
f9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9c0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
f9d0: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
f9e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f9f0: 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
fa00: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
fa10: 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
fa20: 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
fa30: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
fa40: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
fa50: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
fa60: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
fa70: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
fa80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
fa90: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
faa0: 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
fab0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
fac0: 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
fad0: 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
fae0: 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
faf0: 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
fb00: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
fb10: 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
fb20: 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
fb30: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
fb40: 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
fb50: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
fb60: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
fb70: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67  3pager_close(Pag
fb80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
fb90: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
fba0: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  t;.  switch( pPa
fbb0: 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
fbc0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
fbd0: 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
fbe0: 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
fbf0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
fc00: 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
fc10: 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
fc20: 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
fc30: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
fc40: 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
fc50: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
fc60: 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
fc70: 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
fc80: 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
fc90: 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
fca0: 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
fcb0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
fcc0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 28  QLITE_TEST) && (
fcd0: 64 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29  defined(OS_UNIX)
fce0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57   || defined(OS_W
fcf0: 49 4e 29 29 0a 20 20 20 20 20 20 65 78 74 65 72  IN)).      exter
fd00: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
fd10: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
fd20: 20 20 20 20 20 20 69 6e 74 20 69 6f 65 72 72 5f        int ioerr_
fd30: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
fd40: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
fd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f        sqlite3_io
fd60: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
fd70: 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   -1;.#endif.    
fd80: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
fd90: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
fda0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
fdb0: 49 54 45 5f 54 45 53 54 29 20 26 26 20 28 64 65  ITE_TEST) && (de
fdc0: 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c  fined(OS_UNIX) |
fdd0: 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e  | defined(OS_WIN
fde0: 29 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  )).      sqlite3
fdf0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
fe00: 67 20 3d 20 69 6f 65 72 72 5f 63 6e 74 3b 0a 23  g = ioerr_cnt;.#
fe10: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
fe20: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
fe30: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
fe40: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
fe50: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
fe60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fe70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
fe80: 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
fe90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fea0: 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
feb0: 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
fec0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
fed0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
fee0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
fef0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
ff00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ff10: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
ff20: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
ff30: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
ff40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ff50: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
ff60: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
ff70: 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66  =pNext){.#ifndef
ff80: 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20   NDEBUG.    if( 
ff90: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
ffa0: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
ffb0: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
ffc0: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
ffd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
ffe0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
fff0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10000 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
10010 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10020 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
10030 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
10040 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
10050 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
10060 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
10070 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f   }.  TRACE2("CLO
10080 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
10090 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 73 71  D(pPager));.  sq
100a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
100b0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73  ager->fd);.  ass
100c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
100d0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
100e0 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
100f0 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
10100 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
10110 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
10120 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
10130 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
10140 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
10150 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
10160 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  }.  */..  sqlite
10170 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
10180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
101a0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
101b0 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
101c0 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
101d0 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  no sqlite3pager_
101e0 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
101f0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
10200 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
10210 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
10220 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
10230 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
10240 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
10250 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
10260 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
10270 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
10280 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
10290 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
102a0 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
102b0 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
102c0 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
102d0 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
102e0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
102f0 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
10300 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
10310 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
10320 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
10330 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
10340 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
10350 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
10360 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
10370 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
10380 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
10390 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
103a0 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
103b0 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
103c0 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
103d0 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
103e0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
103f0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
10400 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
10410 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
10420 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
10430 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
10440 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
10450 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
10460 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
10470 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10480 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
10490 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
104a0 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
104b0 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
104c0 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
104d0 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
104e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
104f0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
10500 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
10510 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10520 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
10530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
10540 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
10550 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
10560 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
10570 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
10580 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
10590 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
105a0 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
105b0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
105c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
105d0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
105e0 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
105f0 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
10600 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
10610 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
10620 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
10630 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10640 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
10650 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
10660 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
10670 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
10680 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
10690 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
106a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
106b0 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
106c0 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
106d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
106e0 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
106f0 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
10700 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
10710 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
10720 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
10730 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
10740 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
10750 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
10760 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
10770 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
10780 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
10790 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
107a0 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
107b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
107c0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
107d0 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
107e0 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
107f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10800 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
10810 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
10820 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
10830 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
10840 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
10850 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
10860 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
10870 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
10880 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
10890 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
108a0 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
108b0 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
108c0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
108d0 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
108e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
108f0 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
10900 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10910 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
10920 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
10930 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
10940 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
10950 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
10960 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
10970 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
10980 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
10990 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
109a0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
109b0 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
109c0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
109d0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
109e0 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
109f0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
10a00 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
10a10 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
10a20 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
10a30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
10a40 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
10a50 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
10a60 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
10a70 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
10a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
10a90 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
10aa0 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
10ab0 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
10ac0 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
10ad0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
10ae0 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
10af0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
10b00 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
10b10 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
10b20 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
10b30 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
10b40 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
10b50 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
10b60 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
10b70 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
10b80 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63  lure, so sync oc
10b90 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  curs..**.** This
10ba0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
10bb0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
10bc0 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
10bd0 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
10be0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
10bf0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
10c00 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
10c10 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
10c20 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
10c30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
10c40 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
10c50 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
10c60 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
10c70 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
10c80 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
10c90 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
10ca0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
10cb0 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
10cc0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
10cd0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
10ce0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
10cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
10d10 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
10d20 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
10d30 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63  ync ); // noSync
10d40 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66   might be set if
10d50 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20   synchronous.   
10d60 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64     ** was turned
10d70 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74   off after the t
10d80 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
10d90 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20  tarted.  Ticket 
10da0 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20  #615 */.#ifndef 
10db0 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20  NDEBUG.      {. 
10dc0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
10dd0 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e  ure the pPager->
10de0 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20  nRec counter we 
10df0 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65  are keeping agre
10e00 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  es.        ** wi
10e10 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70  th the nRec comp
10e20 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69  uted from the si
10e30 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
10e40 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
10e50 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a  */.        i64 j
10e60 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Sz;.        rc =
10e70 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10e80 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
10e90 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
10ea0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
10eb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
10ec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10ed0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
10ee0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
10ef0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
10f00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
10f10 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
10f20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10f30 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
10f40 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
10f50 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
10f60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
10f70 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
10f80 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
10f90 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
10fa0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
10fb0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
10fc0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
10fd0 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
10fe0 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
10ff0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
11000 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11010 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
11020 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
11030 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
11040 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
11050 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11060 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
11070 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
11080 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
11090 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
110a0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
110b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
110c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
110d0 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
110e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
110f0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
11100 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
11110 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
11120 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
11130 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
11140 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
11150 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11170 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
11180 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
11190 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
111a0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
111b0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
111c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
111d0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
111e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
111f0 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
11200 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
11210 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11220 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
11230 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
11240 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
11250 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
11260 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
11270 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
11280 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
11290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
112a0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
112b0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
112c0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
112d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
112e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
112f0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11300 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
11310 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
11320 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
11330 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
11340 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
11350 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
11360 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
11370 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
11380 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
11390 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
113a0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
113b0 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
113c0 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
113d0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
113e0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
113f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
11400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11410 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
11420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
11430 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11440 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
11450 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
11460 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
11470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
11480 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
11490 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
114a0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
114b0 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
114c0 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
114d0 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
114e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
114f0 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
11500 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
11510 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
11520 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
11530 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
11540 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
11550 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
11560 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
11570 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11580 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
11590 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
115a0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
115b0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
115c0 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
115d0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
115e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
115f0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
11600 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
11610 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
11620 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
11630 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
11640 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
11650 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
11660 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
11670 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
11680 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
11690 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
116a0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
116b0 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
116c0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
116d0 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
116e0 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
116f0 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
11700 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
11710 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
11720 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
11730 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
11740 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
11750 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
11760 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
11770 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
11780 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
11790 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
117a0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
117b0 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
117c0 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
117d0 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
117e0 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
117f0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
11800 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
11810 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
11820 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
11830 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
11840 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
11850 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
11860 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
11870 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11880 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
11890 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
118a0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
118b0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
118c0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
118d0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
118e0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
118f0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
11900 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
11910 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
11920 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11930 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
11940 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
11950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11970 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
11980 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
11990 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
119a0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
119b0 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
119c0 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
119d0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
119e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a 20 49  eSize);.    /* I
119f0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
11a00 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
11a10 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
11a20 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
11a30 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
11a40 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
11a50 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
11a60 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
11a70 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
11a80 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
11a90 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
11aa0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
11ab0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
11ac0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
11ad0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
11ae0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
11af0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
11b00 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
11b10 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
11b20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
11b30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
11b40 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
11b50 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41  o, 6);.      TRA
11b60 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
11b70 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
11b80 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
11b90 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72  ->pgno);.      r
11ba0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11bb0 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
11bc0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
11bd0 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  ist), pPager->pa
11be0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 43  geSize);.      C
11bf0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
11c00 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
11c10 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
11c20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
11c30 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ->nWrite++;.    
11c40 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
11c50 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
11c60 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
11c70 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
11c80 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
11c90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
11ca0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11cb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11cc0 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
11cd0 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
11ce0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
11cf0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
11d00 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
11d10 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
11d20 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
11d30 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
11d40 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
11d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11d60 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
11d70 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
11d80 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
11d90 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
11da0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
11db0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
11dc0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
11dd0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
11de0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
11df0 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
11e00 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
11e10 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
11e20 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
11e30 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11e40 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
11e50 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
11e60 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
11e70 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
11e80 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
11e90 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
11ea0 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
11eb0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
11ec0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11ed0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
11ee0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11ef0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
11f00 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
11f10 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
11f20 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
11f30 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
11f40 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
11f60 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
11f70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11f80 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
11f90 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
11fa0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
11fb0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
11fc0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
11fd0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
11fe0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
11ff0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
12000 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
12010 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
12020 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
12030 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12040 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12050 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
12060 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
12070 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
12080 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
12090 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  al) ) return 0;.
120a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
120b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
120c0 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  (&pPager->fd) ) 
120d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
120e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
120f0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
12100 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12110 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
12120 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
12130 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
12140 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
12150 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
12160 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
12170 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
12180 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
12190 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
121a0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
121b0 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
121c0 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
121d0 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
121e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
121f0 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
12200 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
12210 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
12220 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
12230 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
12240 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
12250 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
12260 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
12270 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
12280 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
12290 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
122a0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
122b0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
122c0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
122d0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
122e0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
122f0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
12300 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
12310 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
12320 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
12330 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
12340 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
12350 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
12360 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
12370 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
12380 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
12390 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
123a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
123b0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
123c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
123d0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
123e0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
123f0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
12400 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
12410 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
12420 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
12430 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
12440 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
12450 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
12460 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
12470 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
12480 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
12490 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
124a0 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
124b0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
124c0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
124d0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
124e0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
124f0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
12500 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
12510 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
12520 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
12530 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
12540 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
12550 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
12560 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
12570 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
12580 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
12590 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
125a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
125b0 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
125c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
125d0 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
125e0 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
125f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
12600 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
12610 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
12620 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
12630 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
12640 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
12650 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
12660 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
12670 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
12680 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
12690 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
126a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
126b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
126c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
126d0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
126e0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
126f0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
12700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12710 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
12720 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
12730 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
12740 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
12750 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
12760 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
12770 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
12780 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
12790 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
127a0 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
127b0 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
127c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
127d0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
127e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
127f0 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
12800 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
12810 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
12820 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
12830 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
12840 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
12850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12890 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
128a0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
128b0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
128c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
128d0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
128e0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
128f0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
12900 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
12910 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
12920 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
12930 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
12940 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
12950 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
12960 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
12970 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12980 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
12990 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
129a0 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
129b0 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
129c0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
129d0 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
129e0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
129f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
12a00 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
12a10 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
12a20 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
12a30 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
12a40 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
12a50 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
12a60 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
12a70 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
12a80 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
12a90 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
12aa0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
12ab0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
12ac0 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
12ad0 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
12ae0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
12af0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
12b00 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
12b10 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
12b20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
12b30 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
12b40 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
12b50 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
12b60 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
12b70 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
12b80 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
12b90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12ba0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
12bb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
12bc0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
12bd0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
12be0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
12bf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12c10 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
12c20 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
12c30 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
12c40 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
12c50 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
12c60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12c70 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
12c80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12c90 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
12ca0 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
12cb0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
12cc0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
12cd0 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
12ce0 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
12cf0 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
12d00 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
12d10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
12d20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
12d30 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12d40 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
12d50 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
12d60 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
12d70 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
12d80 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
12d90 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
12da0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
12db0 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
12dc0 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
12dd0 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
12de0 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
12df0 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
12e00 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
12e10 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
12e20 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
12e30 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
12e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12e50 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
12e60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
12e70 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
12e80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12e90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12ea0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
12eb0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
12ec0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
12ed0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
12ee0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
12ef0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
12f00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
12f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
12f30 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
12f40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
12f50 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
12f60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12f70 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
12f80 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12f90 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  r = 0;.       pP
12fa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12fb0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
12fc0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
12fd0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12fe0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
12ff0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
13000 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
13010 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
13020 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
13030 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
13040 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
13050 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  er);.       if( 
13060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13070 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
13080 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
13090 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b    }.    pPg = 0;
130a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
130b0 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65   Search for page
130c0 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
130d0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
130e0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
130f0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
13100 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
13110 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
13120 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
13130 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
13140 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
13150 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
13160 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
13170 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
13180 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
13190 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
131a0 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
131b0 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
131c0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
131d0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
131e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
131f0 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  0 || MEMDB ){.  
13200 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
13210 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
13220 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
13230 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
13240 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
13250 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20 20  psAligned.      
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
13280 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
13290 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
132c0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
132d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
132e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
132f0 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
13300 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
13310 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
13320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13330 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
13340 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
13350 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
13360 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13380 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
13390 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
133a0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
133b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
133c0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
133d0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
133e0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
133f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13400 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
13410 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
13420 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
13430 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
13440 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
13450 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
13460 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
13470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13480 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
13490 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
134a0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
134b0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
134c0 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
134d0 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
134e0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
134f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13500 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
13510 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
13520 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
13530 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
13540 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
13550 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
13560 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
13570 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13580 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
13590 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
135a0 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
135b0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
135c0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
135d0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
135e0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
135f0 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
13600 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
13610 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13620 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
13630 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
13640 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
13650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13660 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
13670 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
13680 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
13690 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
136a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
136b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
136c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
136d0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
136e0 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
136f0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
13700 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
13710 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
13720 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
13730 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
13740 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
13750 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
13760 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20  al..  ** header 
13770 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
13780 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
13790 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
137a0 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64  ave..  ** alread
137b0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
137c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
137d0 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
137e0 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73  er is..  ** tras
137f0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
13800 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13810 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ed)..          *
13820 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  /.          pPag
13830 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13850 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13860 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
13870 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
13880 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13890 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
138a0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
138b0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
138c0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
138d0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
138e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
138f0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ERR;.          }
13900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13910 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
13920 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
13930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13940 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
13950 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13960 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
13970 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13980 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
13990 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
139a0 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
139b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
139c0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
139d0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
139e0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
139f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
13a00 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
13a10 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
13a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13a40 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
13a50 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
13a60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13a70 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
13a80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13a90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
13aa0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
13ab0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
13ac0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
13ad0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
13ae0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
13af0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
13b00 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
13b10 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
13b20 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
13b30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
13b40 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
13b50 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
13b60 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
13b70 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
13b80 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
13b90 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
13ba0 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
13bb0 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
13bc0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
13bd0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
13be0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
13bf0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
13c00 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
13c10 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
13c20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
13c30 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
13c40 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
13c50 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
13c60 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
13c70 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
13c80 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
13c90 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
13ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13cb0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
13cc0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
13cd0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
13ce0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
13cf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13d00 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
13d10 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
13d20 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
13d30 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
13d40 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  */.      unlinkP
13d50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
13d60 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
13d70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
13d80 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
13d90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
13da0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
13db0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
13dc0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
13dd0 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
13de0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
13df0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
13e00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13e10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13e20 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
13e30 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
13e40 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13e50 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
13e60 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
13e70 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
13e80 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
13e90 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
13ea0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
13eb0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
13ec0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
13ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
13ee0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
13ef0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
13f00 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
13f10 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
13f20 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
13f30 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
13f40 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
13f50 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
13f60 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
13f70 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
13f80 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
13f90 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
13fa0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13fb0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
13fc0 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
13fd0 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
13fe0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
13ff0 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
14000 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
14010 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
14020 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
14030 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
14040 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
14050 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
14060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14070 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
14080 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
14090 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
140a0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
140b0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
140c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
140d0 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
140e0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
140f0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
14100 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
14110 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
14120 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
14130 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask!=0 ){.      
14140 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
14150 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
14160 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
14170 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
14180 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
141a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
141b0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
141c0 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e  pPager)<(int)pgn
141d0 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
141e0 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
141f0 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
14200 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
14220 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72   rc;.      asser
14230 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
14240 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
14250 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
14260 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
14270 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14280 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14290 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
142a0 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
142b0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
142c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
142d0 20 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43      TRACE3("FETC
142e0 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
142f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14300 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
14310 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
14320 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
14330 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
14340 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   3);.      if( r
14350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14360 20 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65          i64 file
14370 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
14380 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
14390 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
143a0 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49  &fileSize)!=SQLI
143b0 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
143c0 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65       || fileSize
143d0 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70  >=pgno*pPager->p
143e0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
143f0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
14400 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
14410 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
14420 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14430 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14440 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
14450 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
14460 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
14470 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
14490 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e{.        pPage
144a0 72 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20  r->nRead++;.    
144b0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
144c0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
144d0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
144e0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
144f0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
14500 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
14510 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
14520 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
14530 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
14540 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74      pPager->nHit
14550 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66  ++;.    page_ref
14560 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
14570 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Page = PGHDR_TO_
14580 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74  DATA(pPg);.  ret
14590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
145a0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
145b0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
145c0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
145d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
145e0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
145f0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
14600 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
14610 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
14620 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
14630 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
14640 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
14650 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
14660 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20  ger_get().  The 
14670 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14680 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
14690 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61  ** and sqlite3pa
146a0 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61  ger_get() is tha
146b0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
146c0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
146d0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
146e0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
146f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
14700 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
14710 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
14720 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
14730 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
14740 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
14750 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
14760 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
14770 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
14780 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50  e3pager_lookup(P
14790 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
147a0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
147b0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
147c0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
147d0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
147e0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
147f0 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50  r->errMask & ~(P
14800 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29  AGER_ERR_FULL) )
14810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
14820 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
14830 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
14840 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
14850 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
14860 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
14870 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  ;.  return PGHDR
14880 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
14890 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
148a0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
148b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
148c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
148d0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
148e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
148f0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
14900 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
14910 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
14920 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
14930 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
14940 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
14950 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
14960 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14970 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
14980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
14990 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a  ger_unref(void *
149a0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
149b0 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72  *pPg;..  /* Decr
149c0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
149d0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
149e0 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70  is page.  */.  p
149f0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
14a00 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  DR(pData);.  ass
14a10 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
14a20 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d   );.  pPg->nRef-
14a30 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  -;.  REFINFO(pPg
14a40 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
14a50 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
14a60 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14a70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
14a80 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
14a90 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
14aa0 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
14ab0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
14ac0 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
14ad0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
14ae0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
14af0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
14b00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
14b10 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
14b20 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
14b30 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
14b40 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
14b50 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
14b60 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
14b70 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
14b80 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
14b90 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
14ba0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
14bb0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14bc0 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
14bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
14be0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
14bf0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14c00 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
14c10 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
14c20 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
14c30 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14c40 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
14c50 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14c60 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
14c70 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
14c80 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
14c90 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
14ca0 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
14cb0 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
14cc0 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
14cd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
14ce0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
14cf0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
14d00 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
14d10 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
14d20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
14d30 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
14d40 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
14d50 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14d60 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
14d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14d80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
14d90 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
14da0 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
14db0 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
14dc0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
14dd0 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
14de0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
14df0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
14e00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14e10 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
14e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14e30 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
14e40 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
14e50 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
14e60 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
14e70 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
14e80 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
14e90 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
14ea0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
14eb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
14ec0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
14ed0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
14ee0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14ef0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
14f00 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
14f10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14f20 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
14f30 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
14f40 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74  urnal );.  sqlit
14f50 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
14f60 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
14f70 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
14f80 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
14f90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
14fa0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
14fb0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
14fd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14fe0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
14ff0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
15000 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15010 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
15020 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
15030 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
15040 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15050 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
15060 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
15070 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
15080 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
15090 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
150a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
150b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
150c0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
150d0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 53 45  ournal;.  }.  SE
150e0 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61 67 65  T_FULLSYNC(pPage
150f0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
15100 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 53 45 54  fullSync);.  SET
15110 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61 67 65 72  _FULLSYNC(pPager
15120 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  ->fd, pPager->fu
15130 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
15140 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
15150 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
15160 74 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a  tory, &pPager->j
15170 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  fd);.  pPager->j
15180 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
15190 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
151a0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
151b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
151c0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
151d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
151e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
151f0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
15200 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
15210 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
15220 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
15230 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
15240 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
15250 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
15260 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
15270 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
15280 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
15290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
152a0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
152b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
152c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
152d0 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
152e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
152f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15300 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
15310 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
15320 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
15330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15350 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
15360 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15370 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
15380 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
15390 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
153a0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
153b0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
153c0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  = 0;.  sqlite3Os
153d0 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
153e0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
153f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15400 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
15410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15420 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
15430 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
15440 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
15450 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
15460 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
15470 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
15480 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
15490 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
154a0 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
154b0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
154c0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
154d0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
154e0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
154f0 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
15500 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
15510 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
15520 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
15530 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
15540 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
15550 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
15560 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
15570 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
15580 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
15590 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
155a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
155b0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
155c0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
155d0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
155e0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
155f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
15600 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
15610 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
15620 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
15630 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
15640 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15650 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
15660 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
15670 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
15680 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
15690 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
156a0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
156b0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
156c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
156d0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
156e0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
156f0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
15700 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
15710 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
15720 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
15730 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
15740 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
15750 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
15760 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
15770 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
15780 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
15790 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
157a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
157b0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
157c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
157d0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
157e0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
157f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
15800 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
15810 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
15820 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
15830 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
15840 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
15850 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
15860 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
15870 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
15880 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
15890 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
158a0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
158b0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
158c0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
158d0 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76  te3pager_begin(v
158e0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
158f0 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72  exFlag){.  PgHdr
15900 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15910 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15920 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15930 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
15940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15950 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
15960 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
15970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
15980 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
15990 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
159a0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
159b0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
159c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
159d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
159e0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
159f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15a00 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
15a10 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
15a20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
15a30 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15a60 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
15a70 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
15a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15ab0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
15ac0 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
15ad0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
15ae0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15af0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
15b00 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
15b10 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
15b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15b30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15b40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15b50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15b60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
15b70 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
15b80 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
15b90 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
15ba0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
15bb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
15bc0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
15bd0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
15be0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
15bf0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
15c00 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
15c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15c30 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
15c40 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
15c50 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
15c60 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15c70 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
15c80 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
15c90 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
15ca0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
15cb0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
15cc0 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
15cd0 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
15ce0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
15cf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15d00 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
15d10 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
15d20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
15d30 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
15d40 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
15d50 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
15d60 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
15d70 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
15d80 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
15d90 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
15da0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
15db0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
15dc0 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
15dd0 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
15de0 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
15df0 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
15e00 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
15e10 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
15e20 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
15e30 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
15e40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
15e50 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
15e60 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
15e70 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
15e80 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
15e90 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
15ea0 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
15eb0 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
15ec0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
15ed0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
15ee0 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
15ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
15f00 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
15f10 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
15f20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
15f30 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
15f40 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
15f50 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
15f60 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15f70 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
15f80 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
15f90 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
15fa0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
15fb0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
15fc0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
15fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15fe0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
15ff0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
16000 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
16010 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  k ){ .    return
16020 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
16030 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
16040 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
16050 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
16060 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
16070 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
16080 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
16090 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
160a0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
160b0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
160c0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
160d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
160e0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
160f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
16100 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
16110 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
16120 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
16130 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
16140 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
16150 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
16160 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
16170 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
16180 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
16190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
161a0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
161b0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
161c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
161d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
161e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
161f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
16200 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
16210 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
16220 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
16230 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
16240 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
16250 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
16260 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
16270 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
16280 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
16290 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
162a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
162b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
162c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
162d0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
162e0 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b  begin(pData, 0);
162f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16320 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16330 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
16340 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
16350 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
16360 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
16370 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
16380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
16390 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
163a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
163b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
163c0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
163d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
163e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
163f0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
16400 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
16410 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
16420 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
16430 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
16440 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
16450 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
16460 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
16470 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
16480 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
16490 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
164a0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
164b0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
164c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
164d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
164e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
164f0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
16500 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
16510 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
16520 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
16530 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
16540 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
16550 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
16560 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
16570 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
16580 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20  Pg;.        u32 
16590 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
165a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
165b0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
165c0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
165d0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
165e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  er);.          T
165f0 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
16600 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
16610 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
16620 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
16630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
16640 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
16650 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
16660 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
16670 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
16680 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
16690 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
166a0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
166b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
166c0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
166d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
166e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
166f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
16700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16710 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
16720 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f  um;.          CO
16730 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
16740 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
16750 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
16760 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
16770 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
16780 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
16790 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
167a0 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
167b0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  RA(pPg, pPager);
167c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
167d0 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
167e0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
167f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
16800 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
16810 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
16820 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
16830 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
16840 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -4);.          
16850 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16860 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
16870 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
16880 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
16890 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
168a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
168b0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
168c0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
168d0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
168e0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
168f0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
16900 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
16910 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
16920 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
16930 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
16940 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
16950 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   0);.          *
16960 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
16970 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
16980 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
16990 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
169a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
169b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
169c0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
169d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
169e0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
169f0 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
16a00 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
16a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16a30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
16a40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16a50 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
16a60 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
16a70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
16a80 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
16a90 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
16aa0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
16ab0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
16ac0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
16ad0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
16ae0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
16af0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
16b00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
16b10 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
16b20 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
16b30 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
16b40 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
16b50 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
16b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16b70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16b80 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
16b90 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
16ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
16bb0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
16bc0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
16bd0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
16be0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
16bf0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
16c00 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16c10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
16c20 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
16c30 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
16c40 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
16c50 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
16c60 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
16c70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16c80 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
16c90 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
16ca0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
16cb0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16cc0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
16cd0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
16ce0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
16cf0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16d00 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
16d10 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
16d20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
16d30 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
16d40 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
16d50 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
16d60 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
16d70 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
16d80 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
16d90 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
16da0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
16db0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
16dc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
16dd0 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
16de0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
16df0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
16e00 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
16e10 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
16e20 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
16e30 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
16e40 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
16e50 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
16e60 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
16e70 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
16e80 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16e90 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
16ea0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
16eb0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
16ec0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
16ed0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
16ee0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16ef0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
16f00 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
16f10 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
16f20 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
16f30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16f40 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
16f50 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
16f60 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
16f70 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
16f80 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
16f90 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
16fa0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
16fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
16fc0 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
16fd0 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
16fe0 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
16ff0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
17000 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
17010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17020 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
17030 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61  stfd,((char*)pDa
17040 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70  ta)-4, pPager->p
17050 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
17060 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
17070 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
17080 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17090 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
170a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
170b0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
170c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
170d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
170e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
170f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
17100 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
17110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
17120 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17130 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
17140 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
17150 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17160 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
17170 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
17180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17190 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
171a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
171b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
171c0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
171d0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
171e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
171f0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
17200 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
17210 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
17220 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
17230 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
17240 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17250 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
17260 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
17270 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
17280 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
17290 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
172a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
172b0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
172c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
172d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
172e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
172f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17300 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
17310 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
17320 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
17330 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
17340 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
17350 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
17360 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
17370 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
17380 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
17390 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
173a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
173b0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
173c0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
173d0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
173e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
173f0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
17400 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
17410 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23  pPg->dirty;.}..#
17420 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17430 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
17440 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
17450 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
17460 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
17470 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
17480 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
17490 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
174a0 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
174b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
174c0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
174d0 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
174e0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
174f0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
17500 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
17510 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
17520 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17540 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
17550 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
17560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
17580 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
17590 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
175a0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
175b0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
175c0 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
175d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
175e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
175f0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
17600 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
17610 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
17620 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
17630 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
17640 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
17650 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
17660 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
17670 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
17680 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
17690 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
176a0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
176b0 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
176c0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
176d0 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
176e0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
176f0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
17700 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
17710 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
17720 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
17730 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
17740 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
17750 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
17760 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
17770 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
17780 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
17790 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
177a0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
177b0 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
177c0 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
177d0 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
177e0 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
177f0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
17800 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
17810 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
17820 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
17830 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
17840 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
17850 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
17860 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
17870 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
17880 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
17890 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
178a0 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
178b0 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
178c0 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
178d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
178e0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
178f0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
17900 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
17910 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
17920 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
17930 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
17940 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
17950 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
17960 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
17970 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
17980 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
17990 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
179a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
179b0 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
179c0 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
179d0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
179e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
179f0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
17a00 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
17a10 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
17a20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
17a30 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
17a40 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
17a50 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
17a60 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
17a70 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
17a80 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
17a90 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
17aa0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
17ab0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
17ac0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
17ad0 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
17ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
17af0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
17b00 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
17b10 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
17b20 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
17b30 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
17b40 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
17b50 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
17b60 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
17b70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
17b80 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
17b90 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
17ba0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
17bb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
17bc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
17bd0 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
17be0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
17bf0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
17c00 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
17c10 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
17c20 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
17c30 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
17c40 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
17c50 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
17c60 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
17c70 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
17c80 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
17c90 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
17ca0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
17cb0 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
17cc0 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
17cd0 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
17ce0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
17cf0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
17d00 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
17d10 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
17d20 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
17d30 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
17d40 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
17d50 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
17d60 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
17d70 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
17d80 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
17d90 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
17da0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
17db0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
17dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
17dd0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
17de0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
17df0 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  , pgno, PAGERID(
17e00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
17e10 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
17e20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
17e30 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
17e40 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
17e50 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
17e60 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
17e70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
17e80 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
17e90 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
17ea0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
17eb0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
17ec0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
17ed0 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
17ee0 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
17ef0 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
17f00 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
17f10 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
17f20 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
17f30 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
17f40 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
17f50 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
17f60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
17f70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
17f80 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
17f90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
17fa0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
17fb0 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
17fc0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
17fd0 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
17fe0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
17ff0 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
18000 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18010 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
18020 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
18030 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
18040 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
18050 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
18060 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
18070 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
18080 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
18090 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
180a0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
180b0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
180c0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
180d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
180e0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
180f0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
18100 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
18110 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
18120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18130 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
18140 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
18150 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
18160 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
18170 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
18180 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
18190 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
181a0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
181b0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
181c0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
181d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
181e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
181f0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
18200 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
18210 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
18220 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
18230 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
18240 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
18250 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
18260 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
18270 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
18280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
18290 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
182a0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
182b0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
182c0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
182d0 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
182e0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
182f0 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  .  }.}...#ifndef
18300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
18310 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ORYDB./*.** Clea
18320 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
18330 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
18340 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
18350 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
18360 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
18370 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
18380 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
18390 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
183a0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
183b0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
183c0 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
183d0 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
183e0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
183f0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
18400 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
18410 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
18420 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
18430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
18440 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
18450 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
18460 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
18470 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
18480 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18490 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
184a0 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
184b0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
184c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
184d0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
184e0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
184f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
18500 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
18510 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
18520 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k==PAGER_ERR_FUL
18530 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  L ){.    rc = sq
18540 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
18550 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
18560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18580 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
18590 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
185a0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
185b0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
185c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
185d0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
185e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
185f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
18600 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
18610 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
18620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
18630 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
18640 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
18650 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18660 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
18670 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
18680 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
18690 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
186a0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
186b0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
186c0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
186d0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
186e0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
186f0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
18700 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
18710 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
18720 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
18730 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
18740 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
18750 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
18760 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
18770 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
18780 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
18790 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
187a0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
187b0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
187c0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
187d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
187e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
187f0 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
18800 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
18810 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
18820 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
18830 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
18840 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
18850 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
18860 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
18870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
18880 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
18890 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
188a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
188b0 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
188c0 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
188d0 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
188e0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
188f0 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
18900 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
18910 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
18920 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
18930 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
18940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18950 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
18960 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
18970 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
18980 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
18990 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
189a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
189b0 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
189c0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
189d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
189e0 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
189f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
18a00 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  c(pPager, 0, 0);
18a10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
18a30 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
18a40 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
18a50 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
18a60 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
18a70 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
18a80 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
18a90 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74  ump here if anyt
18aa0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
18ab0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
18ac0 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  t process..  */.
18ad0 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20  commit_abort:.  
18ae0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
18af0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
18b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18b10 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
18b20 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
18b30 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
18b40 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
18b50 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
18b60 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
18b70 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
18b80 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
18b90 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
18ba0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
18bb0 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
18bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
18bd0 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
18be0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18bf0 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
18c00 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
18c10 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
18c20 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
18c30 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
18c40 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
18c50 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
18c60 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
18c70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
18c80 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
18c90 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
18ca0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
18cb0 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
18cc0 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
18cd0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
18ce0 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
18cf0 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
18d00 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
18d10 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18d20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
18d30 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
18d40 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
18d50 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
18d60 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c  ;.  TRACE2("ROLL
18d70 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
18d80 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
18d90 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18da0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
18db0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
18dc0 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
18dd0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
18de0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
18df0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
18e00 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
18e10 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
18e20 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
18e30 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
18e40 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
18e50 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
18e60 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
18e70 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
18e80 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
18e90 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
18ea0 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
18eb0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
18ec0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18ed0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18ee0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
18ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
18f00 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
18f10 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
18f20 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
18f30 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
18f40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18f50 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f        TRACE3("RO
18f60 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
18f70 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
18f80 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18f90 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
18fa0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
18fb0 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
18fc0 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
18fd0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
18fe0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
18ff0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
19000 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
19010 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
19020 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
19030 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
19040 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
19050 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20   p->pPrevStmt = 
19060 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  p->pNextStmt = 0
19070 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
19080 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
19090 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
190a0 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
190b0 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
190c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
190d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
190e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
190f0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
19100 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19110 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
19120 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
19130 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
19140 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
19150 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
19160 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
19170 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
19180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19190 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
191a0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
191b0 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
191c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
191d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
191e0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
191f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
19200 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
19210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
19220 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
19230 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
19240 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
19250 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
19260 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
19270 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
19280 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
19290 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
192a0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
192b0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
192c0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
192d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
192e0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
192f0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
19300 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
19310 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
19320 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
19330 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
19340 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
19350 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19370 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
19380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
19390 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
193a0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
193b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
193c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
193d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f  LITE_CORRUPT;  /
193e0 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a  * bkpt-CORRUPT *
193f0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  /.    pPager->er
19400 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
19410 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  RR_CORRUPT;.  }.
19420 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19430 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
19440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19450 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
19460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19470 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
19480 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
19490 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
194a0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
194b0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
194c0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
194d0 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  _isreadonly(Page
194e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
194f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
19500 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
19510 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19520 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
19530 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
19540 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
19550 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50  te3pager_stats(P
19560 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19570 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
19580 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
19590 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
195a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
195b0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
195c0 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
195d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
195e0 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
195f0 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
19600 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
19610 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
19620 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
19630 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
19640 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
19650 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61  ager->nOvfl;.  a
19660 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
19670 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
19680 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
19690 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a   return a;.}../*
196a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
196b0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
196c0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
196d0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
196e0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
196f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
19700 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
19710 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
19720 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
19730 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
19740 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
19750 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
19760 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
19770 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
19780 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
19790 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
197a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
197b0 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
197c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
197d0 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
197e0 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
197f0 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  IZE];.  assert( 
19800 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
19810 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
19820 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19830 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  0 );.  TRACE2("S
19840 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
19850 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19860 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
19870 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
19880 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
19890 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
198a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
198b0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
198c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
198d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
198e0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
198f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
19900 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
19910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19920 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
19930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19940 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
19950 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
19960 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
19970 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
19980 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
19990 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
199a0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
199b0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
199c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75  _LOCK);.    retu
199d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
199e0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
199f0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
19a00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
19a10 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
19a20 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
19a30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
19a40 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
19a50 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
19a60 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
19a70 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
19a80 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
19a90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
19aa0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
19ab0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
19ac0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
19ad0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
19ae0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
19af0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
19b00 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
19b10 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
19b20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19b30 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
19b40 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19b50 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
19b60 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  , &pPager->stfd)
19b70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
19b80 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
19b90 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
19ba0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
19bb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
19bc0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
19bd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
19be0 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
19bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
19c00 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
19c10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
19c20 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
19c30 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
19c40 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
19c50 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
19c60 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
19c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
19c80 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
19c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19ca0 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
19cb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
19cc0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
19cd0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
19ce0 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
19cf0 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28  ext;.    TRACE2(
19d00 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
19d10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19d20 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
19d30 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
19d40 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
19d50 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
19d60 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
19d70 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
19d80 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
19d90 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
19da0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
19db0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
19dc0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
19dd0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
19de0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
19df0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
19e00 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
19e10 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
19e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19e30 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
19e40 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
19e50 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
19e60 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
19e70 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
19e80 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
19e90 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
19ea0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
19eb0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19ec0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19ed0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
19ee0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
19ef0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
19f00 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
19f10 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
19f20 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
19f30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
19f40 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
19f50 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
19f60 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
19f70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
19f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19f90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
19fa0 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
19fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19fc0 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
19fd0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
19fe0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
19ff0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1a000 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
1a010 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
1a020 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1a030 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1a040 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1a050 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1a060 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
1a070 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1a080 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53   pPg=pPg->pNextS
1a090 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  tmt){.        Pg
1a0a0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1a0b0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1a0c0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1a0d0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1a0e0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
1a0f0 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
1a100 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
1a110 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
1a120 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1a130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
1a140 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1a150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1a160 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
1a170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a180 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1a190 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1a1a0 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
1a1b0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1a1c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1a1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a1f0 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
1a200 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
1a210 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a220 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1a230 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
1a240 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1a250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1a260 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1a270 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1a280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a290 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1a2a0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1a2b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1a2c0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1a2d0 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e  lite3pager_filen
1a2e0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1a2f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1a300 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
1a310 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a320 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
1a330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a340 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1a350 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1a360 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  dirname(Pager *p
1a370 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1a380 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
1a390 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
1a3a0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
1a3b0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
1a3c0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
1a3d0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1a3e0 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e  e3pager_journaln
1a3f0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
1a400 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1a410 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
1a420 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a430 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
1a440 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
1a450 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
1a460 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
1a470 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
1a480 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1a490 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1a4a0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1a4b0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1a4c0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1a4d0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1a4e0 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1a4f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a500 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1a510 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1a520 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1a530 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1a540 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1a550 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1a560 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1a570 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1a580 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1a590 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
1a5a0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
1a5b0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1a5c0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1a5d0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1a5e0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1a5f0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1a600 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1a610 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1a620 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1a630 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1a640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1a650 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1a660 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1a670 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1a680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a690 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1a6a0 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1a6b0 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1a6c0 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
1a6d0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a6e0 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
1a6f0 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1a700 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1a710 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
1a720 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1a730 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1a740 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1a750 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1a760 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1a770 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68    store32bits(ch
1a780 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50  ange_counter, pP
1a790 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
1a7a0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1a7b0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1a7c0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1a7d0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
1a7e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1a800 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a810 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1a820 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1a830 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1a840 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1a850 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1a860 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1a870 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1a880 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1a890 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1a8a0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1a8b0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1a8c0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1a8d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1a8e0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1a8f0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1a900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a910 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1a920 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1a930 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1a940 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1a950 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1a960 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1a970 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1a980 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1a990 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1a9a0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1a9b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1a9c0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1a9d0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1a9e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a9f0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1aa00 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1aa10 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1aa20 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1aa30 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1aa40 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1aa50 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1aa60 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1aa70 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1aa80 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1aa90 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1aaa0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1aab0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1aac0 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1aad0 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1aae0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1aaf0 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1ab00 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1ab10 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1ab20 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1ab30 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1ab40 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1ab50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1ab60 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1ab70 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1ab80 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1ab90 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1aba0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1abb0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1abc0 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1abd0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1abe0 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1abf0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1ac00 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1ac10 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1ac20 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1ac30 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1ac40 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1ac50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1ac60 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1ac70 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1ac80 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1ac90 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1aca0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1acb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1acc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
1acd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ace0 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1acf0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1ad00 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1ad10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1ad20 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1ad30 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1ad40 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1ad50 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1ad60 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1ad70 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1ad80 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1ad90 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1ada0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1adb0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1adc0 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1add0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1ade0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1adf0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1ae00 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1ae10 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1ae20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1ae30 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1ae40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1ae50 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1ae60 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
1ae70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ae80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1ae90 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
1aea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1aeb0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
1aec0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1aed0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1aee0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1aef0 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1af00 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1af10 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1af20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1af30 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1af40 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1af50 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1af60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1af70 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
1af80 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1af90 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   i;.        void
1afa0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1afb0 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1afc0 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1afd0 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1afe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1aff0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1b000 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1b010 26 37 29 29 29 20 29 7b 0a 20 20 20 20 20 20 20  &7))) ){.       
1b020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b030 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1b040 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, i, &pPage);. 
1b050 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1b060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1b070 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1b080 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1b090 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1b0a0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1b0b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
1b0c0 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1b0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b0e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b0f0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1b100 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b110 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1b120 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1b130 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1b140 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1b150 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
1b160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b170 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1b180 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
1b190 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1b1a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1b1c0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1b1d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b1e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b1f0 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1b200 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1b210 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  = sqlite3pager_t
1b220 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1b230 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
1b240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b250 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1b260 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1b270 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
1b280 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
1b290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b2a0 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
1b2b0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1b2c0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1b2d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1b2e0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1b2f0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1b300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1b310 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
1b320 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
1b330 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1b340 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1b350 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1b360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b370 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
1b380 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  d);.    }..    p
1b390 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1b3a0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1b3b0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1b3c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1b3d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b3e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
1b3f0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
1b400 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
1b410 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
1b420 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
1b430 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1b440 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
1b450 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
1b460 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
1b470 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
1b480 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
1b490 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
1b4a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
1b4b0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
1b4c0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
1b4d0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
1b4e0 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
1b4f0 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
1b500 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
1b510 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
1b520 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
1b530 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1b540 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
1b550 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
1b560 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
1b570 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
1b580 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1b590 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
1b5a0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
1b5b0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
1b5c0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
1b5d0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
1b5e0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
1b5f0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1b600 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
1b610 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
1b620 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
1b630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b640 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
1b650 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
1b660 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
1b670 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1b680 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
1b690 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
1b6a0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
1b6b0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
1b6c0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
1b6d0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
1b6e0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
1b6f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1b700 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
1b710 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1b720 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1b730 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1b740 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1b750 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1b760 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1b770 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1b780 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
1b790 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
1b7a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1b7b0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1b7c0 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
1b7d0 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
1b7e0 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
1b7f0 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
1b800 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1b810 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1b820 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
1b830 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ;..  if( pPg->ne
1b840 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
1b850 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
1b860 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
1b870 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1b880 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
1b890 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
1b8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b8b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1b8c0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1b8d0 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
1b8e0 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
1b8f0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1b900 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
1b910 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1b920 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
1b930 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
1b940 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
1b950 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1b960 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
1b970 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
1b980 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
1b990 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
1b9a0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
1b9b0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
1b9c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1b9d0 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
1b9e0 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
1b9f0 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
1ba00 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
1ba10 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1ba20 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
1ba30 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1ba40 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
1ba50 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
1ba60 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1ba70 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
1ba80 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  Old->dirty = 0;.
1ba90 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
1baa0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1bab0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1bac0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1bad0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1bae0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
1baf0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
1bb00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bb10 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1bb20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
1bb30 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
1bb40 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
1bb50 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
1bb60 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
1bb70 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70  sh-chain. */.  p
1bb80 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1bb90 0a 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  .  h = pager_has
1bba0 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  h(pgno);.  if( p
1bbb0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1bbc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bbd0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
1bbe0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1bbf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1bc00 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1bc10 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
1bc20 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1bc30 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1bc40 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
1bc50 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
1bc60 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
1bc70 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  ..  pPg->dirty =
1bc80 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   1;.  pPager->di
1bc90 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
1bca0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
1bcb0 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
1bcc0 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
1bcd0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1bce0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
1bcf0 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
1bd00 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
1bd10 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
1bd20 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
1bd30 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
1bd40 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
1bd50 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
1bd60 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
1bd70 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
1bd80 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
1bd90 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
1bda0 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
1bdb0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
1bdc0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
1bdd0 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
1bde0 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
1bdf0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1be00 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
1be10 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
1be20 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
1be30 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61  ** The sqlite3pa
1be40 67 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d  ger_get() call m
1be50 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
1be60 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
1be70 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1be80 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
1be90 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1bea0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
1beb0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69   int rc;.    voi
1bec0 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20  d *pNeedSync;.  
1bed0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bee0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1bef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1bf00 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1bf10 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
1bf20 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69  NeedSync);.    i
1bf30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bf40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1bf50 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1bf60 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1bf70 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1bf80 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ync)->needSync =
1bf90 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1bfa0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1bfb0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1bfc0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1bfd0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64  DR(pNeedSync)->d
1bfe0 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71  irty = 1;.    sq
1bff0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1c000 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d  (pNeedSync);.  }
1c010 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1c020 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1c030 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c040 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1c050 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1c060 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1c070 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1c080 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
1c090 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1c0a0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
1c0b0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
1c0c0 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
1c0d0 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
1c0e0 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
1c0f0 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
1c100 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
1c110 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1c120 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  r_lockstate(Page
1c130 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
1c140 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74  ef OS_TEST.  ret
1c150 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  urn pPager->fd->
1c160 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c  fd.locktype;.#el
1c170 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  se.  return pPag
1c180 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  er->fd.locktype;
1c190 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
1c1a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c1b0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
1c1c0 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
1c1d0 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
1c1e0 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
1c1f0 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
1c200 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1c210 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
1c220 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1c230 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
1c240 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1c250 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1c260 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
1c270 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
1c280 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
1c290 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
1c2a0 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
1c2b0 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
1c2c0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
1c2d0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1c2e0 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
1c2f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a                 }.}.#endif.