/ Hex Artifact Content
Login

Artifact 2771a39e242ec549906240196530f00073cfb741:


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 33 36  : pager.c,v 1.36
0350: 31 20 32 30 30 37 2f 30 38 2f 32 30 20 30 35 3a  1 2007/08/20 05:
0360: 33 36 3a 35 31 20 64 61 6e 69 65 6c 6b 31 39 37  36:51 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
0710: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
0720: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65  argument..*/.#de
0730: 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29 20  fine PAGERID(p) 
0740: 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23  ((int)(p->fd)).#
0750: 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c  define FILEHANDL
0760: 45 49 44 28 66 64 29 20 28 28 69 6e 74 29 66 64  EID(fd) ((int)fd
0770: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  )../*.** The pag
0780: 65 20 63 61 63 68 65 20 61 73 20 61 20 77 68 6f  e cache as a who
0790: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
07a0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
07b0: 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a  wing.** states:.
07c0: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e  **.**   PAGER_UN
07d0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68 65 20  LOCK        The 
07e0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f  page cache is no
07f0: 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64  t currently read
0800: 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  ing or .**      
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0830: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
0840: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20  re is no.**     
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d    data held in m
0870: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20  emory.  This is 
0880: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20  the initial.**  
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a       state..**.*
08b0: 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52 45 44  *   PAGER_SHARED
08c0: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
08d0: 20 63 61 63 68 65 20 69 73 20 72 65 61 64 69 6e   cache is readin
08e0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
08f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0900: 20 20 20 20 20 20 20 20 20 57 72 69 74 69 6e 67           Writing
0910: 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
0920: 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62 65  d.  There can be
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70            multip
0950: 6c 65 20 72 65 61 64 65 72 73 20 61 63 63 65 73  le readers acces
0960: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
0970: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
09a0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50   time..**.**   P
09b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
09c0: 20 20 20 54 68 69 73 20 70 72 6f 63 65 73 73 20     This process 
09d0: 68 61 73 20 72 65 73 65 72 76 65 64 20 74 68 65  has reserved the
09e0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 72   database for wr
09f0: 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  iting.**        
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
0a10: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d  ut has not yet m
0a20: 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e  ade any changes.
0a30: 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65    Only one proce
0a40: 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20 61              at a
0a60: 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76   time can reserv
0a70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
0a80: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   The original.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0ab0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
0ac0: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74  n modified so ot
0ad0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0af0: 63 65 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c  cesses may still
0b00: 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
0b10: 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20  on-disk.**      
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
0b40: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58  **.**   PAGER_EX
0b50: 43 4c 55 53 49 56 45 20 20 20 20 20 54 68 65 20  CLUSIVE     The 
0b60: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
0b70: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0b80: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0ba0: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0bb0: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0bc0: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0bf0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0c00: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0c30: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
0c40: 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20     PAGER_SYNCED 
0c50: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 72         The pager
0c60: 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73   moves to this s
0c70: 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f  tate from PAGER_
0c80: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72     after all dir
0cb0: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
0cc0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
0cd0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0ce0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0cf0: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
0d00: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
0d10: 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  ynced to.**     
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74    disk. All that
0d40: 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69   remains to do i
0d50: 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a  s to remove or.*
0d60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d70: 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65          truncate
0d80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
0d90: 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  e and the transa
0da0: 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
0dd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  d..**.** The pag
0de0: 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70  e cache comes up
0df0: 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
0e00: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0e10: 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  e a.** sqlite3Pa
0e20: 67 65 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c  gerGet() occurs,
0e30: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e40: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0e50: 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72  SHARED..** After
0e60: 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
0e70: 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73  been released us
0e80: 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  ing sqlite_page_
0e90: 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20  unref(),.** the 
0ea0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0eb0: 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
0ec0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0ed0: 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20  st time.** that 
0ee0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
0ef0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  e() is called, t
0f00: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0f10: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52  ions to.** PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74  _RESERVED.  (Not
0f30: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61  e that sqlite3Pa
0f40: 67 65 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f  gerWrite() can o
0f50: 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64  nly be.** called
0f60: 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   on an outstandi
0f70: 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65  ng page which me
0f80: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
0f90: 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e  er must.** be in
0fa0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65   PAGER_SHARED be
0fb0: 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69  fore it transiti
0fc0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53  ons to PAGER_RES
0fd0: 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52  ERVED.).** PAGER
0fe0: 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20  _RESERVED means 
0ff0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e  that there is an
1000: 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   open rollback j
1010: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74  ournal..** The t
1020: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47  ransition to PAG
1030: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63  ER_EXCLUSIVE occ
1040: 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63  urs before any c
1050: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
1060: 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
1070: 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20  se file, though 
1080: 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f  writes to the ro
1090: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
10a0: 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75  l occurs with ju
10b0: 73 74 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  st PAGER_RESERVE
10c0: 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  D.  After an sql
10d0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
10e0: 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65  k().** or sqlite
10f0: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1100: 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74  eTwo(), the stat
1110: 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f  e can go back to
1120: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a   PAGER_SHARED,.*
1130: 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79  * or it can stay
1140: 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53   at PAGER_EXCLUS
1150: 49 56 45 20 69 66 20 77 65 20 61 72 65 20 69 6e  IVE if we are in
1160: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
1170: 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69  s mode..*/.#defi
1180: 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  ne PAGER_UNLOCK 
1190: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
11a0: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
11b0: 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   1   /* same as 
11c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SHARED_LOCK */.#
11d0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53  define PAGER_RES
11e0: 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20  ERVED    2   /* 
11f0: 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44  same as RESERVED
1200: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1210: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1220: 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61     4   /* same a
1230: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
1240: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1250: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a  R_SYNCED      5.
1260: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  ./*.** If the SQ
1270: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1280: 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73  ED_LOCK macro is
1290: 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   set to true at 
12a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a  compile-time,.**
12b0: 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74   then failed att
12c0: 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72  empts to get a r
12d0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c  eserved lock wil
12e0: 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  l invoke the bus
12f0: 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54  y callback..** T
1300: 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65  his is off by de
1310: 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77  fault.  To see w
1320: 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  hy, consider the
1330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
1340: 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70  rio:.** .** Supp
1350: 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72  ose thread A alr
1360: 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65  eady has a share
1370: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
1380: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1390: 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c  ..** Thread B al
13a0: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65  ready has a rese
13b0: 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  rved lock and wa
13c0: 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  nts an exclusive
13d0: 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f   lock.  If.** bo
13e0: 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75  th threads are u
13f0: 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20  sing their busy 
1400: 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69  callbacks, it mi
1410: 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69  ght be a long ti
1420: 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65  me.** be for one
1430: 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20   of the threads 
1440: 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f  give up and allo
1450: 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20  ws the other to 
1460: 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20  proceed..** But 
1470: 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72  if the thread tr
1480: 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20  ying to get the 
1490: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69  reserved lock gi
14a0: 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a  ves up quickly.*
14b0: 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69  * (if it never i
14c0: 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20  nvokes its busy 
14d0: 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74  callback) then t
14e0: 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69  he contention wi
14f0: 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65  ll be.** resolve
1500: 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69  d quickly..*/.#i
1510: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53  fndef SQLITE_BUS
1520: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  Y_RESERVED_LOCK.
1530: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1540: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1550: 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 0.#endif../*.
1560: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f  ** This macro ro
1570: 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73  unds values up s
1580: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61  o that if the va
1590: 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73  lue is an addres
15a0: 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61  s it.** is guara
15b0: 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61  nteed to be an a
15c0: 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61  ddress that is a
15d0: 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62  ligned to an 8-b
15e0: 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f  yte boundary..*/
15f0: 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41  .#define FORCE_A
1600: 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28  LIGNMENT(X)   ((
1610: 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a  (X)+7)&~7)../*.*
1620: 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  * Each in-memory
1630: 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65   image of a page
1640: 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
1650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65   following heade
1660: 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65  r..** This heade
1670: 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c  r is only visibl
1680: 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20  e to this pager 
1690: 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69  module.  The cli
16a0: 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74  ent.** code that
16b0: 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65   calls pager see
16c0: 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  s only the data 
16d0: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
16e0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43   header..**.** C
16f0: 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c  lient code shoul
1700: 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  d call sqlite3Pa
1710: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20  gerWrite() on a 
1720: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
1730: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
1740: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
1750: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
1760: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50  st time sqlite3P
1770: 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69  agerWrite().** i
1780: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72  s called, the or
1790: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17a0: 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ents are written
17b0: 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
17c0: 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ck.** journal an
17d0: 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61  d PgHdr.inJourna
17e0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64  l and PgHdr.need
17f0: 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c  Sync are set.  L
1800: 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68  ater, once.** th
1810: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68  e journal page h
1820: 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20  as made it onto 
1830: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
1840: 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  , PgHdr.needSync
1850: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20  .** is cleared. 
1860: 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61   The modified pa
1870: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69  ge cannot be wri
1880: 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
1890: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
18a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
18b0: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  il the journal p
18c0: 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79  ages has been sy
18d0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64  nced to disk and
18e0: 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65   the.** PgHdr.ne
18f0: 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20  edSync has been 
1900: 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  cleared..**.** T
1910: 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66  he PgHdr.dirty f
1920: 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20  lag is set when 
1930: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1940: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  e() is called an
1950: 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20  d.** is cleared 
1960: 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70  again when the p
1970: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77  age content is w
1980: 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
1990: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
19a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
19b0: 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69  .** Details of i
19c0: 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75  mportant structu
19d0: 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a  re elements:.**.
19e0: 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a  ** needSync.**.*
19f0: 2a 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73  *     If this is
1a00: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
1a10: 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  s that it is not
1a20: 20 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74   safe to write t
1a30: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
1a40: 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61  ontent to the da
1a50: 74 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74  tabase because t
1a60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  he original cont
1a70: 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20  ent needed.**   
1a80: 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68    for rollback h
1a90: 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64  as not by synced
1aa0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   to the main rol
1ab0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1ac0: 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e  *     The origin
1ad0: 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68  al content may h
1ae0: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1af0: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1b00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1b10: 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79  but it has not y
1b20: 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  et been synced. 
1b30: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72   So we cannot wr
1b40: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
1b50: 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  ase.**     file 
1b60: 62 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61  because power fa
1b70: 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73  ilure might caus
1b80: 65 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  e the page in th
1b90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1ba0: 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72  *     to never r
1bb0: 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20  each the disk.  
1bc0: 49 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20  It is as if the 
1bd0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1be0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
1bf0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1c00: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1c10: 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1c20: 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20  ..**     .**    
1c30: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61   This flag is fa
1c40: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20  lse if the page 
1c50: 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20  content exactly 
1c60: 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20  matches what.** 
1c70: 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78      currently ex
1c80: 69 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ists in the data
1c90: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
1ca0: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1cb0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c   also.**     fal
1cc0: 73 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e  se if the origin
1cd0: 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  al content has b
1ce0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cf0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
1d00: 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
1d10: 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20  and synced.  If 
1d20: 74 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65  the page represe
1d30: 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74  nts a new page t
1d40: 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62  hat has.**     b
1d50: 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  een added onto t
1d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1d70: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68  tabase during th
1d80: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20  e current.**    
1d90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1da0: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1db0: 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68  is true until th
1dc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1dd0: 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20  ase.**     size 
1de0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  in the journal h
1df0: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73  eader has been s
1e00: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1e10: 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a  *.** inJournal.*
1e20: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73  *.**     This is
1e30: 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69   true if the ori
1e40: 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62  ginal page has b
1e50: 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  een written into
1e60: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20   the main.**    
1e70: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e80: 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61  l.  This is alwa
1e90: 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77  ys false for new
1ea0: 20 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a   pages added to.
1eb0: 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f  **     the end o
1ec0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ed0: 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ile during the c
1ee0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1ef0: 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74  on..**     And t
1f00: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f  his flag says no
1f10: 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74  thing about whet
1f20: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
1f30: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61  ournal.**     ha
1f40: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1f50: 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65   disk.  For page
1f60: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
1f70: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
1f80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c    database file,
1f90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1fa0: 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64  xpression should
1fb0: 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a   always be true:
1fc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a  .**.**       inJ
1fd0: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
1fe0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67  ->aInJournal[(pg
1ff0: 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28  no-1)/8] & (1<<(
2000: 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a  (pgno-1)%8))!=0.
2010: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 70 50  **.**     The pP
2020: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
2030: 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e 6c 79  [] array is only
2040: 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6f   valid for the o
2050: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70  riginal.**     p
2060: 61 67 65 73 20 6f 66 20 74 68 65 20 64 61 74 61  ages of the data
2070: 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61  base, not new pa
2080: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 64 64  ges that are add
2090: 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a  ed to the end.**
20a0: 20 20 20 20 20 6f 66 20 74 68 65 20 64 61 74 61       of the data
20b0: 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73  base, so obvious
20c0: 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65 78 70  ly the above exp
20d0: 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ression cannot b
20e0: 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64 20 66  e.**     valid f
20f0: 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20 20 46  or new pages.  F
2100: 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69 6e 4a  or new pages inJ
2110: 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73  ournal is always
2120: 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a   0..**.** dirty.
2130: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e 20 74  **.**     When t
2140: 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  rue, this means 
2150: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2160: 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73   of the page has
2170: 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64   been.**     mod
2180: 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64 73 20  ified and needs 
2190: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  to be written ba
21a0: 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
21b0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  se file..**     
21c0: 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d 65 61  If false, it mea
21d0: 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 74  ns that either t
21e0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
21f0: 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20  e page is.**    
2200: 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20 65 6c   unchanged or el
2210: 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  se the content i
2220: 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e  s unimportant an
2230: 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20  d we do not.**  
2240: 20 20 20 63 61 72 65 20 77 68 65 74 68 65 72 20     care whether 
2250: 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70 72 65  or not it is pre
2260: 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c  served..**.** al
2270: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a  waysRollback.**.
2280: 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65 61 6e  **     This mean
2290: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
22a0: 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
22b0: 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75 6c 64  ack() API should
22c0: 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72   be.**     ignor
22d0: 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
22e0: 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  .  The DontRollb
22f0: 61 63 6b 28 29 20 41 50 49 20 61 74 74 65 6d 70  ack() API attemp
2300: 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20  ts to say.**    
2310: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2320: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 6e  t of the page on
2330: 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72   disk is unimpor
2340: 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e 0a 2a  tant (it is an.*
2350: 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70 61 67  *     unused pag
2360: 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  e on the freelis
2370: 74 29 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  t) so that it is
2380: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74 6f 20   unnecessary to 
2390: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
23a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73   changes to this
23b0: 20 70 61 67 65 20 62 65 63 61 75 73 65 20 74 68   page because th
23c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23d0: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e   page.**     can
23e0: 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 20   change without 
23f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d 65 61  changing the mea
2400: 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2410: 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20  base.  This.**  
2420: 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69 64 65     flag override
2430: 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61  s any DontRollba
2440: 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20 20 54  ck() attempt.  T
2450: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a  his flag is set.
2460: 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20 70 61  **     when a pa
2470: 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  ge that original
2480: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ly contained val
2490: 69 64 20 64 61 74 61 20 69 73 20 61 64 64 65 64  id data is added
24a0: 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 66   to.**     the f
24b0: 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65 72 20  reelist.  Later 
24c0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  in the same tran
24d0: 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 70 61  saction, this pa
24e0: 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20  ge might.**     
24f0: 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74  be pulled from t
2500: 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2510: 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 74  reused for somet
2520: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
2530: 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74 68 61  *     and at tha
2540: 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74  t point the Dont
2550: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 77  Rollback() API w
2560: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
2570: 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70 61 67  cause.**     pag
2580: 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  es taken from th
2590: 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f  e freelist do no
25a0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 6f  t need to be pro
25b0: 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20 20 20  tected by.**    
25c0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
25d0: 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68 69 73  urnal.  But this
25e0: 20 66 6c 61 67 20 73 61 79 73 20 74 68 61 74 20   flag says that 
25f0: 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
2600: 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c      not original
2610: 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ly part of the f
2620: 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61 74 20  reelist so that 
2630: 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73 20 74  it still needs t
2640: 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c  o.**     be roll
2650: 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
2660: 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71 75 65   of any subseque
2670: 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  nt DontRollback(
2680: 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e  ) calls..**.** n
2690: 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20  eedRead .**.**  
26a0: 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d 65 61     This flag mea
26b0: 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29 20 74  ns (when true) t
26c0: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
26d0: 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73 0a  of the page has.
26e0: 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74 20 62  **     not yet b
26f0: 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20  een loaded from 
2700: 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65  disk.  The in-me
2710: 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69 73 20  mory content is 
2720: 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61 72 62  just.**     garb
2730: 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c  age.  (Actually,
2740: 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e   we zero the con
2750: 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20 73 68  tent, but you sh
2760: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
2770: 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d 70 74  make any assumpt
2780: 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65 20 63  ions about the c
2790: 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68 65 6c  ontent neverthel
27a0: 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a  ess.)  If the.**
27b0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69 73 20       content is 
27c0: 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20 66 75  needed in the fu
27d0: 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 20  ture, it should 
27e0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
27f0: 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e 61 6c  .**     original
2800: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2810: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2820: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
2830: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
2840: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2860: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
2870: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
2880: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
2890: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
28a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
28c0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
28d0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
28e0: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
28f0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
2900: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
2910: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
2920: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
2930: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
2940: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
2950: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
2960: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
2970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2980: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2990: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
29a0: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c0: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
29d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
29e0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
29f0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2a10: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
2a20: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
2a30: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a50: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
2a60: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
2a70: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
2a80: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2a90: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
2aa0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2ab0: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2ac0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2ad0: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af0: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
2b00: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
2b10: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
2b20: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b40: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
2b50: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
2b60: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
2b70: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
2b80: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
2b90: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
2bc0: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
2bd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2be0: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
2bf0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2c00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2c10: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
2c20: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
2c30: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
2c40: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
2c50: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
2c60: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
2c70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
2c80: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
2c90: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
2ca0: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
2cb0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2cc0: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
2cd0: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
2ce0: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
2cf0: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
2d00: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
2d10: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
2d20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
2d30: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
2d40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d50: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
2d60: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
2d70: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
2d80: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
2d90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
2da0: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
2db0: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
2dc0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
2dd0: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
2de0: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
2df0: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
2e00: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
2e10: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
2e20: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
2e30: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
2e40: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
2e50: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
2e60: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2e70: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2e80: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2e90: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2ea0: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2eb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2ec0: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2ed0: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2ee0: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2ef0: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2f00: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
2f10: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
2f20: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
2f30: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
2f40: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
2f50: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
2f60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2f70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2f80: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2f90: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2fa0: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2fb0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2fc0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2fd0: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
3000: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
3010: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
3020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
3030: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
3040: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
3050: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
3060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
3070: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
3080: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
3090: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
30a0: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
30b0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
30c0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
30d0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
30e0: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
30f0: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
3100: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
3110: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
3120: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
3130: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
3140: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
3150: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
3160: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
3170: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
3180: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
3190: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
31a0: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
31b0: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
31c0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
31d0: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
31e0: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
31f0: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
3200: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
3210: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
3220: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
3230: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
3240: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
3250: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
3260: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
3270: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
3280: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
3290: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
32a0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
32b0: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
32c0: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
32d0: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
32e0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
32f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3300: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3310: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
3320: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
3330: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
3340: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
3350: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
3360: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
3370: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
3380: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
3390: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
33a0: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
33b0: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
33c0: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
33d0: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
33e0: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
33f0: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
3400: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
3410: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
3420: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
3430: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
3440: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
3450: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
3460: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
3470: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
3480: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
3490: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
34a0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
34b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
34c0: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
34d0: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
34e0: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
34f0: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
3500: 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger {.  sqlite3_
3510: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
3520: 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69      /* OS functi
3530: 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49  ons to use for I
3540: 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  O */.  u8 journa
3550: 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  lOpen;          
3560: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
3570: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
3580: 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20  iptors is valid 
3590: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
35a0: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
35b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
35c0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
35d0: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
35e0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
35f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3600: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
3610: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
3620: 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f  */.  u8 noReadlo
3630: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
3640: 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
3650: 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64  r to obtain read
3660: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74  locks */.  u8 st
3670: 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  mtOpen;         
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3690: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
36a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  subjournal is op
36b0: 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49  en */.  u8 stmtI
36c0: 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  nUse;           
36d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61      /* True we a
36e0: 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e  re in a statemen
36f0: 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
3700: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74   */.  u8 stmtAut
3710: 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  oopen;          
3720: 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a    /* Open stmt j
3730: 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e  ournal when main
3740: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
3750: 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  ed*/.  u8 noSync
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3770: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
3780: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
3790: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
37a0: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
37b0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
37c0: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
37d0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
37e0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
37f0: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
3800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3810: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
3820: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
3830: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
3840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3850: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
3860: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
3870: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
3880: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3890: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
38a0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
38b0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
38c0: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
38d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
38e0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
38f0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
3900: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3920: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
3930: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
3940: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3950: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3970: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
3980: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
3990: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
39a0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
39b0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
39c0: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
39d0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
39e0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
39f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a00: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3a10: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
3a20: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
3a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3a40: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
3a50: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
3a60: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
3a70: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
3a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
3a90: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
3aa0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
3ab0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
3ac0: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
3ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
3ae0: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
3af0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
3b00: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
3b10: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
3b30: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
3b40: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
3b50: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
3b60: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
3b70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3b80: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
3b90: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
3ba0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
3bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3bc0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
3bd0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
3be0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
3bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3c00: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3c10: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
3c20: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c40: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
3c50: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
3c60: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3c70: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c90: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ca0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
3cb0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
3cc0: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3ce0: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3cf0: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3d00: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
3d10: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d30: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
3d40: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
3d50: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
3d80: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
3d90: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
3da0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3dc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
3dd0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
3de0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e00: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
3e10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3e20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
3e50: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
3e60: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
3e70: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e90: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
3ea0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
3eb0: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
3ec0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ee0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3ef0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
3f00: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a  tabase */.  u8 *
3f10: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
3f20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3f30: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3f40: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3f50: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
3f60: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
3f70: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
3f80: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
3f90: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3fa0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3fb0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3fc0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3fe0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3ff0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
4000: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
4010: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
4020: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
4030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
4040: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
4050: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
4060: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71  al files */.  sq
4070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4080: 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c  *jfd;     /* Fil
4090: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
40a0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
40b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
40c0: 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20  te3_file *stfd; 
40d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
40e0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
40f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4100: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
4110: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
4120: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
4130: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
4140: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67  yHandler */.  Pg
4150: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
4160: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
4170: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
4180: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
4190: 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  stSynced;       
41a0: 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70   /* First free p
41b0: 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e  age with PgHdr.n
41c0: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20  eedSync==0 */.  
41d0: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
41f0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
4200: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
4210: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
4220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
4230: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
4240: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
4250: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
4260: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4270: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
4280: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
4290: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
42b0: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
42c0: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
42d0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
42e0: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
4300: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
4310: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
4320: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
4330: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
4340: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
4350: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
4360: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
4370: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
4380: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
4390: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
43a0: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
43b0: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
43c0: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
43e0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
43f0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
4400: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
4410: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4420: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
4430: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
4440: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
4450: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
4460: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
4480: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
4490: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
44a0: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
44b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
44c0: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
44d0: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
44e0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
44f0: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
4500: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
4510: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
4520: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
4530: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
4540: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
4550: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
4560: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4570: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4590: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
45a0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
45b0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
45c0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
45d0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
45e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
45f0: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
4600: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
4610: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
4620: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
4630: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
4640: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4650: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
4660: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
4670: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
4680: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
4690: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
46a0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
46b0: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
46c0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
46d0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
46e0: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
46f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
4700: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
4710: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
4720: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
4730: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
4740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
4750: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
4760: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
4770: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
4780: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4790: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
47a0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
47b0: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
47c0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
47d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
47e0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
47f0: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4800: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4810: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4820: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4830: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4840: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4850: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4860: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4870: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4890: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
48a0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
48b0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
48c0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
48d0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
48e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
48f0: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4900: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4910: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4920: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4940: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4950: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4960: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4970: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4990: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
49a0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
49b0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
49c0: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
49d0: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
49e0: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
49f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4a00: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
4a10: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
4a20: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
4a30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
4a40: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
4a50: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
4a60: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
4a70: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
4a80: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
4a90: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
4aa0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
4ab0: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
4ac0: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
4ad0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
4ae0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
4af0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
4b00: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
4b10: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
4b20: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
4b30: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
4b40: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
4b50: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
4b60: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
4b70: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
4b80: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
4b90: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
4ba0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
4bb0: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
4bc0: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
4bd0: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
4be0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
4bf0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
4c00: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
4c10: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
4c20: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
4c30: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
4c40: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
4c50: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
4c60: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
4c70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
4c80: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
4c90: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
4ca0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
4cb0: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
4cc0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
4cd0: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
4ce0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
4cf0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
4d00: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
4d10: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
4d20: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
4d30: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
4d40: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
4d50: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
4d60: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
4d70: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
4d80: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
4d90: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
4da0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
4db0: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
4dc0: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
4dd0: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
4de0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
4df0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
4e00: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
4e10: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
4e20: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
4e30: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
4e40: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
4e50: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
4e60: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
4e70: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
4e80: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
4e90: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
4ea0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
4eb0: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
4ec0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4ed0: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
4ee0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
4ef0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
4f00: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
4f10: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
4f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4f30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4f40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
4f50: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
4f60: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
4f70: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
4f80: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
4f90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
4fa0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
4fb0: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
4fc0: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
4fd0: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
4fe0: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
4ff0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5000: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5010: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5020: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5030: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5040: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
5050: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
5060: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
5070: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
5080: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
5090: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
50a0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
50b0: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
50c0: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
50d0: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
50e0: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
50f0: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
5100: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5110: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5120: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5130: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5140: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5150: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
5160: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
5170: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
5180: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
5190: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
51a0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
51b0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
51c0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
51d0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
51e0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
51f0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5200: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5210: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5220: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5230: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5250: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
5260: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
5270: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
5280: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5290: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
52a0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
52b0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
52c0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
52d0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
52e0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
52f0: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
5300: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
5310: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
5320: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
5330: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
5340: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
5350: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
5360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
5370: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
5380: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
5390: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
53a0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
53b0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
53c0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
53d0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
53e0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
53f0: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
5400: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
5410: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
5420: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
5430: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
5440: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
5450: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
5460: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5470: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
5480: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5490: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
54a0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
54b0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
54c0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
54d0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
54e0: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
54f0: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
5500: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
5510: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
5520: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
5530: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
5540: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
5550: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5560: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
5570: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
5580: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
5590: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
55a0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
55b0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
55c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
55d0: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
55e0: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
55f0: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
5600: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
5610: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
5620: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
5630: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
5640: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
5650: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
5660: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
5670: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
5680: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
5690: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
56a0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
56b0: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
56c0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
56d0: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
56e0: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
56f0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
5700: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
5710: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
5720: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
5730: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
5740: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
5750: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
5760: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
5770: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5780: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
5790: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
57a0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
57b0: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
57c0: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
57d0: 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  n PGHDR_TO_HIST(
57e0: 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e  pPg, pPager)->in
57f0: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
5800: 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
5810: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38  Pg->pgno;.    u8
5820: 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49   *a = pPager->aI
5830: 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72  nStmt;.    retur
5840: 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e  n (a && (int)pgn
5850: 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
5860: 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38  ize && (a[pgno/8
5870: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
5880: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  )));.  }.}../*.*
5890: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
58a0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
58b0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
58c0: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
58d0: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
58e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
58f0: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
5900: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
5910: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
5920: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
5930: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
5940: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
5950: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
5960: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
5970: 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d   sizeof(aHash[0]
5980: 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61  )*N );.  if( aHa
5990: 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  sh==0 ){.    /* 
59a0: 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73  Failure to rehas
59b0: 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f  h is not an erro
59c0: 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61  r.  It is only a
59d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
59e0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
59f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5a00: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
5a10: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48  h);.  pPager->nH
5a20: 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65  ash = N;.  pPage
5a30: 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68  r->aHash = aHash
5a40: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
5a50: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
5a60: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
5a70: 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  ){.    int h;.  
5a80: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
5a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
5aa0: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
5ab0: 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
5ac0: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
5ad0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5ae0: 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d    }.    h = pPg-
5af0: 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20  >pgno & (N-1);. 
5b00: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
5b10: 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20  h = aHash[h];.  
5b20: 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29    if( aHash[h] )
5b30: 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d  {.      aHash[h]
5b40: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
5b50: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61  g;.    }.    aHa
5b60: 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
5b70: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
5b80: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
5b90: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
5ba0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
5bb0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
5bc0: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
5bd0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
5be0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
5bf0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
5c00: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
5c10: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
5c20: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
5c30: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5c40: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
5c50: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
5c60: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
5c70: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
5c80: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
5c90: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
5ca0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
5cb0: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
5cc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5cd0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
5ce0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5cf0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
5d00: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
5d10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d20: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
5d30: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
5d40: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
5d50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
5d60: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
5d70: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
5d80: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
5d90: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
5da0: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
5db0: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
5dc0: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
5dd0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
5de0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5df0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
5e00: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
5e10: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
5e20: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
5e30: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
5e40: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
5e50: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
5e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5e70: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
5e80: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
5e90: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
5ea0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
5eb0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
5ec0: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
5ed0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5ee0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
5ef0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
5f00: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
5f10: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
5f20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
5f30: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
5f40: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
5f50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
5f60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5f70: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
5f80: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
5f90: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
5fa0: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
5fb0: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
5fc0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
5fd0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5fe0: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
5ff0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
6000: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
6010: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
6020: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
6030: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
6040: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
6050: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
6060: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
6070: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
6080: 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65  stent. All subse
6090: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
60a0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a  on this Pager.**
60b0: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
60c0: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
60d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
60e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
60f0: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
6100: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
6110: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
6120: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
6130: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
6140: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
6150: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
6160: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
6170: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
6180: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
6190: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
61a0: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
61b0: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
61c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
61d0: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
61e0: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
61f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20  SQLITE_CORRUPT. 
6200: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
6210: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
6220: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6230: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
6240: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
6250: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
6260: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
6270: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
6280: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
6290: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
62a0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
62b0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
62c0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
62d0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
62e0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
62f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
6300: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
6310: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
6320: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
6330: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
6340: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
6350: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
6360: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
6370: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
6380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
6390: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
63a0: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
63b0: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
63c0: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
63d0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
63e0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
63f0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
6400: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6410: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
6420: 61 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20  ageSize, .      
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72    (unsigned char
6450: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
6460: 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPage));.}../*.
6470: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
6480: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
6490: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
64a0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
64b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
64c0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
64d0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
64e0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
64f0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
6500: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
6510: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
6520: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
6530: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
6540: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
6550: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
6560: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
6570: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
6580: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
6590: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
65a0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
65b0: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
65c0: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
65d0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
65e0: 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ode || MEMDB || 
65f0: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
6600: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
6610: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
6620: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
6630: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
6640: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
6650: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
6660: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
6670: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
6680: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
6690: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
66a0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
66b0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
66c0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
66d0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
66e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
66f0: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
6700: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
6710: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
6720: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
6730: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
6740: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
6750: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
6760: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
6770: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
6780: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
6790: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
67a0: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
67b0: 65 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d 61 73  e3_free() *pzMas
67c0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
67d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
67e0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
67f0: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
6800: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
6810: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
6820: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6830: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
6840: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
6850: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
6860: 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  **pzMaster){.  i
6870: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
6880: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75  ;.  i64 szJ;.  u
6890: 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20  32 cksum;.  int 
68a0: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
68b0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
68c0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
68d0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
68e0: 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74  er */..  *pzMast
68f0: 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  er = 0;..  rc = 
6900: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
6910: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a  e(pJrnl, &szJ);.
6920: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6930: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20  _OK || szJ<16 ) 
6940: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6950: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
6960: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
6970: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6980: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6990: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
69a0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
69b0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
69c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
69d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
69e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
69f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
6a00: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
6a10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6a20: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
6a30: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6a40: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
6a50: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
6a60: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
6a70: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6c  ite3MallocZero(l
6a80: 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70  en+1);.  if( !*p
6a90: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  zMaster ){.    r
6aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6ab0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
6ac0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
6ad0: 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c  nl, *pzMaster, l
6ae0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b  en, szJ-16-len);
6af0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6b00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6b10: 74 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74  te3_free(*pzMast
6b20: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
6b30: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
6b40: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
6b50: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
6b60: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
6b70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6b80: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
6b90: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
6ba0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
6bb0: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
6bc0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
6bd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
6be0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
6bf0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
6c00: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
6c10: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
6c20: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
6c30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c40: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
6c50: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
6c60: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
6c70: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
6c80: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
6c90: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
6ca0: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
6cb0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
6cc0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
6cd0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
6ce0: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
6cf0: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
6d00: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
6d10: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d  (*pzMaster)[len]
6d20: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
6d30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6d40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
6d50: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
6d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
6d70: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
6d80: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
6d90: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
6da0: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
6db0: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
6dc0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
6dd0: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
6de0: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
6df0: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
6e00: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
6e10: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
6e20: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
6e30: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
6e40: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6eb0: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6f00: 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75  tic void seekJou
6f10: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
6f20: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
6f30: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
6f40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
6f50: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
6f60: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
6f70: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
6f80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6f90: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
6fa0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
6fb0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
6fc0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
6fd0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
6fe0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
6ff0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
7000: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
7010: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7020: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
7030: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
7040: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
7050: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
7060: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
7070: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7080: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
7090: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
70a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
70b0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
70c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
70d0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
70e0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
70f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
7100: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
7110: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
7120: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
7130: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
7140: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
7150: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
7160: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
7170: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
7180: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
7190: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
71a0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
71b0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
71c0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
71d0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
71e0: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
71f0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
7200: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
7210: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
7220: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
7230: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
7240: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
7250: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
7260: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
7270: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
7280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
7290: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
72a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
72b0: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
72c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
72d0: 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  )+16];.  int rc;
72e0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
72f0: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
7300: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
7310: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
7320: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
7330: 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  }..  seekJournal
7340: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  Hdr(pPager);.  p
7350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
7360: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
7370: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 46 49  nalOff;..  /* FI
7380: 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  X ME: .  **.  **
7390: 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20   Possibly for a 
73a0: 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d  pager not in no-
73b0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  sync mode, the j
73c0: 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f  ournal magic sho
73d0: 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
73e0: 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52  written until nR
73f0: 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  ec is filled in 
7400: 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20  as part of next 
7410: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a  syncJournal(). .
7420: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
7430: 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f  ly maybe the who
7440: 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  le journal heade
7450: 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61  r should be dela
7460: 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20  yed until that. 
7470: 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b   ** point. Think
7480: 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a   about this..  *
7490: 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  /.  memcpy(zHead
74a0: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
74b0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
74c0: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20  alMagic));.  /* 
74d0: 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20  The nRec Field. 
74e0: 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e  0xFFFFFFFF for n
74f0: 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e  o-sync journals.
7500: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7510: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7520: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7530: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
7540: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
7550: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  );.  /* The rand
7560: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
7570: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
7580: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
7590: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
75a0: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
75b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
75c0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
75d0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
75e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
75f0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7600: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
7610: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
7620: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
7630: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7640: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7650: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
7660: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
7670: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
7680: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
7690: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
76a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
76b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
76c0: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
76d0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49  sectorSize);.  I
76e0: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
76f0: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
7700: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
7710: 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28  rnalHdr, sizeof(
7720: 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20  zHeader))).  rc 
7730: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7740: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
7750: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
7760: 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a  eader),pPager->j
7770: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50  ournalOff);.  pP
7780: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7790: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
77a0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
77b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
77c0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
77d0: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
77e0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
77f0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
7800: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
7810: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
7820: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
7830: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
7840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7850: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41     IOTRACE(("JTA
7860: 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  IL %p %lld\n", p
7870: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
7880: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20  ournalOff-1)).  
7890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
78a0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
78b0: 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50  d, "\000", 1, pP
78c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
78d0: 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  -1);.  }.  retur
78e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
78f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7900: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
7910: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
7920: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
7930: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
7940: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
7950: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
7960: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
7970: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
7980: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
7990: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
79a0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
79b0: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
79c0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
79d0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
79e0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
79f0: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
7a00: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
7a10: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
7a20: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
7a30: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
7a40: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
7a50: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
7a60: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
7a70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7a80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
7a90: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
7aa0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
7ab0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
7ac0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
7ad0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
7ae0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
7af0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7b00: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
7b10: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
7b20: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
7b30: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
7b40: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
7b50: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
7b60: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
7b70: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
7b80: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
7b90: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
7ba0: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
7bb0: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
7bc0: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
7bd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7be0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
7bf0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
7c00: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
7c10: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
7c20: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
7c30: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
7c40: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
7c50: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
7c60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
7c70: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7c80: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7c90: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7ca0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7cb0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20  i64 jrnlOff;..  
7cc0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
7cd0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7ce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7cf0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
7d00: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
7d10: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
7d20: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7d30: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
7d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7d50: 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  Off;..  rc = sql
7d60: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
7d70: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
7d80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
7d90: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
7da0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7db0: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a    jrnlOff += siz
7dc0: 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20  eof(aMagic);..  
7dd0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
7de0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
7df0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
7e00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
7e10: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7e20: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
7e30: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7e40: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52  fd, jrnlOff, pNR
7e50: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
7e60: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7e70: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7e80: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7e90: 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63  ff+4, &pPager->c
7ea0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
7eb0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7ec0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7ed0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7ee0: 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53   jrnlOff+8, pDbS
7ef0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
7f00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
7f10: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
7f20: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
7f30: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
7f40: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
7f50: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
7f60: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
7f70: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
7f80: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
7f90: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
7fa0: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
7fb0: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
7fc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
7fd0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
7fe0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
7ff0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
8000: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
8010: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
8020: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
8030: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8040: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
8050: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
8060: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8070: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32  >jfd, jrnlOff+12
8080: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
8090: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
80a0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
80b0: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
80c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
80d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
80e0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
80f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
8100: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
8110: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
8120: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
8130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8140: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
8150: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
8160: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
8170: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8180: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
8190: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
81a0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
81b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
81c0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
81d0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
81e0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
81f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8200: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
8210: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
8220: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
8230: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
8240: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
8250: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
8260: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
8270: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
8280: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
8290: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
82a0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
82b0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
82c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
82d0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
82e0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
82f0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
8300: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8310: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
8320: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
8330: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
8340: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
8350: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
8360: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
8370: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
8380: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
8390: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
83a0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
83b0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
83c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
83d0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
83e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
83f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
8400: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8410: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
8420: 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72  int i; .  i64 jr
8430: 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73  nlOff;.  u32 cks
8440: 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  um = 0;.  char z
8450: 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  Buf[sizeof(aJour
8460: 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a  nalMagic)+2*4];.
8470: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
8480: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
8490: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
84a0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
84b0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
84c0: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
84d0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
84e0: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
84f0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
8500: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
8510: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
8520: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
8530: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
8540: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
8550: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
8560: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8570: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
8580: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
8590: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
85a0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
85b0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
85c0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
85d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
85e0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
85f0: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
8600: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
8610: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
8620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
8630: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8640: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
8650: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
8660: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8670: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
8680: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
8690: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
86a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
86b0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
86c0: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
86d0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
86e0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
86f0: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
8700: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8710: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8720: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
8730: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
8740: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
8750: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
8760: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
8770: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
8780: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
8790: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
87a0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
87b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
87c0: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
87d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
87e0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
87f0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8800: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
8810: 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sync;.  return r
8820: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
8830: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
8840: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
8850: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
8860: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
8870: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8880: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
8890: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
88a0: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
88b0: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
88c0: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
88d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
88e0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
88f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
8900: 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  tCommit().** rou
8910: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
8920: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
8930: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8940: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
8950: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
8960: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
8970: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
8980: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
8990: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
89a0: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
89b0: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
89c0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
89d0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
89e0: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
89f0: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
8a00: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
8a10: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20    assert( MEMDB 
8a20: 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d  );.  if( !pHist-
8a30: 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  >inStmt ){.    a
8a40: 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50  ssert( pHist->pP
8a50: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48  revStmt==0 && pH
8a60: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  ist->pNextStmt==
8a70: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
8a80: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
8a90: 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53      PGHDR_TO_HIS
8aa0: 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c  T(pPager->pStmt,
8ab0: 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53   pPager)->pPrevS
8ac0: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  tmt = pPg;.    }
8ad0: 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78  .    pHist->pNex
8ae0: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
8af0: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65  pStmt;.    pPage
8b00: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
8b10: 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
8b20: 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 1;.  }.}../*
8b30: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
8b40: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
8b50: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
8b60: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
8b70: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
8b80: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
8b90: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
8ba0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
8bb0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
8bc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
8bd0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
8be0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
8bf0: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
8c00: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
8c10: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
8c20: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
8c30: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
8c40: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
8c50: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
8c60: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
8c70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
8c80: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
8c90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
8ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8cb0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8cc0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
8cd0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8ce0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
8cf0: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
8d00: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
8d10: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
8d20: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
8d30: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8d40: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
8d50: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
8d60: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
8d70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8d80: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
8d90: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
8da0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
8db0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8dc0: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
8dd0: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
8de0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
8df0: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
8e00: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
8e10: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
8e20: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
8e30: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
8e40: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
8e50: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
8e60: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
8e70: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
8e80: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
8e90: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
8ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
8eb0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
8ec0: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
8ed0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
8ee0: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
8ef0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8f00: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
8f10: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
8f20: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
8f30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8f40: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
8f50: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
8f60: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
8f70: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
8f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8f90: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
8fa0: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
8fb0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
8fc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
8fd0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
8fe0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
8ff0: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
9000: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
9010: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
9020: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
9030: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
9040: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
9050: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
9060: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
9070: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
9080: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
9090: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
90a0: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
90b0: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
90c0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
90d0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
90e0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
90f0: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
9100: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
9110: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
9120: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
9130: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
9140: 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41  Next){.    IOTRA
9150: 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
9160: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
9170: 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50  g->pgno));.    P
9180: 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
9190: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
91a0: 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74  ount);.    pNext
91b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
91c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
91d0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
91e0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
91f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
9200: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
9210: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
9220: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
9230: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
9240: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70  r->pAll = 0;.  p
9250: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
9260: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9270: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
9280: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
9290: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
92a0: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
92b0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
92c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
92d0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
92e0: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
92f0: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
9300: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
9310: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
9320: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
9330: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9340: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
9350: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
9360: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
9370: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
9380: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
9390: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
93a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
93b0: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
93c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
93d0: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
93e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
93f0: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
9400: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
9410: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
9420: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
9430: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
9440: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
9450: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
9460: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
9470: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
9480: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
9490: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
94a0: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
94b0: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
94c0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
94d0: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
94e0: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
94f0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
9500: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
9510: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9520: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
9530: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
9540: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
9550: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
9560: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
9570: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
9580: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
9590: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
95a0: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
95b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
95c0: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
95d0: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
95e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
95f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9600: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20  E_OK;.  int rc2 
9610: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
9620: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
9630: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9640: 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
9650: 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
9660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9670: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
9680: 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
9690: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
96a0: 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50  >stmtOpen && !pP
96b0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
96c0: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
96d0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
96e0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
96f0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
9700: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
9710: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
9720: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
9730: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9740: 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  e .          && 
9750: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  (rc = sqlite3OsT
9760: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9770: 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45  jfd, 0))==SQLITE
9780: 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70 50  _OK ){;.      pP
9790: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
97a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
97b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
97c0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
97d0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
97e0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
97f0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
9800: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9810: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
9820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9830: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9840: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
9850: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
9860: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
9870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9880: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9890: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
98a0: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
98b0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
98c0: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
98d0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
98e0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
98f0: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
9900: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
9910: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
9920: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
9930: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9940: 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73       pPg->always
9950: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
9960: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9970: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
9980: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
9990: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
99a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
99b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
99c0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
99d0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
99e0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
99f0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
9a00: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
9a10: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
9a20: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
9a30: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
9a40: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
9a50: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
9a60: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
9a70: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
9a80: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
9a90: 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  c2 = sqlite3OsUn
9aa0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
9ab0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
9ac0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
9ad0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
9ae0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
9af0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
9b00: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
9b10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
9b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
9b30: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
9b40: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
9b50: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9b60: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
9b70: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
9b80: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
9b90: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
9ba0: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
9bb0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
9bc0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
9bd0: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
9be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9bf0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
9c00: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
9c10: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
9c20: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
9c30: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
9c40: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
9c50: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
9c60: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
9c70: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
9c80: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
9c90: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
9ca0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
9cb0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
9cc0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
9cd0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
9ce0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
9cf0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
9d00: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
9d10: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
9d20: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
9d30: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
9d40: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
9d50: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
9d60: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
9d70: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
9d80: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
9d90: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
9da0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
9db0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
9dc0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
9dd0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
9de0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
9df0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
9e00: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
9e10: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
9e20: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
9e30: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
9e40: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
9e50: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
9e60: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
9e70: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
9e80: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
9e90: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
9ea0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
9eb0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
9ec0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
9ed0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
9ee0: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
9ef0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
9f00: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
9f10: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
9f20: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
9f30: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
9f40: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
9f50: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
9f60: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
9f70: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
9f80: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
9f90: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
9fa0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
9fb0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
9fc0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
9fd0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
9fe0: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
9ff0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
a000: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
a010: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
a020: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
a030: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
a040: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
a050: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
a060: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
a070: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
a080: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
a090: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
a0a0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
a0b0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
a0c0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
a0d0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
a0e0: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
a0f0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
a100: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
a110: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a120: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
a130: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
a140: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
a150: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
a160: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
a170: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
a180: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
a190: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
a1a0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
a1b0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
a1c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a1d0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
a1e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
a1f0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
a200: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
a210: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
a220: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a230: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
a240: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
a250: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
a260: 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66   *jfd,.  i64 off
a270: 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b  set,.  int useCk
a280: 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sum.){.  int rc;
a290: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
a2c0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a2d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
a2e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a2f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
a300: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
a310: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
a320: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
a350: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
a360: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
a370: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
a380: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
a390: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
a3a0: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
a3b0: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
a3c0: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
a3d0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
a3e0: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
a3f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
a400: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
a410: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
a420: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
a430: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
a440: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
a450: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
a460: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
a470: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
a480: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a490: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
a4a0: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
a4b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a4c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
a4d0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a4e0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
a4f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
a500: 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72  fset+4);.  if( r
a510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
a520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
a530: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a540: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
a550: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
a560: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
a570: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
a580: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
a590: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
a5a0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
a5b0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
a5c0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
a5d0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
a5e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
a5f0: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
a600: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
a610: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
a620: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a630: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
a640: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
a650: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
a660: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
a670: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
a680: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
a690: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
a6a0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
a6b0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
a6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a6d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
a6e0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
a6f0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
a700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
a720: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
a730: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
a740: 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e   offset+pPager->
a750: 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
a760: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
a770: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a780: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a790: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
a7a0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
a7b0: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
a7c0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
a7d0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a7e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
a7f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a800: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
a810: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
a820: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
a830: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
a840: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
a850: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
a860: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
a870: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
a880: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
a890: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a8a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
a8b0: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
a8c0: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
a8d0: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
a8e0: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
a8f0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
a900: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
a910: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
a920: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
a930: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
a940: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
a950: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
a960: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
a970: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
a980: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
a990: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
a9a0: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
a9b0: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
a9c0: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
a9d0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
a9e0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
a9f0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
aa00: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
aa10: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
aa20: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
aa30: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
aa40: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
aa50: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
aa60: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
aa70: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
aa80: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
aa90: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
aaa0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
aab0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
aac0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
aad0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
aae0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
aaf0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
ab00: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
ab10: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
ab20: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
ab30: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
ab40: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
ab50: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
ab60: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
ab70: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
ab80: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
ab90: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
aba0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
abb0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
abc0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
abd0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
abe0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
abf0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
ac00: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
ac10: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
ac20: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
ac30: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
ac40: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
ac50: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
ac60: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
ac70: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
ac80: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
ac90: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
aca0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
acb0: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
acc0: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
acd0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
ace0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
acf0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
ad00: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
ad10: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
ad20: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
ad30: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
ad40: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
ad50: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
ad60: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
ad70: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
ad80: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
ad90: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
ada0: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
adb0: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
adc0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
add0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
ade0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
adf0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
ae00: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
ae10: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
ae20: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
ae30: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
ae40: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
ae50: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
ae60: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
ae70: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
ae80: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ae90: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
aea0: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
aeb0: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
aec0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
aed0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52  , pgno);.  PAGER
aee0: 54 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b  TRACE4("PLAYBACK
aef0: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
af00: 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
af10: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
af20: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
af30: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
af40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
af50: 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28  , aData));.  if(
af60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
af70: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
af80: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
af90: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
afa0: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
afb0: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
afc0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
afd0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
afe0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
aff0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
b000: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
b010: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66   offset);.    if
b020: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
b030: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
b040: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
b050: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
b060: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
b070: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
b080: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
b090: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
b0a0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
b0b0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
b0c0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
b0d0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
b0e0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
b0f0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
b100: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
b110: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
b120: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
b130: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
b140: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
b150: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
b160: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
b170: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
b180: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
b190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
b1a0: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
b1b0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
b1c0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
b1d0: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
b1e0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
b1f0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
b200: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
b210: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
b220: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
b230: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
b240: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
b250: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
b260: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b270: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
b280: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
b290: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
b2a0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
b2b0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
b2c0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
b2d0: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
b2e0: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
b2f0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
b300: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
b310: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
b320: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
b330: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
b340: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
b350: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
b360: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
b370: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
b380: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
b390: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
b3a0: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
b3b0: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
b3c0: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
b3d0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
b3e0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
b3f0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
b400: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b410: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
b420: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b430: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
b440: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
b450: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
b460: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
b470: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b480: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
b490: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
b4a0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
b4b0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
b4c0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b4d0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
b4e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
b4f0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
b500: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
b510: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b520: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
b530: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
b540: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
b550: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
b560: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b570: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
b580: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
b590: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
b5a0: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
b5b0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
b5c0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
b5d0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
b5e0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
b5f0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
b600: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
b610: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
b620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b630: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
b640: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
b650: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
b660: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
b670: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
b680: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
b690: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
b6a0: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
b6b0: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
b6c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
b6d0: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
b6e0: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
b6f0: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
b700: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
b710: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
b720: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
b730: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
b740: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b750: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
b760: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
b770: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
b780: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
b790: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
b7a0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
b7b0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
b7c0: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
b7d0: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
b7e0: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
b7f0: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
b800: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b810: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b820: 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
b830: 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
b840: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
b850: 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
b860: 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
b870: 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
b880: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
b890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
b8b0: 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
b8c0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
b8d0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
b8e0: 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
b8f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
b900: 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
b910: 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
b920: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
b930: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b940: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
b950: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
b960: 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 1;..  rc = sq
b970: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b980: 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
b990: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
b9a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b9b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
b9c0: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
b9d0: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
b9e0: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
b9f0: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
ba00: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20  asterPtr = 0;.. 
ba10: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
ba20: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
ba30: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
ba40: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
ba50: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
ba60: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
ba70: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
ba80: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
ba90: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
baa0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
bab0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
bac0: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
bad0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
bae0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
baf0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
bb00: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
bb10: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
bb20: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
bb30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
bb40: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
bb50: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
bb60: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
bb70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bb80: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
bb90: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
bba0: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
bbb0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
bbc0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
bbd0: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
bbe0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
bbf0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
bc00: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
bc10: 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
bc20: 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a  CESS_EXISTS) ){.
bc30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
bc40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
bc50: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
bc60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bc70: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
bc80: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
bc90: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
bca0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
bcb0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
bcc0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
bcd0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
bce0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
bcf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
bd00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
bd10: 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt c;.        in
bd20: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
bd30: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
bd40: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
bd50: 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
bd60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
bd70: 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
bd80: 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
bd90: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
bda0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bdb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bdc0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
bdd0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
bde0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
bdf0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
be00: 70 4a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74  pJournal, &zMast
be10: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
be20: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
be30: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
be40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
be50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
be60: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
be70: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
be80: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
be90: 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72  terPtr!=0 && str
bea0: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
beb0: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
bec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
bed0: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
bee0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
bef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
bf00: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
bf10: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
bf20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
bf30: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
bf40: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
bf50: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
bf60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
bf70: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
bf80: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
bf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
bfa0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
bfb0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
bfc0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
bfd0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
bfe0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
bff0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c000: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
c010: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
c020: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
c030: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c040: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
c050: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
c060: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
c070: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
c080: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
c090: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
c0a0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
c0b0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
c0c0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
c0d0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
c0e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
c0f0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
c100: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
c110: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
c120: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
c130: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c140: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c150: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c160: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
c170: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c180: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
c190: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
c1a0: 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
c1b0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
c1c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
c1d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c1e0: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20  *(i64)nPage);.  
c1f0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
c200: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
c210: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
c220: 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
c230: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
c240: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
c250: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c260: 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53   Set the sectorS
c270: 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ize for the give
c280: 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  n pager..**.** T
c290: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
c2a0: 73 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  s the larger of 
c2b0: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
c2c0: 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73  reported.** by s
c2d0: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
c2e0: 7a 65 28 29 20 61 6e 64 20 74 68 65 20 70 61 67  ze() and the pag
c2f0: 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  eSize..*/.static
c300: 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
c310: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
c320: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  r){.  pPager->se
c330: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c340: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c350: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66  Pager->fd);.  if
c360: 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
c370: 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67  Size<pPager->pag
c380: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61  eSize ){.    pPa
c390: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
c3a0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
c3b0: 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze;.  }.}../*.**
c3c0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
c3d0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
c3e0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
c3f0: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
c400: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
c410: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
c420: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
c430: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
c440: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
c450: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
c460: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
c470: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
c480: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
c490: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
c4a0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
c4b0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
c4c0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
c4d0: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
c4e0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
c4f0: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
c500: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
c510: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
c520: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
c530: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
c540: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
c550: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c560: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
c570: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
c580: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
c590: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
c5a0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
c5b0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
c5c0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
c5d0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
c5e0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
c5f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
c600: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
c610: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
c620: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
c630: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
c640: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
c650: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
c660: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
c670: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c680: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
c690: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
c6a0: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
c6b0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
c6c0: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
c6d0: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
c6e0: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
c6f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c700: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
c710: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
c720: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
c730: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
c740: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
c750: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
c760: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
c770: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
c780: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
c790: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
c7a0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
c7b0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
c7c0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
c7d0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
c7e0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
c7f0: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
c800: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
c810: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
c820: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
c830: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
c840: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
c850: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
c860: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
c870: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
c880: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
c890: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
c8a0: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
c8b0: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
c8c0: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
c8d0: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
c8e0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
c8f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
c900: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
c910: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
c920: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
c930: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
c940: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
c950: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
c960: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
c970: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
c980: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
c990: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
c9a0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
c9b0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
c9c0: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
c9d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c9e0: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
c9f0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
ca00: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
ca10: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
ca20: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
ca30: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
ca40: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
ca50: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ca60: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
ca70: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
ca80: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
ca90: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
caa0: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
cab0: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
cac0: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
cad0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
cae0: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
caf0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
cb00: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
cb10: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
cb20: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
cb30: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
cb40: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
cb50: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
cb60: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
cb70: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
cb80: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
cb90: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
cba0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
cbb0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
cbc0: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
cbd0: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
cbe0: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
cbf0: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
cc00: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
cc10: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
cc20: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
cc30: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
cc40: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
cc50: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
cc60: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
cc70: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
cc80: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
cc90: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
cca0: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
ccb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
ccc0: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
ccd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
cce0: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
ccf0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
cd00: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
cd10: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
cd20: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
cd30: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
cd40: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
cd50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
cd60: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
cd70: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
cd80: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
cd90: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
cda0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
cdb0: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
cdc0: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
cdd0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
cde0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
cdf0: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
ce00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
ce10: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
ce20: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
ce30: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
ce40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ce50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ce60: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
ce70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
ce80: 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
ce90: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
cea0: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
ceb0: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
cec0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ced0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cee0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
cef0: 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cf10: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
cf20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
cf30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
cf40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
cf50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
cf60: 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
cf70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cf80: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
cf90: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
cfa0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cfc0: 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
cfd0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
cfe0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
cff0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
d000: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
d010: 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
d020: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
d030: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
d040: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
d050: 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
d060: 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
d070: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
d080: 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
d090: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d0a0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
d0b0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
d0c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
d0d0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
d0e0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
d100: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d110: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
d120: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d130: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
d140: 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
d150: 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
d160: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d170: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
d180: 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
d190: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
d1a0: 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
d1b0: 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
d1c0: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
d1d0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
d1e0: 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
d1f0: 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
d200: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
d210: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
d220: 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a  jfd, &zMaster);.
d230: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d240: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
d250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d260: 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72   .   || (zMaster
d270: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41 63   && !sqlite3OsAc
d280: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
d290: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
d2a0: 53 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29 7b  S_EXISTS)) .  ){
d2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d2c0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
d2d0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
d2e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d2f0: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
d300: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
d310: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d320: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
d330: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
d340: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
d350: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
d360: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
d370: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
d380: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
d390: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
d3a0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
d3b0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
d3c0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
d3d0: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
d3e0: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
d3f0: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
d400: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
d410: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
d420: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
d430: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
d440: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
d450: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
d460: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
d470: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
d480: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
d490: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
d4a0: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
d4b0: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
d4c0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d4d0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
d4e0: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d4f0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d500: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
d510: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d520: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
d530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d540: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
d550: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
d570: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d590: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
d5a0: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
d5b0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
d5c0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
d5d0: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
d5e0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d5f0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d600: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
d610: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
d620: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
d630: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
d640: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
d650: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
d660: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
d670: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
d680: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
d690: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
d6a0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
d6b0: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
d6c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d6d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
d6e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d6f0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
d700: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
d710: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d720: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
d730: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
d740: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
d750: 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
d760: 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
d770: 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
d780: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
d790: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
d7a0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
d7b0: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
d7c0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
d7d0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
d7e0: 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
d7f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
d800: 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
d810: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
d820: 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
d830: 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
d840: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d850: 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
d860: 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
d870: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
d880: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
d890: 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
d8a0: 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
d8b0: 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
d8c0: 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
d8d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
d8e0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
d8f0: 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
d900: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
d910: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d920: 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
d930: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
d940: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
d950: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d960: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
d970: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
d980: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
d990: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
d9a0: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
d9b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
d9c0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
d9d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
d9e0: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
d9f0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
da00: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
da10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
da20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
da30: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
da40: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
da50: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
da60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
da70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
da80: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
da90: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
daa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
dab0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
dac0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
dad0: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
dae0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
daf0: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
db00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
db10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
db20: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
db30: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
db40: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
db50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
db60: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  f, 1);.      if(
db70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
db90: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
dba0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
dbb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
dbc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dbd0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
dbe0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
dbf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dc00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
dc10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
dc20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dc30: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
dc40: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
dc50: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
dc60: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
dc70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dc80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
dc90: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
dca0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
dcb0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f  zMaster ){.    /
dcc0: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
dcd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dce0: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
dcf0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
dd00: 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
dd10: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
dd20: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
dd30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
dd40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
dd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dd60: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
dd70: 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
dd80: 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
dd90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
dda0: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
ddb0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
ddc0: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
ddd0: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
dde0: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
ddf0: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
de00: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
de10: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
de20: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
de30: 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
de40: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
de50: 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
de60: 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
de70: 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
de80: 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
de90: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
dea0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
deb0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
dec0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
ded0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
dee0: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
def0: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
df00: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
df10: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
df20: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
df30: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
df40: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
df50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
df60: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
df70: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
df80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
df90: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
dfa0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
dfb0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
dfc0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
dfd0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
dfe0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
dff0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
e000: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
e010: 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
e020: 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
e030: 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
e040: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e050: 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
e060: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
e070: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
e080: 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
e090: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
e0a0: 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
e0b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
e0c0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
e0d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e0e0: 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
e0f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f  al */.  i64 hdrO
e100: 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20  ff;.  int nRec; 
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e120: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
e130: 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e160: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
e170: 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
e180: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e  journalOff;.#ifn
e190: 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a  def NDEBUG .  {.
e1a0: 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a      i64 os_szJ;.
e1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e1c0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
e1d0: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
e1e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e1f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e200: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
e210: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
e220: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
e230: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
e240: 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
e250: 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
e260: 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
e270: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
e280: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
e290: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
e2a0: 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
e2b0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
e2c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
e2d0: 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
e2e0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
e2f0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
e300: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
e310: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
e320: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
e330: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
e340: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
e350: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
e360: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
e370: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
e380: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
e390: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
e3a0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
e3b0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
e3c0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
e3d0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
e3e0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
e3f0: 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
e400: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
e410: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
e420: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
e430: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
e440: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
e450: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
e460: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e470: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
e480: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
e490: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52  rnalOpen );.  nR
e4a0: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
e4b0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
e4c0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
e4d0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
e4e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e4f0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
e500: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
e510: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
e520: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
e530: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
e540: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
e550: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
e560: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
e570: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
e580: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
e590: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
e5a0: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
e5b0: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
e5c0: 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ++){.    i64 off
e5d0: 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65  set = i*(4+pPage
e5e0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
e5f0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
e600: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
e610: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
e620: 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b  tfd, offset, 0);
e630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e640: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e650: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e660: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
e670: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e680: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
e690: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
e6a0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
e6b0: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
e6c0: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
e6d0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
e6e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
e6f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
e700: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
e710: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
e720: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
e730: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
e740: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
e750: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
e760: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
e770: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
e780: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
e790: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
e7a0: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
e7b0: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
e7c0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
e7d0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
e7e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e7f0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
e800: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
e810: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e820: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  n..  */.  pPager
e830: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
e840: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
e850: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
e860: 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
e870: 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
e880: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
e890: 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
e8a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
e8b0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
e8c0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
e8d0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
e8e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
e8f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e900: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e910: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e920: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
e930: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e940: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
e950: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e960: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
e970: 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20  2 nJRec;        
e980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
e990: 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
e9a0: 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
e9b0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
e9c0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
e9d0: 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
e9e0: 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
e9f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ea00: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ea10: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ea20: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
ea30: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ea40: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65    }.    if( nJRe
ea50: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
ea60: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
ea70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
ea80: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
ea90: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
eaa0: 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31     for(i=nJRec-1
eab0: 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
eac0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
ead0: 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
eae0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
eaf0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
eb00: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
eb10: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
eb20: 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
eb30: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
eb40: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
eb50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eb60: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
eb70: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
eb80: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
eb90: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
eba0: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
ebb0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
ebc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
ebd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
ebe0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
ebf0: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
ec00: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
ec10: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
ec20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
ec30: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
ec40: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
ec50: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
ec60: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
ec70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
ec80: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
ec90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
eca0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
ecb0: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
ecc0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
ecd0: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
ece0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
ecf0: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
ed00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
ed10: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
ed20: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
ed30: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
ed40: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
ed50: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
ed60: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
ed70: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
ed80: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
ed90: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
eda0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
edb0: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
edc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
edd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
ede0: 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
edf0: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
ee00: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
ee20: 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
ee30: 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
ee40: 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
ee50: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
ee60: 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
ee70: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
ee80: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
ee90: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
eea0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
eeb0: 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
eec0: 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
eee0: 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
eef0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
ef00: 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
ef10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ef20: 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
ef30: 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
ef40: 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
ef50: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
ef60: 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
ef70: 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
ef80: 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
ef90: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
efb0: 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
efc0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
efd0: 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
efe0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
eff0: 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
f000: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
f010: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f020: 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
f030: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
f040: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
f050: 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
f070: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f080: 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
f090: 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
f0a0: 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
f0b0: 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
f0c0: 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
f0d0: 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
f0e0: 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
f0f0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
f100: 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
f110: 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
f120: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f130: 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
f140: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
f150: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
f160: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
f170: 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
f180: 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
f190: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f1a0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
f1b0: 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
f1c0: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
f1d0: 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
f1e0: 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
f1f0: 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
f200: 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
f210: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
f220: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
f230: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
f240: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
f250: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f260: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
f270: 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
f280: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
f290: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
f2a0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
f2b0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
f2c0: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
f2d0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
f2e0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
f2f0: 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63  gs = (full_fsync
f300: 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
f310: 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
f320: 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
f330: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
f340: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
f350: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
f360: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
f370: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
f380: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
f390: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
f3a0: 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
f3b0: 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
f3c0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
f3d0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
f3e0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
f3f0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
f400: 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
f410: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f420: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
f430: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
f440: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
f450: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
f460: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
f470: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
f480: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
f490: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
f4a0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
f4b0: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
f4c0: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
f4d0: 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
f4e0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
f4f0: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
f500: 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  ary.** file when
f510: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
f520: 2a 0a 2a 2a 20 49 66 20 7a 4e 61 6d 65 4f 75 74  *.** If zNameOut
f530: 20 69 73 20 30 2c 20 74 68 65 6e 20 53 51 4c 49   is 0, then SQLI
f540: 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
f550: 41 4c 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  AL is passed to 
f560: 74 68 65 20 4f 53 20 6c 61 79 65 72 2e 0a 2a 2a  the OS layer..**
f570: 20 49 66 20 7a 4e 61 6d 65 4f 75 74 20 69 73 20   If zNameOut is 
f580: 6e 6f 74 20 30 2c 20 53 51 4c 49 54 45 5f 4f 50  not 0, SQLITE_OP
f590: 45 4e 5f 54 45 4d 50 5f 44 42 20 69 73 20 70 61  EN_TEMP_DB is pa
f5a0: 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssed..*/.static 
f5b0: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
f5c0: 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69  Opentemp(.  sqli
f5d0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
f5e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
f5f0: 70 46 69 6c 65 2c 20 0a 20 20 63 68 61 72 20 2a  pFile, .  char *
f600: 7a 4e 61 6d 65 4f 75 74 0a 29 7b 0a 20 20 69 6e  zNameOut.){.  in
f610: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
f620: 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73   rc;.  int flags
f630: 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
f640: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
f650: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
f660: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
f670: 56 45 29 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 46  VE);..  char *zF
f680: 72 65 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ree = 0;.  if( z
f690: 4e 61 6d 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  NameOut==0 ){.  
f6a0: 20 20 7a 46 72 65 65 20 3d 20 28 63 68 61 72 20    zFree = (char 
f6b0: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
f6c0: 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
f6d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 72  e);.    if( !zFr
f6e0: 65 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ee ){.      retu
f6f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f700: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
f710: 4f 75 74 20 3d 20 7a 46 72 65 65 3b 0a 20 20 20  Out = zFree;.   
f720: 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
f730: 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
f740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
f750: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
f760: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
f770: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f780: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
f790: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
f7a0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
f7b0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
f7c0: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
f7d0: 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  f..  do{.    cnt
f7e0: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
f7f0: 73 47 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66  sGetTempName(pVf
f800: 73 2c 20 7a 4e 61 6d 65 4f 75 74 29 3b 0a 20 20  s, zNameOut);.  
f810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f820: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
f830: 4f 75 74 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67  Out, pFile, flag
f840: 73 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  s, 0);.    asser
f850: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f860: 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   || pFile->pMeth
f870: 6f 64 73 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28  ods );.  }while(
f880: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
f890: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
f8a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
f8b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f8c0: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
f8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
f8e0: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
f8f0: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
f900: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
f910: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
f920: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
f930: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
f940: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
f950: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
f960: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
f970: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
f980: 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
f990: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
f9a0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
f9b0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
f9c0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
f9d0: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
f9e0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
f9f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
fa00: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
fa10: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
fa20: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
fa30: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
fa40: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
fa50: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
fa60: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
fa70: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
fa80: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
fa90: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
faa0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
fab0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
fac0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
fad0: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
fae0: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
faf0: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
fb00: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
fb10: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
fb20: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
fb30: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
fb40: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
fb50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
fb60: 70 56 66 73 2c 0a 20 20 50 61 67 65 72 20 2a 2a  pVfs,.  Pager **
fb70: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
fb80: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
fb90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
fba0: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
fbb0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
fbc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
fbd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
fbe0: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
fbf0: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
fc00: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
fc10: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
fc20: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
fc30: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
fc60: 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
fc70: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
fc80: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
fc90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
fca0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
fcb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fcc0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
fcd0: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
fce0: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
fcf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
fd00: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
fd10: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
fd20: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
fd30: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
fd40: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
fd50: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
fd60: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
fd70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fd80: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
fd90: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
fda0: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
fdb0: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
fdc0: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
fdd0: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
fde0: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
fdf0: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
fe00: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
fe10: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
fe20: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
fe30: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
fe40: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
fe50: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
fe60: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
fe70: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
fe80: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
fe90: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
fea0: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
feb0: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
fec0: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
fed0: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
fee0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
fef0: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
ff00: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
ff10: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
ff20: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
ff30: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
ff40: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
ff50: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
ff60: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
ff70: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
ff80: 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20 74   /* We used to t
ff90: 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  est if malloc() 
ffa0: 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69 6c  had already fail
ffb0: 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ed before procee
ffc0: 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20  ding. .  ** But 
ffd0: 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75 6e  the way this fun
ffe0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
fff0: 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74 68   SQLite means th
10000 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a  at can never.  *
10010 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68 65  * happen. Furthe
10020 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d 61  rmore, if the ma
10030 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
10040 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 2c   is already set,
10050 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74 68   .  ** either th
10060 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
10070 33 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c  3StrDup() or sql
10080 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 62 65  ite3_malloc() be
10090 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61  low will.  ** fa
100a0 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53  il shortly and S
100b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75  QLITE_NOMEM retu
100c0 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a  rned anyway..  *
100d0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
100e0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
100f0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
10100 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
10110 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
10120 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10130 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
10140 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
10150 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
10160 75 72 65 20 2a 2f 0a 20 20 20 20 70 56 66 73 2d  ure */.    pVfs-
10170 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20  >szOsFile * 3 + 
10180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62         /* The db
10190 2c 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 74  , journal and st
101a0 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  mt journal files
101b0 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 6d   */ .    pVfs->m
101c0 78 50 61 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20  xPathname * 3 + 
101d0 33 30 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  30   /* zFilenam
101e0 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  e, zDirectory, z
101f0 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
10200 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b    if( !pPager ){
10210 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10220 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10230 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
10240 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
10250 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
10260 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
10270 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
10280 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
10290 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
102a0 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
102b0 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
102c0 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65  ->stfd = (sqlite
102d0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
102e0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
102f0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
10300 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
10310 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
10320 6c 65 2a 33 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*3];.  pPager-
10330 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
10340 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10350 5b 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  [pVfs->mxPathnam
10360 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  e];.  pPager->zJ
10370 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
10380 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 70 56 66  ->zDirectory[pVf
10390 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a  s->mxPathname];.
103a0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
103b0 20 70 56 66 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65   pVfs;..  /* Ope
103c0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
103d0 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61   and set zFullPa
103e0 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20  thname to point 
103f0 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20  at malloc()ed . 
10400 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61   ** memory conta
10410 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65  ining the comple
10420 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65  te filename (i.e
10430 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  . including the 
10440 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f  directory)..  */
10450 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
10460 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
10470 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
10480 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10490 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
104a0 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
104b0 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
104c0 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
104d0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
104e0 6e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  name[0] = '\0';.
104f0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
10500 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
10510 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
10520 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
10530 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
10540 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
10550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10570 69 66 28 20 73 74 72 6c 65 6e 28 70 50 61 67 65  if( strlen(pPage
10580 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3e 28 70  r->zFilename)>(p
10590 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
105a0 2d 20 73 74 72 6c 65 6e 28 22 2d 6a 6f 75 72 6e  - strlen("-journ
105b0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 20  al")) ){.       
105c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
105d0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ANTOPEN;.       
105e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
105f0 20 20 69 6e 74 20 6f 66 6c 61 67 20 3d 20 0a 20    int oflag = . 
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
10610 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
10620 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
10630 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
10640 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 20  EN_MAIN_DB);.   
10650 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
10660 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
10670 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
10680 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
10690 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
106a0 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c 20 26 66  r->fd, oflag, &f
106b0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
106c0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
106d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
106e0 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20  DONLY);.        
106f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
10710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
10720 65 6e 74 65 6d 70 28 70 56 66 73 2c 20 70 50 61  entemp(pVfs, pPa
10730 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
10740 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
10750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
10770 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
10780 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
10790 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
107a0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
107b0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
107c0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
107d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 44 45 46 41  lloc(SQLITE_DEFA
107e0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
107f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
10800 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
10810 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
10820 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
10830 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20  e the memory .  
10840 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
10850 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   zFullPathname, 
10860 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  free the Pager s
10870 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
10880 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c  se the .  ** fil
10890 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  e. Since the pag
108a0 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
108b0 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
108c0 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
108d0 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
108e0 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
108f0 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
10900 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  r || !pPager->pT
10910 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73  mpSpace ){.    s
10920 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
10930 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
10940 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
10950 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
10960 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
10970 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
10980 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
10990 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
109a0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
109b0 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
109c0 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43  hname);.  IOTRAC
109d0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
109e0 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c  ", pPager, zFull
109f0 50 61 74 68 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a  Pathname))..  /*
10a00 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
10a10 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20  Directory[] */. 
10a20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
10a30 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67  zDirectory, pPag
10a40 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
10a50 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
10a60 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  ;.  for(i=strlen
10a70 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
10a80 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61  ory); i>0 && pPa
10a90 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
10aa0 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
10ab0 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
10ac0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10ad0 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
10ae0 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
10af0 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d  Journal[] */.  m
10b00 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
10b10 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
10b20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 56 66 73 2d  zFilename, pVfs-
10b30 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  >mxPathname);.  
10b40 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
10b50 7a 4a 6f 75 72 6e 61 6c 5b 73 74 72 6c 65 6e 28  zJournal[strlen(
10b60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10b70 29 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  )], "-journal", 
10b80 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72  9);..  /* pPager
10b90 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
10ba0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
10bb0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
10bc0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
10bd0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
10be0 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
10bf0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
10c00 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
10c10 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
10c20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
10c30 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
10c40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
10c50 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
10c60 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
10c70 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
10c80 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
10c90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10ca0 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ZE;.  /* pPager-
10cb0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
10cc0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
10cd0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
10ce0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
10cf0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
10d00 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
10d10 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
10d20 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
10d30 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
10d40 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e  assert( PAGER_UN
10d50 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  LOCK==0 );.  /* 
10d60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10d70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
10d80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
10d90 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
10da0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
10db0 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61   = tempFile;.  a
10dc0 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
10dd0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
10de0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
10df0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
10e00 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
10e10 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
10e20 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10e30 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
10e40 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
10e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
10e60 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  Mode = tempFile;
10e70 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   .  pPager->memD
10e80 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  b = memDb;.  pPa
10e90 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
10ea0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
10eb0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
10ec0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
10ed0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
10ee0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
10ef0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
10f00 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
10f10 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
10f20 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
10f30 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
10f40 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
10f50 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
10f60 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
10f70 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
10f80 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
10f90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
10fa0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
10fb0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
10fc0 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
10fd0 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
10fe0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
10ff0 68 6f 64 73 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20  hods||memDb);.  
11000 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
11010 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
11020 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f  pPager);.  }.  /
11030 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
11040 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
11050 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
11060 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
11070 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
11080 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
11090 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66  er = pPager;.#if
110a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
110b0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
110c0 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e  ENT.  pPager->pN
110d0 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  ext = pTsd->pPag
110e0 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67  er;.  pTsd->pPag
110f0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e  er = pPager;.#en
11100 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
11110 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11120 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
11130 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
11140 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
11150 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
11160 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
11170 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
11180 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
11190 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
111a0 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
111b0 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
111c0 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
111d0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
111e0 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
111f0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
11200 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
11210 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
11220 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
11230 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
11240 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
11250 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
11260 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
11270 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
11280 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
11290 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
112a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
112b0 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
112c0 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
112d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
112e0 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
112f0 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
11300 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
11310 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
11320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
11330 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72  gerSetDestructor
11340 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11350 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
11360 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
11370 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
11380 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
11390 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
113a0 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
113b0 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
113c0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
113d0 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
113e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
113f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
11400 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
11410 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
11420 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
11430 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11440 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
11450 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
11460 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
11470 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
11480 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
11490 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
114a0 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
114b0 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
114c0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
114d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
114e0 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
114f0 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
11500 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
11510 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
11520 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
11530 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
11540 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
11550 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
11560 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65  ew size.  If the
11570 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67   suggest new pag
11580 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61  e.** size is ina
11590 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e  ppropriate, then
115a0 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
115b0 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c  page size is sel
115c0 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74  ected.** and ret
115d0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
115e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
115f0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
11600 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
11610 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
11620 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
11630 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
11640 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
11650 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11660 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
11670 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
11680 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
11690 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
116a0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
116b0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
116c0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70  3_free(pPager->p
116d0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
116e0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
116f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
11700 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  c(pageSize);.  }
11710 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
11720 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
11730 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
11740 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
11750 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
11760 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
11770 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
11780 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
11790 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
117a0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
117b0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
117c0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
117d0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
117e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
117f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11800 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
11810 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
11820 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
11830 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11840 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
11850 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
11860 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
11870 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
11880 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
11890 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
118a0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
118b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
118c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
118d0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  er);.  return pP
118e0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
118f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
11900 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
11910 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
11920 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
11930 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
11940 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
11950 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
11960 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
11970 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
11980 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
11990 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
119a0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
119b0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
119c0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
119d0 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
119e0 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
119f0 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
11a00 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
11a10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
11a20 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
11a30 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
11a40 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
11a50 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
11a60 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
11a70 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
11a80 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
11a90 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11aa0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
11ab0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
11ac0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
11ad0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
11ae0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
11af0 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
11b00 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11b10 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
11b20 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
11b30 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
11b40 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
11b50 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
11b60 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11b70 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
11b80 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11b90 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
11ba0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
11bb0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
11bc0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
11bd0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
11be0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
11bf0 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
11c00 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
11c10 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
11c20 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
11c30 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
11c40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
11c50 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
11c60 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
11c70 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
11c80 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
11c90 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
11ca0 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
11cb0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
11cc0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
11cd0 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
11ce0 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
11cf0 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
11d00 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
11d10 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
11d20 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
11d30 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
11d40 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
11d50 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
11d60 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
11d70 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
11d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
11d90 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
11da0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
11db0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
11dc0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
11dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11de0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
11df0 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
11e00 42 3d 3d 30 20 29 7b 0a 20 20 20 20 49 4f 54 52  B==0 ){.    IOTR
11e10 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
11e20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
11e30 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
11e40 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
11e50 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
11e60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
11e70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
11e80 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
11e90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11ec0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
11ed0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
11ee0 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
11ef0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
11f00 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a  ith.** pPager. .
11f10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e  **.** If the PEN
11f20 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f  DING_BYTE lies o
11f30 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63  n the page direc
11f40 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e  tly after the en
11f50 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  d of the.** file
11f60 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
11f70 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f  this page part o
11f80 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20  f the file too. 
11f90 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
11fa0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
11fb0 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68  is byte 4096 (th
11fc0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
11fd0 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20  page 5) and the 
11fe0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  size of the.** f
11ff0 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65  ile is 4096 byte
12000 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64  s, 5 is returned
12010 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a   instead of 4..*
12020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12030 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
12040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
12050 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  4 n;.  int rc;. 
12060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
12070 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
12080 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
12090 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
120a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
120b0 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
120c0 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
120d0 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
120e0 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
120f0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
12100 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
12110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12120 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
12130 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
12140 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
12150 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
12160 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
12170 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
12180 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
12190 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
121a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
121b0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
121c0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
121d0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
121e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
121f0 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
12200 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
12210 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
12220 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
12230 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
12240 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
12250 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
12260 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
12270 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
12280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12290 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
122a0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
122b0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
122c0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
122d0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
122e0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
122f0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
12300 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
12310 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
12320 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
12330 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
12340 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
12350 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
12360 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
12370 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
12380 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
12390 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
123a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
123b0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
123c0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
123d0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
123e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
123f0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
12400 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
12410 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
12420 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
12430 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
12440 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
12450 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
12460 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
12470 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
12480 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
12490 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
124a0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
124b0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
124c0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
124d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
124e0 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
124f0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
12500 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
12510 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
12520 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
12530 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
12540 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
12550 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
12560 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
12570 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
12580 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
12590 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
125a0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
125b0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
125c0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
125d0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
125e0 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
125f0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
12600 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
12610 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
12620 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
12630 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
12640 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
12650 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
12660 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
12670 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
12680 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
12690 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
126a0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
126b0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
126c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
126d0 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
126e0 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
126f0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
12700 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
12710 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
12720 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12730 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
12740 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
12750 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
12760 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
12770 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
12780 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
12790 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
127a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
127b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
127c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
127d0 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
127e0 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
127f0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
12800 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
12810 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
12820 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
12830 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
12840 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
12850 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12860 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
12870 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
12880 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
12890 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
128a0 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
128b0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
128c0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
128d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
128e0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
128f0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
12900 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
12910 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
12920 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12930 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
12940 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
12950 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
12960 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
12970 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
12980 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
12990 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
129a0 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
129b0 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
129c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
129d0 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
129e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
129f0 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
12a00 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
12a10 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
12a20 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
12a30 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
12a40 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
12a50 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
12a60 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
12a70 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
12aa0 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
12ab0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
12ac0 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
12ad0 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
12ae0 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
12af0 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
12b00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
12b10 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
12b20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
12b30 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
12b40 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
12b50 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
12b60 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
12b70 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
12b80 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
12b90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12ba0 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
12bb0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
12bc0 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
12bd0 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
12be0 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
12bf0 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
12c00 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
12c10 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
12c20 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
12c30 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
12c40 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
12c50 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
12c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12c70 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
12c80 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
12c90 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
12ca0 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
12cb0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
12cc0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
12cd0 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
12ce0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
12cf0 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
12d00 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
12d10 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
12d20 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
12d30 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
12d40 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
12d50 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
12d60 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
12d70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
12d80 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
12d90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
12da0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
12db0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
12dc0 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
12dd0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
12de0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
12df0 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
12e00 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
12e10 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
12e20 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
12e30 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
12e40 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
12e50 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
12e60 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
12e70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12e80 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
12e90 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
12ea0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12eb0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
12ec0 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
12ed0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
12ee0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
12ef0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
12f00 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
12f10 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
12f20 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
12f30 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
12f40 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
12f50 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
12f60 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
12f70 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12f80 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
12f90 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
12fa0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
12fb0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
12fc0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
12fd0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
12fe0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
12ff0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
13000 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
13010 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
13020 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
13030 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
13040 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
13050 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
13060 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
13070 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
13080 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
13090 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
130a0 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
130b0 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
130c0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
130d0 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
130e0 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
130f0 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
13100 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
13110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13120 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
13130 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
13140 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
13150 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
13160 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
13170 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
13180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
13190 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
131a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
131b0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
131c0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
131d0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
131e0 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
131f0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
13200 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
13210 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
13220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
13240 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
13250 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
13260 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
13270 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
13280 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
13290 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
132a0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
132b0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
132c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
132d0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
132e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
132f0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
13300 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
13310 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
13320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13330 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
13340 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
13350 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
13360 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
13370 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13380 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
13390 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
133a0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
133b0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
133c0 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
133d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
133e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
133f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
13400 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
13410 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
13420 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
13430 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
13440 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
13450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13460 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
13470 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
13480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13490 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
134a0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
134b0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
134c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
134d0 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
134e0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
134f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
13500 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
13510 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
13520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13530 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
13540 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
13550 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
13560 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72  ger, nPage);.  r
13570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13580 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
13590 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
135a0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
135b0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
135c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
135d0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
135e0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
135f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13600 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
13610 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
13620 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
13630 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
13640 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
13650 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
13660 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
13670 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
13680 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
13690 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
136a0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
136b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
136c0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
136d0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
136e0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
136f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13700 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
13710 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
13720 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
13730 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
13740 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
13750 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
13760 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
13770 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
13780 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
13790 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
137a0 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
137b0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
137c0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
137d0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
137e0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
137f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
13800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13810 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
13820 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
13830 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
13840 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
13850 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
13860 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
13870 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
13880 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
13890 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
138a0 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
138b0 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
138c0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
138d0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
138e0 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
138f0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
13900 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
13910 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
13920 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
13930 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  set..  */.  Thre
13940 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
13950 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
13960 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ();.  assert( pP
13970 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
13980 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e  ( pTsd && pTsd->
13990 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66  nAlloc );.#endif
139a0 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
139b0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
139c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
139d0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
139e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
139f0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
13a00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
13a10 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
13a20 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
13a30 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
13a40 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
13a50 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
13a60 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
13a70 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13a80 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
13a90 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
13aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13ab0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
13ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
13ad0 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
13ae0 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
13af0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13b00 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
13b10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13b20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13b30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
13b40 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
13b50 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
13b60 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
13b70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13b80 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
13b90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
13ba0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
13bb0 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
13bc0 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
13bd0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
13be0 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
13bf0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
13c00 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
13c10 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
13c20 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
13c30 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66    ** }.  */..#if
13c40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13c50 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
13c60 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
13c70 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74  the pager from t
13c80 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
13c90 66 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e  f pagers startin
13ca0 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61  g at .  ** Threa
13cb0 64 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20  dData.pPager if 
13cc0 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
13cd0 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  t is enabled..  
13ce0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  */.  if( pPager=
13cf0 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b  =pTsd->pPager ){
13d00 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65  .    pTsd->pPage
13d10 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  r = pPager->pNex
13d20 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
13d30 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20  Pager *pTmp;.   
13d40 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64   for(pTmp = pTsd
13d50 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e  ->pPager; pTmp->
13d60 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70  pNext!=pPager; p
13d70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29  Tmp=pTmp->pNext)
13d80 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65  {}.    pTmp->pNe
13d90 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
13da0 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  xt;.  }.#endif. 
13db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
13dc0 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
13dd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
13de0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
13df0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13e00 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
13e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13e20 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
13e30 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
13e40 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
13e50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
13e60 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
13e70 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
13e80 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
13e90 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
13ea0 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
13eb0 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
13ec0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13ed0 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
13ee0 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
13ef0 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
13f00 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
13f10 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
13f20 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
13f30 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
13f40 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
13f50 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
13f60 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
13f70 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
13f80 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
13f90 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
13fa0 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
13fb0 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
13fc0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
13fd0 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
13fe0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
13ff0 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
14000 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
14010 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
14020 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
14030 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
14040 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
14050 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
14060 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
14070 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
14080 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
14090 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
140a0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
140b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
140c0 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
140d0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
140e0 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
140f0 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
14100 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
14110 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
14120 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
14130 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
14140 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
14150 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
14160 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
14170 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
14180 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
14190 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
141a0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
141b0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
141c0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
141d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
141e0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
141f0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
14200 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
14210 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
14220 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
14230 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
14240 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
14250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14260 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
14270 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
14280 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
14290 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
142a0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
142b0 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
142c0 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
142d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
142e0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
142f0 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
14300 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
14310 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
14320 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
14330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14340 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
14350 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
14360 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
14370 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
14380 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
14390 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
143a0 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
143b0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
143c0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
143d0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
143e0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
143f0 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
14400 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
14410 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
14420 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
14430 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
14440 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
14450 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
14460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14470 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
14480 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
14490 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
144a0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
144b0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
144c0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
144d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
144e0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
144f0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
14500 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
14510 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
14520 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
14530 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14540 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
14550 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
14560 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
14570 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
14580 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
14590 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
145a0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
145b0 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
145c0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
145d0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
145e0 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
145f0 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
14600 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
14610 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
14620 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
14630 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
14640 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
14650 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
14660 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
14670 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
14680 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
14690 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
146a0 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
146b0 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
146c0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
146d0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
146e0 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
146f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
14700 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
14710 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
14720 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
14730 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
14740 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
14750 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
14760 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14770 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
14780 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
14790 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
147a0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
147b0 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
147c0 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
147d0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
147e0 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
147f0 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
14800 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
14810 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
14820 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
14830 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
14840 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
14850 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
14860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
14870 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
14880 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
14890 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
148a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
148b0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
148c0 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
148d0 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
148e0 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
148f0 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
14900 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
14910 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
14920 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
14930 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14940 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
14950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
14960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14980 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
14990 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
149a0 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
149b0 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
149c0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
149d0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
149e0 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
149f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
14a00 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
14a10 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
14a20 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
14a30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
14a40 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
14a50 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
14a60 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
14a70 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
14a80 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
14a90 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
14aa0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
14ab0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
14ac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
14ad0 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
14ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
14af0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
14b00 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
14b10 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
14b20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14b40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
14b50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
14b60 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
14b70 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a     i64 jrnlOff;.
14b80 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
14b90 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
14ba0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
14bb0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
14bc0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
14bd0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
14be0 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
14bf0 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
14c00 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
14c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
14c20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
14c30 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
14c40 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
14c50 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
14c60 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
14c70 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
14c80 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
14c90 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
14ca0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
14cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
14cc0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
14cd0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
14ce0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14cf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
14d00 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
14d10 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
14d20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14d30 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
14d40 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
14d50 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
14d60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14d70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14d80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
14d90 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
14da0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
14db0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
14dc0 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  gic);.        IO
14dd0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
14de0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
14df0 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29  er, jrnlOff, 4))
14e00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
14e10 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
14e20 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
14e30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
14e40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
14e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14e60 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
14e70 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
14e80 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
14e90 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
14ea0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14eb0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
14ec0 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d  ger)).      rc =
14ed0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14ee0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14ef0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
14f00 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
14f10 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
14f20 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
14f30 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
14f40 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 29 3b 0a  NLY:0).      );.
14f50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14f60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14f70 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
14f80 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
14f90 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14fa0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
14fb0 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
14fc0 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
14fd0 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
14fe0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
14ff0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
15000 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
15010 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
15020 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
15030 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
15040 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
15050 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  d = pPager->pFir
15060 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  st;.  }..#ifndef
15070 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
15080 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
15090 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
150a0 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
150b0 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
150c0 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
150d0 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
150e0 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
150f0 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
15100 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
15110 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
15120 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
15130 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
15140 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
15150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
15160 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
15170 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
15180 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
15190 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d  tSynced==pPager-
151a0 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  >pFirst );.  }.#
151b0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
151c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72  rc;.}../*.** Mer
151d0 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20  ge two lists of 
151e0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20  pages connected 
151f0 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e  by pDirty and in
15200 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20   pgno order..** 
15210 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69  Do not both fixi
15220 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74  ng the pPrevDirt
15230 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  y pointers..*/.s
15240 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72  tatic PgHdr *mer
15250 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  ge_pagelist(PgHd
15260 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42  r *pA, PgHdr *pB
15270 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c  ){.  PgHdr resul
15280 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61  t, *pTail;.  pTa
15290 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20  il = &result;.  
152a0 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20  while( pA && pB 
152b0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  ){.    if( pA->p
152c0 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a  gno<pB->pgno ){.
152d0 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
152e0 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  rty = pA;.      
152f0 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20  pTail = pA;.    
15300 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74    pA = pA->pDirt
15310 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
15320 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
15330 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54  y = pB;.      pT
15340 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  ail = pB;.      
15350 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b  pB = pB->pDirty;
15360 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15370 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pA ){.    pTail
15380 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
15390 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b   }else if( pB ){
153a0 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
153b0 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65  ty = pB;.  }else
153c0 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
153d0 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  rty = 0;.  }.  r
153e0 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69  eturn result.pDi
153f0 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  rty;.}../*.** So
15400 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  rt the list of p
15410 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
15420 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e  g order by pgno.
15430 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63    Pages are.** c
15440 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
15450 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68  ty pointers.  Th
15460 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69  e pPrevDirty poi
15470 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72  nters are.** cor
15480 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73  rupted by this s
15490 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ort..*/.#define 
154a0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
154b0 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e  LOC 25.#define N
154c0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20  _SORT_BUCKET    
154d0 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c     25.#ifdef SQL
154e0 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73  ITE_TEST.  int s
154f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
15500 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a  ort_bucket = 0;.
15510 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f    #undef N_SORT_
15520 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65  BUCKET.  #define
15530 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c   N_SORT_BUCKET \
15540 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67  .   (sqlite3_pag
15550 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
15560 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  ?sqlite3_pager_n
15570 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53  _sort_bucket:N_S
15580 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
15590 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
155a0 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
155b0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
155c0 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
155d0 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
155e0 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  ], *p;.  int i;.
155f0 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
15600 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69  izeof(a));.  whi
15610 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70  le( pIn ){.    p
15620 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20   = pIn;.    pIn 
15630 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
15640 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
15650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
15660 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20  _SORT_BUCKET-1; 
15670 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15680 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
15690 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20     a[i] = p;.   
156a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
156b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
156c0 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
156d0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
156e0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a        a[i] = 0;.
156f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15700 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f    if( i==N_SORT_
15710 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20  BUCKET-1 ){.    
15720 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54    /* Coverage: T
15730 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72  o get here, ther
15740 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28  e need to be 2^(
15750 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a  N_SORT_BUCKET) .
15760 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
15770 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
15780 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73  ist. This is pos
15790 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61  sible, but impra
157a0 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  ctical..      **
157b0 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69   Testing this li
157c0 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20  ne is the point 
157d0 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  of global variab
157e0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  le.      ** sqli
157f0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
15800 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a  _bucket..      *
15810 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d  /.      a[i] = m
15820 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
15830 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  i], p);.    }.  
15840 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20  }.  p = a[0];.  
15850 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52  for(i=1; i<N_SOR
15860 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a  T_BUCKET; i++){.
15870 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
15880 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b  gelist(p, a[i]);
15890 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
158b0 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
158c0 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
158d0 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
158e0 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
158f0 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
15900 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
15910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15920 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
15930 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
15940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15950 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
15960 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
15970 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
15980 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
15990 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
159a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
159b0 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
159c0 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
159d0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
159e0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
159f0 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
15a00 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
15a10 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
15a20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
15a30 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
15a40 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15a50 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
15a60 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
15a70 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
15a80 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
15a90 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
15aa0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
15ab0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
15ac0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
15ad0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
15ae0 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
15af0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
15b00 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
15b10 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
15b20 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
15b30 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
15b40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
15b50 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
15b60 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
15b70 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
15b80 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
15b90 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
15ba0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
15bb0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
15bc0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
15bd0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
15be0 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
15bf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
15c00 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
15c10 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
15c20 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
15c30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
15c40 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
15c50 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
15c60 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
15c70 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
15c80 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
15c90 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
15ca0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
15cb0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
15cc0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
15cd0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
15ce0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
15cf0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
15d00 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
15d10 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
15d20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
15d30 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
15d40 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
15d50 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
15d60 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
15d70 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
15d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
15da0 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61   pList = sort_pa
15db0 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20  gelist(pList);. 
15dc0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
15dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
15de0 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
15df0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
15e00 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
15e10 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
15e20 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
15e30 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
15e40 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
15e50 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
15e60 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
15e70 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
15e80 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
15e90 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
15ea0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
15eb0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
15ec0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
15ed0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
15ee0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
15ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15f00 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
15f10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
15f20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
15f30 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
15f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
15f60 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
15f70 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
15f80 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
15f90 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
15fa0 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
15fb0 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20  RACE4("STORE %d 
15fc0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
15fd0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
15fe0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
15ff0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
16000 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
16010 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a  gehash(pList));.
16020 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16030 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
16040 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
16050 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
16060 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
16070 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
16080 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
16090 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
160a0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
160b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
160c0 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
160d0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
160e0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
160f0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
16100 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
16110 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16120 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16130 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
16140 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
16150 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
16160 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
16170 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
16180 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
16190 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
161a0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
161b0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
161c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
161d0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
161e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
161f0 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
16200 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
16210 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
16220 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
16230 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
16240 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
16250 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
16260 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
16270 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16280 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
16290 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
162a0 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
162b0 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
162c0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
162d0 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
162e0 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
162f0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
16300 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
16310 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
16320 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
16330 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
16340 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
16350 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16360 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
16370 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
16380 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
16390 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
163a0 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
163b0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
163c0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
163d0 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
163e0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
163f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
16400 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
16410 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16420 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
16430 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
16440 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
16450 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
16460 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
16470 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
16480 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
16490 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
164a0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
164b0 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
164c0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
164d0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
164e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
164f0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
16500 70 56 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61  pVfs;.  if( !pPa
16510 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
16520 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16530 28 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65  ( !sqlite3OsAcce
16540 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
16550 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
16560 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
16570 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
16590 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
165a0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
165b0 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
165c0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
165d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
165e0 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
165f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
16600 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
16610 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
16620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
16640 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
16650 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
16660 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
16670 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
16680 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
16690 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
166a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
166b0 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
166c0 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
166d0 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
166e0 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
166f0 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
16700 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16710 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
16720 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
16730 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20  t syncOk, PgHdr 
16740 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
16750 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
16760 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d   0;..  assert(!M
16770 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  EMDB);..  /* Fin
16780 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
16790 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
167a0 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
167b0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
167c0 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
167d0 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
167e0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
167f0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
16800 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
16810 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
16820 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
16830 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
16840 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
16850 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
16860 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
16870 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
16880 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
16890 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
168a0 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
168b0 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
168c0 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
168d0 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
168e0 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
168f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
16900 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
16910 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26  rst && syncOk &&
16920 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e   !MEMDB){.    in
16930 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
16940 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
16950 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
16960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16970 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
16980 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
16990 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
169a0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
169b0 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
169c0 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
169d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  he.      ** jour
169e0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
169f0 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
16a00 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
16a10 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
16a20 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
16a30 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
16a40 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
16a50 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
16a60 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
16a70 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16a80 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
16a90 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
16aa0 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68  s.      ** trash
16ab0 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
16ac0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
16ad0 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d)..      */.   
16ae0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
16af0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
16b00 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
16b10 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
16b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16b30 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
16b40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
16b50 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
16b60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
16b70 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
16b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
16ba0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
16bb0 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
16bc0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
16bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16be0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
16bf0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
16c00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
16c10 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
16c20 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
16c30 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
16c40 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
16c50 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
16c60 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
16c70 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
16c80 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
16c90 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
16ca0 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
16cb0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
16cc0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
16cd0 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
16ce0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16d10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16d20 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
16d30 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
16d40 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
16d50 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
16d60 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
16d70 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
16d80 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
16d90 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
16da0 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
16db0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
16dc0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
16dd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
16de0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
16df0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
16e00 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
16e10 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
16e20 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
16e30 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
16e40 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
16e50 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
16e60 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
16e70 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
16e80 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
16e90 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
16ea0 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
16eb0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
16ec0 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
16ed0 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
16ee0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
16ef0 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
16f00 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
16f10 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
16f20 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
16f30 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
16f40 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
16f50 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
16f60 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
16f70 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
16f80 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
16f90 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
16fa0 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
16fb0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
16fc0 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
16fd0 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
16fe0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
16ff0 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
17000 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17010 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17030 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
17040 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
17050 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
17060 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
17070 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
17080 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
17090 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
170a0 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
170b0 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
170c0 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
170d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65   sqlite3_free()e
170e0 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
170f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17100 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
17110 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
17120 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
17130 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
17140 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
17150 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ns. A negative v
17160 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65  alue for nReq me
17170 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d  ans.** free as m
17180 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
17190 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75  ssible. The retu
171a0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
171b0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
171c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
171d0 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
171e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
171f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
17200 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26  Y_MANAGEMENT) &&
17210 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17220 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e  _OMIT_DISKIO).in
17230 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
17240 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
17250 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54  nReq){.  const T
17260 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72  hreadData *pTsdr
17270 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  o = sqlite3Threa
17280 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b  dDataReadOnly();
17290 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
172a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
172b0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20    /* If the the 
172c0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
172d0 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f  held, this subro
172e0 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a  utine becomes a.
172f0 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20    ** o-op; zero 
17300 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
17310 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73  are freed.  This
17320 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a   is because.  **
17330 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64   some of the cod
17340 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69  e invoked by thi
17350 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
17360 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  lso.  ** try to 
17370 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  obtain the mutex
17380 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  , resulting in a
17390 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
173a0 23 69 66 20 30 0a 20 20 69 66 28 20 73 71 6c 69  #if 0.  if( sqli
173b0 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20  te3OsInMutex(0) 
173c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
173d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
173e0 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
173f0 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
17400 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
17410 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
17420 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
17430 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
17440 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
17450 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
17460 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
17470 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
17480 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
17490 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
174a0 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
174b0 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
174c0 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
174d0 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
174e0 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
174f0 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
17500 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
17510 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
17520 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
17530 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
17540 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
17550 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
17560 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
17570 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
17580 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
17590 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a  pTsdro->pPager;.
175a0 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65      for( ; pPage
175b0 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20  r && (nReq<0 || 
175c0 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b  nReleased<nReq);
175d0 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
175e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67  pNext){.      Pg
175f0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
17600 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69  int rc;..      i
17610 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17620 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17640 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
17650 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
17660 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
17670 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
17680 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
17690 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
176a0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
176b0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
176c0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
176d0 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
176e0 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
176f0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
17700 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
17710 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
17720 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
17730 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
17740 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
17750 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
17760 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
17770 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
17780 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
17790 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
177a0 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
177b0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
177c0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
177d0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
177e0 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
177f0 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
17800 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
17810 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
17820 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
17830 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
17840 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
17850 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
17860 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
17870 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
17880 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
17890 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
178a0 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
178b0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
178c0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
178d0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
178e0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
178f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
17900 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17910 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
17920 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
17930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17940 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67    for( pTmp=pPag
17950 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  er->pAll; pTmp->
17960 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
17970 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
17980 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
17990 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
179a0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
179b0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 20 30  .        }.#if 0
179c0 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73  .        nReleas
179d0 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f  ed += sqliteAllo
179e0 63 53 69 7a 65 28 70 50 67 29 3b 0a 23 65 6c 73  cSize(pPg);.#els
179f0 65 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61  e.        nRelea
17a00 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20  sed += (.       
17a10 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67       sizeof(*pPg
17a20 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
17a30 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
17a40 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
17a50 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
17a70 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
17a80 74 6f 72 79 29 20 0a 20 20 20 20 20 20 20 20 29  tory) .        )
17a90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
17aa0 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45   IOTRACE(("PGFRE
17ab0 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50  E %p %d *\n", pP
17ac0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
17ad0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
17ae0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
17af0 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
17b00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17b10 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
17b20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
17b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17b40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
17b50 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
17b60 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
17b70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17b80 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  e or .        **
17b90 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65   journal in page
17ba0 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65  r_recycle(). The
17bb0 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65   error is not re
17bc0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20  turned to the . 
17bd0 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72         ** caller
17be0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
17bf0 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
17c00 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
17c10 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
17c20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
17c30 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
17c40 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
17c50 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
17c60 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  case .        **
17c70 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67   of a shared pag
17c80 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65  er cache) of the
17c90 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
17ca0 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
17cb0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
17cc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 0a 20         assert(. 
17cd0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30             (rc&0
17ce0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
17cf0 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  RR ||.          
17d00 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c    rc==SQLITE_FUL
17d10 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  L ||.           
17d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
17d30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17d40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17d50 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
17d60 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
17d70 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
17d80 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
17d90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17da0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
17db0 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
17dc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
17dd0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
17de0 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
17df0 5f 44 49 53 4b 49 4f 20 2a 2f 0a 0a 2f 2a 0a 2a  _DISKIO */../*.*
17e00 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
17e10 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f  nt of page pPg o
17e20 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
17e30 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
17e40 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
17e50 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17e60 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e   PgHdr *pPg, Pgn
17e70 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
17e80 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b  c;.  i64 offset;
17e90 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42  .  assert( MEMDB
17ea0 3d 3d 30 20 29 3b 0a 20 20 6f 66 66 73 65 74 20  ==0 );.  offset 
17eb0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
17ec0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ed0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17ee0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17ef0 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
17f00 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
17f10 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
17f20 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
17f30 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
17f40 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
17f50 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
17f60 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
17f70 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
17f80 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
17f90 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  ));.  if( pgno==
17fa0 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
17fb0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
17fc0 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
17fd0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
17fe0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
18020 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
18030 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
18040 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
18050 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
18060 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54  no, 3);.  PAGERT
18070 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20  RACE4("FETCH %d 
18080 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18090 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
180a0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
180b0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
180c0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
180d0 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  (pPg));.  return
180e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
180f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18100 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
18110 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18120 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
18130 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
18140 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
18150 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
18160 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
18170 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
18180 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
18190 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
181a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
181b0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
181c0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
181d0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
181e0 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
181f0 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
18200 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
18210 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
18220 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
18230 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
18240 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
18250 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
18260 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
18270 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
18280 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
18290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
182a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
182b0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
182c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
182d0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
182e0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
182f0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
18300 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18310 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  r->nRef==0 );.  
18320 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
18330 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
18340 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
18350 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
18360 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
18370 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
18380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18390 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
183a0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
183b0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
183c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
183d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
183e0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
183f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20   );.      }.  . 
18400 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75       /* If a jou
18410 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
18420 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
18430 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
18440 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  on the.      ** 
18450 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
18460 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
18470 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
18480 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
18490 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
184a0 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e   if( hasHotJourn
184b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
184c0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
184d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
184e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
184f0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
18500 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
18510 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
18520 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
18530 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
18540 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
18550 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18560 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18570 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
18580 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
18590 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
185a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
185b0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
185c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
185d0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
185e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
185f0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
18600 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
18610 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
18620 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
18630 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
18640 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
18650 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
18660 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
18670 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
18680 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
18690 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
186a0 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
186b0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
186c0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
186d0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
186e0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
186f0 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53   it's own EXCLUS
18700 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18710 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
18720 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18740 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
18750 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18780 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
18790 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
187a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
187b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
187c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
187d0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
187e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
187f0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20  _EXCLUSIVE;. .  
18800 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
18810 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
18820 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
18830 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
18840 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  if.        ** we
18850 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
18860 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
18870 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  file. .        *
18880 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
18890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
188a0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
188b0 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e  e locked itself.
188c0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
188d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
188e0 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
188f0 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
18900 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
18910 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69          ** a wri
18920 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
18930 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
18940 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
18950 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  more.        ** 
18960 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
18970 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
18980 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
18990 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
189a0 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a     ** Open the j
189b0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
189c0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
189d0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
189e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63   .        ** exc
189f0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
18a00 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
18a10 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
18a20 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
18a30 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79       ** possibly
18a40 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
18a50 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
18a60 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  . On some system
18a70 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  s, the.        *
18a80 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
18a90 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
18aa0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
18ab0 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
18ac0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61          ** a rea
18ad0 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
18ae0 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dle..        */.
18af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
18b00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
18b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
18b20 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
18b30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
18b40 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18b50 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TS) ){.         
18b60 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
18b70 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61           int fla
18b80 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
18b90 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
18ba0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18bb0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
18bc0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
18bd0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
18be0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18bf0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
18c00 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
18c10 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
18c20 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
18c30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
18c40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
18c50 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
18c60 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
18c70 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49     if( fout&SQLI
18c80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
18cc0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
18cd0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
18ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
18d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18d10 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
18d20 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
18d30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
18d40 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
18d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
18d60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18d70 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
18d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
18d90 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
18da0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
18db0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
18dc0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
18dd0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
18de0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18df0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
18e00 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
18e10 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
18e20 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
18e30 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
18e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
18e50 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
18e60 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
18e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18e80 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
18e90 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
18ea0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
18eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
18ed0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
18ee0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
18ef0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
18f00 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
18f10 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
18f30 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
18f40 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
18f50 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
18f60 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
18f70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
18f80 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
18f90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
18fa0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
18fb0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
18fc0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
18fd0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
18fe0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
18ff0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
19000 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
19010 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
19020 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
19030 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
19040 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
19050 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
19060 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
19070 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
19080 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
19090 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
190a0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
190b0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
190c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
190d0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
190e0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
190f0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
19100 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
19110 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
19120 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
19130 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
19140 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
19150 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
19160 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
19170 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
19180 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
19190 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
191a0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
191b0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
191c0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
191d0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
191e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
191f0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
19200 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
19210 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
19220 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
19230 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
19240 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
19250 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
19260 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
19270 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
19280 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
19290 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
192a0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
192b0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
192c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
192d0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
192e0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
192f0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
19300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
19310 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
19320 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
19330 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19340 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
19350 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
19360 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
19370 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
19380 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
19390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
193a0 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
193b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
193c0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
193d0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
193e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
193f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
19400 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
19410 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
19420 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
19430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19480 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
19490 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
194a0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
194b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
194c0 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
194d0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
194e0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
194f0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
19500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
19510 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
19520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
19540 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
19550 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
19560 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41  Pager->state<=PA
19570 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
19580 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19590 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
195a0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
195b0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
195c0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
195d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
195e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
195f0 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
19600 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
19610 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
19620 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
19630 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
19640 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
19650 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
19660 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
19670 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
19680 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
19690 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
196a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
196b0 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
196c0 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
196d0 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
196e0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
196f0 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
19700 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
19710 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
19720 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
19730 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
19740 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
19750 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
19760 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
19770 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
19780 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
19790 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
197a0 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
197b0 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
197c0 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
197d0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
197e0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
197f0 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
19800 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19810 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
19820 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
19830 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
19840 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
19850 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
19860 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
19870 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
19880 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
19890 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
198a0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
198b0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
198c0 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
198d0 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
198e0 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
198f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
19900 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
19910 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
19920 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
19930 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
19940 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
19950 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
19960 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
19970 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
19980 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
19990 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
199a0 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
199b0 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
199c0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
199d0 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
199e0 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
199f0 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
19a00 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
19a10 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
19a20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
19a30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
19a40 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
19a50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
19a60 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
19a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19a80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
19a90 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
19aa0 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66   PgHdr if any of
19ab0 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74   the four condit
19ac0 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20  ions defined .  
19ad0 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a  ** above is met:
19ae0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
19af0 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
19b00 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61  mxPage.   || pPa
19b10 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a  ger->pFirst==0 .
19b20 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c     || MEMDB.   |
19b30 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73  | (pPager->pFirs
19b40 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
19b50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
19b60 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
19b70 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
19b80 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
19b90 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
19ba0 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
19bb0 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
19bc0 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
19bd0 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
19be0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
19bf0 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
19c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
19c10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19c20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
19c30 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
19c40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
19c50 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
19c60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
19c70 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
19c80 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
19cb0 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
19cc0 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
19cf0 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
19d00 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
19d10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19d20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
19d30 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
19d40 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
19d50 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
19d60 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
19d70 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
19d80 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
19d90 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
19da0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
19db0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
19dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
19dd0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
19de0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
19df0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
19e00 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
19e10 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
19e20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
19e30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19e40 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
19e50 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
19e60 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
19e70 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
19e80 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
19e90 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
19ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19eb0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
19ec0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
19ed0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
19ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19f00 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
19f10 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
19f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19f30 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
19f40 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
19f50 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
19f60 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
19f70 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
19f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19f90 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19fa0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
19fb0 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
19fc0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
19fd0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
19fe0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
19ff0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
1a000 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
1a010 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
1a020 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
1a030 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
1a040 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1a050 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
1a060 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
1a070 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
1a080 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
1a090 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
1a0a0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
1a0b0 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
1a0c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1a0d0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1a0e0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
1a0f0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
1a100 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
1a110 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1a120 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
1a130 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1a140 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
1a160 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1a170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1a1a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a1b0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1a1c0 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
1a1d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
1a1e0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
1a1f0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
1a200 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
1a210 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
1a220 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
1a230 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
1a240 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
1a250 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a260 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1a270 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
1a280 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
1a290 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1a2a0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
1a2b0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1a2c0 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
1a2d0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
1a2e0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
1a2f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
1a300 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
1a310 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
1a320 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
1a330 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
1a340 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
1a350 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
1a360 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
1a370 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
1a380 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
1a390 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
1a3a0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
1a3b0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
1a3c0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
1a3d0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
1a3e0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
1a3f0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
1a400 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1a410 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
1a420 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1a430 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1a440 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
1a450 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
1a460 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
1a470 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
1a480 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
1a490 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1a4a0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
1a4b0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1a4c0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
1a4d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
1a4e0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
1a4f0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
1a500 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
1a510 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
1a520 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
1a530 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
1a540 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1a550 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
1a560 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
1a570 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
1a580 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
1a590 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
1a5a0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
1a5b0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
1a5c0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
1a5d0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
1a5e0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
1a5f0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1a600 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
1a610 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
1a620 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1a630 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1a640 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1a650 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1a660 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1a670 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1a680 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1a690 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1a6a0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1a6b0 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1a6c0 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1a6d0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1a6e0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1a6f0 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1a700 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1a710 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1a720 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1a730 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1a740 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1a750 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1a760 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a770 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1a780 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1a790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a7a0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1a7b0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1a7c0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1a7d0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1a7e0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1a7f0 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1a800 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1a810 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
1a820 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
1a830 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1a840 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1a850 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1a860 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a870 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1a880 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1a890 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1a8a0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1a8b0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1a8c0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1a8d0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1a8e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1a8f0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1a900 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1a910 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1a920 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1a930 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1a940 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1a950 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1a960 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1a970 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1a980 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1a990 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1a9a0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1a9b0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1a9c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1a9d0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1a9e0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1a9f0 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1aa00 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1aa10 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1aa20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1aa30 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1aa40 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1aa50 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1aa60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1aa70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1aa80 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1aa90 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1aaa0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1aab0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1aac0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1aad0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1aae0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1aaf0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1ab00 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1ab10 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1ab20 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1ab30 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
1ab40 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1ab50 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
1ab60 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
1ab70 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
1ab80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ab90 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
1aba0 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
1abb0 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
1abc0 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
1abd0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
1abe0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
1abf0 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
1ac00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ac10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1ac20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1ac30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1ac40 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1ac50 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
1ac60 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1ac70 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1ac80 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
1ac90 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1aca0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
1acb0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1acc0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
1acd0 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
1ace0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1acf0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
1ad00 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
1ad10 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
1ad20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ad30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ad50 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
1ad60 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
1ad70 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
1ad80 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
1ad90 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
1ada0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1adb0 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
1adc0 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1add0 53 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20  Size ){.#if 0.  
1ade0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
1adf0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
1ae00 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
1ae10 38 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  8);.#endif.     
1ae20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ae30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1ae40 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1ae50 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
1ae60 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
1ae70 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
1ae80 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
1ae90 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1aea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1aeb0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1aec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1aed0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1aee0 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c     }..    makeCl
1aef0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
1af00 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
1af10 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
1af20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
1af30 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
1af40 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
1af50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1af60 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
1af70 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
1af80 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
1af90 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73    }.    nMax = s
1afa0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1afb0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1afc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1afd0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  rCode ){.      s
1afe0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1aff0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20  (pPg);.      rc 
1b000 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1b010 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
1b020 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
1b030 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
1b040 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
1b050 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
1b060 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1b070 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
1b080 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
1b090 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
1b0a0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1b0b0 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
1b0c0 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
1b0d0 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
1b0e0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1b0f0 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
1b100 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1b110 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1b120 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b130 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1b140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b150 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
1b160 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1b170 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1b180 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
1b190 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
1b1a0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
1b1b0 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
1b1c0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1b1d0 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
1b1e0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
1b1f0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1b200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b210 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1b220 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
1b230 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1b240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1b250 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1b260 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1b270 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
1b280 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
1b290 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1b2a0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1b2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b2c0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
1b2d0 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1b2e0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
1b2f0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
1b300 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
1b310 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
1b320 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
1b330 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
1b340 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
1b350 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1b360 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1b370 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
1b380 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
1b390 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
1b3a0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
1b3b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
1b3c0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
1b3d0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
1b3e0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
1b3f0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1b400 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1b410 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1b420 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1b430 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1b440 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1b450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b460 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1b470 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
1b480 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
1b490 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1b4a0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1b4b0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
1b4c0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
1b4d0 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
1b4e0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
1b4f0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1b500 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
1b510 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1b520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1b540 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
1b550 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
1b560 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
1b570 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b580 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
1b590 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
1b5a0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1b5b0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
1b5c0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
1b5d0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
1b5e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b5f0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
1b600 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
1b610 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
1b620 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1b630 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1b640 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
1b650 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
1b660 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
1b670 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
1b680 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
1b690 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
1b6a0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
1b6b0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
1b6c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
1b6d0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
1b6e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b6f0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
1b700 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1b710 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
1b720 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
1b730 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
1b740 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
1b750 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
1b760 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
1b770 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
1b780 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1b790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b7a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b7b0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
1b7c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1b7d0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1b7e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1b7f0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70  Pager->pAll || p
1b800 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1b810 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75  Mode );.    retu
1b820 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1b830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1b840 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1b850 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1b860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b870 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
1b880 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1b890 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1b8a0 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
1b8b0 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
1b8c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
1b8d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1b8e0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1b8f0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1b900 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1b910 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
1b920 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1b930 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
1b940 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
1b950 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
1b960 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
1b970 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
1b980 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
1b990 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
1b9a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b9b0 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
1b9c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b9d0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
1b9e0 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44  e *pPg){..  /* D
1b9f0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
1ba00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1ba10 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
1ba20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1ba30 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
1ba40 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
1ba50 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b  O(pPg);..  CHECK
1ba60 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1ba70 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
1ba80 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1ba90 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
1baa0 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
1bab0 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
1bac0 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
1bad0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
1bae0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
1baf0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
1bb00 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1bb10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1bb20 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1bb30 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
1bb40 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
1bb50 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
1bb60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
1bb70 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
1bb80 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
1bb90 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
1bba0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
1bbb0 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
1bbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1bbd0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
1bbe0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
1bbf0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
1bc00 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
1bc10 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
1bc20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
1bc30 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
1bc40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bc50 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1bc60 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
1bc70 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
1bc80 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
1bc90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1bca0 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
1bcb0 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
1bcc0 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
1bcd0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
1bce0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
1bcf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1bd00 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1bd10 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
1bd20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1bd30 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
1bd40 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1bd50 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
1bd60 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1bd70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bd80 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  >0) ){.      pag
1bd90 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1bda0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1bdb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1bdc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1bdd0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
1bde0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
1bdf0 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
1be00 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
1be10 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
1be20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1be30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1be40 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
1be50 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1be60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1be70 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1be80 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
1be90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
1bea0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
1beb0 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
1bec0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1bed0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bee0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1bef0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1bf00 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
1bf10 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1bf20 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c  ->pVfs;.  int fl
1bf30 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
1bf40 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1bf50 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1bf60 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  VE|SQLITE_OPEN_C
1bf70 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72  REATE);..  int r
1bf80 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
1bf90 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1bfa0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1bfb0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1bfc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1bfd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1bfe0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bff0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1c000 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1c010 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1c020 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1c030 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1c040 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1c050 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1c060 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1c070 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ro( pPager->dbSi
1c080 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
1c090 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1c0a0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
1c0b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c0c0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1c0d0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1c0e0 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
1c0f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c100 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28  {.    flags |= (
1c110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1c120 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
1c130 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1c140 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AL);.  }else{.  
1c150 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1c160 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1c170 52 4e 41 4c 29 3b 0a 20 20 7d 0a 20 20 72 63 20  RNAL);.  }.  rc 
1c180 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1c190 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1c1a0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1c1b0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
1c1c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1c1d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c1e0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1c1f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
1c200 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1c210 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1c220 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
1c230 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1c240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1c260 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1c270 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c280 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1c290 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1c2a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1c2b0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1c2c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1c2d0 0a 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33  .#if 0.  sqlite3
1c2e0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
1c2f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1c300 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
1c310 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1c320 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  llSync(pPager->f
1c330 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
1c340 66 73 79 6e 63 29 3b 0a 23 65 6e 64 69 66 0a 20  fsync);.#endif. 
1c350 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c360 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
1c370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1c380 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
1c390 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1c3a0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
1c3b0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
1c3c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1c3d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c3e0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1c3f0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1c400 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
1c410 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1c420 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
1c430 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1c440 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1c450 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
1c460 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1c470 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1c480 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
1c490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c4a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c4b0 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
1c4c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1c4d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c4e0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1c4f0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
1c500 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1c510 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
1c520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c540 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1c550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c560 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
1c570 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1c580 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
1c590 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1c5a0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
1c5b0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
1c5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c5d0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1c5e0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1c5f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1c600 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
1c610 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
1c620 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c630 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
1c640 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1c650 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1c660 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1c670 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1c680 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
1c690 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1c6a0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1c6b0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1c6c0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1c6d0 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
1c6e0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
1c6f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1c700 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1c710 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
1c720 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1c730 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
1c740 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
1c750 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1c760 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
1c770 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
1c780 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
1c790 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
1c7a0 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
1c7b0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1c7c0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
1c7d0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
1c7e0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
1c7f0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1c800 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1c810 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1c820 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
1c830 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
1c840 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
1c850 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
1c860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
1c870 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
1c880 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1c890 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1c8a0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1c8b0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1c8c0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1c8d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1c8e0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1c8f0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1c900 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1c910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1c920 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1c930 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1c940 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1c950 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1c960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1c970 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1c980 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1c990 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1c9a0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c9b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1c9c0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1c9d0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1c9e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1c9f0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1ca00 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1ca10 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1ca20 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1ca30 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1ca40 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1ca50 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1ca60 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1ca70 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1ca80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1ca90 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1caa0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1cab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1cac0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1cad0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cae0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
1caf0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1cb00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1cb10 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1cb20 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1cb30 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1cb40 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1cb50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1cb60 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1cb70 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1cb80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1cb90 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1cba0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
1cbb0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1cbc0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1cbd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cbe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1cbf0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1cc00 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1cc10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cc20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cc30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1cc40 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
1cc50 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
1cc60 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1cc70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1cc80 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1cc90 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1cca0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
1ccb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ccc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ccd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cce0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ccf0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1cd00 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
1cd10 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
1cd20 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
1cd30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1cd40 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
1cd50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1cd60 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
1cd70 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
1cd80 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1cd90 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1cda0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cdb0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1cdc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1cdd0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1cde0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
1cdf0 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
1ce00 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
1ce10 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
1ce20 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74  access mode last
1ce30 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1ce40 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1ce50 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1ce60 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1ce70 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1ce80 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1ce90 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1cea0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1ceb0 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1cec0 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1ced0 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  nd truncated to 
1cee0 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 bytes..    */.
1cef0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cf00 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
1cf10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1cf20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
1cf30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cf40 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1cf50 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  al==0 );.    sql
1cf60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1cf70 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
1cf80 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1cf90 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
1cfa0 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e  ocZero( pPager->
1cfb0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1cfc0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1cfd0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >aInJournal ){. 
1cfe0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cff0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1d000 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
1d010 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1d020 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1d030 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
1d040 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1d050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1d060 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
1d070 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
1d080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d090 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
1d0a0 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
1d0b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
1d0c0 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20  e a page dirty. 
1d0d0 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66   Set its dirty f
1d0e0 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74  lag and add it t
1d0f0 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70  o the dirty.** p
1d100 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
1d110 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72  tic void makeDir
1d120 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ty(PgHdr *pPg){.
1d130 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1d140 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
1d150 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d160 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
1d170 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
1d180 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
1d190 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20  ager->pDirty;.  
1d1a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44    if( pPager->pD
1d1b0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1d1c0 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50  ager->pDirty->pP
1d1d0 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  revDirty = pPg;.
1d1e0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
1d1f0 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20  PrevDirty = 0;. 
1d200 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1d210 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  y = pPg;.  }.}..
1d220 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
1d230 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20  e clean.  Clear 
1d240 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e  its dirty bit an
1d250 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  d remove it from
1d260 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
1d270 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1d280 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
1d290 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  n(PgHdr *pPg){. 
1d2a0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1d2b0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  ){.    pPg->dirt
1d2c0 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1d2d0 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  Pg->pDirty ){.  
1d2e0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
1d2f0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
1d300 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
1d310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
1d320 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
1d330 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
1d340 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20  Dirty->pDirty = 
1d350 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
1d360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1d370 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74  g->pPager->pDirt
1d380 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1d390 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
1d3a0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
1d3b0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
1d3c0 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
1d3d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d3e0 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
1d3f0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1d400 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
1d410 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
1d420 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
1d430 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
1d440 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
1d450 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1d460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d470 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
1d480 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
1d490 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
1d4a0 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
1d4b0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1d4c0 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
1d4d0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
1d4e0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
1d4f0 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
1d500 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1d510 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
1d520 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
1d530 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
1d540 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
1d550 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
1d560 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
1d570 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
1d580 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
1d590 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1d5a0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
1d5b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d5c0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
1d5d0 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
1d5e0 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
1d5f0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
1d600 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1d610 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
1d620 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1d630 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
1d640 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
1d650 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
1d660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1d670 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
1d680 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
1d690 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1d6a0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61  t() or sqlite3Pa
1d6b0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  gerRollback() to
1d6c0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74  .** reset..*/.st
1d6d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
1d6e0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
1d6f0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
1d700 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
1d710 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPg);.  Pager *p
1d720 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d730 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
1d740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1d750 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
1d760 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
1d770 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
1d780 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1d790 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1d7a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
1d7b0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
1d7c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
1d7d0 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
1d7e0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1d7f0 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
1d800 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1d810 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77  * If this page w
1d820 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  as previously ac
1d830 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1d840 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d  ntent==1, that m
1d850 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64  eans.  ** we did
1d860 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20  n't really read 
1d870 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
1d880 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  f the page.  Thi
1d890 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a  s can happen.  *
1d8a0 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20  * (for example) 
1d8b0 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  when the page is
1d8c0 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
1d8d0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42  the freelist.  B
1d8e0 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61  ut.  ** now we a
1d8f0 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76  re (perhaps) mov
1d900 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66  ing the page off
1d910 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1d920 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20   for.  ** reuse 
1d930 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  and we need to k
1d940 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  now its original
1d950 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74   content so that
1d960 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61   content.  ** ca
1d970 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  n be stored in t
1d980 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1d990 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20  nal.  So do the 
1d9a0 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a  read at this.  *
1d9b0 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72  * time..  */.  r
1d9c0 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1d9d0 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
1d9e0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1d9f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1da00 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1da10 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
1da20 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
1da30 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
1da40 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
1da50 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
1da60 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
1da70 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72  ..  */.  makeDir
1da80 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
1da90 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1daa0 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   (pageInStatemen
1dab0 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72  t(pPg) || pPager
1dac0 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
1dad0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1dae0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1daf0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
1db00 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
1db10 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
1db20 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
1db30 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
1db40 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
1db50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1db60 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
1db70 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
1db80 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
1db90 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
1dba0 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
1dbb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dbc0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1dbd0 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
1dbe0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
1dbf0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1dc00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dc10 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1dc20 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
1dc30 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1dc40 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
1dc50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dc60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dc70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1dc80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1dc90 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1dca0 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
1dcb0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1dcc0 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1dcd0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
1dce0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1dcf0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1dd00 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1dd10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1dd20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1dd30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1dd40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1dd50 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
1dd60 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
1dd70 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1dd80 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
1dd90 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1dda0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
1ddb0 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
1ddc0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
1ddd0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1dde0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1ddf0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1de00 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
1de10 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
1de20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
1de30 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
1de40 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1de50 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1de60 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
1de70 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72  urnal && (pPager
1de80 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->useJournal || 
1de90 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
1dea0 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
1deb0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1dec0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1ded0 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
1dee0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1def0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
1df00 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1df10 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1df20 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1df30 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1df40 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
1df50 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1df60 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1df70 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1df80 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1df90 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
1dfa0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
1dfb0 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ig = sqlite3_mal
1dfc0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
1dfd0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
1dfe0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1dff0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
1e000 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
1e010 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
1e020 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1e030 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1e040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e060 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
1e070 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
1e080 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
1e090 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
1e0a0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
1e0b0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
1e0c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
1e0d0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
1e0e0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
1e0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
1e100 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
1e110 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
1e120 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e130 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
1e140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1e150 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
1e160 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1e170 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
1e180 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1e190 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1e1a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1e1b0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
1e1c0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1e1d0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1e1e0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
1e1f0 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
1e200 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1e210 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1e220 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
1e230 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
1e240 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
1e250 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
1e260 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1e270 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
1e280 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
1e290 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1e2a0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1e2b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1e2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1e2d0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1e2e0 20 70 44 61 74 61 32 2c 20 73 7a 50 67 2c 20 70   pData2, szPg, p
1e2f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e300 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  f);.          IO
1e310 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1e320 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1e330 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1e340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1e360 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b  rnalOff, szPg));
1e370 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1e380 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1e390 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1e3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1e3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1e3c0 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
1e3d0 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
1e3e0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1e3f0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
1e400 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1e420 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1e430 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1e440 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61  edSync, pager_pa
1e450 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
1e460 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70          *(u32*)p
1e470 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 20 20  End = saved;..  
1e480 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
1e490 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
1e4a0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
1e4b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1e4c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
1e4d0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1e4e0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1e4f0 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1e500 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1e510 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e530 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e540 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1e550 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
1e560 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
1e570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e580 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1e590 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
1e5a0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1e5b0 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1e5c0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1e5d0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
1e5e0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1e5f0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1e600 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e610 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e620 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1e630 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e640 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1e650 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1e660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
1e690 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1e6a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1e6b0 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
1e6c0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1e6d0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
1e6e0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1e6f0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1e700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e710 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e720 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1e730 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1e740 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1e750 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1e760 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e770 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e780 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1e790 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1e7a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1e7b0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1e7c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
1e7d0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1e7e0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
1e7f0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
1e800 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1e810 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
1e820 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
1e830 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
1e840 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1e850 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
1e860 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
1e870 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
1e880 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
1e890 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
1e8a0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
1e8b0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
1e8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1e8d0 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
1e8e0 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
1e8f0 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
1e900 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1e910 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1e920 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
1e930 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1e940 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1e950 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1e960 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1e970 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1e980 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1e990 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1e9a0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1e9b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1e9c0 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1e9d0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
1e9e0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1e9f0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1ea00 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1ea10 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
1ea20 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1ea30 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1ea40 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
1ea50 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1ea60 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1ea70 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1ea80 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
1ea90 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1eaa0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1eab0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1eac0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1ead0 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1eae0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1eaf0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
1eb00 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66  .        i64 off
1eb10 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
1eb20 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
1eb30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1eb40 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1eb50 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1eb60 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1eb70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20  gno, 7)-4;.     
1eb80 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1eb90 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1eba0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ebb0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1ebc0 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
1ebd0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1ebe0 69 7a 65 2b 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ize+4, offset);.
1ebf0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ec00 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1ec10 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1ec20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ec30 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ec40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ec50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ec70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec80 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1ec90 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1eca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1ecb0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1ecc0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1ecd0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1ece0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1ecf0 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1ed00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
1ed10 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
1ed20 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
1ed30 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
1ed40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1ed50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1ed60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1ed70 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
1ed80 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
1ed90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
1eda0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
1edb0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1edc0 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e  ->dbSize==PENDIN
1edd0 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
1ede0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
1edf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b   pPager->dbSize+
1ee00 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
1ee10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ee20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ee30 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b   is used to mark
1ee40 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20   a data-page as 
1ee50 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65  writable. It use
1ee60 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74  s .** pager_writ
1ee70 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f  e() to open a jo
1ee80 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
1ee90 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1eea0 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72   open).** and wr
1eeb0 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44  ite the page *pD
1eec0 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ata to the journ
1eed0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  al..**.** The di
1eee0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1eef0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1ef00 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
1ef10 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
1ef20 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
1ef30 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
1ef40 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
1ef50 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
1ef60 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
1ef70 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
1ef80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
1ef90 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
1efa0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
1efb0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1efc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1efd0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1efe0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1eff0 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
1f000 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1f010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f020 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
1f030 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1f040 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1f050 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
1f060 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
1f070 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
1f080 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
1f090 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
1f0a0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
1f0b0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
1f0c0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
1f0d0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
1f0e0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1f0f0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1f100 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1f110 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
1f120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1f130 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1f140 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1f150 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
1f160 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
1f170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f180 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
1f190 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
1f1a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
1f1b0 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53  nt ii;..    /* S
1f1c0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1f1d0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1f1e0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1f1f0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1f200 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1f210 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1f220 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1f230 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1f240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1f250 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1f260 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1f270 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
1f280 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1f290 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
1f2a0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
1f2b0 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
1f2c0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
1f2d0 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
1f2e0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
1f2f0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
1f300 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
1f310 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
1f320 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
1f330 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1f340 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1f350 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
1f360 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
1f370 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
1f380 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
1f390 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
1f3a0 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
1f3b0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1f3c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1f3d0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1f3e0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1f3f0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1f400 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1f410 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1f420 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1f430 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1f440 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1f450 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1f460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f470 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1f480 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1f490 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1f4a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1f4b0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1f4c0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1f4d0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1f4e0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1f4f0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1f500 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1f510 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1f520 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1f530 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
1f540 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d  nJournal || pg==
1f550 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20  pPg->pgno || .  
1f560 20 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65          pg>pPage
1f570 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c  r->origDbSize ||
1f580 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1f590 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c  urnal[pg/8]&(1<<
1f5a0 28 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29  (pg&7))).      )
1f5b0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
1f5c0 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
1f5d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f5e0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
1f5f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
1f600 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1f610 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
1f620 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1f630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f650 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1f660 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1f670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f680 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1f690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f6b0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1f6c0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1f6d0 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
1f6e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1f6f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1f700 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1f710 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1f720 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f730 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1f740 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
1f750 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1f760 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
1f770 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
1f780 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
1f790 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
1f7a0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
1f7b0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
1f7c0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
1f7d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1f7e0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
1f7f0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
1f800 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1f810 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
1f820 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1f830 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dirty;.}.#endif.
1f840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f850 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
1f860 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
1f870 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
1f880 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
1f890 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1f8a0 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
1f8b0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1f8c0 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
1f8d0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1f8e0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
1f8f0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
1f900 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
1f910 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
1f920 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1f930 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a  r, pgno, &pPg);.
1f940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f950 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1f960 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f970 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
1f980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f990 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71  .      memcpy(sq
1f9a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1f9b0 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70  a(pPg), pData, p
1f9c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f9e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f9f0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1fa00 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1fa10 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1fa20 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1fa30 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1fa40 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
1fa50 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
1fa60 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1fa70 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
1fa80 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
1fa90 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
1faa0 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
1fab0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1fac0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
1fad0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
1fae0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
1faf0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
1fb00 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
1fb10 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1fb20 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
1fb30 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
1fb40 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
1fb50 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
1fb60 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
1fb70 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
1fb80 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
1fb90 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
1fba0 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
1fbb0 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
1fbc0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1fbd0 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
1fbe0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
1fbf0 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
1fc00 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
1fc10 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
1fc20 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
1fc30 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
1fc40 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1fc50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1fc60 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
1fc70 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
1fc80 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
1fc90 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
1fca0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1fcb0 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
1fcc0 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
1fcd0 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
1fce0 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
1fcf0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
1fd00 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
1fd10 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
1fd20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
1fd30 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1fd40 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
1fd50 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
1fd60 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
1fd70 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
1fd80 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
1fd90 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
1fda0 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
1fdb0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
1fdc0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
1fdd0 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
1fde0 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
1fdf0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1fe00 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1fe10 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
1fe20 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
1fe30 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1fe40 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
1fe50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1fe60 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
1fe70 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
1fe80 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
1fe90 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1fea0 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
1feb0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1fec0 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
1fed0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1fee0 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
1fef0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ff00 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
1ff10 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1ff20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1ff30 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1ff40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1ff50 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
1ff60 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1ff70 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1ff80 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
1ff90 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70  pPg->dirty && !p
1ffa0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ffb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ffc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1ffd0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1ffe0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
1fff0 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
20000 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
20010 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
20020 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
20030 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
20040 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
20050 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
20060 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
20070 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
20080 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
20090 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
200a0 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
200b0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
200c0 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
200d0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
200e0 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
200f0 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
20100 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
20110 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
20120 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
20130 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
20140 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
20150 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
20160 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
20170 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
20180 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
20190 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
201a0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
201b0 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
201c0 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
201d0 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
201e0 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
201f0 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
20200 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
20210 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
20220 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
20230 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
20240 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
20250 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
20260 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
20270 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20280 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
20290 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
202a0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
202b0 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  o)).      makeCl
202c0 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66  ean(pPg);.#ifdef
202d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
202e0 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
202f0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
20300 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
20310 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
20320 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
20330 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
20340 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
20350 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
20360 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
20370 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
20380 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
20390 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
203a0 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
203b0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
203c0 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
203d0 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
203e0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
203f0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
20400 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
20410 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
20420 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
20430 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
20440 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
20450 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
20460 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
20470 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
20480 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
20490 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
204a0 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
204b0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
204c0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
204d0 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
204e0 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
204f0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
20500 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
20510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20520 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
20530 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
20540 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20550 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
20560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20570 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
20580 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
20590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
205a0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
205b0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
205c0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
205d0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
205e0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
205f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
20600 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
20610 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
20620 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
20630 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
20640 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
20650 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
20660 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
20670 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
20680 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
20690 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
206a0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
206b0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
206c0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
206d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
206e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
206f0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
20700 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
20710 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
20720 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
20730 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
20740 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
20750 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
20760 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
20770 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
20780 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
20790 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
207a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
207b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
207c0 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
207d0 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
207e0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
207f0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
20800 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
20810 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
20820 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
20830 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
20840 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
20850 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
20860 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
20870 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20880 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
20890 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
208a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
208b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
208c0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
208d0 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
208e0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
208f0 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
20900 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
20910 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
20920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20930 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
20940 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
20950 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
20960 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
20970 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
20980 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  nt rc;..  if( !p
20990 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
209a0 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
209b0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
209c0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
209d0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
209e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
209f0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
20a00 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
20a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
20a20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
20a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20a40 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
20a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20a60 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20a70 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  .  .    /* Incre
20a80 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
20a90 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
20aa0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
20ab0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
20ac0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
20ad0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
20ae0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
20af0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
20b00 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
20b10 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
20b20 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
20b30 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
20b40 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
20b50 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
20b60 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
20b70 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
20b80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20b90 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
20ba0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20bb0 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
20bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20bd0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
20be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
20bf0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
20c00 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
20c10 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
20c20 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
20c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
20c40 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
20c50 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
20c60 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
20c70 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
20c80 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
20c90 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
20ca0 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
20cb0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
20cc0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
20cd0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
20ce0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
20cf0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
20d00 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
20d10 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
20d20 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
20d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20d40 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
20d50 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
20d60 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
20d70 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
20d80 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
20d90 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
20da0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
20db0 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
20dc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20dd0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
20de0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20df0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
20e00 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
20e10 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
20e20 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
20e30 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
20e40 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
20e50 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
20e60 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
20e70 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
20e80 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
20e90 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
20ea0 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
20eb0 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
20ec0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
20ed0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
20ee0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
20ef0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
20f00 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67  eOne(Pager *pPag
20f10 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
20f20 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
20f30 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
20f40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20f50 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
20f60 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
20f70 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
20f80 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
20f90 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
20fa0 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
20fb0 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
20fc0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
20fd0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
20fe0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
20ff0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
21000 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
21010 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21020 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
21030 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
21040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21050 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
21060 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
21070 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
21080 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
21090 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
210a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
210b0 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
210c0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
210d0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
210e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
210f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
21100 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
21110 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
21120 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
21130 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
21140 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
21150 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
21160 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
21170 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
21180 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
21190 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
211a0 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
211b0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
211c0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
211d0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
211e0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
211f0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
21200 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
21210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21220 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
21230 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
21240 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
21250 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
21260 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
21270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
21280 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
21290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
212a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
212b0 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
212c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
212d0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
212e0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
212f0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
21300 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
21310 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
21320 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
21330 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
21340 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
21350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
21360 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
21370 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21380 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
21390 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
213a0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
213b0 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
213c0 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
213d0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
213e0 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
213f0 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
21400 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
21410 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
21420 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
21430 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21440 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
21450 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
21460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21480 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
21490 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
214a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
214b0 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
214c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
214d0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
214e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
214f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21500 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21520 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
21530 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
21540 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
21550 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
21560 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
21570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21580 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21590 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
215a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
215b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
215c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
215d0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
215e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
215f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21600 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
21610 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21620 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
21630 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
21640 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
21650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21660 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21670 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
21680 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
21690 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
216a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
216b0 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
216c0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
216d0 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
216e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
216f0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
21700 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
21710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
21720 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
21730 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21740 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   0;..    /* Sync
21750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21760 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
21770 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
21780 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21790 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
217a0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
217b0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
217c0 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
217d0 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
217e0 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
217f0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
21800 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
21810 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
21820 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
21830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21840 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
21850 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
21860 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
21870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
21880 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
21890 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
218a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
218b0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
218c0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
218d0 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
218e0 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
218f0 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
21900 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
21910 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
21920 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
21930 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
21940 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73 0a  onsistent, it's.
21950 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f       * better to
21960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
21970 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  USY..     */.   
21980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
21990 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  Y;.  }.  return 
219a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
219b0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
219c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
219d0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
219e0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
219f0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
21a00 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
21a10 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
21a20 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
21a30 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
21a40 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
21a50 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
21a60 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
21a70 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21a80 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
21a90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
21aa0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
21ab0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
21ac0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
21ad0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
21ae0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
21af0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
21b00 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
21b10 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
21b20 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
21b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21b40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41  _ERROR;.  }.  PA
21b50 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
21b60 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
21b70 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
21b80 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
21b90 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
21ba0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
21bb0 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
21bc0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50  ( pPg ){.      P
21bd0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
21be0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
21bf0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
21c00 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
21c10 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
21c20 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
21c30 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
21c40 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
21c50 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
21c60 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
21c70 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
21c80 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
21c90 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
21ca0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
21cb0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
21cc0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
21cd0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
21ce0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
21cf0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
21d00 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
21d10 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
21d20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
21d30 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
21d40 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
21d50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
21d60 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
21d70 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
21d80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
21d90 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
21da0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
21db0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
21dc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
21dd0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
21de0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
21df0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
21e00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21e10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
21e20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
21e30 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
21e40 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21e60 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
21e70 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
21e80 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21e90 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
21ea0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
21eb0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
21ec0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
21ed0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
21ee0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
21ef0 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
21f00 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
21f10 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
21f20 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
21f30 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
21f40 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
21f50 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
21f60 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
21f70 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
21f80 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
21f90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
21fa0 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
21fb0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
21fc0 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
21fd0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
21fe0 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
21ff0 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
22000 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
22010 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
22020 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
22030 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
22040 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
22050 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
22060 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
22070 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
22080 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
22090 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
220a0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
220b0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
220c0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
220d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
220e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
220f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
22100 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
22110 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
22120 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
22130 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
22140 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
22150 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
22160 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
22170 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
22180 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
22190 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
221a0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
221b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
221c0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
221d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
221e0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
221f0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
22200 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
22210 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
22220 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
22230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
22240 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
22250 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
22260 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
22270 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
22280 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
22290 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
222a0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
222b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
222c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
222d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
222e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
222f0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
22300 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22310 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
22320 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
22330 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
22340 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
22350 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
22360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22370 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
22380 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
22390 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
223a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
223b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
223c0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
223d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
223e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
223f0 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
22400 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
22410 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
22420 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
22430 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
22440 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
22450 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
22460 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
22470 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
22480 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
22490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
224a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
224b0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
224c0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
224d0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
224e0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
224f0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
22500 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
22510 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
22520 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
22530 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
22540 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
22550 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
22560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22570 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
22580 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22590 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
225a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
225b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
225c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
225d0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
225e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
225f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22600 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
22610 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
22620 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
22630 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
22640 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
22650 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
22660 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
22670 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
22680 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
22690 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
226a0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
226b0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
226c0 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
226d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
226e0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
226f0 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
22700 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
22710 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
22720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22730 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
22740 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
22750 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
22760 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
22770 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
22780 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
22790 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
227a0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
227b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
227c0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
227d0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
227e0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
227f0 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
22800 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
22810 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
22820 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
22830 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
22840 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
22850 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
22860 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
22870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22880 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
22890 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
228a0 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
228b0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
228c0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
228d0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
228e0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
228f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
22900 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
22910 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
22920 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
22930 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
22940 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
22950 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
22960 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
22970 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
22980 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
22990 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
229a0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
229b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
229c0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
229d0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
229e0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
229f0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
22a00 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
22a10 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
22a20 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
22a30 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
22a40 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
22a50 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
22a60 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
22a70 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
22a80 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
22a90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
22aa0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
22ab0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
22ac0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
22ad0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
22ae0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
22af0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
22b00 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
22b10 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
22b20 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
22b30 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
22b40 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
22b50 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
22b60 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
22b70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
22b80 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
22b90 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
22ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
22bb0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
22bc0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
22bd0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
22be0 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
22bf0 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
22c00 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
22c10 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
22c20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
22c30 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
22c40 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
22c50 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
22c60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
22c70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22c80 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
22c90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
22ca0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
22cb0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
22cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
22cd0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
22ce0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
22cf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
22d00 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
22d10 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
22d20 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
22d30 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
22d40 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
22d50 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
22d60 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
22d70 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
22d80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
22d90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22da0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
22db0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
22dc0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
22dd0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
22de0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
22df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22e10 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
22e20 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
22e30 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mt = sqlite3Mall
22e40 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e  ocZero( pPager->
22e50 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
22e60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
22e70 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
22e80 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
22e90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
22ea0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
22eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22ec0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
22ed0 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
22ee0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
22ef0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
22f00 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
22f10 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
22f20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
22f30 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
22f40 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
22f50 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
22f60 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
22f70 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
22f80 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
22f90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
22fa0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
22fb0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
22fc0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
22fd0 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
22fe0 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
22ff0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
23000 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
23010 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
23020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23030 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
23040 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
23050 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
23060 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23070 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
23080 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
23090 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
230a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
230b0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
230c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
230d0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
230e0 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
230f0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
23100 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
23110 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
23120 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
23130 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
23140 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
23150 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
23170 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
23180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23190 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50  agerStmtCommit(P
231a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
231b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
231c0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
231d0 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
231e0 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
231f0 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
23200 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
23210 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
23220 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
23230 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
23240 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
23250 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
23260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50  sqlite3_free( pP
23270 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
23280 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
23290 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
232a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
232b0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
232c0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
232d0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  xt){.        PgH
232e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
232f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
23300 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
23310 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73      pNext = pHis
23320 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  t->pNextStmt;.  
23330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
23340 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  ist->inStmt );. 
23350 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e         pHist->in
23360 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
23370 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
23380 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
23390 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
233a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
233b0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
233c0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
233d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
233e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
233f0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
23400 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
23410 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
23420 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
23430 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
23440 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
23450 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
23460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23470 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
23480 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
23490 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
234a0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
234b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
234c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
234d0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
234e0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
234f0 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
23500 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23510 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
23520 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
23530 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69  *pPg;.      PgHi
23540 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
23550 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
23560 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
23570 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74  pPg=pHist->pNext
23580 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Stmt){.        p
23590 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
235a0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
235b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
235c0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
235d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
235e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
235f0 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
23600 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23610 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
23620 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
23630 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
23640 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
23650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
23660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23670 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23680 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
23690 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72  ;.      pager_tr
236a0 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
236b0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
236c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
236d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
236e0 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
236f0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
23700 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23710 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
23720 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
23730 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23740 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
23750 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
23760 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
23770 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23780 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
23790 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
237a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
237b0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
237c0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
237d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
237e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
237f0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
23800 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
23810 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
23820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
23830 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
23840 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
23850 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23860 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23870 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
23880 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
23890 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
238a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
238b0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
238c0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
238d0 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
238e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
238f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
23900 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
23910 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
23920 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
23930 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
23940 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
23950 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
23960 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
23970 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
23980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23990 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
239a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
239b0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
239c0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
239d0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
239e0 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
239f0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
23a00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23a10 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
23a20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
23a30 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
23a40 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
23a50 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
23a60 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
23a70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
23a80 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
23a90 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
23aa0 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  odecArg;.}.#endi
23ab0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
23ac0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
23ad0 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
23ae0 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
23af0 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
23b00 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
23b10 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
23b20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
23b30 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
23b40 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
23b50 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
23b60 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
23b70 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
23b80 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
23b90 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
23ba0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
23bb0 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
23bc0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
23bd0 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
23be0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
23bf0 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
23c00 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
23c10 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
23c20 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
23c30 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
23c40 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
23c50 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
23c60 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
23c70 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
23c80 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
23c90 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
23ca0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
23cb0 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
23cc0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
23cd0 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
23ce0 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
23cf0 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
23d00 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
23d10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
23d20 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
23d30 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
23d40 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23d50 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
23d60 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
23d70 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
23d80 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
23d90 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
23da0 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
23db0 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
23dc0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
23dd0 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
23de0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23df0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
23e00 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
23e10 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
23e20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
23e30 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
23e40 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
23e50 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20  . */.  int h;.  
23e60 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
23e70 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
23e80 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
23e90 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28  ..  PAGERTRACE5(
23ea0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
23eb0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
23ec0 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
23ed0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
23ee0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
23ef0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
23f00 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43   pgno);.  IOTRAC
23f10 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
23f20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
23f30 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
23f40 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  .  pager_get_con
23f50 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
23f60 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
23f70 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
23f80 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
23f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
23fa0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
23fb0 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  nt)pgno>pPager->
23fc0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
23fd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
23fe0 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
23ff0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
24000 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
24010 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
24020 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
24030 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
24040 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
24050 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
24060 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
24070 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
24080 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
24090 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
240a0 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
240b0 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
240c0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
240d0 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
240e0 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
240f0 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
24100 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
24110 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
24120 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
24130 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
24140 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65  .  */.  pPg->nee
24150 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67  dSync = 0;.  pPg
24160 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
24170 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
24180 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
24190 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
241a0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
241b0 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
241c0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
241d0 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  Old);.    makeCl
241e0 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  ean(pPgOld);.   
241f0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
24200 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
24210 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
24220 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
24230 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
24240 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
24250 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
24260 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
24270 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a   ){.    pPg->inJ
24280 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61 67 65  ournal =  (pPage
24290 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
242a0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
242b0 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c  o&7)))!=0;.  }el
242c0 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  se{.    pPg->inJ
242d0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
242e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
242f0 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74  dSync==0 || (int
24300 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
24310 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  igDbSize );.  }.
24320 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
24330 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
24340 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
24350 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
24360 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
24370 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
24380 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
24390 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
243a0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
243b0 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
243c0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
243d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
243e0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
243f0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
24400 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
24410 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
24420 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
24430 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
24440 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
24450 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
24460 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
24470 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
24480 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
24490 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
244a0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
244b0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
244c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
244d0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
244e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
244f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
24500 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
24510 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
24520 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
24530 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
24540 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
24550 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
24560 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
24570 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
24580 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
24590 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
245a0 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
245b0 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
245c0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
245d0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
245e0 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
245f0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
24600 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
24610 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
24620 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
24630 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
24640 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
24650 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
24660 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
24670 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
24680 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
24690 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
246a0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
246b0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
246c0 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
246d0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
246e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
246f0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
24700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
24710 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
24720 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
24730 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24740 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24750 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
24760 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
24770 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
24780 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
24790 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
247a0 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
247b0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
247c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
247d0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
247e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
247f0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
24800 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24810 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
24820 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
24830 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
24840 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
24850 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
24860 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g){.  return PGH
24870 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
24880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24890 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
248a0 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
248b0 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
248c0 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
248d0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
248e0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
248f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
24900 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
24910 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24920 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
24930 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
24940 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50  return (pPager?P
24950 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
24960 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d  g, pPager):0);.}
24970 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
24980 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
24990 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
249a0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
249b0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
249c0 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
249d0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
249e0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
249f0 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
24a00 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
24a10 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
24a20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
24a30 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
24a40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
24a50 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
24a60 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
24a70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
24a80 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
24a90 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
24aa0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
24ab0 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
24ac0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
24ad0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
24ae0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
24af0 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
24b00 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
24b10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
24b20 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
24b30 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
24b40 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
24b50 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
24b60 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
24b70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
24b80 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
24b90 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
24ba0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
24bb0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
24bc0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
24bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
24be0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
24bf0 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
24c00 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
24c10 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
24c20 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
24c30 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
24c40 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
24c50 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
24c60 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
24c70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
24c80 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
24c90 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
24ca0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
24cb0 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eMode;.}..#if de
24cc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24cd0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
24ce0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
24cf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
24d00 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
24d10 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
24d20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
24d30 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
24d40 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
24d50 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
24d60 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
24d70 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
24d80 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
24d90 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
24da0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73  qlite3PagerLocks
24db0 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
24dc0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
24dd0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
24de0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
24df0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
24e00 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
24e10 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
24e20 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
24e30 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
24e40 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
24e50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24e60 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
24e70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
24e80 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
24e90 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
24ea0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
24eb0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
24ec0 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
24ed0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
24ee0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24ef0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
24f00 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
24f10 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
24f20 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
24f30 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
24f40 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
24f50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24f60 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
24f70 0a                                               .