/ Hex Artifact Content
Login

Artifact ee60b932e7b4ba355f2606505415b4d5183b1de1:


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 35  : pager.c,v 1.35
0350: 39 20 32 30 30 37 2f 30 38 2f 31 37 20 31 35 3a  9 2007/08/17 15:
0360: 35 33 3a 33 37 20 64 61 6e 69 65 6c 6b 31 39 37  53:37 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 66  stness */.  u8 f
37f0: 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20  ull_fsync;      
3800: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46          /* Use F
3810: 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20  _FULLFSYNC when 
3820: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75  available */.  u
3830: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3850: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3860: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3870: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
3880: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3890: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
38a0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
38b0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
38c0: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
38d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38e0: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
38f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3900: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3920: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3930: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3940: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3950: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
3960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3970: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
3980: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
3990: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
39a0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
39b0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
39c0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
39d0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
39e0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a00: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
3a10: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
3a20: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
3a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a40: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
3a50: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
3a60: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
3a70: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
3a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3a90: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
3aa0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
3ab0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
3ac0: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3ae0: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
3af0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3b00: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68  USIVE */.  u8 ch
3b10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
3b20: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
3b30: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
3b40: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
3b50: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ter */.  int err
3b60: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
3b70: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
3b80: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
3b90: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
3ba0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
3bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3bc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
3bd0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
3be0: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
3bf0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
3c00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
3c10: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
3c20: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c40: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
3c50: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
3c60: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
3c70: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
3cb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
3cc0: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3ce0: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
3cf0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
3d00: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
3d10: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
3d20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d30: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
3d40: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
3d50: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
3d80: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
3d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
3da0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3dd0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
3de0: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e00: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3e10: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
3e20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
3e50: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
3e60: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
3e70: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
3ea0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
3eb0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
3ec0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
3ef0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
3f00: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61  abase */.  u8 *a
3f10: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
3f20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
3f30: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
3f40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3f50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
3f60: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
3f70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3f80: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3f90: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
3fa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
3fb0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3fc0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3fd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3fe0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4000: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
4010: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
4020: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
4030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
4040: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
4050: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
4060: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
4070: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
4080: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
4090: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
40a0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
40b0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
40c0: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
40d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
40e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
40f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
4100: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
4110: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
4120: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
4130: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
4140: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
4150: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
4160: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
4170: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
4180: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
4190: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
41a0: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
41b0: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
41c0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
41d0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
41e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
41f0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
4200: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
4210: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4220: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
4230: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
4240: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
4250: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
4260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4270: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69  * List of all di
4280: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  rty pages */.  i
4290: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
42b0: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
42c0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
42d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
42e0: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
42f0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
4300: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
4310: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
4320: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
4330: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
4340: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
4350: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
4360: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
4370: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
4380: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
4390: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
43a0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
43b0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
43c0: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
43e0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
43f0: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
4400: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
4410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4420: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
4430: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
4440: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
4450: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
4460: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
4470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
4480: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
4490: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
44a0: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
44b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
44c0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
44d0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
44e0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
44f0: 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  or)(DbPage*,int)
4500: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
4510: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
4520: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
4530: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
4540: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20  (DbPage*,int);  
4550: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4560: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4570: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4580: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4590: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
45a0: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
45b0: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
45c0: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
45d0: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
45e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
45f0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
4600: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
4610: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
4620: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48  .#endif.  int nH
4630: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
4640: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4650: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20   the pager hash 
4660: 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72  table */.  PgHdr
4670: 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20   **aHash;       
4680: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
4690: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
46a0: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
46b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
46c0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
46d0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67  MANAGEMENT.  Pag
46e0: 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  er *pNext;      
46f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
4700: 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
4710: 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64  s in this thread
4720: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4730: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4750: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4760: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4770: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
4780: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4790: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
47a0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
47b0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
47c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
47d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
47e0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
47f0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4800: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4810: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4820: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4830: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4840: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4850: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4860: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4870: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4890: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
48a0: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
48b0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
48c0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
48d0: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
48e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
48f0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4900: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4910: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4920: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4940: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4950: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4960: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4970: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4980: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4990: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
49a0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
49b0: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
49c0: 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66  s freed */.# def
49d0: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
49e0: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
49f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4a00: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
4a10: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4a20: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4a30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4a40: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4a50: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4a60: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4a70: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4a80: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4a90: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4aa0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4ab0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4ac0: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4ad0: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4ae0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4af0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4b00: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4b10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4b20: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
4b30: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4b40: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4b50: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4b60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4b70: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4b80: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4b90: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4ba0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4bb0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4bc0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4bd0: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4be0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4bf0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4c00: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4c10: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4c20: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4c30: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4c40: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4c50: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4c60: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4c80: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
4c90: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
4ca0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
4cb0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
4cc0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
4cd0: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
4ce0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
4cf0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
4d00: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
4d10: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
4d20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
4d30: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
4d40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
4d50: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
4d60: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
4d70: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
4d80: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
4d90: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
4da0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
4db0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
4dc0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
4dd0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
4de0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
4df0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
4e00: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
4e10: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
4e20: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
4e30: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
4e40: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
4e50: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
4e60: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
4e70: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
4e80: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
4e90: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
4ea0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
4eb0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
4ec0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
4ed0: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
4ee0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
4ef0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
4f00: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
4f10: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
4f20: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4f30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
4f40: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
4f50: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
4f60: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
4f70: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
4f80: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
4f90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
4fa0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
4fb0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
4fc0: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
4fd0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
4fe0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
4ff0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5000: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5010: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5020: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5030: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5040: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5050: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
5060: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
5070: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
5080: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
5090: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
50a0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
50b0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
50c0: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
50d0: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
50e0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
50f0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5100: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5110: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5120: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5130: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5140: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5150: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
5160: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
5170: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
5180: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
5190: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
51a0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
51b0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
51c0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
51d0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
51e0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
51f0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5200: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5210: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5220: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5230: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5250: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
5260: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
5270: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
5280: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
5290: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
52a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
52b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
52c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
52d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
52e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
52f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5300: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5310: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5320: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5330: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5340: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5350: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5360: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5370: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5380: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5390: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
53a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
53b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
53c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
53d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
53e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
53f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5400: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5410: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5420: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5430: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5440: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5450: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5460: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5470: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5480: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5490: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
54a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
54b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
54c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
54d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
54e0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
54f0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
5500: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
5510: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
5520: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
5530: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
5540: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
5550: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
5560: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
5570: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
5580: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
5590: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
55a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
55b0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
55c0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
55d0: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
55e0: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d   addr=%p nRef=%-
55f0: 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a  3d total=%d\n",.
5600: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
5610: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
5620: 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50  , p->nRef, p->pP
5630: 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ager->nRef.    )
5640: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
5650: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
5660: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
5670: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
5680: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
5690: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
56a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
56b0: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
56c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
56d0: 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67  rue if page *pPg
56e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
56f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
5700: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f   statement.** jo
5710: 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d  urnal (or statem
5720: 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73  ent snapshot has
5730: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
5740: 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a  f *pPg is part.*
5750: 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  * of an in-memor
5760: 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  y database)..*/.
5770: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
5780: 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72  nStatement(PgHdr
5790: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
57a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
57b0: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d  Pager;.  if( MEM
57c0: 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  DB ){.    return
57d0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
57e0: 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53  Pg, pPager)->inS
57f0: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
5800: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5810: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38 20  g->pgno;.    u8 
5820: 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49 6e  *a = pPager->aIn
5830: 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  Stmt;.    return
5840: 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e 6f   (a && (int)pgno
5850: 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
5860: 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38 5d  ze && (a[pgno/8]
5870: 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
5880: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
5890: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
58a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
58b0: 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20  sh table to N.  
58c0: 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  N must be a powe
58d0: 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a  r.** of two..*/.
58e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
58f0: 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
5900: 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ble(Pager *pPage
5910: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48  r, int N){.  PgH
5920: 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67  dr **aHash, *pPg
5930: 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20  ;.  assert( N>0 
5940: 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20  && (N&(N-1))==0 
5950: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
5960: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
5970: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
5980: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
5990: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
59a0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
59b0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
59c0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
59d0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
59e0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
59f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5a00: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
5a10: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
5a20: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
5a30: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
5a40: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
5a50: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
5a60: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
5a70: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
5a80: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
5a90: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
5aa0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
5ab0: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
5ac0: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
5ad0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5ae0: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
5af0: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
5b00: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
5b10: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
5b20: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
5b30: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
5b40: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
5b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
5b60: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
5b70: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
5b80: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
5b90: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
5ba0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
5bb0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
5bc0: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
5bd0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
5be0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
5bf0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
5c00: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
5c10: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
5c20: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
5c30: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
5c40: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
5c50: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
5c60: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
5c70: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
5c80: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
5c90: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
5ca0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
5cb0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
5cc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5cd0: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
5ce0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
5cf0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
5d00: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
5d10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5d20: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
5d30: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
5d40: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
5d50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
5d60: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
5d70: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
5d80: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
5d90: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
5da0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
5db0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
5dc0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
5dd0: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
5de0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5df0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
5e00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
5e10: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
5e20: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
5e30: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
5e40: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
5e50: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
5e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e70: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
5e80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
5e90: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
5ea0: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5eb0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5ec0: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5ed0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5ee0: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
5ef0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5f00: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
5f10: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
5f40: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
5f50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
5f60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5f70: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
5f80: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
5f90: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
5fa0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
5fb0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
5fc0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
5fd0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5fe0: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
5ff0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6000: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
6010: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
6020: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6030: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
6040: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
6050: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
6060: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
6070: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
6080: 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71  tent. All subseq
6090: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
60a0: 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20  n this Pager.** 
60b0: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
60c0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
60d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
60e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
60f0: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
6100: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
6110: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
6120: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
6130: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
6140: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
6150: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
6160: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
6170: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
6180: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
6190: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
61a0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
61b0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
61c0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
61d0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
61e0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
61f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
6200: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
6210: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
6220: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6230: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
6240: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
6250: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
6260: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
6270: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
6280: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
6290: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
62a0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
62b0: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
62c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
62d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
62e0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
62f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6300: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
6310: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
6320: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
6330: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
6340: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
6350: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
6360: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
6370: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
6380: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
6390: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
63a0: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
63b0: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
63c0: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
63d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
63e0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
63f0: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
6400: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
6410: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
6420: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
6450: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
6460: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
6470: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
6480: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
6490: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
64a0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
64b0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
64c0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
64d0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
64e0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
64f0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
6500: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
6510: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
6520: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
6530: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
6540: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
6550: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
6560: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
6570: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
6580: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
6590: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
65a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
65b0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
65c0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
65d0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
65e0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
65f0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
6600: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
6610: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
6620: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
6630: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
6640: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
6650: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
6660: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
6670: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
6680: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
6690: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
66a0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
66b0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
66c0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
66d0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
66e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
66f0: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
6700: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
6710: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
6720: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
6730: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
6740: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
6750: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
6760: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
6770: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
6780: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
6790: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
67a0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
67b0: 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  3_free() *pzMast
67c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
67d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
67e0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
67f0: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
6800: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
6810: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
6820: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6830: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
6840: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
6850: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
6860: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
6870: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
6880: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
6890: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
68a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
68b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
68c0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
68d0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
68e0: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
68f0: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
6900: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
6910: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
6920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6930: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
6940: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6950: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
6960: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
6970: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6980: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6990: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
69a0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
69b0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  J-12, &cksum);. 
69c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
69d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
69f0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
6a00: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a  gic, 8, szJ-8);.
6a10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6a20: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
6a30: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6a40: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
6a50: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
6a60: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
6a70: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6c 65  te3MallocZero(le
6a80: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
6a90: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
6aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6ab0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
6ac0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6ad0: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
6ae0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
6af0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
6b10: 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65  e3_free(*pzMaste
6b20: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
6b30: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
6b40: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
6b50: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
6b60: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
6b70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6b80: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
6b90: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
6ba0: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
6bb0: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
6bc0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
6bd0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
6be0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
6bf0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
6c00: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
6c10: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
6c20: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
6c30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c40: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
6c50: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
6c60: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
6c70: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
6c80: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
6c90: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
6ca0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
6cb0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
6cc0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
6cd0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
6ce0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
6cf0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
6d00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
6d10: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
6d20: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
6d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
6d50: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
6d60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6d70: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6d80: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
6d90: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
6da0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
6db0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
6dc0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
6dd0: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
6de0: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
6df0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
6e00: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
6e10: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
6e20: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
6e30: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
6e40: 4f 66 66 73 65 74 0a 2a 2a 20 2d 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 0a 2a 2a 20 30 20 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 30                 0
6e90: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6eb0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6ed0: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
6f00: 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72  ic void seekJour
6f10: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
6f20: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
6f30: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
6f40: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6f50: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
6f60: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
6f70: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
6f80: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
6f90: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
6fa0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
6fb0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6fc0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
6fd0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
6fe0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
6ff0: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
7000: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
7010: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7020: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
7030: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
7040: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
7050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
7060: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
7070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7080: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
7090: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
70a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
70b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
70c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
70d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
70e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
70f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
7100: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7110: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
7120: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
7130: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
7140: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
7150: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
7160: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
7170: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
7180: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
7190: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
71a0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
71b0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
71c0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
71d0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
71e0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
71f0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
7200: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
7210: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
7220: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
7230: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
7240: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
7250: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7260: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
7270: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
7280: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7290: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
72a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
72b0: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
72c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
72d0: 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  +16];.  int rc;.
72e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
72f0: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
7300: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
7310: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
7320: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
7330: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
7340: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
7350: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
7360: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7370: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 46 49 58  alOff;..  /* FIX
7380: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
7390: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
73a0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
73b0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
73c0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
73d0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
73e0: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
73f0: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
7400: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
7410: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
7420: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
7430: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
7440: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7450: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
7460: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
7470: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
7480: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
7490: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
74a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
74b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
74c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54  lMagic));.  /* T
74d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
74e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
74f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
7500: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7510: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7520: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
7530: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
7540: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
7550: 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ;.  /* The rando
7560: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
7570: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
7580: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
7590: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
75a0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
75b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
75c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
75d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
75e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
75f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
7600: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
7610: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
7620: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7630: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7640: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7650: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
7660: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7670: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7680: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7690: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
76a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
76b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
76c0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
76d0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
76e0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
76f0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
7700: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
7710: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
7720: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
7730: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
7750: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
7760: 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f  ader),pPager->jo
7770: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61  urnalOff);.  pPa
7780: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7790: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
77a0: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
77b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
77c0: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
77d0: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
77e0: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
77f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
7800: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
7810: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
7820: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
7830: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
7840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7850: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49    IOTRACE(("JTAI
7860: 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  L %p %lld\n", pP
7870: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
7880: 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20  urnalOff-1)).   
7890: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
78a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
78b0: 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61  , "\000", 1, pPa
78c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
78d0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
78e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
78f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7900: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7910: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
7920: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
7930: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
7940: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
7950: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
7960: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
7970: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
7980: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
7990: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
79a0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
79b0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
79c0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
79d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
79e0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
79f0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
7a00: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
7a10: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
7a20: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7a30: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
7a40: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
7a50: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
7a60: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
7a70: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
7a80: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
7a90: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
7aa0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
7ab0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
7ac0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
7ad0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
7ae0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
7af0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
7b00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
7b10: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
7b20: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
7b30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
7b40: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
7b50: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
7b60: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
7b70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
7b80: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
7b90: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
7ba0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
7bb0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
7bc0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
7bd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
7bf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
7c00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
7c10: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
7c20: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
7c30: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
7c40: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
7c50: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
7c60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
7c70: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
7c80: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
7c90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
7ca0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
7cb0: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73  64 jrnlOff;..  s
7cc0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7cd0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
7ce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
7cf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7d00: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
7d10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
7d20: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7d30: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
7d40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7d50: 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ff;..  rc = sqli
7d60: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
7d70: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
7d80: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a  izeof(aMagic), j
7d90: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
7da0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7db0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65   jrnlOff += size
7dc0: 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69  of(aMagic);..  i
7dd0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
7de0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7df0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7e00: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
7e10: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
7e20: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
7e30: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7e40: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65  d, jrnlOff, pNRe
7e50: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
7e60: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
7e70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7e80: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7e90: 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  f+4, &pPager->ck
7ea0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
7eb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7ec0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7ed0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7ee0: 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69  jrnlOff+8, pDbSi
7ef0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
7f00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
7f10: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
7f20: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
7f30: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
7f40: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
7f50: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
7f60: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
7f70: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
7f80: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
7f90: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
7fa0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
7fb0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
7fc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
7fd0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
7fe0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
7ff0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
8000: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
8010: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
8020: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
8030: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
8040: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
8050: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
8060: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
8070: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
8080: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
8090: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
80a0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
80b0: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
80c0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
80d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
80e0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
80f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
8100: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
8110: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
8120: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
8130: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8140: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
8150: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
8160: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
8170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8180: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
8190: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
81a0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
81b0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
81c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
81d0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
81e0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
81f0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
8200: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
8210: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
8220: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
8230: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
8240: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
8250: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
8260: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
8270: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
8280: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
8290: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
82a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
82b0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
82c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
82d0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
82e0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
82f0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
8300: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
8310: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
8320: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8330: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
8340: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
8350: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
8360: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
8370: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
8380: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
8390: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
83a0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
83b0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
83c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
83d0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
83e0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
83f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
8400: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8410: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
8420: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
8430: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75  lOff;.  u32 cksu
8440: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
8450: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
8460: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
8470: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
8480: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
8490: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
84a0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
84b0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
84c0: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
84d0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
84e0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
84f0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
8500: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
8510: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
8520: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
8530: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
8540: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
8550: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
8560: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8570: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
8580: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
8590: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
85a0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
85b0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
85c0: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
85d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
85e0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
85f0: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
8600: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
8610: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
8620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8640: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
8650: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
8660: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
8670: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
8680: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
8690: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
86a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
86b0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
86c0: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
86d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
86e0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
86f0: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
8700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8710: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8720: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
8730: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
8740: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
8750: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
8760: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
8770: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
8780: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8790: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
87a0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
87b0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
87c0: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
87d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
87e0: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
87f0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
8800: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
8810: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
8820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
8830: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
8840: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
8850: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
8860: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
8870: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
8880: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
8890: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
88a0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
88b0: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
88c0: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
88d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
88e0: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
88f0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8900: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
8910: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
8920: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
8930: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
8940: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
8950: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
8960: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
8970: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
8980: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
8990: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
89a0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
89b0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
89c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
89d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
89e0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
89f0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
8a00: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
8a10: 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29   assert( MEMDB )
8a20: 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e  ;.  if( !pHist->
8a30: 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  inStmt ){.    as
8a40: 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72  sert( pHist->pPr
8a50: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69  evStmt==0 && pHi
8a60: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  st->pNextStmt==0
8a70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
8a80: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
8a90: 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54     PGHDR_TO_HIST
8aa0: 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20  (pPager->pStmt, 
8ab0: 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74  pPager)->pPrevSt
8ac0: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  mt = pPg;.    }.
8ad0: 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74      pHist->pNext
8ae0: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
8af0: 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Stmt;.    pPager
8b00: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
8b10: 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
8b20: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
8b30: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
8b40: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
8b50: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
8b60: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
8b70: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
8b80: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
8b90: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
8ba0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
8bb0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
8bc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
8bd0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
8be0: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
8bf0: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
8c00: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
8c10: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
8c20: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
8c30: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
8c40: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
8c50: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
8c60: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
8c70: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
8c80: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
8c90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
8ca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8cb0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
8cc0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
8cd0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
8ce0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
8cf0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
8d00: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
8d10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
8d20: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50  _LOCK);.      pP
8d30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
8d40: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
8d50: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
8d60: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a   pPager)).    }.
8d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8d80: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
8d90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
8da0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
8db0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
8dc0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
8dd0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
8de0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
8df0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
8e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8e10: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
8e20: 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
8e30: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
8e40: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74  .** the error-st
8e50: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
8e60: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
8e70: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
8e80: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65   *p){.  if( p->e
8e90: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
8ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  .  assert( p->st
8eb0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
8ec0: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
8ed0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  lOpen==0 );.  if
8ee0: 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
8ef0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8f00: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
8f10: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20  llback(p);.  }. 
8f20: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29   pager_unlock(p)
8f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
8f40: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f  rrCode || !p->jo
8f50: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d  urnalOpen || (p-
8f60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26  >exclusiveMode&&
8f70: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  !p->journalOff) 
8f80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8f90: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73  errCode || !p->s
8fa0: 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78  tmtOpen || p->ex
8fb0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d  clusiveMode );.}
8fc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  .../*.** Clear t
8fd0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
8fe0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
8ff0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
9000: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
9010: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
9020: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
9030: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
9040: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
9050: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
9060: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
9070: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
9080: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
9090: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
90a0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
90b0: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
90c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
90d0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
90e0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
90f0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  pPg, *pNext;.  i
9100: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
9110: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  de ) return;.  f
9120: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
9130: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
9140: 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ext){.    IOTRAC
9150: 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
9160: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
9170: 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41  ->pgno));.    PA
9180: 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
9190: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
91a0: 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20  unt);.    pNext 
91b0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
91c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
91d0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
91e0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
91f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
9200: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
9210: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
9220: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
9230: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
9240: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  ->pAll = 0;.  pP
9250: 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b  ager->nHash = 0;
9260: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9270: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
9280: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
9290: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
92a0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67  Hash = 0;.  pPag
92b0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a  er->nRef = 0;.}.
92c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
92d0: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
92e0: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
92f0: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
9300: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
9310: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
9320: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
9330: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9340: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
9350: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
9360: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
9370: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
9380: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
9390: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
93a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93b0: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
93c0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
93d0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
93e0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
93f0: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
9400: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
9410: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
9420: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
9430: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
9440: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
9450: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
9460: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
9470: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
9480: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
9490: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
94a0: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
94b0: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
94c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
94d0: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
94e0: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
94f0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
9500: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
9510: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
9520: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
9530: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
9540: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
9550: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
9560: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
9570: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
9580: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
9590: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
95a0: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
95b0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
95c0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
95d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95e0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
95f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9600: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d  _OK;.  int rc2 =
9610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
9620: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9630: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9640: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
9650: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
9660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9670: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
9680: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
9690: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
96a0: 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61  stmtOpen && !pPa
96b0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
96c0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
96d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
96e0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
96f0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
9700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
9710: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9720: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
9730: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
9740: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
9750: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
9760: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
9770: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
9780: 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70 50 61  OK ){;.      pPa
9790: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
97a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
97b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
97c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
97d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
97e0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
97f0: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
9800: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
9810: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
9820: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9830: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9840: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
9850: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
9860: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
9870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
9880: 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61  qlite3_free( pPa
9890: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
98a0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
98b0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
98c0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
98d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
98e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
98f0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
9900: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
9910: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
9920: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
9930: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
9940: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
9950: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
9960: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
9970: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
9980: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
9990: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
99a0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
99b0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
99c0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
99d0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
99e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
99f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
9a00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9a10: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
9a20: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9a30: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
9a40: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
9a50: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
9a60: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
9a70: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
9a80: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
9a90: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
9aa0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
9ab0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
9ac0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
9ad0: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
9ae0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
9af0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
9b00: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
9b10: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
9b20: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
9b30: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
9b40: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
9b50: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9b60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
9b70: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
9b80: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
9b90: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
9ba0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
9bb0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
9bc0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
9bd0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
9be0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
9bf0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
9c00: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
9c10: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
9c20: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
9c30: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
9c40: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
9c50: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
9c60: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
9c70: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
9c80: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
9c90: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
9ca0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
9cb0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
9cc0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
9cd0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
9ce0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
9cf0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
9d00: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
9d10: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
9d20: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
9d30: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
9d40: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
9d50: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
9d60: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
9d70: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
9d80: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
9d90: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
9da0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
9db0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
9dc0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
9dd0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
9de0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
9df0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
9e00: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
9e10: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9e20: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
9e30: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
9e40: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
9e50: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
9e60: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
9e70: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
9e80: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
9e90: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
9ea0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
9eb0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
9ec0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
9ed0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
9ee0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
9ef0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
9f00: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
9f10: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9f20: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
9f30: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
9f40: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
9f50: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
9f60: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
9f70: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
9f80: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
9f90: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
9fa0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
9fb0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
9fc0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
9fd0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
9fe0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
9ff0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
a000: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
a010: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
a020: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
a030: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
a040: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
a050: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
a060: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
a070: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
a080: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
a090: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
a0a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
a0b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
a0c0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
a0d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
a0e0: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
a0f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
a100: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
a110: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a120: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
a130: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
a140: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
a150: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
a160: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
a170: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
a180: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
a190: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
a1a0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
a1b0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
a1c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
a1d0: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
a1e0: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
a1f0: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
a200: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
a210: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
a220: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
a230: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
a240: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
a250: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
a260: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
a270: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
a280: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
a290: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2b0: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
a2c0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
a2d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
a300: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
a310: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
a320: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
a330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a340: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
a350: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
a360: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
a370: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
a380: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
a390: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
a3a0: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
a3b0: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
a3c0: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
a3d0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
a3e0: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
a3f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a400: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
a410: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
a420: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
a430: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
a440: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
a450: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
a460: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
a470: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
a480: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
a490: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
a4a0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
a4b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
a4c0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
a4d0: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
a4e0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
a4f0: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
a500: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
a510: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
a520: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
a530: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
a540: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
a550: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
a560: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
a570: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
a580: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
a590: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
a5a0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
a5b0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
a5c0: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
a5d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
a5e0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
a5f0: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
a600: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
a610: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
a620: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
a630: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
a640: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
a650: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
a660: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
a670: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
a680: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
a690: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
a6a0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
a6b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
a6c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
a6d0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
a6e0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
a6f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
a700: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a710: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
a720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
a730: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
a740: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
a750: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
a760: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a770: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
a780: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
a790: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
a7a0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
a7b0: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
a7c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a7d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a7e0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
a7f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
a800: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
a810: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
a820: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
a830: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
a840: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
a850: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
a860: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
a870: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
a880: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
a890: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
a8a0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
a8b0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
a8c0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
a8d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a8e0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
a8f0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
a900: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
a910: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
a920: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
a930: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
a940: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
a950: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
a960: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
a970: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
a980: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
a990: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
a9a0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
a9b0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
a9c0: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
a9d0: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
a9e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
a9f0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
aa00: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
aa10: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
aa20: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
aa30: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
aa40: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
aa50: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
aa60: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
aa70: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
aa80: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
aa90: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
aaa0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
aab0: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
aac0: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
aad0: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
aae0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
aaf0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
ab00: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
ab10: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
ab20: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
ab30: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ab40: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
ab50: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
ab60: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
ab70: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
ab80: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
ab90: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
aba0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
abb0: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
abc0: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
abd0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
abe0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
abf0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
ac00: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
ac10: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
ac20: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
ac30: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
ac40: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
ac50: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
ac60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
ac70: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
ac80: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
ac90: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
aca0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
acb0: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
acc0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
acd0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
ace0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
acf0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
ad00: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
ad10: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
ad20: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
ad30: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
ad40: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
ad50: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
ad60: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
ad70: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
ad80: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
ad90: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
ada0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
adb0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
adc0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
add0: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
ade0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
adf0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
ae00: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
ae10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
ae20: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
ae30: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
ae40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
ae50: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
ae60: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
ae70: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
ae80: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
ae90: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
aea0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
aeb0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
aec0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
aed0: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
aee0: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
aef0: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
af00: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
af10: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
af20: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
af30: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
af40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
af50: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
af60: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
af70: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
af80: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
af90: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
afa0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
afb0: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
afc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
afd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
afe0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
aff0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
b000: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
b010: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
b020: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
b030: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
b040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
b050: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
b060: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
b070: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
b080: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
b090: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
b0a0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
b0b0: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
b0c0: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
b0d0: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
b0e0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
b0f0: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
b100: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
b110: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
b120: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
b130: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
b140: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
b150: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
b160: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
b170: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
b180: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
b190: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
b1a0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
b1b0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
b1c0: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
b1d0: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
b1e0: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
b1f0: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
b200: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
b210: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b220: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
b230: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
b240: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
b250: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
b260: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
b270: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
b280: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
b290: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
b2a0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
b2b0: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
b2c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
b2d0: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
b2e0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
b2f0: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
b300: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
b310: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
b320: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
b330: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
b340: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
b350: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
b360: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
b370: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
b380: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
b390: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b3a0: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
b3b0: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
b3c0: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
b3d0: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
b3e0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
b3f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
b410: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
b420: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
b430: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b440: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
b450: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
b460: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
b470: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b480: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
b490: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
b4a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b4b0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
b4c0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
b4d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
b4e0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
b4f0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
b500: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
b510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b520: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
b530: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
b540: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
b550: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
b560: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
b570: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
b580: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
b590: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
b5a0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
b5b0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
b5c0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
b5d0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
b5e0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
b5f0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
b600: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
b610: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
b620: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b630: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
b640: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
b650: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
b660: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
b670: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
b680: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
b690: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
b6a0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
b6b0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
b6c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
b6d0: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
b6e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
b6f0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
b700: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
b710: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
b720: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
b730: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b750: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
b760: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
b770: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
b780: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
b790: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
b7a0: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
b7b0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
b7c0: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
b7d0: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
b7e0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
b7f0: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
b800: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
b810: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
b820: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
b830: 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
b840: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b850: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
b860: 65 7b 0a 20 20 20 20 70 4a 6f 75 72 6e 61 6c 20  e{.    pJournal 
b870: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
b880: 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
b890: 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
b8a0: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
b8b0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
b8c0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
b8d0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ter, SQLITE_OPEN
b8e0: 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20  _READONLY, 0);. 
b8f0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
b900: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
b910: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
b920: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
b930: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b940: 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
b950: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
b960: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
b970: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b980: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
b990: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
b9a0: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
b9b0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
b9c0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
b9d0: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  tr = 0;..    /* 
b9e0: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
b9f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ba00: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
ba10: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
ba20: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
ba30: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
ba40: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
ba50: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
ba60: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
ba70: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
ba80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74  te3_malloc(nMast
ba90: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
baa0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
bab0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
bac0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
bad0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
bae0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
baf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bb00: 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
bb10: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
bb20: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
bb30: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
bb40: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
bb50: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
bb60: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
bb70: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
bb80: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
bb90: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
bba0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
bbb0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
bbc0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
bbd0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
bbe0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
bbf0: 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20  XISTS) ){.      
bc00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
bc10: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
bc20: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
bc30: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
bc40: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
bc50: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
bc60: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
bc70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bc80: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
bc90: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
bca0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
bcb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bcc0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
bcd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
bce0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
bcf0: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
bd00: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
bd10: 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rnal, SQLITE_OPE
bd20: 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
bd30: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
bd40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bd50: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
bd60: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
bd70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
bd80: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
bd90: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 26  rnal(pJournal, &
bda0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
bdb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
bdc0: 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
bdd0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
bde0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bdf0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
be00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
be10: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
be20: 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26   zMasterPtr!=0 &
be30: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
be40: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
be50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
be60: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 50 74  3_free(zMasterPt
be70: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
be80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
be90: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
bea0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
beb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
bec0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
bed0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
bee0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
bef0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bf00: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
bf10: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
bf20: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
bf30: 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
bf40: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
bf50: 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73  Master);..delmas
bf60: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
bf70: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
bf80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bf90: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
bfa0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
bfb0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
bfc0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bfd0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
bfe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
bff0: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
c000: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
c010: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
c020: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
c030: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
c040: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
c050: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
c060: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
c070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
c080: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
c090: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
c0a0: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
c0b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
c0c0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
c0d0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
c0e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
c0f0: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
c100: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c110: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
c120: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
c130: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
c140: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
c150: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
c160: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
c170: 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a  ze*(i64)nPage);.
c180: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
c190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
c1a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c1b0: 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
c1c0: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
c1d0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
c1e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c1f0: 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f  ** Set the secto
c200: 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69  rSize for the gi
c210: 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  ven pager..**.**
c220: 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
c230: 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 20 6f   is the larger o
c240: 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
c250: 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79  e reported.** by
c260: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
c270: 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20 70  Size() and the p
c280: 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ageSize..*/.stat
c290: 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
c2a0: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
c2b0: 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ger){.  pPager->
c2c0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
c2d0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
c2e0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
c2f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
c300: 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70  orSize<pPager->p
c310: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  ageSize ){.    p
c320: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c330: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c340: 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Size;.  }.}../*.
c350: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
c360: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
c370: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
c380: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
c390: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
c3a0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
c3b0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
c3c0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
c3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3e0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
c3f0: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
c400: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
c410: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
c420: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
c430: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
c440: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c450: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
c460: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
c470: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
c480: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
c490: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
c4a0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
c4b0: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
c4c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
c4d0: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
c4e0: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
c4f0: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
c500: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
c510: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c520: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
c530: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
c540: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
c550: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
c560: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
c570: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c580: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
c590: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
c5a0: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
c5b0: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
c5c0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
c5d0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
c5e0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
c5f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
c600: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c610: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
c620: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
c630: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
c640: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
c650: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
c660: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
c670: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
c680: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
c690: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
c6a0: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
c6b0: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
c6c0: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
c6d0: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
c6e0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
c6f0: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
c700: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
c710: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
c720: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
c730: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
c740: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
c750: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
c760: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
c770: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
c780: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
c790: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
c7a0: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
c7b0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
c7c0: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
c7d0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
c7e0: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
c7f0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
c800: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
c810: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
c820: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
c830: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
c840: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
c850: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
c860: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
c870: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
c880: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
c890: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
c8a0: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
c8b0: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
c8c0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
c8d0: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
c8e0: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
c8f0: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
c900: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
c910: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
c920: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
c930: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
c940: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
c950: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
c960: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c970: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
c980: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
c990: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
c9a0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
c9b0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
c9c0: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
c9d0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
c9e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c9f0: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
ca00: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
ca10: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
ca20: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
ca30: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
ca40: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
ca50: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
ca60: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
ca70: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
ca80: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
ca90: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
caa0: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
cab0: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
cac0: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
cad0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
cae0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
caf0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
cb00: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
cb10: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
cb20: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
cb30: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
cb40: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
cb50: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
cb60: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
cb70: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
cb80: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
cb90: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
cba0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
cbb0: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
cbc0: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
cbd0: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
cbe0: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
cbf0: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
cc00: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
cc10: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
cc20: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
cc30: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
cc40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
cc50: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
cc60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
cc70: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
cc80: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
cc90: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
cca0: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
ccb0: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
ccc0: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
ccd0: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
cce0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
ccf0: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
cd00: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
cd10: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
cd20: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
cd30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
cd40: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
cd50: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
cd60: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
cd70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cd80: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
cd90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
cda0: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
cdb0: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
cdc0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
cdd0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
cde0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
cdf0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
ce00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ce10: 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
ce20: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
ce30: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
ce40: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ce60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ce70: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
ce80: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
ce90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cea0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
ceb0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
cec0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
cf00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cf10: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
cf20: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
cf30: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf50: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
cf60: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
cf70: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
cf80: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
cf90: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
cfa0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
cfb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
cfc0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
cfd0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
cfe0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
cff0: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
d000: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
d010: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
d020: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
d030: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
d040: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d050: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d060: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
d070: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
d080: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
d090: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d0a0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
d0b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d0c0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
d0d0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
d0e0: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
d0f0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
d100: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
d110: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
d120: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
d130: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
d140: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
d150: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
d160: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
d170: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
d180: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
d190: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
d1a0: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
d1b0: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
d1c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
d1d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
d1e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d1f0: 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74  OK .   || (zMast
d200: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
d210: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
d220: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
d230: 45 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20 20  ESS_EXISTS)) .  
d240: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
d250: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
d260: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
d270: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d280: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
d290: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
d2a0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d2b0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
d2c0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
d2d0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
d2e0: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
d2f0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
d300: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
d310: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
d320: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
d330: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
d340: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
d350: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
d360: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
d370: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
d380: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
d390: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
d3a0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
d3b0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
d3c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
d3d0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
d3e0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
d3f0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
d400: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
d410: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
d420: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
d430: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
d440: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
d450: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d460: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
d470: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
d480: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
d490: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
d4a0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
d4b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
d4c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d4d0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
d4e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
d4f0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
d500: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
d510: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
d520: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
d530: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
d540: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
d550: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
d560: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
d570: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
d580: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
d590: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
d5a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
d5b0: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
d5c0: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
d5d0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
d5e0: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
d5f0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
d600: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
d610: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
d620: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
d630: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
d640: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
d650: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d660: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
d670: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d680: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
d690: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
d6a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d6b0: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
d6c0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
d6d0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
d6e0: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
d6f0: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
d700: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
d710: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
d720: 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
d730: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
d740: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d750: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
d760: 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
d770: 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
d780: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
d790: 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
d7a0: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
d7b0: 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
d7c0: 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
d7d0: 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
d7e0: 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
d7f0: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
d800: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
d810: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
d820: 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
d830: 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
d840: 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
d850: 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
d860: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
d870: 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
d880: 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
d890: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
d8a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d8b0: 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
d8c0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d8d0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
d8e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d8f0: 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
d900: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
d910: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
d920: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
d930: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
d940: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
d950: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
d960: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
d970: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
d980: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
d990: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
d9a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
d9b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d9c0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
d9d0: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
d9e0: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
d9f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
da00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
da10: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
da20: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
da30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
da40: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
da50: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
da60: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
da70: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
da80: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
da90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
daa0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
dab0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
dac0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
dad0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  Off, 1);.      i
db00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
db10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
db20: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
db30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
db40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
db50: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
db60: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
db70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
db80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
db90: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
dba0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
dbb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dbc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
dbd0: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
dbe0: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
dbf0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
dc00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dc10: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
dc20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
dc30: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
dc40: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
dc50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
dc60: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
dc70: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
dc80: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
dc90: 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
dca0: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
dcb0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
dcc0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
dcd0: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
dce0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dcf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
dd00: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
dd10: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
dd20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
dd30: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
dd40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
dd50: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
dd60: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
dd70: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
dd80: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
dd90: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
dda0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
ddb0: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
ddc0: 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
ddd0: 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
dde0: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
ddf0: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
de00: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
de10: 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
de20: 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
de30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
de40: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
de50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
de60: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
de70: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
de80: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
de90: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
dea0: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
deb0: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
dec0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
ded0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
dee0: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
def0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
df00: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
df10: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
df20: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
df30: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
df40: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
df50: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
df60: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
df70: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
df80: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
df90: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
dfa0: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
dfb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
dfc0: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
dfd0: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
dfe0: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
dff0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
e000: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
e010: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
e020: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
e030: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
e040: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e050: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
e060: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
e070: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
e080: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
e090: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
e0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e0b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
e0c0: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
e0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e0e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e0f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
e100: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
e110: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
e120: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
e130: 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
e140: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e150: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
e160: 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a  ger->jfd, &os_sz
e170: 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  J);.    if( rc!=
e180: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e190: 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
e1a0: 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29  t( szJ==os_szJ )
e1b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
e1c0: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
e1d0: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
e1e0: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
e1f0: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
e200: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
e210: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
e220: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e230: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
e240: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
e250: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
e260: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
e270: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
e280: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
e290: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
e2a0: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
e2b0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
e2c0: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
e2d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
e2e0: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
e2f0: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
e300: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
e310: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
e320: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
e330: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
e340: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
e350: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
e360: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
e370: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
e380: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  tmtSize);.  asse
e390: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e3a0: 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
e3b0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
e3c0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
e3d0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
e3e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e3f0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
e400: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
e410: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
e420: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
e430: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
e440: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
e450: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
e460: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
e470: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e480: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
e490: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e4a0: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
e4b0: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
e4c0: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
e4d0: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
e4e0: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
e4f0: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
e500: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
e510: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
e520: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
e530: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
e540: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
e550: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f   i++){.    i64 o
e560: 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61  ffset = i*(4+pPa
e570: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e580: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e590: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e5a0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e5b0: 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30  >stfd, offset, 0
e5c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e5d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e5e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e5f0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e600: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e610: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
e620: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
e630: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
e640: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e650: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
e660: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
e670: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
e680: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
e690: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
e6a0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
e6b0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
e6c0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
e6d0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
e6e0: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
e6f0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
e700: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
e710: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
e720: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
e730: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
e740: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
e750: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
e760: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
e770: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
e780: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
e790: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
e7a0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e7b0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ion..  */.  pPag
e7c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e7d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
e7e0: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
e7f0: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
e800: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
e810: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
e820: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
e830: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
e840: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
e850: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
e860: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
e870: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
e880: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e890: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e8a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e8b0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e8c0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e8d0: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
e8e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e8f0: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
e900: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
e910: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e920: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
e930: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
e940: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
e950: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
e960: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
e970: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
e980: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
e9a0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e9b0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e9c0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e9d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
e9e0: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
e9f0: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
ea00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ea10: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
ea20: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
ea30: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
ea40: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
ea50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ea60: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
ea70: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ea80: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ea90: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
eaa0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
eab0: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
eac0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ead0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
eae0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
eaf0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
eb00: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
eb10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
eb20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
eb30: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
eb40: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
eb50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
eb60: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
eb70: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
eb80: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
eb90: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
eba0: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
ebb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ebc0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
ebd0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ebe0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
ebf0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ec00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
ec10: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
ec20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ec30: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
ec40: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
ec50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
ec60: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
ec70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
ec80: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
ec90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
eca0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
ecb0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
ecc0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
ecd0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
ece0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
ecf0: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
ed00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
ed10: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
ed20: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
ed30: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
ed40: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
ed50: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
ed60: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
ed70: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
ed80: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
ed90: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
edb0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
edc0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
edd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
ede0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
edf0: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
ee00: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
ee10: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
ee20: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
ee30: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
ee40: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
ee50: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
ee60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
ee70: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
ee80: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
ee90: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
eea0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
eeb0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
eec0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
eed0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
eee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
ef00: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
ef10: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
ef20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
ef30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ef40: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
ef50: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
ef60: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
ef70: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
ef80: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
ef90: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
efa0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
efb0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
efc0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
efd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
efe0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
f000: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f010: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
f020: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
f030: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
f040: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
f050: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
f060: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
f080: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
f090: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
f0a0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
f0b0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
f0c0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
f0d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
f0e0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
f0f0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
f100: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
f110: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
f120: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
f130: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
f140: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
f150: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
f160: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
f170: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
f180: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
f190: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
f1a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1b0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
f1c0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
f1d0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
f1e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f1f0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
f200: 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  l_fsync){.  pPag
f210: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
f220: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
f230: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
f240: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
f250: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
f260: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
f270: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66    pPager->full_f
f280: 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e  sync = full_fsyn
f290: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
f2a0: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
f2b0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
f2c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f2d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
f2e0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
f2f0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
f300: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
f310: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
f320: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
f330: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
f340: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
f350: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
f360: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f370: 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
f380: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
f390: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
f3a0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
f3b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
f3c0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
f3d0: 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
f3e0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f3f0: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
f400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f410: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
f420: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
f430: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
f440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
f450: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
f460: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
f470: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
f480: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
f490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f4a0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
f4b0: 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  emp(.  sqlite3_v
f4c0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 73 71 6c  fs *pVfs, .  sql
f4d0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
f4e0: 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  , .  char *zName
f4f0: 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74  Out.){.  int cnt
f500: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
f510: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f520: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f530: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
f540: 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
f550: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
f560: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d  .  char *zFree =
f570: 20 30 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 4f   0;.  if( zNameO
f580: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 72  ut==0 ){.    zFr
f590: 65 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ee = (char *)sql
f5a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
f5b0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ->mxPathname);. 
f5c0: 20 20 20 69 66 28 20 21 7a 46 72 65 65 20 29 7b     if( !zFree ){
f5d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f5e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f5f0: 7d 0a 20 20 20 20 7a 4e 61 6d 65 4f 75 74 20 3d  }.    zNameOut =
f600: 20 7a 46 72 65 65 3b 0a 20 20 7d 0a 0a 23 69 66   zFree;.  }..#if
f610: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f620: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
f630: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
f640: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
f650: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f660: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
f670: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
f680: 20 20 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54     sqlite3OsGetT
f690: 65 6d 70 4e 61 6d 65 28 70 56 66 73 2c 20 7a 4e  empName(pVfs, zN
f6a0: 61 6d 65 4f 75 74 29 3b 0a 20 20 20 20 72 63 20  ameOut);.    rc 
f6b0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
f6c0: 70 56 66 73 2c 20 7a 4e 61 6d 65 4f 75 74 2c 20  pVfs, zNameOut, 
f6d0: 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 29  pFile, flags, 0)
f6e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
f6f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
f700: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
f710: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e  ;.  }while( cnt>
f720: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
f730: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
f740: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 73 71 6c  _NOMEM );..  sql
f750: 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29  ite3_free(zFree)
f760: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f770: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
f780: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
f790: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
f7a0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
f7b0: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
f7c0: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
f7d0: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
f7e0: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
f7f0: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
f800: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
f810: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
f820: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
f830: 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
f840: 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
f850: 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
f860: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
f870: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
f880: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
f890: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
f8a0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
f8b0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
f8c0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
f8d0: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
f8e0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
f8f0: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
f900: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
f910: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
f920: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
f930: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
f940: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
f950: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
f960: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
f970: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
f980: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
f990: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
f9a0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
f9b0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
f9c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f9d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f9e0: 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
f9f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
fa00: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
fa10: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
fa20: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
fa30: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
fa40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fa50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
fa60: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
fa70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
fa80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
fa90: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
faa0: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
fab0: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
fac0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
fad0: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
fae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
faf0: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
fb00: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
fb10: 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
fb20: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
fb30: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
fb40: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
fb50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fb60: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
fb70: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
fb80: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
fb90: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
fba0: 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
fbb0: 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
fbc0: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
fbd0: 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
fbe0: 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
fbf0: 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
fc00: 44 4c 4f 43 4b 29 21 3d 30 3b 0a 0a 23 69 66 64  DLOCK)!=0;..#ifd
fc10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fc20: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
fc30: 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
fc40: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
fc50: 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
fc60: 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
fc70: 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
fc80: 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
fc90: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
fca0: 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
fcb0: 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
fcc0: 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
fcd0: 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
fce0: 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
fcf0: 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
fd00: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
fd10: 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
fd20: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
fd30: 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
fd40: 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63   It would be nic
fd50: 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a  e to assert.  **
fd60: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
fd70: 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a  .nAlloc is non-z
fd80: 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68  ero, but alas th
fd90: 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63  is breaks test c
fda0: 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74  ases .  ** writt
fdb0: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  en to invoke the
fdc0: 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e   pager directly.
fdd0: 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
fde0: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
fdf0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
fe00: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29    assert( pTsd )
fe10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  ;.#endif..  /* W
fe20: 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  e used to test i
fe30: 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20 61  f malloc() had a
fe40: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 62 65  lready failed be
fe50: 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
fe60: 20 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 77   .  ** But the w
fe70: 61 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ay this function
fe80: 20 69 73 20 75 73 65 64 20 69 6e 20 53 51 4c 69   is used in SQLi
fe90: 74 65 20 6d 65 61 6e 73 20 74 68 61 74 20 63 61  te means that ca
fea0: 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61 70  n never.  ** hap
feb0: 70 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72 65  pen. Furthermore
fec0: 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63 2d  , if the malloc-
fed0: 66 61 69 6c 65 64 20 66 6c 61 67 20 69 73 20 61  failed flag is a
fee0: 6c 72 65 61 64 79 20 73 65 74 2c 20 0a 20 20 2a  lready set, .  *
fef0: 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 61 6c  * either the cal
ff00: 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 72 44  l to sqlite3StrD
ff10: 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  up() or sqlite3_
ff20: 6d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77  malloc() below w
ff30: 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68  ill.  ** fail sh
ff40: 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  ortly and SQLITE
ff50: 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20  _NOMEM returned 
ff60: 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a  anyway..  */.  *
ff70: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
ff80: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
ff90: 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  ry for the pager
ffa0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
ffb0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
ffc0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
ffd0: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
ffe0: 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
fff0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
10000 2f 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73  /.    pVfs->szOs
10010 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20  File * 3 +      
10020 20 20 2f 2a 20 54 68 65 20 64 62 2c 20 6a 6f 75    /* The db, jou
10030 72 6e 61 6c 20 61 6e 64 20 73 74 6d 74 20 6a 6f  rnal and stmt jo
10040 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
10050 20 20 20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68      pVfs->mxPath
10060 6e 61 6d 65 20 2a 20 33 20 2b 20 33 30 20 20 20  name * 3 + 30   
10070 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
10080 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
10090 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
100a0 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
100b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
100c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20  MEM;.  }.  pPtr 
100d0 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b  = (u8 *)&pPager[
100e0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  1];.  pPager->fd
100f0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
10100 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
10110 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61  OsFile*0];.  pPa
10120 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69  ger->jfd = (sqli
10130 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
10140 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31  pVfs->szOsFile*1
10150 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66  ];.  pPager->stf
10160 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
10170 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
10180 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50  zOsFile*2];.  pP
10190 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
101a0 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
101b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 33 5d  Vfs->szOsFile*3]
101c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
101d0 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
101e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 70 56 66 73  ->zFilename[pVfs
101f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a 20  ->mxPathname];. 
10200 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
10210 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
10220 72 65 63 74 6f 72 79 5b 70 56 66 73 2d 3e 6d 78  rectory[pVfs->mx
10230 50 61 74 68 6e 61 6d 65 5d 3b 0a 20 20 70 50 61  Pathname];.  pPa
10240 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
10250 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
10260 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
10270 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
10280 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
10290 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
102a0 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
102b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
102c0 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
102d0 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
102e0 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
102f0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
10300 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
10310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10320 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
10330 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
10340 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
10350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
10360 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  Db = 1;.      pP
10370 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
10380 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d  0] = '\0';.    }
10390 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
103a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
103b0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
103c0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
103d0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  me, pPager->zFil
103e0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
103f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10400 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
10410 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 46  trlen(pPager->zF
10420 69 6c 65 6e 61 6d 65 29 3e 28 70 56 66 73 2d 3e  ilename)>(pVfs->
10430 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 74 72  mxPathname - str
10440 6c 65 6e 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  len("-journal"))
10450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10460 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
10470 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EN;.        }els
10480 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
10490 20 66 6c 61 67 20 3d 20 28 53 51 4c 49 54 45 5f   flag = (SQLITE_
104a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
104b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
104c0 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  E);.          in
104d0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
104e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
104f0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
10500 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10510 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 66 6c  , pPager->fd, fl
10520 61 67 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  ag, &fout);.    
10530 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
10540 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
10550 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
10560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10570 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
10580 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10590 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 56 66  agerOpentemp(pVf
105a0 73 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  s, pPager->fd, p
105b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
105c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
105d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
105e0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
105f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
10600 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
10610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10620 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10630 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
10640 74 65 33 5f 6d 61 6c 6c 6f 63 28 53 51 4c 49 54  te3_malloc(SQLIT
10650 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
10660 49 5a 45 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  IZE);.  }..  /* 
10670 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10680 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
10690 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
106a0 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f  e, free the memo
106b0 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64  ry .  ** pointed
106c0 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68   to by zFullPath
106d0 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50  name, free the P
106e0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
106f0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20  nd close the .  
10700 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74  ** file. Since t
10710 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
10720 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
10730 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
10740 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
10750 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
10760 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
10770 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67  !pPager || !pPag
10780 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  er->pTmpSpace ){
10790 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
107a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
107b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
107c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
107d0 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
107e0 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
107f0 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20  MEM:rc);.  }..  
10800 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45  PAGERTRACE3("OPE
10810 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
10820 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46  HANDLEID(fd), zF
10830 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10840 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
10850 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
10860 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29   zFullPathname))
10870 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
10880 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b  ager.zDirectory[
10890 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
108a0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
108b0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
108c0 61 6d 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ame, pVfs->mxPat
108d0 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  hname);.  for(i=
108e0 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a  strlen(pPager->z
108f0 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20  Directory); i>0 
10900 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
10910 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
10920 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
10930 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
10940 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
10950 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
10960 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
10970 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  */.  memcpy(pPag
10980 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
10990 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
109a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
109b0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
109c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 73  ager->zJournal[s
109d0 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 4a  trlen(pPager->zJ
109e0 6f 75 72 6e 61 6c 29 5d 2c 20 22 2d 6a 6f 75 72  ournal)], "-jour
109f0 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20  nal", 9);..  /* 
10a00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10a10 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
10a20 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
10a30 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
10a40 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
10a50 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
10a60 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
10a70 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
10a80 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
10a90 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
10aa0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
10ab0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
10ac0 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
10ad0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10ae0 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
10af0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
10b00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
10b10 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
10b20 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
10b30 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10b40 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
10b50 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
10b60 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
10b70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
10b80 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
10b90 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
10ba0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
10bb0 4e 54 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  NT;.  assert( PA
10bc0 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  GER_UNLOCK==0 );
10bd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
10be0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
10bf0 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
10c00 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
10c10 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
10c20 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
10c30 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
10c40 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
10c50 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
10c60 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
10c70 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
10c80 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
10c90 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
10ca0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
10cb0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
10cc0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
10cd0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d  lusiveMode = tem
10ce0 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
10cf0 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
10d00 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
10d10 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
10d20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
10d30 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
10d40 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
10d50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
10d60 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
10d70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
10d80 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
10d90 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f  noSync?0:1);.  /
10da0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
10db0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
10dc0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10dd0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
10de0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
10df0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
10e00 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
10e10 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
10e20 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
10e30 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
10e40 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21  |memDb);.  if( !
10e50 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74  memDb ){.    set
10e60 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
10e70 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  r);.  }.  /* pPa
10e80 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10e90 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
10ea0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
10eb0 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
10ec0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
10ed0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
10ee0 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
10ef0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
10f00 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
10f10 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
10f20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20   pTsd->pPager;. 
10f30 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
10f40 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
10f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10f60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
10f70 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
10f80 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
10f90 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
10fa0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
10fb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
10fc0 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
10fd0 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
10fe0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
10ff0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
11000 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11010 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
11020 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
11030 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
11040 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
11050 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
11060 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
11070 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
11080 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
11090 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
110a0 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
110b0 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
110c0 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
110d0 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
110e0 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
110f0 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
11100 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
11110 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
11120 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
11130 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
11140 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
11150 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
11160 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
11170 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
11180 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
11190 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
111a0 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
111b0 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
111c0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
111d0 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
111e0 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
111f0 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
11200 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
11210 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
11220 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
11230 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
11240 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
11250 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
11260 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11270 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
11280 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
11290 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
112a0 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
112b0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
112c0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
112d0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
112e0 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
112f0 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
11300 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
11310 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
11320 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
11330 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
11340 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
11350 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
11360 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
11370 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
11380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11390 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52  he page size.  R
113a0 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69  eturn the new si
113b0 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67  ze.  If the sugg
113c0 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20  est new page.** 
113d0 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70  size is inapprop
113e0 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
113f0 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
11400 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64  size is selected
11410 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64  .** and returned
11420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11430 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11440 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11450 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
11460 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
11470 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11480 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11490 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
114a0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
114b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
114c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ==0 ){.    pager
114d0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
114e0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
114f0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
11500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11510 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
11520 61 63 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ace);.    pPager
11530 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
11540 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67  lite3_malloc(pag
11550 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65  eSize);.  }.  re
11560 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
11570 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
11580 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
11590 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
115a0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
115b0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
115c0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
115d0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
115e0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
115f0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
11600 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
11610 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
11620 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
11630 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
11640 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
11650 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
11660 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
11670 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
11680 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
11690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
116a0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
116b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
116c0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
116d0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
116e0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
116f0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
11700 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11710 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
11720 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
11730 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
11740 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11750 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
11760 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
11770 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
11780 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
11790 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
117a0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
117b0 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
117c0 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
117d0 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
117e0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
117f0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
11800 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
11810 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
11820 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
11830 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
11840 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
11850 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
11860 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11870 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11880 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
11890 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
118a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
118b0 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
118c0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
118d0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
118e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
118f0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
11900 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
11910 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
11920 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
11930 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
11940 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
11950 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
11960 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
11970 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
11980 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
11990 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
119a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
119b0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
119c0 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
119d0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
119e0 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
119f0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
11a00 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
11a10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
11a20 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
11a30 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
11a40 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
11a50 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  ** No error chec
11a60 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68  king is done. Th
11a70 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74  e rational for t
11a80 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
11a90 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61   function .** ma
11aa0 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e  y be called even
11ab0 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
11ac0 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
11ad0 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e  ontain a header.
11ae0 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61   In .** these ca
11af0 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ses sqlite3OsRea
11b00 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  d() will return 
11b10 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69  an error, to whi
11b20 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a  ch the correct .
11b30 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74  ** response is t
11b40 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72  o zero the memor
11b50 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63  y at pDest and c
11b60 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c  ontinue.  A real
11b70 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69   IO error .** wi
11b80 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65  ll presumably re
11b90 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65  cur and be picke
11ba0 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f  d up later (Todo
11bb0 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  : Think about th
11bc0 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  is)..*/.int sqli
11bd0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
11be0 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
11bf0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
11c00 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
11c10 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
11c20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
11c30 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
11c40 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
11c50 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
11c60 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
11c70 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
11c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11c90 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
11ca0 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
11cb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11cc0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
11cd0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
11ce0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11cf0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11d10 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
11d20 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
11d30 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
11d40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
11d50 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
11d60 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
11d70 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
11d80 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
11d90 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
11da0 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
11db0 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
11dc0 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
11dd0 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
11de0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
11df0 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
11e00 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
11e10 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
11e20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
11e30 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
11e40 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
11e50 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
11e60 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
11e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11e80 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
11e90 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
11ea0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
11eb0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
11ec0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
11ed0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
11ee0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
11ef0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
11f00 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
11f10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
11f20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
11f30 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
11f40 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11f50 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
11f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
11f70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
11f80 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
11f90 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
11fa0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
11fb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11fc0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
11fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11fe0 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
11ff0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
12000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12010 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
12020 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
12030 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
12040 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
12050 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
12060 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12070 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
12080 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
12090 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
120a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
120b0 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
120c0 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   n;.}...#ifndef 
120d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
120e0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  RYDB./*.** Clear
120f0 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
12100 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
12110 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
12120 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
12130 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
12140 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
12150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12160 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
12170 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
12180 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
12190 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
121a0 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
121b0 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
121c0 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
121d0 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
121e0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
121f0 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
12200 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
12210 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
12220 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
12230 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
12240 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
12250 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
12260 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
12270 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
12280 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
12290 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
122a0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
122b0 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
122c0 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
122d0 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
122e0 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
122f0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
12300 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
12310 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
12320 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
12330 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
12340 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
12350 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
12360 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
12370 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
12380 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
12390 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
123a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
123b0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
123c0 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
123d0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
123e0 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
123f0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
12400 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
12410 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
12420 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d  ager->aHash[pPg-
12430 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
12440 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20  >nHash-1)]!=pPg 
12450 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
12460 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
12470 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
12480 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
12490 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e  int h = pPg->pgn
124a0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
124b0 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65  sh-1);.    pPage
124c0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
124d0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
124e0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
124f0 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72  .    clearHistor
12500 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
12510 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
12520 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d   }.  pPg->pgno =
12530 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
12540 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
12550 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
12560 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
12570 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
12580 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
12590 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
125a0 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
125b0 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
125c0 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
125d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
125e0 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
125f0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
12600 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
12610 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
12620 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
12630 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
12640 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
12650 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
12660 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
12670 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
12680 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
12690 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
126a0 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
126b0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
126c0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
126d0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
126e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
126f0 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
12700 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
12710 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
12720 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
12730 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
12740 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
12750 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
12760 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
12770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12780 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
12790 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
127a0 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
127b0 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
127c0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
127d0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
127e0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
127f0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
12800 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
12810 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12820 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
12830 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
12840 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
12850 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
12860 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
12870 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
12880 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
12890 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
128a0 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
128b0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
128c0 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pPg);.}../*.** 
128d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
128e0 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
128f0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
12900 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
12910 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
12920 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
12930 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
12940 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
12950 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
12960 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
12970 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
12980 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
12990 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
129a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
129b0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
129c0 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
129d0 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
129e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
129f0 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
12a00 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
12a10 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
12a20 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
12a30 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
12a40 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
12a50 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
12a60 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
12a70 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
12a80 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
12a90 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
12aa0 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
12ab0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12ac0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
12ad0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12ae0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
12af0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
12b00 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
12b10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
12b20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
12b30 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
12b40 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
12b50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
12b60 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
12b70 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
12b80 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
12b90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
12ba0 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
12bb0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
12bc0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
12bd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
12be0 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
12bf0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
12c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c10 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
12c20 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54  xtAll;.      IOT
12c30 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
12c40 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
12c50 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
12c60 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
12c70 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
12c80 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
12c90 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
12ca0 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
12cb0 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
12cc0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
12cd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
12ce0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
12cf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
12d00 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
12d10 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
12d20 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12d30 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
12d40 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
12d50 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
12d60 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
12d70 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
12d80 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
12d90 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
12da0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
12db0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
12dc0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
12dd0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12de0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
12df0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
12e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12e10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12e20 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12e30 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
12e40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
12e50 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
12e60 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
12e70 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
12e80 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
12e90 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12ea0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
12eb0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
12ec0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
12ed0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
12ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
12ef0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
12f00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
12f10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
12f20 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
12f30 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
12f40 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
12f50 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
12f60 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
12f70 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
12f80 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
12f90 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
12fa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12fb0 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
12fc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12fd0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
12fe0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
12ff0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
13000 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
13010 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
13020 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
13030 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
13040 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
13050 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13060 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
13070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13080 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13090 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
130a0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
130b0 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
130c0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
130d0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
130e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
130f0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
13100 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
13110 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
13120 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
13130 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
13140 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
13150 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
13160 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
13170 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13180 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
13190 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
131a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
131b0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
131c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
131d0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
131e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
131f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13200 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
13210 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
13220 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
13230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13240 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
13250 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13260 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
13270 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
13280 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
13290 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
132a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
132b0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
132c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
132d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
132e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
132f0 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
13300 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
13310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
13320 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
13330 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
13340 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
13350 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
13360 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
13370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13390 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
133a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
133b0 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
133c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
133d0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
133e0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
133f0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
13400 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
13410 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
13420 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
13430 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
13440 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
13450 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
13460 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
13470 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
13480 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
13490 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
134a0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
134b0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
134c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
134d0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
134e0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
134f0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
13500 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13510 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
13520 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
13530 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
13540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
13550 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
13560 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13570 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
13580 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
13590 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
135a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
135b0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
135c0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
135d0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
135e0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
135f0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
13600 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
13610 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
13620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13630 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
13640 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
13650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13660 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
13670 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
13680 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
13690 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
136a0 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
136b0 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
136c0 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
136d0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
136e0 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
136f0 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
13700 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
13710 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
13720 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
13730 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
13740 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
13750 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
13760 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
13770 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a  loc can be set..
13780 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
13790 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
137a0 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
137b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20   assert( pPager 
137c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
137d0 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f  d && pTsd->nAllo
137e0 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  c );.#endif..  d
137f0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
13800 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
13810 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13820 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
13830 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
13840 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
13850 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
13860 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
13870 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61  k(pPager);.  ena
13880 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13890 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
138a0 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  ERTRACE2("CLOSE 
138b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
138c0 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
138d0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
138e0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73  , pPager)).  ass
138f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
13900 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
13910 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
13920 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
13930 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
13940 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13950 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
13960 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13970 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
13980 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
13990 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
139a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
139b0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
139c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
139d0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
139e0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
139f0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
13a00 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
13a10 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
13a20 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
13a30 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
13a40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13a50 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
13a60 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
13a70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
13a80 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  }.  */..#ifdef S
13a90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
13aa0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
13ab0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
13ac0 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69  ager from the li
13ad0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
13ae0 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
13af0 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61  .  ** ThreadData
13b00 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72  .pPager if memor
13b10 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
13b20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  enabled..  */.  
13b30 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64  if( pPager==pTsd
13b40 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
13b50 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
13b60 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
13b70 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72  }else{.    Pager
13b80 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28   *pTmp;.    for(
13b90 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61  pTmp = pTsd->pPa
13ba0 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  ger; pTmp->pNext
13bb0 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70  !=pPager; pTmp=p
13bc0 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  Tmp->pNext){}.  
13bd0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20    pTmp->pNext = 
13be0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
13bf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
13c00 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
13c10 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
13c20 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
13c30 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
13c40 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
13c50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
13c60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
13c70 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
13c80 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13c90 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
13ca0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
13cb0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
13cc0 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
13cd0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
13ce0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
13cf0 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
13d00 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
13d10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
13d20 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
13d30 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
13d40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
13d50 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
13d60 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
13d70 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
13d80 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
13d90 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
13da0 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
13db0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
13dc0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
13dd0 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
13de0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
13df0 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
13e00 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
13e10 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
13e20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
13e30 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
13e40 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
13e50 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
13e60 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
13e70 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
13e80 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
13e90 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
13ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13eb0 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
13ec0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
13ed0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
13ee0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
13ef0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
13f00 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
13f10 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
13f20 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
13f30 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
13f40 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
13f50 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
13f60 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
13f70 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
13f80 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
13f90 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
13fa0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
13fb0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
13fc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
13fd0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
13fe0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
13ff0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
14000 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
14010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14020 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
14030 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
14040 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
14050 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
14060 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
14070 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
14080 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
14090 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
140a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
140b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
140c0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
140d0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
140e0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
140f0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
14100 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
14110 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
14120 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
14130 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
14140 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
14150 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
14160 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
14170 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
14180 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
14190 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
141a0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
141b0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
141c0 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
141d0 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
141e0 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
141f0 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
14200 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
14210 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
14220 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
14230 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
14240 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
14250 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
14260 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
14270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
14280 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
14290 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28  Pg){.  page_ref(
142a0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
142b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
142c0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
142d0 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
142e0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
142f0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
14300 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
14310 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
14320 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
14330 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
14340 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
14350 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
14360 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
14370 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
14380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
14390 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
143a0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
143b0 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
143c0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
143d0 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
143e0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
143f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
14400 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
14410 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
14420 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
14430 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
14440 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
14450 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
14460 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
14470 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
14480 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
14490 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
144a0 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
144b0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
144c0 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
144d0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
144e0 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
144f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
14500 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
14510 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
14520 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
14530 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
14540 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
14550 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
14560 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
14570 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
14580 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
14590 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
145a0 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
145b0 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
145c0 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
145d0 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
145e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
145f0 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
14600 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
14610 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
14620 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
14630 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
14640 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
14650 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
14660 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
14670 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
14680 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
14690 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
146a0 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
146b0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
146c0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
146d0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
146e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
146f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
14700 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
14710 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
14720 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
14730 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
14740 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
14750 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
14760 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
14770 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
14780 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
14790 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
147a0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
147b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
147c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
147d0 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
147e0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
147f0 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
14800 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
14810 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
14820 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
14830 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
14840 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
14850 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
14860 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
14870 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
14880 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
14890 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
148a0 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
148b0 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
148c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
148d0 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
148e0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
148f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
14900 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
14910 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
14920 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
14930 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
14940 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
14950 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
14960 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
14970 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
14980 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14990 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
149a0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
149b0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 36      {.        i6
149c0 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 20 20  4 jrnlOff;..    
149d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
149e0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
149f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14a00 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
14a10 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
14a20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
14a30 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
14a40 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
14a50 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
14a60 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
14a70 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
14a80 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
14a90 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
14aa0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
14ab0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
14ac0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
14ad0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
14ae0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
14af0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14b00 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
14b10 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
14b20 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
14b30 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14b40 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
14b50 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
14b60 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
14b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b80 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
14b90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
14ba0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
14bb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
14bc0 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66  ..        jrnlOf
14bd0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
14be0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
14bf0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
14c00 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
14c10 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
14c20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72  d\n", pPager, jr
14c30 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20  nlOff, 4));.    
14c40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
14c50 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
14c60 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65  , jrnlOff, pPage
14c70 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
14c80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14c90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
14ca0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
14cb0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
14cc0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
14cd0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
14ce0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
14cf0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
14d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d10 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
14d20 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
14d30 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20  ll_fsync);.     
14d40 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
14d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50  urn rc;.      pP
14d60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
14d70 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
14d80 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
14d90 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
14da0 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
14db0 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
14dc0 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
14dd0 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  /.    for(pPg=pP
14de0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
14df0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
14e00 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
14e10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
14e20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
14e30 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
14e40 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
14e50 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
14e60 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
14e70 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
14e80 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
14e90 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
14ea0 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
14eb0 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
14ec0 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
14ed0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
14ee0 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
14ef0 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
14f00 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
14f10 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
14f20 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
14f30 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
14f40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
14f50 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
14f60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
14f70 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
14f80 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  ed==pPager->pFir
14f90 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  st );.  }.#endif
14fa0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
14fb0 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77  ../*.** Merge tw
14fc0 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73  o lists of pages
14fd0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
14fe0 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f  irty and in pgno
14ff0 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   order..** Do no
15000 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68  t both fixing th
15010 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69  e pPrevDirty poi
15020 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
15030 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61   PgHdr *merge_pa
15040 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41  gelist(PgHdr *pA
15050 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20  , PgHdr *pB){.  
15060 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70  PgHdr result, *p
15070 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20  Tail;.  pTail = 
15080 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65  &result;.  while
15090 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20  ( pA && pB ){.  
150a0 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70    if( pA->pgno<p
150b0 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  B->pgno ){.     
150c0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
150d0 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pA;.      pTail
150e0 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20   = pA;.      pA 
150f0 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pA->pDirty;.  
15100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15110 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
15120 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  B;.      pTail =
15130 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20   pB;.      pB = 
15140 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pB->pDirty;.    
15150 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29  }.  }.  if( pA )
15160 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
15170 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73  rty = pA;.  }els
15180 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20  e if( pB ){.    
15190 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
151a0 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pB;.  }else{.   
151b0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
151c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
151d0 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a   result.pDirty;.
151e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68  }../*.** Sort th
151f0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
15200 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
15210 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67  er by pgno.  Pag
15220 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63  es are.** connec
15230 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f  ted by pDirty po
15240 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72  inters.  The pPr
15250 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
15260 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65   are.** corrupte
15270 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a  d by this sort..
15280 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  */.#define N_SOR
15290 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32  T_BUCKET_ALLOC 2
152a0 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  5.#define N_SORT
152b0 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35  _BUCKET       25
152c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
152d0 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65  EST.  int sqlite
152e0 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
152f0 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e  ucket = 0;.  #un
15300 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  def N_SORT_BUCKE
15310 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f  T.  #define N_SO
15320 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28  RT_BUCKET \.   (
15330 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
15340 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69  sort_bucket?sqli
15350 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
15360 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42  _bucket:N_SORT_B
15370 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e  UCKET_ALLOC).#en
15380 64 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72  dif.static PgHdr
15390 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28   *sort_pagelist(
153a0 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50  PgHdr *pIn){.  P
153b0 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42  gHdr *a[N_SORT_B
153c0 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70  UCKET_ALLOC], *p
153d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d  ;.  int i;.  mem
153e0 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66  set(a, 0, sizeof
153f0 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  (a));.  while( p
15400 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49  In ){.    p = pI
15410 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e  n;.    pIn = p->
15420 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
15430 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66  Dirty = 0;.    f
15440 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=0; i<N_SORT
15450 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b  _BUCKET-1; i++){
15460 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d  .      if( a[i]=
15470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b  =0 ){.        a[
15480 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  i] = p;.        
15490 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
154a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
154b0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
154c0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  [i], p);.       
154d0 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20   a[i] = 0;.     
154e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
154f0 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   i==N_SORT_BUCKE
15500 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  T-1 ){.      /* 
15510 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74  Coverage: To get
15520 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65   here, there nee
15530 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52  d to be 2^(N_SOR
15540 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20  T_BUCKET) .     
15550 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   ** elements in 
15560 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20  the input list. 
15570 54 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65  This is possible
15580 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61  , but impractica
15590 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74  l..      ** Test
155a0 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73  ing this line is
155b0 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c   the point of gl
155c0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20  obal variable.  
155d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70      ** sqlite3_p
155e0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
155f0 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
15600 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f     a[i] = merge_
15610 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
15620 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15630 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69   = a[0];.  for(i
15640 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =1; i<N_SORT_BUC
15650 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  KET; i++){.    p
15660 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
15670 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a  t(p, a[i]);.  }.
15680 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
15690 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
156a0 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
156b0 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
156c0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
156d0 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
156e0 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
156f0 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
15700 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
15710 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
15720 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
15730 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15740 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
15750 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
15760 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
15770 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15780 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
15790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
157a0 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
157b0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
157c0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
157d0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
157e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
157f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
15800 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
15810 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
15820 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
15830 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
15840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
15850 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
15860 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
15870 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
15880 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
15890 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
158a0 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
158b0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
158c0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
158d0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
158e0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
158f0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
15900 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
15910 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
15920 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
15930 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
15940 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
15950 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
15960 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
15970 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
15980 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
15990 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
159a0 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
159b0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
159c0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
159d0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
159e0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
159f0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
15a00 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
15a10 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
15a20 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
15a30 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
15a40 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
15a50 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15a60 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
15a70 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
15a80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
15a90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
15aa0 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
15ab0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
15ac0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
15ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
15ae0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
15af0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
15b00 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
15b10 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
15b20 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
15b30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
15b40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
15b50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
15b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b70 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15b80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
15b90 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
15ba0 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c  t(pList);.  whil
15bb0 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
15bc0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
15bd0 69 72 74 79 20 29 3b 0a 20 20 20 20 2f 2a 20 49  irty );.    /* I
15be0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
15bf0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
15c00 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
15c10 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
15c20 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
15c30 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15c40 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
15c50 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
15c60 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
15c70 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
15c80 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
15c90 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
15ca0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
15cb0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
15cc0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
15cd0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
15ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
15cf0 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
15d00 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
15d10 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
15d20 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69  List->pgno-1)*(i
15d30 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
15d40 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ize;.      char 
15d50 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
15d60 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
15d70 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
15d80 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
15d90 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
15da0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
15db0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
15dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15dd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
15de0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
15df0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
15e00 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20  h(pList));.     
15e10 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
15e20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
15e30 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  r, pList->pgno))
15e40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
15e50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
15e60 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
15e70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
15e80 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
15e90 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
15ea0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
15eb0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
15ec0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
15ed0 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  ->nWrite);.     
15ee0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
15ef0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
15f00 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
15f10 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
15f20 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
15f30 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
15f40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15f50 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
15f60 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
15f70 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f   PAGERTRACE3("NO
15f80 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
15f90 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
15fa0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
15fb0 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
15fc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15fd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
15fe0 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
15ff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
16000 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
16010 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
16020 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
16030 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
16040 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
16050 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
16060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16070 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
16080 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
16090 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
160a0 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
160b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
160c0 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
160d0 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
160e0 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
160f0 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
16100 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
16110 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
16120 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
16130 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
16140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
16150 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
16160 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
16170 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
16180 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
16190 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
161a0 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
161b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
161c0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
161d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
161e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
161f0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
16200 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
16210 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
16220 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
16230 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
16240 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
16250 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
16260 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
16270 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
16280 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
16290 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
162a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
162b0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
162c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
162d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
162e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
162f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
16300 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
16310 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
16320 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
16330 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
16340 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
16350 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
16360 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16370 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
16380 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
16390 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  k(pPager->fd) ){
163a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
163b0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
163c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
163d0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
163e0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
163f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
16400 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65  Journal);.    re
16410 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
16420 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
16430 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
16440 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
16450 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
16460 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
16470 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  . .**.** This ro
16480 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e  utine may return
16490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
164a0 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51  QLITE_FULL or SQ
164b0 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20  LITE_OK. It .** 
164c0 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65  does not set the
164d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
164e0 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
164f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
16500 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50  ecycle(Pager *pP
16510 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b  ager, int syncOk
16520 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
16530 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
16540 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61   *ppPg = 0;..  a
16550 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 0a  ssert(!MEMDB);..
16560 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
16570 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
16580 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
16590 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
165a0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
165b0 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
165c0 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
165d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
165e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
165f0 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
16600 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
16610 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
16620 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
16630 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
16640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16650 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
16660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
16670 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
16680 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
16690 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
166a0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
166b0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
166c0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
166d0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
166e0 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
166f0 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
16700 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
16710 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
16720 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
16730 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
16740 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
16750 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
16760 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
16770 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
16780 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
16790 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
167a0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
167b0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
167c0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
167d0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
167e0 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
167f0 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
16800 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
16810 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
16820 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
16830 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
16840 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
16850 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
16860 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
16870 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
16880 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
16890 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
168a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
168b0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
168c0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
168d0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
168e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
168f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
16900 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
16910 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
16920 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
16930 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
16940 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
16950 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
16960 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16970 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16980 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
16990 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
169a0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
169b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
169c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
169d0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
169e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
169f0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
16a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16a10 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
16a20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
16a30 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  dirty ){.    int
16a40 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
16a50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
16a60 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  0 );.    makeCle
16a70 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
16a80 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
16a90 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
16aa0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
16ab0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
16ac0 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20   pPg );.    if( 
16ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
16b00 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
16b10 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
16b20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
16b30 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
16b40 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
16b50 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
16b60 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
16b70 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
16b80 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
16b90 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
16ba0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
16bb0 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
16bc0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
16bd0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
16be0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
16bf0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
16c00 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
16c10 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
16c20 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
16c30 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
16c40 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
16c50 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
16c60 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
16c70 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
16c80 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
16c90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
16ca0 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
16cb0 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
16cc0 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
16cd0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
16ce0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
16cf0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
16d00 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
16d10 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ck ){.    IOTRAC
16d20 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42  E(("ALWAYS_ROLLB
16d30 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  ACK %p\n", pPage
16d40 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r)).    pPager->
16d50 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
16d60 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
16d70 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
16d80 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
16d90 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
16da0 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
16db0 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
16dc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
16dd0 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70  gno==0 );..  *pp
16de0 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
16df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16e00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16e10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16e20 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
16e30 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
16e40 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
16e50 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
16e60 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
16e70 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
16e80 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
16e90 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
16ea0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
16eb0 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33  d may be sqlite3
16ec0 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  _free()ed..**.**
16ed0 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
16ee0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16ef0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
16f00 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
16f10 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
16f20 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
16f30 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
16f40 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
16f50 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
16f60 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
16f70 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
16f80 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
16f90 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
16fa0 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
16fb0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
16fc0 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ased..*/.#if def
16fd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
16fe0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
16ff0 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65  MENT) && !define
17000 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
17010 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69 74 65  SKIO).int sqlite
17020 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
17030 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
17040 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
17050 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  a *pTsdro = sqli
17060 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
17070 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20 6e  dOnly();.  int n
17080 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
17090 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
170a0 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
170b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
170c0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
170d0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
170e0 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
170f0 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
17100 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
17110 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
17120 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
17130 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
17140 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
17150 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
17160 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
17170 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
17180 6b 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  k..  */.#if 0.  
17190 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
171a0 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
171b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
171c0 64 69 66 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d  dif..  /* Outerm
171d0 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f  ost loop runs fo
171e0 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74  r at most two it
171f0 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20  erations. First 
17200 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a  iteration we.  *
17210 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65  * try to find me
17220 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  mory that can be
17230 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75   released withou
17240 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  t calling fsync(
17250 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69  ). Second.  ** i
17260 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20  teration (which 
17270 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65  only runs if the
17280 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f   first failed to
17290 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73   free nReq bytes
172a0 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29   of.  ** memory)
172b0 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
172c0 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54   call fsync(). T
172d0 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65  his is of course
172e0 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a   much more .  **
172f0 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f   expensive..  */
17300 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31  .  for(i=0; i<=1
17310 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
17320 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
17330 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65   the SQLite page
17340 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
17350 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
17360 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20 2a 70   */.    Pager *p
17370 50 61 67 65 72 20 3d 20 70 54 73 64 72 6f 2d 3e  Pager = pTsdro->
17380 70 50 61 67 65 72 3b 0a 20 20 20 20 66 6f 72 28  pPager;.    for(
17390 20 3b 20 70 50 61 67 65 72 20 26 26 20 28 6e 52   ; pPager && (nR
173a0 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
173b0 64 3c 6e 52 65 71 29 3b 20 70 50 61 67 65 72 3d  d<nReq); pPager=
173c0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
173d0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
173e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
173f0 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
17400 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
17410 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
17420 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
17430 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66   pager, try to f
17440 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65  ree as many page
17450 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77  s as possible (w
17460 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a  ithout .      **
17470 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29   calling fsync()
17480 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
17490 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
174a0 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
174b0 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29   .      ** loop)
174c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
174d0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
174e0 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72  K==(rc = pager_r
174f0 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 69  ecycle(pPager, i
17500 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67 29  , &pPg)) && pPg)
17510 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65   {.        /* We
17520 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
17530 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
17540 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
17550 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
17560 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
17570 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
17580 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
17590 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
175a0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70  t .        ** (p
175b0 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
175c0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
175d0 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
175e0 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  ) list. .       
175f0 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
17600 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
17610 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
17620 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17630 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
17640 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
17650 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
17660 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
17670 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
17680 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
17690 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
176a0 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
176b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
176c0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
176d0 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
176e0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
176f0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
17700 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
17710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17720 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70            for( p
17730 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Tmp=pPager->pAll
17740 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
17750 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
17760 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
17770 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70           pTmp->p
17780 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
17790 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
177a0 20 7d 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20   }.#if 0.       
177b0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
177c0 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
177d0 67 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  g);.#else.      
177e0 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28    nReleased += (
177f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a  .            siz
17800 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
17810 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
17820 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
17830 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
17840 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
17850 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
17860 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20  of(PgHistory) . 
17870 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66         );.#endif
17880 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
17890 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20  (("PGFREE %p %d 
178a0 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  *\n", pPager, pP
178b0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
178c0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
178d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
178e0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
178f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17900 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pPg);.      }.. 
17910 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17930 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
17940 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
17950 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
17960 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
17970 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17980 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
17990 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
179a0 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
179b0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
179c0 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
179d0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
179e0 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
179f0 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
17a00 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  le..        ** T
17a10 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
17a20 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
17a30 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
17a40 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
17a50 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
17a60 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
17a70 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
17a80 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
17a90 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
17aa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17ab0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  ssert(.         
17ac0 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51     (rc&0xff)==SQ
17ad0 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
17ae0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
17af0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
17b00 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
17b10 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20  ITE_BUSY.       
17b20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17b30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
17b40 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
17b50 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
17b60 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17b70 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
17b80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
17b90 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
17ba0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17bb0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
17bc0 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c  NAGEMENT && !SQL
17bd0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
17be0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
17bf0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
17c00 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
17c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
17c30 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
17c40 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
17c50 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
17c60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
17c70 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
17c80 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
17c90 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
17ca0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
17cb0 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
17cc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
17cd0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
17ce0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
17cf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17d00 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
17d10 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
17d20 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
17d30 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
17d40 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
17d50 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
17d60 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
17d70 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
17d80 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
17d90 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
17da0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
17db0 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  u8*)PGHDR_TO_DAT
17dc0 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20  A(pPg))[24],.   
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17e00 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
17e10 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
17e20 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
17e30 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
17e40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
17e50 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46    PAGERTRACE4("F
17e60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
17e70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
17e90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17ea0 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
17eb0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
17ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ed0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17ee0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
17ef0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
17f00 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
17f10 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
17f20 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
17f30 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
17f40 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
17f50 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
17f60 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
17f70 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
17f80 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
17f90 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
17fa0 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
17fb0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17fc0 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
17fd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
17fe0 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
17ff0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
18000 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
18010 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
18020 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
18030 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
18040 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18050 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
18060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18080 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
18090 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
180a0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
180b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
180c0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
180d0 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  s;.    if( !MEMD
180e0 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
180f0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
18100 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
18110 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
18120 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
18130 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
18140 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
18150 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
18160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18180 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
18190 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
181a0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
181b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
181c0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
181d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
181e0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
181f0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
18200 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
18210 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
18220 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
18230 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
18240 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
18250 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
18260 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
18270 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20   deleted..      
18280 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  */.      if( has
18290 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
182a0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
182b0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
182c0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
182d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
182e0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
182f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
18300 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
18310 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
18320 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
18330 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
18340 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
18350 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
18360 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
18370 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
18380 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
18390 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
183a0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
183b0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
183c0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
183d0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
183e0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
183f0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
18400 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
18410 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
18420 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
18430 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
18440 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
18450 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
18460 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
18470 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
18480 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
18490 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
184a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
184b0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
184c0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
184d0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
184e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
184f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18500 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
18510 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
18520 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
18530 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
18540 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
18550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18570 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
18580 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
18590 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
185a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
185b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
185c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
185d0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
185e0 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a  VE;. .        /*
185f0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
18600 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
18610 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
18620 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
18630 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
18640 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
18650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
18660 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
18670 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
18680 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
18690 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
186a0 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
186b0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
186c0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
186d0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
186e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
186f0 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20  e holds.        
18700 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
18710 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
18720 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
18730 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
18740 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
18750 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
18760 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
18770 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  e time..        
18780 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  **.        ** Op
18790 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
187a0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
187b0 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
187c0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
187d0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
187e0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
187f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
18800 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
18810 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
18820 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
18830 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18840 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
18850 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
18860 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
18870 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
18880 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
18890 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
188a0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
188b0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
188c0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
188d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
188e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
188f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
18900 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
18910 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
18920 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
18930 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
18940 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
18950 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
18960 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
18970 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
18980 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  TE;.          as
18990 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
189a0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
189b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
189c0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
189d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
189e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
189f0 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
18a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
18a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
18a20 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
18a30 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20  hods );.        
18a40 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
18a50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
18a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
18a70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
18a90 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
18aa0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
18ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18ac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ae0 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
18af0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
18b00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
18b10 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
18b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
18b30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18b40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
18b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
18b60 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
18b70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18b80 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
18b90 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
18ba0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
18bb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18bc0 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
18bd0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
18be0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
18bf0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
18c00 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
18c10 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
18c20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
18c30 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
18c40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18c50 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
18c60 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
18c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18c90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
18ca0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
18cb0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
18cc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18cd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18ce0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
18d00 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
18d10 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
18d20 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
18d30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
18d40 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
18d50 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
18d60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
18d70 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
18d80 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
18d90 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
18da0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
18db0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
18dc0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
18dd0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
18de0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
18df0 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
18e00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
18e10 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
18e20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
18e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20  .        ** has 
18e40 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
18e50 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
18e60 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
18e70 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  sh the.        *
18e80 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20  * cache..       
18e90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   **.        ** D
18ea0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
18eb0 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
18ec0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
18ed0 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
18ee0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
18ef0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
18f00 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
18f10 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
18f20 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
18f30 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
18f40 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
18f50 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
18f60 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
18f70 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
18f80 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
18f90 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
18fa0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
18fb0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64          ** a cod
18fc0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
18fd0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
18fe0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
18ff0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
19000 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
19010 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
19020 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  be .        ** d
19030 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
19040 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
19050 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
19060 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
19070 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
19080 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
19090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
190a0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
190b0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
190c0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
190d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
190e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
190f0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
19100 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19110 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
19120 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
19130 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
19140 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
19150 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
19160 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  {.          IOTR
19170 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
19180 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
19190 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
191a0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
191b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
191c0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
191d0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
191e0 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
191f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
19200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
19220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
19240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
19250 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
19260 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
19270 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
19280 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
19290 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
192a0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
192b0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
192c0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
192d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
192e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
192f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19300 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
19310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
19320 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
19330 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
19340 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
19350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19360 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
19370 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19380 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
19390 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
193a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
193b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
193c0 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
193d0 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
193e0 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
193f0 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
19400 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
19410 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
19420 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
19430 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
19440 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
19450 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
19460 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
19470 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
19480 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
19490 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
194a0 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
194b0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
194c0 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
194d0 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
194e0 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
194f0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
19500 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
19510 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
19520 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
19530 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
19540 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
19550 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
19560 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
19570 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
19580 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
19590 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
195a0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
195b0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
195c0 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
195d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
195e0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
195f0 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
19600 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
19610 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
19620 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
19630 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19640 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
19650 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
19660 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
19670 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
19680 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
19690 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
196a0 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
196b0 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
196c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
196d0 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
196e0 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
196f0 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
19700 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
19710 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
19720 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
19730 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
19740 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
19750 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
19760 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
19770 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
19780 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
19790 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
197a0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
197b0 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
197c0 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
197d0 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
197e0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
197f0 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
19800 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
19810 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
19820 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
19830 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
19840 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19850 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
19860 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
19870 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
19880 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
19890 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
198a0 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20  * above is met: 
198b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
198c0 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
198d0 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
198e0 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20  er->pFirst==0 . 
198f0 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
19900 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74   (pPager->pFirst
19910 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
19920 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
19930 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
19940 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
19950 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
19960 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
19970 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
19980 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
19990 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
199a0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
199b0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
199c0 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
199d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
199e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
199f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19a00 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
19a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
19a30 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
19a40 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
19a50 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
19a80 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
19a90 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
19ac0 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
19ad0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
19ae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19af0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
19b00 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
19b10 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
19b20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
19b30 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
19b40 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19b50 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19b60 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19b70 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
19b80 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
19b90 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
19ba0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
19bb0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
19bc0 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
19bd0 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
19be0 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
19bf0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
19c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19c10 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
19c20 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
19c30 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
19c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
19c50 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
19c60 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , 1, &pPg);.    
19c70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
19c80 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
19c90 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
19ca0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
19cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19cd0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
19ce0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19cf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19d00 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
19d10 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
19d20 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
19d30 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
19d40 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
19d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d60 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
19d70 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
19d80 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
19d90 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
19da0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
19db0 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
19dc0 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
19dd0 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
19de0 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
19df0 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
19e00 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
19e10 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
19e20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
19e30 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
19e40 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
19e50 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
19e60 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
19e70 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
19e80 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
19e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ea0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
19eb0 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
19ec0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
19ed0 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
19ee0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
19ef0 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
19f00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
19f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19f20 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
19f30 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
19f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19f60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19f80 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
19f90 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
19fa0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
19fb0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
19fc0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
19fd0 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
19fe0 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
19ff0 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1a000 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1a010 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1a020 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a030 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1a040 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1a050 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1a060 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1a070 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1a080 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1a090 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1a0a0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1a0b0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1a0c0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1a0d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1a0e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1a0f0 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1a100 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1a110 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1a120 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1a130 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1a140 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1a150 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1a160 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1a170 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1a180 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1a190 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1a1a0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1a1b0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1a1c0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1a1d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1a1e0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1a1f0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1a200 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1a210 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1a220 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1a230 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1a240 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1a250 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1a260 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1a270 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1a280 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1a290 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1a2a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1a2b0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1a2c0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1a2d0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1a2e0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1a2f0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1a300 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1a310 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1a320 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1a330 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1a340 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1a350 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1a360 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1a370 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1a380 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1a390 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1a3a0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1a3b0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1a3c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1a3d0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1a3e0 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1a3f0 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1a400 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1a410 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1a420 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1a430 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1a440 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1a450 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1a460 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1a470 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1a480 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1a490 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1a4a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1a4b0 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1a4c0 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1a4d0 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1a4e0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1a4f0 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1a500 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1a510 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1a520 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1a530 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a540 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1a550 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1a560 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1a570 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1a580 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1a590 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1a5a0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1a5b0 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1a5c0 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1a5d0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1a5e0 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
1a5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1a600 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1a610 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1a620 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1a630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a640 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1a650 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1a660 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1a670 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1a680 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1a690 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1a6a0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1a6b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1a6c0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1a6d0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1a6e0 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1a6f0 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1a700 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a710 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a720 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a730 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1a740 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1a750 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1a760 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1a770 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1a780 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1a790 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1a7a0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1a7b0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1a7c0 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1a7d0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1a7e0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1a7f0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1a800 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1a810 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1a820 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1a830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a840 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1a850 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1a860 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1a870 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1a880 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1a890 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1a8a0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1a8b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a8c0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1a8d0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1a8e0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1a8f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1a900 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
1a910 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1a920 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1a930 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1a940 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1a950 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a960 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1a970 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1a980 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1a990 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1a9a0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1a9b0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1a9c0 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1a9d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a9e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1a9f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1aa00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1aa10 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1aa20 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
1aa30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1aa40 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1aa50 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
1aa60 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1aa70 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
1aa80 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1aa90 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
1aaa0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47    int h;.    PAG
1aab0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1aac0 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d  nMiss);.    rc =
1aad0 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1aae0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  ge(pPager, &pPg)
1aaf0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ab00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ab10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ab20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  }..    pPg->pgno
1ab30 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73   = pgno;.    ass
1ab40 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
1ab50 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74  gno>pPager->stmt
1ab60 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1ab70 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ab80 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
1ab90 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1aba0 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  ize ){.#if 0.   
1abb0 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
1abc0 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
1abd0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
1abe0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1abf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ac00 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1ac10 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1ac20 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1ac30 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
1ac40 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
1ac50 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
1ac60 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1ac70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac80 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ac90 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1aca0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1acb0 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65    }..    makeCle
1acc0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
1acd0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1ace0 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1acf0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
1ad00 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
1ad10 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
1ad20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1ad30 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
1ad40 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
1ad50 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
1ad60 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
1ad70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1ad80 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1ad90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ada0 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Code ){.      sq
1adb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1adc0 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pPg);.      rc =
1add0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ade0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1adf0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1ae00 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
1ae10 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
1ae20 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
1ae30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1ae40 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
1ae50 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1ae60 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
1ae70 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1ae80 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1ae90 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1aea0 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
1aeb0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1aec0 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
1aed0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1aee0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
1aef0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1af00 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1af10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1af20 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
1af30 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1af40 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1af50 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1af60 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
1af70 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
1af80 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
1af90 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1afa0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1afb0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
1afc0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1afd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1afe0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1aff0 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
1b000 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1b010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1b020 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1b030 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1b040 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
1b050 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
1b060 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1b070 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1b080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b090 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
1b0a0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1b0b0 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1b0c0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1b0d0 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
1b0e0 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
1b0f0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1b100 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
1b110 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
1b120 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1b130 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1b140 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
1b150 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1b160 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
1b170 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
1b180 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
1b190 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1b1a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
1b1b0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1b1c0 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1b1d0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1b1e0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1b1f0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1b200 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1b210 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1b220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1b230 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1b240 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
1b250 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
1b260 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1b270 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1b280 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1b290 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1b2a0 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1b2b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1b2c0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1b2d0 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1b2e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1b2f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1b310 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1b320 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1b330 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b340 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1b350 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
1b360 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
1b370 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1b380 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
1b390 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
1b3a0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
1b3b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1b3c0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
1b3d0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
1b3e0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
1b3f0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1b400 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
1b410 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
1b420 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
1b430 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
1b440 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
1b450 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
1b460 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
1b470 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
1b480 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
1b490 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1b4a0 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
1b4b0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1b4c0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1b4d0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1b4e0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
1b4f0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
1b500 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
1b510 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
1b520 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
1b530 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
1b540 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1b550 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1b560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1b570 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b580 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66  pgno!=0 );..  if
1b590 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1b5a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1b5b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1b5c0 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
1b5d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1b5e0 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ode );.    retur
1b5f0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
1b600 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1b610 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1b620 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1b630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1b640 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
1b650 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1b660 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1b670 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
1b680 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
1b690 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
1b6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
1b6b0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
1b6c0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1b6d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1b6e0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
1b6f0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
1b700 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
1b710 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
1b720 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
1b730 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
1b740 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
1b750 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
1b760 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
1b770 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b780 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
1b790 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b7a0 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
1b7b0 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65   *pPg){..  /* De
1b7c0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1b7d0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1b7e0 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
1b7f0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1b800 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
1b810 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
1b820 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
1b830 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1b840 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
1b850 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1b860 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
1b870 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
1b880 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
1b890 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
1b8a0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
1b8b0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
1b8c0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
1b8d0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
1b8e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1b8f0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
1b900 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
1b910 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
1b920 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
1b930 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
1b940 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
1b950 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
1b960 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1b970 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
1b980 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
1b990 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
1b9a0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
1b9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b9c0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1b9d0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
1b9e0 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
1b9f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
1ba00 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
1ba10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ba20 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1ba30 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
1ba40 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
1ba50 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
1ba60 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1ba70 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
1ba80 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
1ba90 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
1baa0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
1bab0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
1bac0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1bad0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1bae0 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
1baf0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1bb00 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
1bb10 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1bb20 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
1bb30 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1bb40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1bb50 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  0) ){.      page
1bb60 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1bb70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1bb80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1bb90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1bba0 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
1bbb0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
1bbc0 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
1bbd0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
1bbe0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
1bbf0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1bc00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bc10 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1bc20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1bc30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1bc40 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1bc50 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
1bc60 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
1bc70 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
1bc80 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
1bc90 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1bca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bcb0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1bcc0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1bcd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1bce0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1bcf0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
1bd00 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1bd10 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1bd20 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1bd30 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
1bd40 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
1bd50 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
1bd60 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1bd70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1bd80 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1bd90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bda0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1bdb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bdc0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1bdd0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1bde0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1bdf0 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
1be00 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1be10 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
1be20 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1be30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1be40 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
1be50 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
1be60 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1be70 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
1be80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1be90 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1bea0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1beb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1bec0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1bed0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
1bee0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1bef0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20 20 72  ONCLOSE;.  }.  r
1bf00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1bf10 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1bf20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
1bf30 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
1bf40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1bf50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1bf60 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
1bf70 64 73 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ds );.  pPager->
1bf80 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1bf90 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
1bfa0 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
1bfb0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1bfc0 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1bfd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1bfe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
1bff0 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
1c000 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1c010 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1c020 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
1c030 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1c040 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1c050 23 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33 4f  #if 0.  sqlite3O
1c060 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
1c070 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1c080 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
1c090 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
1c0a0 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  lSync(pPager->fd
1c0b0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
1c0c0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
1c0d0 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
1c0e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1c0f0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
1c100 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
1c110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1c120 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
1c130 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1c140 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
1c150 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
1c160 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1c170 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
1c180 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1c190 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1c1a0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1c1b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c1c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1c1d0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1c1e0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
1c1f0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1c200 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1c210 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1c220 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1c230 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
1c240 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
1c250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c270 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
1c280 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1c290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1c2a0 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
1c2b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1c2c0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1c2d0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
1c2e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c2f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c300 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1c310 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1c320 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
1c330 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
1c340 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1c350 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
1c360 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1c370 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1c380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c390 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1c3a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1c3b0 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1c3c0 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1c3d0 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1c3e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1c3f0 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1c400 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1c410 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1c420 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1c430 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1c440 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1c450 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1c460 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1c470 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1c480 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c490 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1c4a0 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1c4b0 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1c4c0 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1c4d0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1c4e0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1c4f0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1c500 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1c510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1c520 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1c530 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1c540 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1c550 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1c560 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c570 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1c580 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1c590 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1c5a0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1c5b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c5c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1c5d0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1c5e0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1c5f0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1c600 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1c610 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1c620 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1c630 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1c640 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1c650 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1c660 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1c670 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1c680 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1c690 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1c6a0 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1c6b0 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1c6c0 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1c6d0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1c6e0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1c6f0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1c700 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1c710 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1c720 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1c730 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1c740 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1c750 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1c760 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1c770 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1c780 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1c790 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1c7a0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1c7b0 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1c7c0 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1c7d0 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1c7e0 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1c7f0 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1c800 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1c810 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1c820 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1c830 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1c840 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1c850 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1c860 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1c870 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c880 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1c890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1c8a0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1c8b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1c8c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c8d0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1c8e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c8f0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1c900 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c910 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1c920 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
1c930 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1c940 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1c950 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1c960 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1c970 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1c980 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1c990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c9a0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1c9b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
1c9c0 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
1c9d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c9e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1c9f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1ca00 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
1ca10 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
1ca20 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
1ca30 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1ca40 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1ca50 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1ca60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
1ca80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1caa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1cab0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1cac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
1cad0 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
1cae0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1caf0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1cb00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1cb10 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
1cb20 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1cb30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cb40 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1cb50 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1cb60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1cb70 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1cb80 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1cb90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1cba0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1cbb0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1cbc0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1cbd0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1cbe0 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a   mode last.    *
1cbf0 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
1cc00 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
1cc10 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
1cc20 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
1cc30 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
1cc40 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
1cc50 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
1cc60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cc70 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
1cc80 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75  ept open and tru
1cc90 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
1cca0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
1ccb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1ccc0 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
1ccd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
1cce0 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  gDbSize==0 );.  
1ccf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cd00 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1cd10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1cd20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1cd30 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1cd40 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1cd50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1cd60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1cd70 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  /8 + 1 );.    if
1cd80 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1cd90 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1cda0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1cdb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cdc0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1cdd0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1cde0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1cdf0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1ce00 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1ce10 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1ce20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1ce30 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1ce40 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1ce50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1ce60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ce70 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1ce80 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69  ge dirty.  Set i
1ce90 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e  ts dirty flag an
1cea0 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  d add it to the 
1ceb0 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69  dirty.** page li
1cec0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1ced0 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48  id makeDirty(PgH
1cee0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1cef0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b  pPg->dirty==0 ){
1cf00 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1cf10 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1cf20 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1cf30 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
1cf40 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
1cf50 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20  pDirty;.    if( 
1cf60 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29  pPager->pDirty )
1cf70 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1cf80 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1cf90 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ty = pPg;.    }.
1cfa0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1cfb0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
1cfc0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1cfd0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1cfe0 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1cff0 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1d000 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1d010 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1d020 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1d030 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1d040 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1d050 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
1d060 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1d070 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1d080 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44  .    if( pPg->pD
1d090 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1d0a0 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
1d0b0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72  Dirty = pPg->pPr
1d0c0 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  evDirty;.    }. 
1d0d0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
1d0e0 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  vDirty ){.      
1d0f0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
1d100 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1d110 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
1d120 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
1d130 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1d140 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1d150 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  .  }.}.../*.** M
1d160 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
1d170 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
1d180 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
1d190 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1d1a0 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1d1b0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1d1c0 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1d1d0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1d1e0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1d1f0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1d200 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1d210 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1d220 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1d230 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1d240 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1d250 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1d260 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1d270 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d280 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1d290 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1d2a0 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1d2b0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1d2c0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1d2d0 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1d2e0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1d2f0 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1d300 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1d310 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1d320 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1d330 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1d340 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1d350 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1d360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1d370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1d380 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1d390 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1d3a0 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1d3b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1d3c0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1d3d0 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1d3e0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1d3f0 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1d400 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1d410 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1d420 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1d430 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1d440 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1d450 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1d460 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1d470 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1d480 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1d490 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1d4a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1d4b0 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44  id *pData = PGHD
1d4c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
1d4d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d4e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1d4f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d500 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1d510 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1d520 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d530 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1d540 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1d550 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1d560 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1d570 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1d580 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1d590 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1d5a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1d5b0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1d5c0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1d5d0 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65  his page was pre
1d5e0 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64  viously acquired
1d5f0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1d600 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20  =1, that means. 
1d610 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65   ** we didn't re
1d620 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65  ally read in the
1d630 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1d640 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20  page.  This can 
1d650 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72  happen.  ** (for
1d660 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74   example) when t
1d670 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
1d680 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
1d690 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a  eelist.  But.  *
1d6a0 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65  * now we are (pe
1d6b0 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68  rhaps) moving th
1d6c0 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68  e page off of th
1d6d0 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20  e freelist for. 
1d6e0 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65   ** reuse and we
1d6f0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74   need to know it
1d700 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  s original conte
1d710 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65  nt so that conte
1d720 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73  nt.  ** can be s
1d730 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  tored in the rol
1d740 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
1d750 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61  So do the read a
1d760 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65  t this.  ** time
1d770 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1d780 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1d790 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pPg);.  if( rc )
1d7a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1d7b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
1d7c0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
1d7d0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
1d7e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1d7f0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1d800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
1d810 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
1d820 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
1d830 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
1d840 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  );.  if( pPg->in
1d850 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65  Journal && (page
1d860 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1d870 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
1d880 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
1d890 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1d8a0 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
1d8b0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
1d8c0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
1d8d0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d8e0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
1d8f0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
1d900 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
1d910 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
1d920 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
1d930 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
1d940 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
1d950 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
1d960 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
1d970 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1d980 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
1d990 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
1d9a0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
1d9b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1d9c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1d9d0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1d9e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d9f0 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c  3PagerBegin(pPg,
1da00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1da10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da30 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1da40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1da50 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1da60 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1da70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1da80 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
1da90 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1daa0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1dab0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1dac0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dad0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1dae0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1daf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1db00 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
1db10 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1db20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1db30 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1db40 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1db50 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1db60 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1db70 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1db80 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1db90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1dba0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1dbb0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1dbc0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1dbd0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1dbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1dbf0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1dc00 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1dc10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1dc20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1dc30 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
1dc40 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
1dc50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1dc60 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1dc70 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1dc80 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
1dc90 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
1dca0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1dcb0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1dcc0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1dcd0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1dce0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1dcf0 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55  PAGERTRACE3("JOU
1dd00 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1dd10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1dd20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1dd30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1dd40 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
1dd50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1dd60 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
1dd70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1dd80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1dd90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1dda0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1ddc0 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
1ddd0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1dde0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1ddf0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1de00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1de10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
1de20 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
1de30 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1de40 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
1de50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
1de60 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1de70 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1de80 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1de90 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1dea0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1deb0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1dec0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1ded0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1dee0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1def0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
1df00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1df10 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
1df20 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1df30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
1df40 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1df50 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1df60 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1df70 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
1df80 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
1df90 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
1dfa0 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
1dfb0 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
1dfc0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
1dfd0 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
1dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
1dff0 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
1e000 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1e010 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
1e020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
1e030 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
1e040 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
1e050 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1e060 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1e070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e080 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1e090 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1e0a0 32 2c 20 73 7a 50 67 2c 20 70 50 61 67 65 72 2d  2, szPg, pPager-
1e0b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
1e0c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1e0d0 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1e0e0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1e0f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e120 66 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20 20 20  f, szPg));.     
1e130 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1e140 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1e150 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
1e160 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1e170 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
1e180 67 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  g;.          PAG
1e190 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41  ERTRACE5("JOURNA
1e1a0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
1e1b0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
1e1c0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1e1d0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1e1e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1e1f0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1e200 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1e210 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20  (pPg));.        
1e220 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20    *(u32*)pEnd = 
1e230 73 61 76 65 64 3b 0a 0a 20 20 20 20 20 20 20 20  saved;..        
1e240 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1e250 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1e260 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1e270 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1e280 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1e290 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1e2a0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1e2b0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1e2c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e2d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e2e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e2f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e300 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1e310 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1e320 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1e330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e340 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1e350 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1e360 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1e370 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1e380 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1e390 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1e3a0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1e3b0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1e3c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1e3d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1e3e0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1e3f0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1e400 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1e410 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1e420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e430 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1e440 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
1e450 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
1e460 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1e470 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1e480 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
1e490 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1e4a0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1e4b0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1e4c0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1e4d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e4e0 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1e4f0 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
1e500 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
1e510 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1e520 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1e530 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
1e540 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1e550 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
1e560 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1e570 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1e580 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1e590 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1e5a0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1e5b0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1e5c0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1e5d0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1e5e0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1e5f0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1e600 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1e610 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1e620 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1e630 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1e640 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1e650 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1e660 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1e670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e680 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e690 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
1e6a0 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1e6b0 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
1e6c0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1e6d0 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
1e6e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e6f0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e700 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1e710 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1e720 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1e730 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1e740 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1e750 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1e760 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1e770 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1e780 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
1e790 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
1e7a0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
1e7b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
1e7c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1e7d0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1e7e0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1e7f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
1e800 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
1e810 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1e820 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1e830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e840 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1e850 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1e860 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1e870 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1e880 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1e890 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
1e8a0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
1e8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8c0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1e8d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1e8e0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1e8f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
1e900 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
1e910 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1e920 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1e930 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74  )-4;.        put
1e940 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
1e950 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1e960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e970 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
1e980 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  tfd, pData2, pPa
1e990 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
1e9a0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
1e9b0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
1e9c0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1e9d0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1e9e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e9f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1ea00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ea10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ea20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ea30 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1ea40 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
1ea50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ea60 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1ea70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1ea80 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1ea90 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1eaa0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1eab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eac0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1ead0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1eae0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1eaf0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1eb00 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1eb10 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
1eb20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
1eb30 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
1eb40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
1eb50 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
1eb60 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1eb70 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
1eb80 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
1eb90 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1eba0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1ebb0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
1ebc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ebd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ebe0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1ebf0 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
1ec00 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
1ec10 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
1ec20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
1ec30 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1ec40 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
1ec50 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
1ec60 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1ec70 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
1ec80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1ec90 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1eca0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1ecb0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
1ecc0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
1ecd0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
1ece0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
1ecf0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
1ed00 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
1ed10 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
1ed20 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
1ed30 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
1ed40 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
1ed50 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
1ed60 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1ed70 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1ed80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
1ed90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1eda0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1edb0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
1edc0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
1edd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1ede0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
1edf0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
1ee00 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1ee10 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
1ee20 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
1ee30 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ee40 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
1ee50 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45  ize);..  if( !ME
1ee60 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
1ee70 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
1ee80 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
1ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1eea0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1eeb0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
1eec0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
1eed0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
1eee0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1eef0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1ef00 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1ef10 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
1ef20 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1ef30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ef40 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
1ef50 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
1ef60 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
1ef70 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1ef80 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1ef90 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
1efa0 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
1efb0 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a  allow a journal.
1efc0 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f      ** header to
1efd0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
1efe0 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
1eff0 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20  urnaled by this 
1f000 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
1f010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f020 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1f030 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1f040 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
1f050 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
1f060 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
1f070 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
1f080 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
1f090 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
1f0a0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
1f0b0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
1f0c0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
1f0d0 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
1f0e0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
1f0f0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1f100 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1f110 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
1f120 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
1f130 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
1f140 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
1f150 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
1f160 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
1f170 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1f180 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1f190 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1f1a0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1f1b0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1f1c0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1f1d0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1f1e0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1f1f0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1f200 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1f210 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1f220 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1f230 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1f240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1f250 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1f260 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1f270 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1f280 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1f290 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1f2a0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1f2b0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1f2c0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1f2d0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1f2e0 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21  +ii;.      if( !
1f2f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1f300 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70  al || pg==pPg->p
1f310 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  gno || .        
1f320 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69    pg>pPager->ori
1f330 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61  gDbSize || !(pPa
1f340 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1f350 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29  pg/8]&(1<<(pg&7)
1f360 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20  )).      ) {.   
1f370 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
1f380 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1f390 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1f3a0 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
1f3b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f3c0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1f3d0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
1f3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f3f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f400 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f410 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
1f420 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f440 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1f450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f460 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f480 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1f490 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1f4a0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1f4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1f4c0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1f4d0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1f4e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f4f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1f500 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1f510 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1f520 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1f530 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1f540 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1f550 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f560 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1f570 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1f580 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1f590 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1f5a0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1f5b0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1f5c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1f5d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1f5e0 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
1f5f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1f600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1f610 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
1f620 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
1f630 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1f640 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
1f650 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
1f660 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
1f670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1f680 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67  gerOverwrite(Pag
1f690 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1f6a0 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
1f6b0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
1f6c0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
1f6d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f6e0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
1f6f0 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  o, &pPg);.  if( 
1f700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f710 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f720 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
1f730 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f750 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50   memcpy(sqlite3P
1f760 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29  agerGetData(pPg)
1f770 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1f780 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1f790 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
1f7a0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f7b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f7c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1f7d0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1f7e0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1f7f0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
1f800 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1f810 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
1f820 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
1f830 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
1f840 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
1f850 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
1f860 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
1f870 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
1f880 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
1f890 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
1f8a0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1f8b0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
1f8c0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
1f8d0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
1f8e0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
1f8f0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
1f900 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
1f910 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
1f920 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
1f930 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
1f940 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
1f950 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1f960 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
1f970 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1f980 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
1f990 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1f9a0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1f9b0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1f9c0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1f9d0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1f9e0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1f9f0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1fa00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1fa10 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1fa20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1fa30 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1fa40 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1fa50 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
1fa60 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1fa70 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1fa80 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1fa90 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1faa0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1fab0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1fac0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1fad0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1fae0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1faf0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1fb00 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1fb10 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1fb20 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1fb30 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1fb40 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1fb50 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1fb60 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1fb70 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1fb80 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1fb90 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1fba0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1fbb0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1fbc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1fbd0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1fbe0 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ed,.** the sqlit
1fbf0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1fc00 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1fc10 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1fc20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67  cause the.** pag
1fc30 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69  e contains criti
1fc40 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1fc50 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1fc60 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f  re it gets.** ro
1fc70 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1fc80 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  te of the sqlite
1fc90 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1fca0 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
1fcb0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1fcc0 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20  ontWrite(DbPage 
1fcd0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48  *pDbPage){.  PgH
1fce0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1fcf0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1fd00 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1fd10 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
1fd20 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e   return;.  pPg->
1fd30 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1fd40 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
1fd50 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1fd60 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1fd70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fd80 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1fd90 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1fda0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1fdb0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1fdc0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1fdd0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1fde0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1fdf0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1fe00 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1fe10 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1fe20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1fe30 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1fe40 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1fe50 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1fe60 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1fe70 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1fe80 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1fe90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fea0 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1feb0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1fec0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1fed0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1fee0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1fef0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1ff00 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1ff10 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1ff20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1ff30 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1ff40 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1ff50 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1ff60 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1ff70 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1ff80 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1ff90 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1ffa0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1ffb0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1ffc0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1ffd0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1ffe0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1fff0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
20000 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
20010 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
20020 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
20030 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
20040 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
20050 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
20060 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
20070 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
20080 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
20090 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
200a0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
200b0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
200c0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
200d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
200e0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
200f0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
20100 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
20110 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
20120 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
20130 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
20140 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
20150 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
20160 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
20170 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
20180 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
20190 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
201a0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
201b0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
201c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
201d0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
201e0 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
201f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
20200 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
20210 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
20220 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
20230 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
20240 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
20250 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
20260 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
20270 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
20280 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
20290 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
202a0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
202b0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
202c0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
202d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
202e0 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
202f0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
20300 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20310 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ager;..  assert(
20320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20330 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20340 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20350 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
20360 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
20370 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
20380 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
20390 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
203a0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
203b0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
203c0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
203d0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
203e0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
203f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20400 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
20410 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
20420 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
20430 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
20440 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
20450 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
20460 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  l = 1;.    pPg->
20470 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
20480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20490 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
204a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
204b0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
204c0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
204d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47  );.    }.    PAG
204e0 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52  ERTRACE3("DONT_R
204f0 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
20500 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
20510 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
20520 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  ger));.    IOTRA
20530 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20  CE(("GARBAGE %p 
20540 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
20550 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20  Pg->pgno)).  }. 
20560 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
20570 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70  tInUse .   && !p
20580 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
20590 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29  Pg) .   && (int)
205a0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
205b0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29  r->stmtSize .  )
205c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
205d0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
205e0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
205f0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
20600 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
20610 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20620 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
20630 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
20640 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
20650 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d  Pg->pgno&7);.  }
20660 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
20670 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
20680 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
20690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
206a0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
206b0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
206c0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
206d0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
206e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
206f0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
20700 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20710 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
20720 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
20730 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
20740 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
20750 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
20760 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
20770 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
20780 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
20790 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
207a0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
207b0 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
207c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
207d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
207e0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
207f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20800 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
20810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20  return rc;.  .  
20830 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
20840 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
20850 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
20860 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
20870 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
20880 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
20890 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
208a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
208b0 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  );.    change_co
208c0 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
208d0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
208e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
208f0 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
20900 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 2f  _counter);.    /
20910 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
20920 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
20930 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
20940 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
20950 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
20960 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
20970 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20990 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
209a0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
209b0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
209c0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
209d0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
209e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
209f0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
20a00 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
20a10 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
20a20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20a30 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
20a40 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
20a50 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
20a60 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
20a70 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
20a80 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
20a90 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
20aa0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
20ab0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20ac0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
20ad0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
20ae0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
20af0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
20b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20b10 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
20b20 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
20b30 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
20b40 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
20b50 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
20b60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20b70 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
20b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
20b90 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
20ba0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
20bb0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
20bc0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
20bd0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
20be0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
20bf0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
20c00 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
20c10 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
20c20 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
20c30 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
20c40 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
20c50 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
20c60 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
20c70 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
20c80 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
20c90 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
20ca0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20cb0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
20cc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
20cd0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
20ce0 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
20cf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20d00 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
20d10 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
20d20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
20d30 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
20d40 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
20d50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
20d60 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
20d70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
20d80 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
20d90 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
20da0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
20db0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
20dc0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
20dd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
20de0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
20df0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
20e00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
20e10 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
20e20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
20e30 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
20e40 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
20e50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20e60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
20e70 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  ;..    /* If a m
20e80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20e90 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
20ea0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
20eb0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
20ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
20ed0 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
20ee0 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
20ef0 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
20f00 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
20f10 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
20f20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
20f30 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
20f40 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
20f50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
20f60 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
20f70 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
20f80 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
20f90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
20fa0 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
20fb0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
20fc0 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
20fd0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
20fe0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
20ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21000 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
21010 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
21020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21030 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
21040 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
21050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
21060 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
21070 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
21080 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
21090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
210a0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
210b0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
210c0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
210d0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
210e0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
210f0 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
21100 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
21110 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
21120 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
21130 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
21140 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  i;.        int i
21150 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
21160 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
21170 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
21180 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
21190 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
211a0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
211b0 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
211c0 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
211d0 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
211e0 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
211f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21200 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
21210 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
21220 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
21240 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
21250 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21260 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21270 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
21280 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21290 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
212a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
212b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
212c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
212d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
212e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
212f0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
21300 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
21310 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
21320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21330 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
21340 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
21350 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
21360 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
21370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21380 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
21390 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
213a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
213b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
213c0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
213d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
213e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
213f0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
21400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21410 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
21420 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
21430 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
21440 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
21450 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
21460 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
21470 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
21480 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
21490 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
214a0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
214b0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
214c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
214d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
214e0 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65 72  exit;.    pPager
214f0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
21500 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
21510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
21520 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
21530 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
21540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21550 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
21560 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   0);.    }.    I
21570 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
21580 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
21590 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
215a0 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
215b0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
215c0 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
215d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
215e0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
215f0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
21600 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
21610 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
21620 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
21630 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
21640 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
21650 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
21660 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
21670 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
21680 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
21690 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
216a0 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
216b0 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
216c0 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
216d0 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
216e0 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
216f0 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a 20  nt, it's.     * 
21700 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
21710 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
21720 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
21730 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
21740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21750 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
21760 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
21770 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
21780 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
21790 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
217a0 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
217b0 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
217c0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
217d0 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
217e0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
217f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
21800 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
21810 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
21820 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21830 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21840 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
21850 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21860 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
21870 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
21880 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
21890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
218a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
218b0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
218c0 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
218d0 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
218e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
218f0 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43  .  }.  PAGERTRAC
21900 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
21910 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21920 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
21930 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  ){.    pPg = pag
21940 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
21950 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
21960 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29      while( pPg )
21970 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
21980 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
21990 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
219a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65  ager);.      cle
219b0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
219c0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
219d0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
219e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
219f0 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
21a00 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
21a10 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
21a20 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
21a30 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
21a40 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
21a50 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
21a60 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
21a70 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
21a80 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  irty = 0;.#ifnde
21a90 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
21aa0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
21ab0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
21ac0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
21ad0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
21ae0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21af0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
21b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
21b10 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
21b20 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
21b30 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
21b40 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
21b50 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
21b60 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
21b70 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
21b80 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
21b90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
21ba0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
21bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21bc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21bd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21be0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  en || !pPager->d
21bf0 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61  irtyCache );.  a
21c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21c10 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
21c20 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  ED || !pPager->d
21c30 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
21c40 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21c50 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  );.  return page
21c70 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
21c80 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  rc);.}../*.** Ro
21c90 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
21ca0 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
21cb0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
21cc0 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
21cd0 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
21ce0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
21cf0 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
21d00 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
21d10 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
21d20 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
21d30 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
21d40 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
21d50 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
21d60 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
21d70 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
21d80 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
21d90 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
21da0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
21db0 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
21dc0 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
21dd0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
21de0 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
21df0 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
21e00 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
21e10 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
21e20 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
21e30 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
21e40 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
21e50 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
21e60 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
21e70 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
21e80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21e90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21ea0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
21eb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21ec0 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54  int rc;.  PAGERT
21ed0 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
21ee0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
21ef0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
21f00 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
21f10 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
21f20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
21f30 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
21f40 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
21f50 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
21f60 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
21f70 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
21f80 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
21f90 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
21fa0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
21fb0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
21fc0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
21fd0 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
21fe0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
21ff0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
22000 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
22010 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
22020 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22030 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
22040 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
22050 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
22060 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
22070 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
22080 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
22090 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
220a0 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
220b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
220c0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f   PAGERTRACE3("RO
220d0 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
220e0 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
220f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22100 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
22110 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
22120 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
22130 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
22140 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
22150 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
22160 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
22170 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
22180 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
22190 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
221a0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
221b0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
221c0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
221d0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
221e0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
221f0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
22200 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
22210 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
22220 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70  ->xReiniter(p, p
22230 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22250 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
22260 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
22270 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
22280 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
22290 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
222a0 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65  DbSize;.    page
222b0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
222c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
222d0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
222e0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
222f0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
22300 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
22310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
22320 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
22330 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
22340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22350 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
22360 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
22370 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
22380 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22390 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
223a0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
223b0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
223c0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
223d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
223e0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
223f0 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
22400 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
22410 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
22420 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22430 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
22440 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22450 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
22460 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
22470 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
22480 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
22490 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70   0);.    rc2 = p
224a0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
224b0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
224c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
224d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
224e0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
224f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
22500 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
22510 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
22520 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  /* pager_reset(p
22530 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61  Pager); */.  pPa
22540 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
22550 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
22560 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
22570 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
22580 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
22590 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
225a0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
225b0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
225c0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
225d0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
225e0 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
225f0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
22600 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
22610 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
22620 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22630 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
22640 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
22650 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
22660 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
22670 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
22680 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
22690 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
226a0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
226b0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
226c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
226d0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
226e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
226f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
22700 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
22710 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
22720 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
22730 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22740 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22750 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
22760 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
22770 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22780 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
22790 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
227a0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
227b0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
227c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
227d0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
227e0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
227f0 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
22800 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
22810 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
22820 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
22830 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
22840 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
22850 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
22860 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
22870 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
22880 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
22890 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
228a0 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
228b0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
228c0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
228d0 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
228e0 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
228f0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
22900 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
22910 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22920 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
22930 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
22940 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
22950 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
22960 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
22970 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
22980 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
22990 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
229a0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
229b0 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
229c0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
229d0 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
229e0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
229f0 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
22a00 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
22a10 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
22a20 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
22a30 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
22a40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
22a50 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
22a60 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
22a70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
22a80 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
22a90 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
22aa0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
22ab0 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
22ac0 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
22ad0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
22ae0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
22af0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
22b00 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
22b10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
22b20 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
22b30 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
22b40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22b50 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
22b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
22b70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
22b80 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
22b90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22ba0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
22bb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
22bc0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
22bd0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
22be0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22bf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
22c00 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
22c10 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
22c20 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
22c30 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
22c40 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
22c50 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
22c60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22c70 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
22c80 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
22c90 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
22ca0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
22cb0 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
22cc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
22cd0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
22ce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22cf0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
22d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22d10 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
22d20 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
22d30 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
22d40 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
22d50 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
22d60 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
22d70 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
22d80 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
22d90 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
22da0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
22db0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
22dc0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
22dd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
22de0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
22df0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74  pVfs, pPager->st
22e00 66 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fd, 0);.    if( 
22e10 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
22e20 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
22e30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
22e40 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
22e50 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
22e60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
22e70 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
22e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22e90 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66  ;. .stmt_begin_f
22ea0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
22eb0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a  ger->aInStmt ){.
22ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22ed0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
22ee0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
22ef0 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
22f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22f10 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
22f20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
22f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
22f40 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
22f50 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
22f60 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22f70 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
22f80 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
22f90 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
22fa0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
22fb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
22fc0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
22fd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  ){.      /* sqli
22fe0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
22ff0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
23000 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
23010 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  _free( pPager->a
23020 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
23030 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
23040 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
23050 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
23060 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
23070 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
23080 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
23090 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
230a0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
230b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
230c0 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
230d0 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
230e0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
230f0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
23100 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
23110 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
23120 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
23130 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
23140 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
23150 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
23160 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
23170 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
23180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
231a0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
231b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
231c0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
231d0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
231e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
231f0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
23200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23210 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
23220 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
23230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23240 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50  erStmtRollback(P
23250 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23260 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
23270 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
23280 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
23290 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
232a0 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
232b0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
232c0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
232d0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
232e0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
232f0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72  pHist;.      for
23300 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
23310 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69  mt; pPg; pPg=pHi
23320 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  st->pNextStmt){.
23330 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20          pHist = 
23340 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
23350 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
23360 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
23370 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
23380 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
23390 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
233a0 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
233b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
233c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
233d0 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
233e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
233f0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
23400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23410 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
23420 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
23430 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
23440 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
23450 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
23460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23470 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
23480 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23490 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
234a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
234b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
234c0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
234d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
234e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
234f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
23500 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
23510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23520 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23530 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
23540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23550 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
23560 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
23570 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
23580 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
23590 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
235a0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
235b0 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
235c0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
235d0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
235e0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
235f0 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
23600 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23610 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
23620 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
23630 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
23640 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
23650 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
23660 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
23670 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
23680 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
23690 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
236a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
236b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
236c0 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
236d0 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
236e0 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
236f0 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
23700 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
23710 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
23720 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
23730 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
23740 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
23750 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23760 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
23770 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
23780 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
23790 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
237a0 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
237b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
237c0 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
237d0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
237e0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
237f0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
23800 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
23810 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
23820 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
23830 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
23840 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
23850 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23870 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
23880 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
23890 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
238a0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
238b0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
238c0 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
238d0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
238e0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
238f0 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
23900 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
23910 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
23920 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
23930 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
23940 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
23950 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65   previous locate
23960 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
23970 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
23980 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
23990 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
239a0 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
239b0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
239c0 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
239d0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
239e0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
239f0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
23a00 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
23a10 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
23a20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
23a30 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
23a40 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
23a50 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
23a60 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
23a70 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
23a80 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
23a90 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
23aa0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
23ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
23ac0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
23ad0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
23ae0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
23af0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
23b00 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
23b10 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
23b20 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
23b30 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
23b40 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
23b50 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
23b60 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
23b70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
23b80 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ive)..*/.int sql
23b90 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
23ba0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23bb0 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
23bc0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
23bd0 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
23be0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
23bf0 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
23c00 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
23c10 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
23c20 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
23c30 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
23c40 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
23c50 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
23c60 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
23c70 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
23c80 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
23c90 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
23ca0 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
23cb0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
23cc0 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
23cd0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
23ce0 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
23cf0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
23d00 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g);.  if( pPg->n
23d10 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
23d20 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
23d30 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
23d40 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
23d50 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f  nal || (int)pgno
23d60 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
23d70 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
23d80 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
23d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23da0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
23db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
23dc0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
23dd0 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
23de0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
23df0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
23e00 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
23e10 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
23e20 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
23e30 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
23e40 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
23e50 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
23e60 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
23e70 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
23e80 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
23e90 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
23ea0 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
23eb0 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
23ec0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
23ed0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
23ee0 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
23ef0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
23f00 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   0;.  pPgOld = p
23f10 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
23f20 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
23f30 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
23f40 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
23f50 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
23f60 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
23f70 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
23f80 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
23f90 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  Old);.    pPg->n
23fa0 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64  eedSync = pPgOld
23fb0 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65  ->needSync;.  }e
23fc0 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  lse{.    pPg->ne
23fd0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
23fe0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
23ff0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
24000 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
24010 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
24020 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
24030 3d 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  =  (pPager->aInJ
24040 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
24050 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
24060 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
24070 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
24080 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
24090 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
240a0 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70  0 || (int)pgno>p
240b0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
240c0 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  e );.  }..  /* C
240d0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
240e0 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
240f0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
24100 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
24110 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
24120 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
24130 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
24140 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
24150 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
24160 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
24170 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
24180 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
24190 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
241a0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
241b0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
241c0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
241d0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
241e0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
241f0 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
24200 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
24210 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
24220 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
24230 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
24240 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
24250 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
24260 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
24270 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
24280 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
24290 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
242a0 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
242b0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
242c0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
242d0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
242e0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
242f0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
24300 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
24310 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
24320 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
24330 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
24340 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
24350 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
24360 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
24370 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
24380 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
24390 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
243a0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
243b0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
243c0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
243d0 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
243e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
243f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
24400 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
24410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
24420 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
24430 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
24440 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
24450 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
24460 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
24470 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
24480 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
24490 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
244a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
244b0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
244c0 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
244d0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
244e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
244f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
24500 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
24510 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
24520 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
24530 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
24540 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
24550 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
24560 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
24570 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
24580 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
24590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
245a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
245b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
245c0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
245d0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
245e0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
245f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
24600 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
24610 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
24620 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
24630 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
24640 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
24650 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
24660 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
24670 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
24680 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
24690 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
246a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
246b0 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
246c0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
246d0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
246e0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
246f0 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
24700 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
24710 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
24720 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
24730 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
24740 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
24750 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
24760 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
24770 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
24780 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
24790 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
247a0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
247b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
247c0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
247d0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
247e0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
247f0 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
24800 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
24810 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
24820 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
24830 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
24840 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
24850 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
24860 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
24870 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
24880 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
24890 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
248a0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
248b0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
248c0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
248d0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
248e0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
248f0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
24900 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24910 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
24920 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
24930 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
24940 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
24950 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
24960 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
24970 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
24980 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
24990 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
249a0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
249b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
249c0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
249d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
249e0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
249f0 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
24a00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24a10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24a20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
24a30 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
24a40 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
24a50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
24a60 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
24a70 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
24a80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
24a90 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
24aa0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
24ab0 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
24ac0 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
24ad0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
24ae0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
24af0 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
24b00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
24b10 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
24b20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
24b30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
24b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24b50 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
24b60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24b70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
24b80 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
24b90 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
24ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
24bb0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
24bc0 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
24bd0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
24be0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
24bf0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
24c00 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
24c10 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
24c20 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
24c30 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
24c40 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
24c50 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
24c60 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
24c70 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
24c80 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
24c90 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
24ca0 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
24cb0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
24cc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
24cd0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
24ce0 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
24cf0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
24d00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
24d10 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.