/ Hex Artifact Content
Login

Artifact 05ea9dcbc4de4e9d9ca332ca1f8a9ba65fe2cbf5:


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: 36 20 32 30 30 37 2f 30 38 2f 31 35 20 31 37 3a  6 2007/08/15 17:
0360: 30 38 3a 34 36 20 64 61 6e 69 65 6c 6b 31 39 37  08:46 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 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
3510: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
3520: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
3530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
3540: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
3550: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3560: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
3570: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
3580: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
3590: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
35a0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
35b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
35c0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
35d0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
35e0: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
35f0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
3600: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
3610: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
3620: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
3630: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
3640: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3650: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
3660: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
3670: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
3680: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
3690: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
36a0: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
36b0: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
36c0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
36d0: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
36e0: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
36f0: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
3700: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
3710: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
3720: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3730: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
3740: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
3750: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
3760: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
3770: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
3780: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
3790: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
37a0: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
37b0: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
37d0: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
37e0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
37f0: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
3800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3810: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
3820: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
3830: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
3840: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3850: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
3860: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
3870: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
3880: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
3890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
38a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
38b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
38c0: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
38d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
38e0: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
38f0: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
3900: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3910: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
3920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3930: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
3940: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
3950: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
3960: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
3970: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
3980: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
3990: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
39a0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
39c0: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
39d0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
39e0: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
39f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3a00: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
3a10: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
3a20: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
3a30: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
3a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
3a50: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
3a60: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
3a70: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
3a80: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
3a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
3aa0: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
3ab0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
3ac0: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
3ad0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
3af0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
3b00: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
3b10: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
3b20: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
3b30: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3b40: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
3b50: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
3b60: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
3b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3b80: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
3b90: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
3ba0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
3bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3bc0: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3bd0: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
3be0: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c00: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
3c10: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
3c20: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3c30: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
3c70: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
3c80: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3ca0: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3cb0: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3cc0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
3cd0: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
3ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3cf0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
3d00: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
3d10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
3d40: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
3d50: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
3d60: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
3d90: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
3da0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
3dd0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3de0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
3e10: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
3e20: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
3e30: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
3e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e50: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
3e60: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
3e70: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
3e80: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ea0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3eb0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
3ec0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a  tabase */.  u8 *
3ed0: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
3ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3ef0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3f00: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3f10: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
3f20: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
3f30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
3f40: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
3f50: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3f60: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3f70: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3f80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3fa0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3fb0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
3fc0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
3fd0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3fe0: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
4000: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
4010: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
4020: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71  al files */.  sq
4030: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4040: 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c  *jfd;     /* Fil
4050: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
4060: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
4070: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
4080: 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20  te3_file *stfd; 
4090: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
40a0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
40b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
40c0: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
40d0: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
40e0: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
40f0: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
4100: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67  yHandler */.  Pg
4110: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
4120: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
4130: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
4140: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
4150: 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  stSynced;       
4160: 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70   /* First free p
4170: 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e  age with PgHdr.n
4180: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20  eedSync==0 */.  
4190: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
41b0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
41c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
41d0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
41e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
41f0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
4200: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
4210: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
4220: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4230: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
4240: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
4250: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4270: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
4280: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
4290: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
42a0: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
42b0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
42c0: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
42d0: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
42e0: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
42f0: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
4300: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
4310: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
4320: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
4330: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
4340: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
4350: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
4360: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
4370: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
4380: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
4390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
43a0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
43b0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
43c0: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
43d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
43e0: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
43f0: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
4400: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
4410: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
4420: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
4430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
4440: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
4450: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
4460: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
4470: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4480: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
4490: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
44a0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
44b0: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
44c0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
44d0: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
44e0: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
44f0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
4500: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
4510: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
4520: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4530: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4540: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4550: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4560: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4570: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4580: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4590: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
45a0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
45b0: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
45c0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
45d0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
45e0: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
45f0: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
4600: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4610: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
4620: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
4630: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
4640: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
4650: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
4660: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
4670: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4680: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
4690: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
46a0: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
46b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
46c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
46d0: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
46e0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
46f0: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
4700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
4710: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
4720: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
4730: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
4740: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4750: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4760: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4770: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4780: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
4790: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
47a0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
47b0: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
47c0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
47d0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
47e0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
47f0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4800: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4810: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4820: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4830: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4850: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4860: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4870: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4880: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4890: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
48a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
48b0: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
48c0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
48d0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
48e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
48f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4900: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4910: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4920: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4930: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4940: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4950: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
4960: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4970: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
4980: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
4990: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
49a0: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
49b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
49c0: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
49d0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
49e0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
49f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
4a00: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
4a10: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
4a20: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
4a30: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
4a40: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
4a50: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
4a60: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
4a70: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
4a80: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
4a90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
4aa0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
4ab0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
4ac0: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
4ad0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
4ae0: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
4af0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
4b00: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
4b10: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
4b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
4b30: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
4b40: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
4b50: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
4b60: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
4b70: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
4b80: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
4b90: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
4ba0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
4bb0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
4bc0: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
4bd0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
4be0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
4bf0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
4c00: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
4c10: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
4c20: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
4c30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
4c40: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
4c50: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
4c60: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
4c70: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
4c80: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
4c90: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
4ca0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
4cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
4cc0: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
4cd0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
4ce0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
4cf0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
4d00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
4d10: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
4d20: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
4d30: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
4d40: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
4d50: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
4d60: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
4d70: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
4d80: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
4d90: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
4da0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
4db0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
4dc0: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
4dd0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
4de0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
4df0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
4e00: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
4e10: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
4e20: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
4e30: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
4e40: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
4e50: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
4e60: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
4e70: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
4e80: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4e90: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
4ea0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
4eb0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
4ec0: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
4ed0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
4ee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4ef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4f00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
4f10: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
4f20: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
4f30: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
4f40: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
4f50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
4f60: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
4f70: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
4f80: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
4f90: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
4fa0: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
4fb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4fc0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
4fd0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4fe0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4ff0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5000: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
5010: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
5020: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
5030: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
5040: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
5050: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
5060: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
5070: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
5080: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
5090: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
50a0: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
50b0: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
50c0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
50d0: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
50e0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
50f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5100: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5110: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
5120: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
5130: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
5140: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
5150: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
5160: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
5170: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5180: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
5190: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
51a0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
51b0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
51c0: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
51d0: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
51e0: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
51f0: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5210: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
5220: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
5230: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
5240: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5250: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
5260: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
5270: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
5280: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
5290: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
52a0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
52b0: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
52c0: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
52d0: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
52e0: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
52f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
5300: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
5310: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
5320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
5330: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
5340: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
5350: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
5360: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
5370: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
5380: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
5390: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
53a0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
53b0: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
53c0: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
53d0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
53e0: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
53f0: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
5400: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
5410: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
5420: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5430: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
5440: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5450: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
5460: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5470: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5480: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5490: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
54a0: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
54b0: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
54c0: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
54d0: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
54e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
54f0: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
5500: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5520: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
5530: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
5540: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
5550: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
5560: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
5570: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
5580: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
5590: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
55a0: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
55b0: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
55c0: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
55d0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
55e0: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
55f0: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
5600: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
5610: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
5620: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
5630: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
5640: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
5650: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
5660: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
5670: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
5680: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
5690: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
56a0: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
56b0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
56c0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
56d0: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
56e0: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
56f0: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
5700: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
5710: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
5720: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
5730: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5740: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
5750: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5760: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5770: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
5780: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
5790: 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  n PGHDR_TO_HIST(
57a0: 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e  pPg, pPager)->in
57b0: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
57c0: 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
57d0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38  Pg->pgno;.    u8
57e0: 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49   *a = pPager->aI
57f0: 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72  nStmt;.    retur
5800: 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e  n (a && (int)pgn
5810: 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
5820: 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38  ize && (a[pgno/8
5830: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
5840: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  )));.  }.}../*.*
5850: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
5860: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
5870: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
5880: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
5890: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
58a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
58b0: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
58c0: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
58d0: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
58e0: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
58f0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
5900: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
5910: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
5920: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5930: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
5940: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
5950: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
5960: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
5970: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
5980: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
5990: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
59a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
59b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
59c0: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
59d0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
59e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
59f0: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72  h = aHash;.  for
5a00: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
5a10: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
5a20: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
5a30: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
5a40: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
5a50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
5a60: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
5a70: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
5a80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
5a90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5aa0: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
5ab0: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
5ac0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
5ad0: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
5ae0: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
5af0: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
5b00: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
5b10: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
5b20: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
5b30: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
5b40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
5b50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
5b60: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
5b70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
5b80: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
5b90: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
5ba0: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
5bb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5bc0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
5bd0: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
5be0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5bf0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5c00: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
5c10: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
5c20: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
5c30: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
5c40: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
5c50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
5c60: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
5c70: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
5c80: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
5c90: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5ca0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
5cb0: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
5cc0: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
5cd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ce0: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
5cf0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
5d00: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5d10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
5d20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
5d30: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
5d40: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
5d50: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
5d60: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
5d70: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
5d80: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
5d90: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
5da0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
5db0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
5dc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
5dd0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
5de0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
5df0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
5e00: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
5e10: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
5e20: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
5e30: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
5e40: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
5e50: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
5e60: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
5e70: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
5e80: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5e90: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
5ea0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
5eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
5ec0: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
5ed0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72  lled when an err
5ee0: 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
5ef0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f   the pager.** co
5f00: 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  de. The first ar
5f10: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
5f20: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
5f30: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a   structure, the.
5f40: 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  ** second the er
5f50: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
5f60: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
5f70: 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
5f80: 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76  ction. .** The v
5f90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
5fa0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
5fb0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
5fc0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
5fd0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
5fe0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
5ff0: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
6000: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
6010: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a  or SQLITE_FULL.*
6020: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
6030: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
6040: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41  All subsequent A
6050: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
6060: 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69   Pager.** will i
6070: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
6080: 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
6090: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
60a0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
60b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
60c0: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
60d0: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
60e0: 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
60f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
6100: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
6110: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
6120: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
6130: 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
6140: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
6150: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
6160: 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20  ERR.  );.  if(. 
6170: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
6180: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
6190: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
61a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
61b0: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
61c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
61d0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
61e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
61f0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
6200: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
6210: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
6220: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
6230: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
6240: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
6250: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
6260: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
6270: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
6280: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
6290: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
62a0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
62b0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
62c0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
62d0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
62e0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
62f0: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
6300: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
6310: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
6320: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
6330: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
6340: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
6350: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
6360: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
6370: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
6380: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
6390: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
63a0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
63b0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
63c0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
63d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
63e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
63f0: 20 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69             (unsi
6400: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
6410: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
6420: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
6430: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
6440: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
6450: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
6460: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
6470: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
6480: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
6490: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
64a0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
64b0: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
64c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
64d0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
64e0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
64f0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
6500: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
6510: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6520: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
6530: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
6540: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
6550: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
6560: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
6570: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
6580: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
6590: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
65a0: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
65b0: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
65c0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
65d0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
65e0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
65f0: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
6600: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
6610: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
6620: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
6630: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
6640: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
6650: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
6660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6670: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
6680: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
6690: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
66a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
66b0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
66c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
66d0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
66e0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
66f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
6700: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
6710: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
6720: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
6730: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
6740: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
6750: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
6760: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
6770: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
6780: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
6790: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
67a0: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
67b0: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
67c0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
67d0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
67e0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
67f0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
6800: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
6810: 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29  char **pzMaster)
6820: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  {.  int rc;.  u3
6830: 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a  2 len;.  i64 szJ
6840: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
6850: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
6860: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6870: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6880: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6890: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70   header */..  *p
68a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  zMaster = 0;..  
68b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
68c0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
68d0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
68e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c  QLITE_OK || szJ<
68f0: 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  16 ) return rc;.
6900: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6910: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
6920: 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  , &len);.  if( r
6930: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) 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 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
6970: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
6980: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6990: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
69a0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
69b0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
69c0: 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  J-8);.  if( rc!=
69d0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
69e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
69f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
6a00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70  return rc;..  *p
6a10: 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20  zMaster = (char 
6a20: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c  *)sqliteMalloc(l
6a30: 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70  en+1);.  if( !*p
6a40: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  zMaster ){.    r
6a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6a60: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
6a70: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
6a80: 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c  nl, *pzMaster, l
6a90: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b  en, szJ-16-len);
6aa0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6ab0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6ac0: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
6ad0: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
6ae0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
6af0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
6b00: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
6b10: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
6b20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6b30: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  me */.  for(i=0;
6b40: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
6b50: 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d    cksum -= (*pzM
6b60: 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20  aster)[i];.  }. 
6b70: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
6b80: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
6b90: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
6ba0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
6bb0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
6bc0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
6bd0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6be0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6bf0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
6c00: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
6c10: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
6c20: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
6c30: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
6c40: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
6c50: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
6c60: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6c70: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
6c80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
6c90: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
6ca0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
6cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a   }else{.    (*pz
6cc0: 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27  Master)[len] = '
6cd0: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
6ce0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
6d00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6d10: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
6d20: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
6d30: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
6d40: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
6d50: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
6d60: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
6d70: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
6d80: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
6d90: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
6da0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
6db0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
6dc0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
6dd0: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
6de0: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
6df0: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
6e20: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
6e40: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
6e50: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6e60: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
6e80: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
6ea0: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
6eb0: 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  void seekJournal
6ec0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6ed0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
6ee0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
6ef0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6f00: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
6f10: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
6f20: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
6f30: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
6f40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6f50: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
6f60: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
6f70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6f80: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
6f90: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
6fa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
6fb0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
6fc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
6fd0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6fe0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
6ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
7000: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
7010: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
7020: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7030: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
7040: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
7050: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
7060: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
7070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7080: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
7090: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
70a0: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
70b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
70c0: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
70d0: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
70e0: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
70f0: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
7100: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
7110: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
7120: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
7130: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
7140: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
7150: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
7160: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
7170: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
7180: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
7190: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
71a0: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
71b0: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
71c0: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
71d0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
71e0: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a  s journal..** .*
71f0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7200: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7210: 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  24) bytes of unu
7220: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7230: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7240: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
7250: 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20  pPager){.  char 
7260: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7270: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7280: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
7290: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
72a0: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
72b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
72c0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
72d0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20  urnalOff;.  }.. 
72e0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
72f0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
7300: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
7310: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7320: 66 66 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45  ff;..  /* FIX ME
7330: 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73  : .  **.  ** Pos
7340: 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65  sibly for a page
7350: 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  r not in no-sync
7360: 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
7370: 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20  al magic should 
7380: 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  not.  ** be writ
7390: 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69  ten until nRec i
73a0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70  s filled in as p
73b0: 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63  art of next sync
73c0: 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a  Journal(). .  **
73d0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d  .  ** Actually m
73e0: 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a  aybe the whole j
73f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68  ournal header sh
7400: 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20  ould be delayed 
7410: 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20  until that.  ** 
7420: 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f  point. Think abo
7430: 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  ut this..  */.  
7440: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
7450: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7460: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7470: 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20  gic));.  /* The 
7480: 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46  nRec Field. 0xFF
7490: 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79  FFFFFF for no-sy
74a0: 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a  nc journals. */.
74b0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
74c0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
74d0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
74e0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78  ger->noSync ? 0x
74f0: 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20  ffffffff : 0);. 
7500: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
7510: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
7520: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
7530: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
7540: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
7550: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
7560: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
7570: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7580: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7590: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
75a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
75b0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
75c0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
75d0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
75e0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
75f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
7600: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
7610: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
7620: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
7630: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
7640: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7650: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7660: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
7670: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
7680: 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41  orSize);.  IOTRA
7690: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
76a0: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
76b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76c0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  Hdr, sizeof(zHea
76d0: 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71  der))).  rc = sq
76e0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
76f0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
7700: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
7710: 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r),pPager->journ
7720: 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72  alOff);.  pPager
7730: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7740: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7750: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  Pager);..  /* Th
7760: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7770: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
7780: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
7790: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
77a0: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
77b0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
77c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
77d0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
77e0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
77f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49  LITE_OK ){.    I
7800: 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25  OTRACE(("JTAIL %
7810: 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
7820: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
7830: 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63  alOff-1)).    rc
7840: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7850: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
7860: 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67 65 72  \000", 1, pPager
7870: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b  ->journalOff-1);
7880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
78a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
78b0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
78c0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
78d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
78e0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
78f0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
7900: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
7910: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
7920: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
7930: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
7940: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
7950: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
7960: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
7970: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
7980: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7990: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
79a0: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
79b0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
79c0: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
79d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
79e0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
79f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
7a00: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
7a10: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
7a20: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
7a30: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
7a40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7a50: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
7a60: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
7a70: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
7a80: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
7a90: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
7aa0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
7ab0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
7ac0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
7ad0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
7ae0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7af0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
7b00: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
7b10: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
7b20: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
7b30: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
7b40: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
7b50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
7b60: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
7b70: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
7b80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
7b90: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7ba0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7bb0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
7bc0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
7bd0: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
7be0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
7bf0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
7c00: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
7c10: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
7c20: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
7c30: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
7c40: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
7c50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
7c60: 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b  jrnlOff;..  seek
7c70: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
7c80: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
7c90: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
7ca0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7cb0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
7cc0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
7cd0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
7ce0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
7cf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
7d00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
7d10: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
7d20: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
7d30: 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  of(aMagic), jrnl
7d40: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Off);.  if( rc )
7d50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
7d60: 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28  nlOff += sizeof(
7d70: 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20  aMagic);..  if( 
7d80: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
7d90: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7da0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
7db0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7dc0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
7dd0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7de0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7df0: 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b  jrnlOff, pNRec);
7e00: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
7e10: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
7e20: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
7e30: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34  ->jfd, jrnlOff+4
7e40: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
7e50: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
7e60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
7e70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7e80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7e90: 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29  lOff+8, pDbSize)
7ea0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7eb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
7ec0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
7ed0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
7ee0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
7ef0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
7f00: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
7f10: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
7f20: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
7f30: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
7f40: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
7f50: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
7f60: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
7f70: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
7f80: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7f90: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7fa0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7fb0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
7fc0: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
7fd0: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
7fe0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
7ff0: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
8000: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
8010: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8020: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75  , jrnlOff+12, (u
8030: 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65  32 *)&pPager->se
8040: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
8050: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
8060: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
8070: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
8080: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8090: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
80a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
80b0: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
80c0: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
80d0: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
80e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
80f0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
8100: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
8110: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
8120: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8130: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
8140: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
8150: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
8160: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
8170: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
8180: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
8190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
81a0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
81b0: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
81c0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
81d0: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
81e0: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
81f0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
8200: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
8210: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
8220: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
8230: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
8240: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
8250: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
8260: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
8270: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
8280: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
8290: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
82a0: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
82b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
82c0: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
82d0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
82e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
82f0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
8300: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
8310: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
8320: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
8330: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
8340: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
8350: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
8360: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
8370: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
8380: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
8390: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
83a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
83b0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
83c0: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
83d0: 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66  i; .  i64 jrnlOf
83e0: 66 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  f;.  u32 cksum =
83f0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
8400: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8410: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
8420: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
8430: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8440: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8450: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
8460: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
8470: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
8480: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
8490: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
84a0: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
84b0: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
84c0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
84d0: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
84e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
84f0: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
8500: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
8510: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8520: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
8530: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
8540: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
8550: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
8560: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
8570: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
8580: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
8590: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73  ullSync ){.    s
85a0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
85b0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e  ager);.  }.  jrn
85c0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
85d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
85e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
85f0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
8600: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
8610: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
8620: 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  nlOff, PAGER_MJ_
8630: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
8640: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8650: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8660: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a    jrnlOff += 4;.
8670: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8680: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
8690: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
86a0: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
86b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
86c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
86d0: 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a  rnlOff += len;..
86e0: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
86f0: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
8700: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
8710: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
8720: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
8730: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8760: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
8770: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
8780: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8790: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50  , jrnlOff);.  pP
87a0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
87b0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
87c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
87d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
87e0: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
87f0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
8800: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
8810: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
8820: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
8830: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
8840: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
8850: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
8860: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
8870: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
8880: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
8890: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
88a0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
88b0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
88c0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
88d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
88e0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
88f0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
8900: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
8910: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
8920: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
8930: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
8940: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
8950: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
8960: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8970: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8980: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
8990: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
89a0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
89b0: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
89c0: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
89d0: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
89e0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
89f0: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
8a00: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
8a10: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
8a20: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8a30: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
8a40: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
8a50: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
8a60: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
8a70: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
8a80: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
8a90: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
8aa0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
8ab0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
8ac0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
8ad0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
8ae0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
8af0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
8b00: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
8b10: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
8b20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8b30: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
8b40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
8b50: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
8b60: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
8b70: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
8b80: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
8b90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
8ba0: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
8bb0: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
8bc0: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
8bd0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
8be0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
8bf0: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
8c00: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
8c10: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
8c20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8c30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
8c40: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
8c50: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
8c60: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
8c70: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
8c80: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8c90: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
8ca0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
8cb0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
8cc0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
8cd0: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
8ce0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8cf0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
8d00: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
8d10: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
8d20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8d30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
8d40: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
8d50: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
8d60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
8d70: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
8d80: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
8d90: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
8da0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
8db0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
8dc0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
8dd0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
8de0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
8df0: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
8e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8e10: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
8e20: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
8e30: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
8e40: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
8e50: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
8e60: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8e70: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
8e80: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
8e90: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
8ea0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
8eb0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
8ec0: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
8ed0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
8ee0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
8ef0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
8f00: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
8f10: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
8f20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
8f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
8f40: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
8f50: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
8f60: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
8f70: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8f80: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
8f90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
8fa0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
8fb0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
8fc0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
8fd0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
8fe0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
8ff0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
9000: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
9010: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
9020: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
9030: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
9040: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
9050: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
9060: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
9070: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
9080: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
9090: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
90a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
90b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
90c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
90d0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
90e0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
90f0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
9100: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
9110: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
9120: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
9130: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
9140: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
9150: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
9160: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
9170: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
9180: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
9190: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
91a0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
91b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
91c0: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
91d0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
91e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
91f0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
9200: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
9210: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
9220: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
9230: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
9240: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
9250: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
9260: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
9270: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
9280: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
9290: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
92a0: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
92b0: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
92c0: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
92d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
92e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
92f0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
9300: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9310: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
9320: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
9330: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
9340: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
9350: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
9360: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
9370: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
9380: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
9390: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
93a0: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
93b0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
93c0: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
93d0: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
93e0: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
93f0: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
9400: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
9410: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
9420: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
9430: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
9440: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
9450: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
9460: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
9470: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9480: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
9490: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
94a0: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
94b0: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
94c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
94d0: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
94e0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
94f0: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
9500: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
9510: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
9520: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
9530: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
9540: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
9550: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9560: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
9570: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
9580: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9590: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
95a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
95b0: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
95c0: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
95d0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
95e0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
95f0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
9600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9610: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
9620: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
9630: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
9640: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
9650: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
9660: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
9670: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9680: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
9690: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
96a0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
96b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
96c0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
96d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
96e0: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
96f0: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
9700: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
9710: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
9720: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
9730: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9740: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
9750: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
9760: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
9770: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9780: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9790: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
97a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
97b0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
97c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
97d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
97e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
97f0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
9800: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
9810: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9820: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
9830: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
9840: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
9850: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
9860: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
9870: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
9880: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
9890: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
98a0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
98b0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
98c0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
98d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
98e0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
98f0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
9900: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
9910: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
9920: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
9930: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
9940: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
9950: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
9960: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
9970: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
9980: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
9990: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
99a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
99b0: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
99c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
99d0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
99e0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
99f0: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
9a00: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
9a10: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
9a20: 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  {.    rc2 = sqli
9a30: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
9a40: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
9a50: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
9a60: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
9a70: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
9a80: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
9a90: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
9aa0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
9ab0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
9ac0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
9ad0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
9ae0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9af0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
9b00: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9b10: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
9b20: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
9b30: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
9b40: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9b50: 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e   = -1;..  return
9b60: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9b70: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
9b80: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
9b90: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
9ba0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
9bb0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
9bc0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
9bd0: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
9be0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
9bf0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
9c00: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
9c10: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
9c20: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
9c30: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
9c40: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
9c50: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
9c60: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
9c70: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
9c80: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
9c90: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
9ca0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
9cb0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
9cc0: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
9cd0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
9ce0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
9cf0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
9d00: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
9d10: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
9d20: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
9d30: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
9d40: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
9d50: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
9d60: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
9d70: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
9d80: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
9d90: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
9da0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
9db0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
9dc0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
9dd0: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
9de0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
9df0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
9e00: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
9e10: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
9e20: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
9e30: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
9e40: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
9e50: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
9e60: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
9e70: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
9e80: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
9e90: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
9ea0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
9eb0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
9ec0: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
9ed0: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
9ee0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
9ef0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
9f00: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
9f10: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
9f20: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
9f30: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
9f40: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
9f50: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
9f60: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
9f70: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
9f80: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
9f90: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
9fa0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
9fb0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
9fc0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
9fd0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
9fe0: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
9ff0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a000: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
a010: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
a020: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
a030: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
a040: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
a050: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
a060: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
a070: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
a080: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
a090: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
a0a0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
a0b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
a0c0: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
a0d0: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
a0e0: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
a0f0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
a100: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
a110: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
a120: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
a130: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
a140: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
a150: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
a160: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
a170: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
a180: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
a190: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
a1a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
a1b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a1c0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
a1d0: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
a1e0: 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74  pPager, .  sqlit
a1f0: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20  e3_file *jfd,.  
a200: 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e  i64 offset,.  in
a210: 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20  t useCksum.){.  
a220: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
a230: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
a240: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
a250: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
a260: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
a270: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
a280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a290: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
a2a0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
a2b0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
a2c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
a2d0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
a2e0: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
a2f0: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
a300: 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38   u8 *aData = (u8
a310: 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
a320: 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20  pace;   /* Temp 
a330: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
a340: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43  ge */..  /* useC
a350: 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74  ksum should be t
a360: 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  rue for the main
a370: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c   journal and fal
a380: 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74  se for.  ** stat
a390: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20  ement journals. 
a3a0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
a3b0: 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  s is always the 
a3c0: 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  case.  */.  asse
a3d0: 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43  rt( jfd == (useC
a3e0: 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a  ksum ? pPager->j
a3f0: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66  fd : pPager->stf
a400: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
a410: 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d  aData );..  rc =
a420: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
a430: 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b   offset, &pgno);
a440: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a450: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
a460: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a470: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
a480: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
a490: 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
a4a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a4b0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
a4c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
a4d0: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
a4e0: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
a4f0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
a500: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
a510: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
a520: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
a530: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
a540: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
a550: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
a560: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
a570: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
a580: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
a590: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
a5a0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
a5b0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
a5c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
a5d0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
a5e0: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
a5f0: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
a600: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
a610: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
a620: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
a630: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
a640: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
a650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a660: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
a670: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
a680: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
a690: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a6a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
a6b0: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
a6c0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
a6d0: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70  ts(jfd, offset+p
a6e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
a6f0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
a700: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a710: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
a720: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
a730: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
a740: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
a750: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
a760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a770: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
a780: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
a790: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
a7a0: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
a7b0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
a7c0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
a7d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
a7e0: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
a7f0: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
a800: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
a810: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
a820: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
a830: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
a840: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
a850: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
a860: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
a870: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
a880: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
a890: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
a8a0: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
a8b0: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
a8c0: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
a8d0: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
a8e0: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
a8f0: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
a900: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
a910: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
a920: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
a930: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
a940: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
a950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
a960: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
a970: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
a980: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
a990: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
a9a0: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
a9b0: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
a9c0: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
a9d0: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
a9e0: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
a9f0: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
aa00: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
aa10: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
aa20: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
aa30: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
aa40: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
aa50: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
aa60: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
aa70: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
aa80: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
aa90: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
aaa0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
aab0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
aac0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
aad0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
aae0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
aaf0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
ab00: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
ab10: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
ab20: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
ab30: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
ab40: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
ab50: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
ab60: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
ab70: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
ab80: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
ab90: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
aba0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
abb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
abc0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
abd0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
abe0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
abf0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ac00: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ac10: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
ac20: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
ac30: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
ac40: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
ac50: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
ac60: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
ac70: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
ac80: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
ac90: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
aca0: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
acb0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
acc0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
acd0: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
ace0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
acf0: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
ad00: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
ad10: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
ad20: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
ad30: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
ad40: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
ad50: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
ad60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ad70: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
ad80: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
ad90: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
ada0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
adb0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
adc0: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
add0: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
ade0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
adf0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
ae00: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
ae10: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
ae20: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
ae30: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
ae40: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
ae50: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
ae60: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
ae70: 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50    PAGERTRACE4("P
ae80: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
ae90: 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
aea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aeb0: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
aec0: 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
aed0: 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
aee0: 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29  ageSize, aData))
aef0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
af00: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
af10: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
af20: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
af30: 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 36  nc==0) ){.    i6
af40: 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
af50: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
af60: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
af70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
af80: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
af90: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
afa0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
afb0: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
afc0: 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
afd0: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
afe0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
aff0: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
b000: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
b010: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
b020: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
b030: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
b040: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
b050: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
b060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
b070: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
b080: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
b090: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
b0a0: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
b0b0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
b0c0: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
b0d0: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
b0e0: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
b0f0: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
b100: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
b110: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
b120: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
b130: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
b140: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
b150: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
b160: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
b170: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
b180: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
b190: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
b1a0: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
b1b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b1c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
b1d0: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
b1e0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
b1f0: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
b200: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
b210: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
b220: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
b230: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
b240: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
b250: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
b260: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
b270: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
b280: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
b290: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
b2a0: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
b2b0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
b2c0: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
b2d0: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
b2e0: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
b2f0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
b300: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
b310: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
b320: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
b330: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
b340: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
b350: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
b360: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
b370: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
b380: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
b390: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3a0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
b3b0: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
b3c0: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
b3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
b3e0: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
b3f0: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
b400: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
b410: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b420: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
b430: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
b440: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
b450: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
b460: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
b470: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b480: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
b490: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
b4a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
b4b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
b4c0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
b4d0: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
b4e0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
b4f0: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
b500: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
b510: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
b520: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
b530: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
b540: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
b550: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
b560: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
b570: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
b580: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
b590: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
b5a0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
b5b0: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
b5c0: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
b5d0: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
b5e0: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
b5f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
b600: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  er_open = 0;.  s
b610: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6d 61 73  qlite3_file *mas
b620: 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ter = 0;.  char 
b630: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
b640: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
b650: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
b660: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
b670: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
b680: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b690: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
b6a0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
b6b0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
b6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
b6d0: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
b6e0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
b6f0: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
b700: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
b710: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
b720: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
b730: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
b740: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
b750: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
b760: 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29  Master, &master)
b770: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
b780: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 61 73  SQLITE_OK || mas
b790: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ter );.  if( rc!
b7a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b7b0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b7c0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
b7d0: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
b7e0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73  e3OsFileSize(mas
b7f0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
b800: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
b810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b820: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b830: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
b840: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
b850: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
b860: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
b870: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
b880: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
b890: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b8a0: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
b8b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
b8c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
b8d0: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
b8e0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
b8f0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
b900: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
b910: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
b920: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
b930: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
b940: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
b950: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
b960: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b970: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
b980: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
b990: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b9a0: 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61  Read(master, zMa
b9b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
b9c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
b9d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b9e0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
b9f0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
ba00: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
ba10: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
ba20: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
ba30: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
ba40: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
ba50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
ba60: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
ba70: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
ba80: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
ba90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
baa0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
bab0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
bac0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
bad0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
bae0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
baf0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
bb00: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
bb10: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
bb20: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
bb30: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
bb40: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
bb50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
bb60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 6f 75 72  lite3_file *jour
bb70: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
bb80: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
bb90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
bba0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
bbb0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
bbc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bbd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
bbe0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
bbf0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
bc00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bc10: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
bc20: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
bc30: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
bc40: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
bc50: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
bc60: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
bc70: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
bc80: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
bc90: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bca0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bcb0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
bcc0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
bcd0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
bce0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
bcf0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
bd00: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
bd10: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
bd20: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
bd30: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
bd40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
bd50: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
bd60: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
bd70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bd80: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
bd90: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bda0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
bdb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
bdc0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
bdd0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
bde0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
bdf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
be00: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
be10: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
be20: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
be30: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
be40: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
be50: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
be60: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
be70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
be80: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
be90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bea0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
beb0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
bec0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
bed0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
bee0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
bef0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
bf00: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
bf10: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
bf20: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
bf30: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
bf40: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
bf50: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
bf60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
bf70: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
bf80: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
bf90: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
bfa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
bfb0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
bfc0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
bfd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
bfe0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
bff0: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
c000: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
c010: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
c020: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c030: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
c040: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
c050: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
c060: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
c070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c080: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
c090: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
c0a0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
c0b0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
c0c0: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
c0d0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
c0e0: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
c0f0: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
c100: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
c110: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
c120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c130: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
c140: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c150: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
c160: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
c170: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
c180: 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61  ->fd);.  if( pPa
c190: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
c1a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c1b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
c1c0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
c1d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
c1e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
c1f0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
c200: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
c210: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
c220: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
c230: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
c240: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
c250: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
c260: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
c270: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
c280: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
c290: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
c2a0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
c2b0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
c2c0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
c2d0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
c2e0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
c2f0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c300: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
c310: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
c320: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
c330: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
c340: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
c350: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
c360: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
c370: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
c380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
c390: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
c3a0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
c3b0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c3c0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
c3d0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
c3e0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
c3f0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
c400: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
c410: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
c420: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
c430: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
c440: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
c450: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
c460: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
c470: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c480: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c490: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
c4a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
c4b0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
c4c0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
c4d0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
c4e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
c4f0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
c500: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
c510: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
c520: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c530: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
c540: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
c550: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
c560: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
c570: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
c580: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
c590: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
c5a0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
c5b0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
c5c0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
c5d0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c5e0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
c5f0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
c600: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
c610: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
c620: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
c630: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
c640: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
c650: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
c660: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
c670: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
c680: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
c690: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
c6a0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
c6b0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
c6c0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
c6d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
c6e0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
c6f0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
c700: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
c710: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
c720: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
c730: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
c740: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
c750: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
c760: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
c770: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
c780: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
c790: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
c7a0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
c7b0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
c7c0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
c7d0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
c7e0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
c7f0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c800: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
c810: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
c820: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
c830: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
c840: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
c850: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
c860: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
c870: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
c880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c890: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
c8a0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
c8b0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
c8c0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
c8d0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
c8e0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
c8f0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
c900: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
c910: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
c920: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
c930: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
c940: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
c950: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
c960: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
c970: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
c980: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
c990: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
c9a0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
c9b0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
c9c0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
c9d0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
c9e0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
c9f0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ca00: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ca10: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ca20: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ca30: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ca40: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
ca50: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
ca60: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
ca70: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
ca80: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
ca90: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
caa0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
cab0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
cac0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
cad0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
cae0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
caf0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
cb00: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
cb10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
cb20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
cb30: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
cb40: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
cb50: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
cb60: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
cb70: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
cb80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
cb90: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
cba0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
cbb0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
cbc0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
cbd0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
cbe0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
cbf0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
cc00: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
cc10: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
cc20: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
cc30: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
cc40: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
cc50: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
cc60: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
cc70: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
cc80: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
cc90: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
cca0: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
ccb0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ccd0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
cce0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
ccf0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
cd20: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
cd30: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
cd60: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
cd70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
cd80: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
cd90: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
cda0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
cdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdc0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
cdd0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
cde0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
cdf0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
ce00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
ce10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
ce20: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
ce30: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
ce40: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
ce50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
ce60: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
ce70: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
ce80: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
ce90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cea0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
ceb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cec0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
ced0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
cee0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cef0: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
cf00: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
cf10: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
cf20: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
cf30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
cf40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
cf50: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
cf60: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
cf70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
cf80: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
cf90: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
cfa0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
cfb0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
cfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
cfd0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
cfe0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
cff0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
d000: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
d010: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
d020: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
d030: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
d040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
d050: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
d060: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
d070: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
d080: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
d090: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
d0a0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
d0b0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
d0c0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
d0d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
d0e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d0f0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
d100: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
d110: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
d120: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
d130: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
d140: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
d150: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
d160: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
d170: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
d180: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
d190: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
d1a0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
d1b0: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
d1c0: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
d1d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
d1e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
d1f0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
d200: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
d210: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
d220: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
d230: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
d240: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
d250: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
d260: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
d270: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
d280: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
d290: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
d2a0: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
d2b0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
d2c0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
d2d0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
d2e0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
d2f0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
d300: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d310: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
d320: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
d330: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d340: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
d350: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
d360: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
d370: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
d380: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
d390: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
d3a0: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
d3b0: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
d3c0: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
d3d0: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
d3e0: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
d3f0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
d400: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
d410: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
d420: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
d430: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
d440: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
d450: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
d460: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
d470: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
d480: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
d490: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
d4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d4b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d4c0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
d4d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
d4e0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
d4f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d500: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
d510: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
d520: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
d530: 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
d540: 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
d550: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
d560: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
d570: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
d580: 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
d590: 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
d5a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
d5b0: 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
d5c0: 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
d5d0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d5e0: 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
d5f0: 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
d600: 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
d610: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
d620: 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
d630: 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
d640: 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
d650: 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
d660: 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
d670: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
d680: 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
d690: 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
d6a0: 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
d6b0: 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  65..    */.    i
d6c0: 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
d6d0: 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
d6e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
d6f0: 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
d700: 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
d710: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d720: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
d730: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
d740: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
d750: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
d760: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d770: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
d780: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
d790: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d7a0: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
d7b0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
d7c0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
d7d0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
d7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d7f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d800: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
d810: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
d820: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
d830: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
d840: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
d850: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d860: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
d870: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d880: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d890: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
d8a0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
d8b0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
d8c0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
d8d0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
d8e0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
d8f0: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
d900: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d910: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d920: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d930: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
d940: 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
d950: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d970: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d980: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
d990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d9a0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
d9b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d9c0: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
d9d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
d9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
d9f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
da00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
da10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
da20: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
da30: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
da40: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
da50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
da60: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
da70: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
da80: 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
da90: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
daa0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
dab0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
dac0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
dad0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
dae0: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
daf0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
db00: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
db10: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
db20: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
db30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
db40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
db50: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
db60: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
db70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
db80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
db90: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
dba0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
dbb0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
dbc0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
dbd0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
dbe0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
dbf0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
dc00: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
dc10: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
dc20: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
dc30: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
dc40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
dc50: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
dc60: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
dc70: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
dc80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
dc90: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
dca0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
dcb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
dcc0: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
dcd0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
dce0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
dcf0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
dd00: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
dd10: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
dd20: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
dd30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
dd40: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
dd50: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
dd60: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
dd70: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
dd80: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
dd90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dda0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
ddb0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
ddc0: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
ddd0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dde0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ddf0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
de00: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
de10: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
de20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
de30: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
de40: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
de50: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
de60: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
de70: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
de80: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
de90: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
dea0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
deb0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
dec0: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
ded0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
dee0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
def0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
df00: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
df10: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
df40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
df50: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
df60: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
df70: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
df80: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
df90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
dfa0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
dfb0: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
dfc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dfd0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
dfe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
dff0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
e000: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
e010: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
e020: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
e030: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
e040: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
e050: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
e060: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
e070: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
e080: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
e090: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
e0a0: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
e0b0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
e0c0: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
e0d0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
e0e0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
e0f0: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
e100: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
e110: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
e120: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
e130: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
e140: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
e150: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
e160: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
e170: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
e180: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
e190: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
e1a0: 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
e1b0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e1c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
e1d0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
e1e0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e1f0: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
e200: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
e210: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
e220: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
e230: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
e240: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e250: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
e260: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e270: 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d  Open );.  nRec =
e280: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
e290: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
e2a0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
e2b0: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
e2c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e2d0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
e2e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e2f0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
e300: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e310: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
e320: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
e330: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
e340: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
e350: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
e360: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
e370: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
e380: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
e390: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
e3a0: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e3b0: 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  = i*(4+pPager->p
e3c0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
e3d0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
e3e0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
e3f0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
e400: 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20   offset, 0);.   
e410: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e420: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e430: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e440: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e450: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e460: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
e470: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
e480: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
e490: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
e4a0: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
e4b0: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
e4c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e4d0: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
e4e0: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
e4f0: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
e500: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
e510: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
e520: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
e530: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
e540: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
e550: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
e560: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
e570: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
e580: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
e590: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
e5a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e5b0: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
e5c0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
e5d0: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
e5e0: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
e5f0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
e600: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
e610: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
e620: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
e630: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e640: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
e650: 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
e660: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e670: 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
e680: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
e690: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
e6a0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
e6b0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
e6c0: 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
e6d0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e6e0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e6f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e700: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e710: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e720: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
e730: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
e740: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
e750: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
e760: 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
e770: 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
e780: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
e790: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
e7a0: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
e7b0: 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
e7c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e7d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7e0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e7f0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e800: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
e810: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
e820: 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
e830: 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
e840: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
e850: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
e860: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e870: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
e880: 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
e890: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
e8a0: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
e8b0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
e8c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
e8d0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
e8e0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
e8f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e900: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
e910: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
e920: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
e930: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e940: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
e950: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
e960: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
e970: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
e980: 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
e990: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
e9a0: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
e9b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e9c0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
e9d0: 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
e9e0: 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
e9f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ea00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
ea10: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
ea20: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
ea30: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
ea40: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
ea50: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
ea60: 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
ea70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
ea80: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
ea90: 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
eaa0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
eab0: 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
eac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
ead0: 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
eae0: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
eaf0: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
eb00: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
eb10: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
eb20: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
eb30: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
eb40: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
eb50: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
eb60: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
eb70: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
eb80: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
eb90: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
eba0: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
ebb0: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
ebc0: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
ebd0: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
ebe0: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
ebf0: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
ec00: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
ec10: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
ec20: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
ec30: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
ec40: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
ec50: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
ec60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
ec70: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
ec80: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
ec90: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
eca0: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
ecb0: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
ecc0: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
ecd0: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
ece0: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
ed00: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
ed10: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
ed20: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
ed30: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
ed40: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
ed50: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
ed60: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
ed70: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
ed80: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
ed90: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
eda0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
edb0: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
edc0: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
edd0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
ede0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
ee00: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
ee10: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
ee20: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
ee30: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
ee40: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
ee50: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
ee60: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
ee70: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
ee80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ee90: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
eea0: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
eeb0: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
eec0: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
eed0: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
eee0: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
eef0: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
ef10: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
ef20: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
ef30: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
ef40: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
ef50: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
ef60: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
ef70: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
ef80: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
ef90: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
efa0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
efb0: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
efc0: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
efd0: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
efe0: 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
eff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f000: 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
f010: 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
f020: 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
f030: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
f040: 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  l, int full_fsyn
f050: 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
f060: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
f070: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
f080: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
f090: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
f0a0: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
f0b0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
f0c0: 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d  er->full_fsync =
f0d0: 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69   full_fsync;.  i
f0e0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
f0f0: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
f100: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
f110: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
f120: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
f130: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
f140: 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
f150: 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
f160: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
f170: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
f180: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
f190: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
f1a0: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
f1b0: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
f1c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f1d0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
f1e0: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
f1f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
f200: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
f210: 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
f220: 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
f230: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
f240: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
f250: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
f260: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
f270: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
f280: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
f290: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
f2a0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
f2b0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
f2c0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
f2d0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
f2e0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
f2f0: 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 73 71  PagerOpentemp(sq
f300: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 2a 70 46 64  lite3_file **pFd
f310: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
f320: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
f330: 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f  ar zFile[SQLITE_
f340: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
f350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f360: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
f370: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
f380: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
f390: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
f3a0: 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
f3b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
f3c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
f3d0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
f3e0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
f3f0: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
f400: 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20  ive(zFile, pFd, 
f410: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
f420: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
f430: 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c   *pFd );.  }whil
f440: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
f450: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
f460: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
f470: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f480: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
f490: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
f4a0: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
f4b0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
f4c0: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
f4d0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
f4e0: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
f4f0: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
f500: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
f510: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
f520: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
f530: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e  te3PagerGet() an
f540: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
f550: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
f560: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
f570: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
f580: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
f590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
f5a0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
f5b0: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
f5c0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
f5d0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
f5e0: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
f5f0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
f600: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
f610: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
f620: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
f630: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
f640: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
f650: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
f660: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
f670: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
f680: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
f690: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
f6a0: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
f6b0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
f6c0: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
f6d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f6e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f6f0: 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67  PagerOpen(.  Pag
f700: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
f710: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f720: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f730: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
f740: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
f750: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
f760: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f770: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
f780: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
f790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
f7a0: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
f7b0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
f7c0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
f7d0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
f7e0: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
f7f0: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
f800: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
f810: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
f820: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
f830: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
f840: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
f850: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
f860: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
f870: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
f880: 65 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  e use */.  sqlit
f890: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b  e3_file *fd = 0;
f8a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f8b0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
f8c0: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
f8d0: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
f8e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
f8f0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
f900: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
f910: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
f920: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
f930: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
f940: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
f950: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
f960: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
f970: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
f980: 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E];.#ifdef SQLIT
f990: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
f9a0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
f9b0: 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
f9c0: 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
f9d0: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
f9e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
f9f0: 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
fa00: 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
fa10: 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
fa20: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
fa30: 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
fa40: 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
fa50: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
fa60: 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
fa70: 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
fa80: 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
fa90: 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
faa0: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
fab0: 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c   be set. It woul
fac0: 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73  d be nice to ass
fad0: 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68  ert.  ** that Th
fae0: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
faf0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74  is non-zero, but
fb00: 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b   alas this break
fb10: 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20  s test cases .  
fb20: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e  ** written to in
fb30: 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64  voke the pager d
fb40: 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  irectly..  */.  
fb50: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
fb60: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
fb70: 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
fb80: 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66  ( pTsd );.#endif
fb90: 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74  ..  /* We used t
fba0: 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63  o test if malloc
fbb0: 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66  () had already f
fbc0: 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f  ailed before pro
fbd0: 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42  ceeding. .  ** B
fbe0: 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20  ut the way this 
fbf0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
fc00: 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73   in SQLite means
fc10: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a   that can never.
fc20: 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72    ** happen. Fur
fc30: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65  thermore, if the
fc40: 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
fc50: 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73  lag is already s
fc60: 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  et, .  ** either
fc70: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
fc80: 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73  iteStrDup() or s
fc90: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65  qliteMalloc() be
fca0: 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61  low will.  ** fa
fcb0: 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53  il shortly and S
fcc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75  QLITE_NOMEM retu
fcd0: 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a  rned anyway..  *
fce0: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
fcf0: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
fd00: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
fd10: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
fd20: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
fd30: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
fd40: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
fd50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
fd60: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
fd70: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
fd80: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
fd90: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
fda0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
fdb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fdc0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
fdd0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
fde0: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
fdf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
fe00: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
fe10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
fe20: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
fe30: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
fe40: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
fe50: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
fe60: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
fe70: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
fe80: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
fe90: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
fea0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
feb0: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
fec0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
fed0: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
fee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
fef0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66  !=SQLITE_OK || f
ff00: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
ff10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ff20: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ff30: 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a  rOpentemp(&fd);.
ff40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
ff50: 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29  pFileName(zTemp)
ff60: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
ff70: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
ff80: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ff90: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
ffa0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
ffb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ffc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
ffd0: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
ffe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
fff0: 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73  cate the Pager s
10000 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72  tructure. As par
10010 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c  t of the same al
10020 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  location, alloca
10030 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  te.  ** space fo
10040 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73  r the full paths
10050 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69   of the file, di
10060 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72  rectory and jour
10070 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72  nal .  ** (Pager
10080 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65  .zFilename, Page
10090 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64  r.zDirectory and
100a0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29   Pager.zJournal)
100b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
100c0 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
100d0 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
100e0 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
100f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
10100 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
10110 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
10120 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
10130 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
10140 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
10150 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10160 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
10170 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
10180 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45  locRaw(SQLITE_DE
10190 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
101a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
101b0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
101c0 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
101d0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
101e0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
101f0 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
10200 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
10210 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
10220 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
10230 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
10240 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
10250 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
10260 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
10270 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
10280 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
10290 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
102a0 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
102b0 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
102c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
102d0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
102e0 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  ce || rc!=SQLITE
102f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
10300 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
10310 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
10320 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
10330 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
10340 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
10350 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
10360 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
10370 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
10380 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
10390 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
103a0 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
103b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  athname);.  IOTR
103c0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
103d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75  \n", pPager, zFu
103e0 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70  llPathname)).  p
103f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10400 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
10410 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
10420 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
10430 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
10440 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
10450 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
10460 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
10470 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
10480 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
10490 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
104a0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65  llPathname, name
104b0 4c 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79  Len+1);.  memcpy
104c0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
104d0 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
104e0 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a  me, nameLen+1);.
104f0 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
10500 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
10510 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
10520 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
10530 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
10540 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
10550 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  ] = 0;.  memcpy(
10560 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10570 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , zFullPathname,
10580 6e 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69  nameLen);.  sqli
10590 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
105a0 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
105b0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
105c0 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
105d0 75 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d  urnal",sizeof("-
105e0 6a 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50  journal"));.  pP
105f0 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
10600 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
10610 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
10620 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
10630 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
10640 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
10650 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
10660 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
10670 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
10680 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
10690 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
106a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
106b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
106c0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
106d0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
106e0 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
106f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10700 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
10710 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
10720 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
10730 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
10740 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
10750 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
10760 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
10770 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
10780 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
10790 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
107a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
107b0 5f 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74  _COUNT;.  assert
107c0 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
107d0 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
107e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
107f0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
10800 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
10810 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
10820 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
10830 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
10840 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
10850 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
10860 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
10870 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
10880 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
10890 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
108a0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
108b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
108c0 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
108d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
108e0 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50   tempFile; .  pP
108f0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
10900 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
10910 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
10920 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
10930 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
10940 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
10950 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
10960 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
10970 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
10980 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
10990 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
109a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
109b0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
109c0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
109d0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
109e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
109f0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
10a00 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
10a10 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
10a20 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66  tra);.  assert(f
10a30 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28  d||memDb);.  if(
10a40 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
10a50 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
10a60 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
10a70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10a80 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
10a90 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
10aa0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
10ab0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
10ac0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
10ad0 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
10ae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
10af0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
10b00 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  .  pPager->pNext
10b10 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
10b20 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20  .  pTsd->pPager 
10b30 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66  = pPager;.#endif
10b40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10b50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
10b60 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
10b70 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
10b80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
10b90 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
10ba0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
10bb0 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
10bc0 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
10bd0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10be0 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
10bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10c00 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
10c10 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
10c20 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
10c30 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
10c40 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
10c50 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
10c60 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
10c70 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
10c80 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
10c90 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
10ca0 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
10cb0 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
10cc0 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
10cd0 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
10ce0 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
10cf0 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
10d00 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
10d10 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
10d20 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
10d30 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
10d40 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
10d50 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
10d60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
10d70 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
10d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
10d90 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
10da0 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
10db0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
10dc0 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
10dd0 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
10de0 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
10df0 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
10e00 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
10e10 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
10e20 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
10e30 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
10e40 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
10e50 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
10e60 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
10e70 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
10e80 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
10e90 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
10ea0 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
10eb0 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
10ec0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
10ed0 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
10ee0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
10ef0 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
10f00 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
10f10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
10f20 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
10f30 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
10f40 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
10f50 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
10f60 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
10f70 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
10f80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
10f90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
10fa0 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75  size.  If the su
10fb0 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a  ggest new page.*
10fc0 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72  * size is inappr
10fd0 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
10fe0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
10ff0 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74  e size is select
11000 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ed.** and return
11010 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11020 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
11030 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
11040 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
11050 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
11060 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
11070 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
11080 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
11090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
110a0 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
110b0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ef==0 ){.    pag
110c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
110d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61  ;.    pPager->pa
110e0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
110f0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  e;.    pPager->p
11100 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
11110 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  e3ReallocOrFree(
11120 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
11130 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
11140 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
11150 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  r->pageSize;.}..
11160 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
11170 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
11180 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
11190 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
111a0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
111b0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
111c0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
111d0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
111e0 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
111f0 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
11200 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
11210 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
11220 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11230 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
11240 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
11250 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11260 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
11270 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
11280 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11290 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
112a0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
112b0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
112c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
112d0 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
112e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
112f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
11300 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
11310 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
11320 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
11330 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
11340 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
11350 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
11360 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
11370 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
11380 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
11390 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
113a0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
113b0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
113c0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
113d0 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
113e0 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
113f0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
11400 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
11410 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
11420 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
11430 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
11440 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
11450 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
11460 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11470 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
11480 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
11490 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
114a0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
114b0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
114c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
114d0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
114e0 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
114f0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
11500 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
11510 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
11520 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
11530 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11540 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
11550 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
11560 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
11570 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
11580 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
11590 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
115a0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
115b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
115c0 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
115d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
115e0 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
115f0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
11600 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
11610 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
11620 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
11630 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
11640 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
11650 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
11660 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
11670 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
11680 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
11690 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
116a0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
116b0 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
116c0 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
116d0 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
116e0 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
116f0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
11700 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
11710 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
11720 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
11730 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
11740 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
11750 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
11760 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
11770 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
11780 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
11790 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
117a0 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e  out this)..*/.in
117b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
117c0 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
117d0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
117e0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
117f0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
11800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11810 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
11820 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d  0, N);.  if( MEM
11830 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 49 4f 54  DB==0 ){.    IOT
11840 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
11850 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
11860 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
11870 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
11880 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
11890 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
118a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
118b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
118c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
118d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
118e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
118f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
11900 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
11910 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
11920 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
11930 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
11940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
11950 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
11960 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
11970 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
11980 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
11990 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
119a0 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
119b0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
119c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
119d0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
119e0 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
119f0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
11a00 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
11a10 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
11a20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
11a30 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
11a40 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
11a50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
11a60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
11a70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11a80 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  64 n;.  int rc;.
11a90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11aa0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
11ab0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
11ac0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11ad0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
11ae0 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
11af0 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
11b00 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
11b10 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
11b20 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
11b30 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
11b40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11b50 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
11b60 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
11b70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11b80 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20    }.    if( n>0 
11b90 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67  && n<pPager->pag
11ba0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e  eSize ){.      n
11bb0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
11bc0 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67  .      n /= pPag
11bd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
11be0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
11bf0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
11c00 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
11c10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11c20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = n;.    }.  }. 
11c30 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
11c40 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
11c50 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
11c60 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
11c70 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
11c80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
11c90 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Pgno = n;.  }.  
11ca0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69  return n;.}...#i
11cb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11cc0 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
11cd0 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
11ce0 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
11cf0 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
11d00 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
11d10 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
11d20 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
11d30 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
11d40 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
11d50 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
11d60 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
11d70 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  mt = 0;.}.#else.
11d80 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73  #define clearHis
11d90 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a  tory(x).#endif..
11da0 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
11db0 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
11dc0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
11dd0 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a  nal(Pager*);../*
11de0 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
11df0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
11e00 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
11e10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
11e20 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
11e30 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
11e40 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
11e50 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
11e60 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
11e70 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
11e80 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
11e90 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
11ea0 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
11eb0 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
11ec0 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
11ed0 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
11ee0 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
11ef0 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
11f00 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
11f10 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
11f20 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
11f30 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
11f40 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
11f50 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
11f60 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
11f70 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
11f80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11f90 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
11fa0 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
11fb0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
11fc0 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
11fd0 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
11fe0 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
11ff0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12000 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
12010 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
12020 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
12030 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
12040 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
12050 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
12060 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
12070 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
12080 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
12090 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
120a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
120b0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
120c0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
120d0 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
120e0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
120f0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
12100 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
12110 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
12120 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
12130 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
12140 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
12150 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
12160 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
12170 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
12180 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
12190 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
121a0 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
121b0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
121c0 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
121d0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
121e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
121f0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
12200 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
12210 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
12220 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
12230 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
12240 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
12250 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
12260 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
12270 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
12280 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
12290 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
122a0 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
122b0 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
122c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
122d0 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
122e0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
122f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
12300 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
12310 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
12320 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
12330 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
12340 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
12350 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
12360 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
12370 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
12380 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
12390 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
123a0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
123b0 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
123c0 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
123d0 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
123e0 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
123f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12400 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
12410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
12420 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
12430 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
12440 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
12450 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
12460 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
12470 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
12480 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
12490 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
124a0 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r, pPg);.}../*.*
124b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
124c0 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
124d0 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65  te the cache whe
124e0 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  n a database.** 
124f0 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44  is truncated.  D
12500 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63  rop from the cac
12510 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  he all pages who
12520 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61  se pgno is.** la
12530 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
12540 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
12550 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
12560 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
12570 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
12580 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
12590 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
125a0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74  * Actually, at t
125b0 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
125c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
125d0 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20   it would be.** 
125e0 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  an error to have
125f0 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61   a referenced pa
12600 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20  ge.  But rather 
12610 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74  than delete.** t
12620 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61  hat page and gua
12630 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75  rantee a subsequ
12640 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74  ent segfault, it
12650 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a   seems better.**
12660 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20   to zero it and 
12670 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72  hope that we err
12680 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a  or out sanely..*
12690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
126a0 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
126b0 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
126c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
126d0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
126e0 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
126f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
12700 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
12710 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
12720 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
12730 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
12740 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
12750 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
12760 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
12770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
12780 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
12790 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
127a0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
127b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
127c0 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
127d0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
127e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
127f0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
12800 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49  NextAll;.      I
12810 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
12820 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
12830 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
12840 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
12850 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
12860 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
12870 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
12880 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
12890 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
128a0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
128b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
128c0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
128d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
128e0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
128f0 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
12900 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12910 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
12920 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
12930 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
12940 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
12950 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
12960 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
12970 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
12980 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
12990 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
129a0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
129b0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
129c0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
129d0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
129e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
129f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12a00 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12a10 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
12a20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
12a30 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
12a40 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
12a50 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
12a60 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
12a70 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12a80 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
12a90 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
12aa0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
12ab0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
12ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
12ad0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
12ae0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
12af0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
12b00 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
12b10 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
12b20 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
12b30 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
12b40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
12b50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
12b60 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
12b70 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
12b80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12b90 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
12ba0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12bb0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
12bc0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
12bd0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
12be0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
12bf0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
12c00 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
12c10 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
12c20 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
12c30 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
12c40 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
12c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12c60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
12c70 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
12c80 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
12c90 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
12ca0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
12cb0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
12cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12cd0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
12ce0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
12cf0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
12d00 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
12d10 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
12d20 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
12d30 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
12d40 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
12d50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
12d60 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
12d70 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
12d80 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
12d90 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
12da0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12db0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
12dc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
12dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12de0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
12df0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
12e00 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
12e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12e20 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
12e30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12e40 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
12e50 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
12e60 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
12e70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12e80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
12e90 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
12ea0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
12eb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12ec0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12ed0 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
12ee0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
12ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
12f00 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
12f10 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
12f20 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
12f30 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
12f40 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
12f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12f70 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
12f80 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
12f90 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
12fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
12fb0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
12fc0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
12fd0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
12fe0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
12ff0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
13000 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
13010 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
13020 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
13030 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
13040 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
13050 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
13060 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
13070 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
13080 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
13090 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
130a0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
130b0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
130c0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
130d0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
130e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
130f0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
13100 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
13110 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
13120 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
13130 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
13140 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13150 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
13160 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
13170 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
13180 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13190 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
131a0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
131b0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
131c0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
131d0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
131e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
131f0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
13200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13210 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
13220 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
13230 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13240 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
13250 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
13260 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
13270 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
13280 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
13290 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
132a0 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
132b0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
132c0 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
132d0 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
132e0 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
132f0 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
13300 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
13310 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
13320 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
13330 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
13340 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
13350 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a  loc can be set..
13360 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
13370 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
13380 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
13390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20   assert( pPager 
133a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
133b0 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f  d && pTsd->nAllo
133c0 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  c );.#endif..  d
133d0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
133e0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
133f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13400 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
13410 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
13420 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
13430 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
13440 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
13450 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61  k(pPager);.  ena
13460 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13470 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
13480 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  ERTRACE2("CLOSE 
13490 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
134a0 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
134b0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
134c0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73  , pPager)).  ass
134d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
134e0 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
134f0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
13500 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
13510 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
13520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13530 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
13540 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
13550 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
13560 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
13570 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
13580 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13590 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
135a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
135b0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
135c0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
135d0 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
135e0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
135f0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
13600 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
13610 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
13620 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
13630 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
13640 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13650 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
13660 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20   }.  */..#ifdef 
13670 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
13680 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
13690 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
136a0 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c  pager from the l
136b0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
136c0 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  gers starting at
136d0 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74   .  ** ThreadDat
136e0 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f  a.pPager if memo
136f0 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
13700 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20   enabled..  */. 
13710 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73   if( pPager==pTs
13720 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  d->pPager ){.   
13730 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
13740 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
13750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65   }else{.    Page
13760 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72  r *pTmp;.    for
13770 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50  (pTmp = pTsd->pP
13780 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  ager; pTmp->pNex
13790 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d  t!=pPager; pTmp=
137a0 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  pTmp->pNext){}. 
137b0 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d     pTmp->pNext =
137c0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
137d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
137e0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
137f0 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65  aHash);.  sqlite
13800 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
13810 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
13820 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
13830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13840 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
13850 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
13860 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
13870 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
13880 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
13890 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
138a0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
138b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
138c0 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
138d0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
138e0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
138f0 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
13900 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
13910 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
13920 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
13930 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
13940 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
13950 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
13960 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
13970 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
13980 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
13990 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
139a0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
139b0 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
139c0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
139d0 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
139e0 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
139f0 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
13a00 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
13a10 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
13a20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
13a30 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
13a40 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
13a50 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
13a60 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
13a70 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
13a80 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
13a90 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
13aa0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
13ab0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
13ac0 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
13ad0 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
13ae0 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
13af0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
13b00 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
13b10 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
13b20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
13b30 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
13b40 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
13b50 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
13b60 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
13b70 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
13b80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13b90 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
13ba0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
13bb0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
13bc0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
13bd0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
13be0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
13bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
13c00 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
13c10 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
13c20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13c30 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
13c40 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
13c50 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
13c60 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
13c70 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
13c80 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
13c90 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
13ca0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
13cb0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
13cc0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
13cd0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
13ce0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
13cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
13d00 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
13d10 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
13d20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
13d30 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
13d40 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
13d50 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
13d60 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
13d70 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
13d80 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
13d90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13da0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
13db0 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
13dc0 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
13dd0 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
13de0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
13df0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
13e00 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
13e10 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
13e20 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
13e30 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
13e40 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
13e50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
13e60 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
13e70 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
13e80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13e90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
13ea0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
13eb0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
13ec0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
13ed0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
13ee0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
13ef0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
13f00 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
13f10 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
13f20 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
13f30 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
13f40 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
13f50 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
13f60 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
13f70 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
13f80 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
13f90 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
13fa0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
13fb0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
13fc0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
13fd0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
13fe0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
13ff0 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
14000 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
14010 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
14020 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
14030 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
14040 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
14050 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14060 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
14070 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
14080 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
14090 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
140a0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
140b0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
140c0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
140d0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
140e0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
140f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
14100 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
14110 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
14120 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
14130 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
14140 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
14150 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
14160 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
14170 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
14180 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
14190 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
141a0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
141b0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
141c0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
141d0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
141e0 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
141f0 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
14200 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
14210 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
14220 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
14230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14240 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
14250 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
14260 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
14270 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
14280 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
14290 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
142a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
142b0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
142c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
142d0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
142e0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
142f0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
14300 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
14310 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
14320 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
14330 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
14340 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
14350 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
14360 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
14370 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
14380 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
14390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
143a0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
143b0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
143c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
143d0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
143e0 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
143f0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
14400 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
14410 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
14420 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
14430 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
14440 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14450 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
14460 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
14470 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
14480 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
14490 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
144a0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
144b0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
144c0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
144d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
144e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
144f0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
14500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14510 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
14520 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
14530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14540 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
14550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14560 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14570 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
14580 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
14590 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
145a0 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lOff;..        /
145b0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
145c0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
145d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
145e0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
145f0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
14600 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
14610 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
14620 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
14630 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
14640 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
14650 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
14660 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
14670 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
14680 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
14690 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
146a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
146b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
146c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
146d0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
146e0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
146f0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
14700 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
14710 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
14720 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
14730 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
14740 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
14750 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
14760 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
14770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14780 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
14790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
147a0 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
147b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
147c0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
147d0 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
147e0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
147f0 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
14800 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
14810 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
14820 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
14830 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
14840 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
14850 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
14860 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
14880 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
14890 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
148a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
148b0 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
148c0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
148d0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
148e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
148f0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
14900 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
14910 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
14920 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
14930 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
14940 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
14950 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
14960 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
14970 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
14980 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
14990 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
149a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
149b0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
149c0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
149d0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
149e0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
149f0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
14a00 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
14a10 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
14a20 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
14a30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
14a40 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
14a50 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
14a60 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
14a70 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
14a80 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
14a90 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
14aa0 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
14ab0 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
14ac0 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
14ad0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
14ae0 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
14af0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
14b00 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
14b10 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
14b20 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
14b30 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
14b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14b50 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
14b60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
14b70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
14b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14b90 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
14ba0 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
14bb0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
14bc0 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
14bd0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
14be0 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
14bf0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
14c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
14c10 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
14c20 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
14c30 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
14c40 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
14c50 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
14c60 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
14c70 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
14c80 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
14c90 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
14ca0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
14cb0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
14cc0 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
14cd0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
14ce0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
14cf0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
14d00 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
14d10 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
14d20 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
14d30 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
14d40 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
14d50 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
14d60 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
14d70 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
14d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
14d90 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
14da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
14db0 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
14dc0 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
14dd0 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
14de0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
14df0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
14e00 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
14e10 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
14e20 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
14e30 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
14e40 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
14e50 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
14e60 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
14e70 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
14e80 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
14e90 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
14ea0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
14eb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
14ec0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
14ed0 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
14ee0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
14ef0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
14f00 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
14f10 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
14f20 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
14f30 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
14f40 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
14f50 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
14f60 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
14f70 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
14f80 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
14f90 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
14fa0 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
14fb0 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
14fc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
14fd0 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
14fe0 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
14ff0 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
15000 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
15010 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
15020 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
15030 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
15040 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
15050 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
15060 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
15070 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15080 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
15090 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
150a0 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
150b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
150c0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
150d0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
150e0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
150f0 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
15100 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
15110 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
15120 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
15130 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
15140 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
15150 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
15160 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
15170 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
15180 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
15190 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
151a0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
151b0 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
151c0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
151d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
151e0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
151f0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
15200 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
15210 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
15220 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
15230 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
15240 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
15250 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
15260 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
15270 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
15280 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
15290 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
152a0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
152b0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
152c0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
152d0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
152e0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
152f0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
15300 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
15310 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
15320 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
15330 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
15340 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
15350 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
15360 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
15370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
15380 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
15390 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
153a0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
153b0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
153c0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
153d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
153e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
153f0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
15400 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
15410 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
15420 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
15430 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
15440 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
15450 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
15460 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
15470 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
15480 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
15490 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
154a0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
154b0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
154c0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
154d0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
154e0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
154f0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
15500 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
15510 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
15520 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
15530 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
15540 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
15550 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
15560 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
15570 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
15580 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
15590 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
155a0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
155b0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
155c0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
155d0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
155e0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
155f0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
15600 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
15610 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
15620 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
15630 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
15640 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
15650 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
15660 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
15670 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
15680 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
15690 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
156a0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
156b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
156c0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
156d0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
156e0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
156f0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
15700 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
15710 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
15720 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
15730 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
15740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15750 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15760 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
15770 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
15780 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
15790 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
157a0 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
157b0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
157c0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
157d0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
157e0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
157f0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
15800 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
15810 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
15820 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
15830 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
15840 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
15850 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
15860 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
15870 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
15880 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
15890 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
158a0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
158b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
158c0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
158d0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
158e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ze ){.      i64 
158f0 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d  offset = (pList-
15900 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
15910 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15920 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
15930 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
15940 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
15950 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
15960 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
15970 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f  PAGERTRACE4("STO
15980 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
15990 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
159c0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61   pList->pgno, pa
159d0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
159e0 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  st));.      IOTR
159f0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
15a00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
15a10 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
15a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15a30 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
15a40 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
15a50 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
15a60 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  et);.      PAGER
15a70 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
15a80 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
15a90 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
15aa0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
15ab0 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ite);.      if( 
15ac0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
15ad0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
15ae0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
15af0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
15b00 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
15b10 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
15b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
15b30 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
15b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
15b50 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45  RTRACE3("NOSTORE
15b60 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
15b70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
15b80 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
15b90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15ba0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15bb0 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
15bc0 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
15bd0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
15be0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
15bf0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
15c00 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
15c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
15c20 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
15c30 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
15c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15c50 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
15c60 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
15c70 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
15c80 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
15c90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
15ca0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
15cb0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
15cc0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
15cd0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
15ce0 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
15cf0 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
15d00 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
15d10 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
15d20 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
15d30 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
15d40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15d50 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
15d60 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
15d70 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
15d80 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
15d90 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
15da0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
15db0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
15dc0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
15dd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
15de0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
15df0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
15e00 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
15e10 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
15e20 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
15e30 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
15e40 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
15e50 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
15e60 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
15e70 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
15e80 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
15e90 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
15ea0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
15eb0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
15ec0 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
15ed0 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69  if( !sqlite3OsFi
15ee0 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
15ef0 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  >zJournal) ){.  
15f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15f10 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
15f20 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15f30 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
15f40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15f50 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  }.  if( sqlite3P
15f60 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15f70 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
15f80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
15f90 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15fa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
15fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
15fc0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
15fd0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64  *.** Try to find
15fe0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63   a page in the c
15ff0 61 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65  ache that can be
16000 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a   recycled. .**.*
16010 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
16020 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
16030 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46  _IOERR, SQLITE_F
16040 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  ULL or SQLITE_OK
16050 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  . It .** does no
16060 74 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72  t set the pPager
16070 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  ->errCode variab
16080 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
16090 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  t pager_recycle(
160a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
160b0 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72  nt syncOk, PgHdr
160c0 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
160d0 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
160e0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21  = 0;..  assert(!
160f0 4d 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69  MEMDB);..  /* Fi
16100 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
16110 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
16120 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
16130 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
16140 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
16150 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
16160 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
16170 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
16180 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
16190 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
161a0 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
161b0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
161c0 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
161d0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75  .  ** on the jou
161e0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
161f0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
16200 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
16210 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77  a.  ** very slow
16220 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
16230 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
16240 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
16250 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20  metimes.  ** it 
16260 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
16270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  .  */.  if( pPg=
16280 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
16290 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26  irst && syncOk &
162a0 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69  & !MEMDB){.    i
162b0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
162c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
162d0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
162e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
162f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
16300 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
16310 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
16320 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
16330 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
16340 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
16350 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
16360 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
16370 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
16380 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
16390 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
163a0 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
163b0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
163c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
163d0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
163e0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
163f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
16400 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
16410 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
16420 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
16430 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
16440 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
16450 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
16460 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
16470 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
16480 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
16490 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
164a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
164b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
164c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
164d0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
164e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
164f0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
16500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16520 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
16530 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
16540 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
16550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16560 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
16570 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
16580 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
16590 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
165a0 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
165b0 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
165c0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
165d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
165e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
165f0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
16600 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
16610 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
16620 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
16630 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
16640 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
16650 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
16660 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16690 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
166a0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
166b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
166c0 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
166d0 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
166e0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
166f0 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
16700 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
16710 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
16720 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
16730 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
16740 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
16750 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
16760 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
16770 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
16780 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
16790 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
167a0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
167b0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
167c0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
167d0 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
167e0 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
167f0 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
16800 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
16810 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
16820 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
16830 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
16840 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
16850 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
16860 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
16870 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
16880 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
16890 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
168a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
168b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
168c0 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
168d0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
168e0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
168f0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
16900 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
16910 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
16920 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
16930 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
16940 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
16950 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72  ge(pPg);.  asser
16960 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  t( pPg->pgno==0 
16970 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50  );..  *ppPg = pP
16980 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
16990 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
169a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
169b0 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
169c0 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
169d0 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
169e0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
169f0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
16a00 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
16a10 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
16a20 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
16a30 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
16a40 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
16a50 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64  e sqliteFree()ed
16a60 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20  ..**.** nReq is 
16a70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16a80 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
16a90 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69  quired. Once thi
16aa0 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65  s much has.** be
16ab0 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  en released, the
16ac0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
16ad0 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61  s. A negative va
16ae0 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61  lue for nReq mea
16af0 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75  ns.** free as mu
16b00 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
16b10 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72  sible. The retur
16b20 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74  n value is the t
16b30 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20  otal number .** 
16b40 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
16b50 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a  ry released..*/.
16b60 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16b70 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
16b80 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20  _MANAGEMENT) && 
16b90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16ba0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74  OMIT_DISKIO).int
16bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c   sqlite3PagerRel
16bc0 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e  easeMemory(int n
16bd0 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68  Req){.  const Th
16be0 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f  readData *pTsdro
16bf0 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
16c00 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  DataReadOnly();.
16c10 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
16c20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
16c30 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67   /* If the the g
16c40 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68  lobal mutex is h
16c50 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75  eld, this subrou
16c60 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20  tine becomes a. 
16c70 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62   ** o-op; zero b
16c80 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ytes of memory a
16c90 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  re freed.  This 
16ca0 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  is because.  ** 
16cb0 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65  some of the code
16cc0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73   invoked by this
16cd0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
16ce0 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f  so.  ** try to o
16cf0 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  btain the mutex,
16d00 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
16d10 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  deadlock..  */. 
16d20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e   if( sqlite3OsIn
16d30 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20  Mutex(0) ){.    
16d40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
16d50 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
16d60 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
16d70 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
16d80 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
16d90 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
16da0 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
16db0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
16dc0 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
16dd0 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
16de0 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
16df0 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
16e00 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
16e10 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
16e20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
16e30 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
16e40 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
16e50 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
16e60 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
16e70 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
16e80 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
16e90 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
16ea0 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
16eb0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
16ec0 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
16ed0 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
16ee0 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
16ef0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16f00 3d 20 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72  = pTsdro->pPager
16f10 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61  ;.    for( ; pPa
16f20 67 65 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c  ger && (nReq<0 |
16f30 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71  | nReleased<nReq
16f40 29 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  ); pPager=pPager
16f50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
16f60 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
16f70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20    int rc;..     
16f80 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
16f90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16fb0 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 72  * For each pager
16fc0 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20 61 73  , try to free as
16fd0 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20 70   many pages as p
16fe0 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74  ossible (without
16ff0 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69   .      ** calli
17000 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20 74 68  ng fsync() if th
17010 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
17020 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
17030 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20   outermost .    
17040 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20    ** loop)..    
17050 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
17060 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
17070 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
17080 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
17090 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20  )) && pPg) {.   
170a0 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f       /* We've fo
170b0 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72  und a page to fr
170c0 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  ee. At this poin
170d0 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  t the page has b
170e0 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  een .        ** 
170f0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
17100 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
17110 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
17120 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
17130 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
17140 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
17150 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
17160 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
17170 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  . .        ** Re
17180 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69  move it from thi
17190 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72  s list before fr
171a0 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  eeing..        *
171b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64  *.        ** Tod
171c0 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
171d0 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
171e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
171f0 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
17200 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
17210 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
17220 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48    */.        PgH
17230 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  dr *pTmp;.      
17240 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
17250 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
17260 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ==pPager->pAll )
17270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61  {.           pPa
17280 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d  ger->pAll = pPg-
17290 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
172a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
172b0 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50      for( pTmp=pP
172c0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  ager->pAll; pTmp
172d0 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
172e0 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
172f0 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20  tAll ){}.       
17300 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
17310 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
17320 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
17330 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b       nReleased +
17340 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a  = sqliteAllocSiz
17350 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
17360 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
17370 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61   %p %d *\n", pPa
17380 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
17390 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
173a0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
173b0 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
173c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
173d0 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
173e0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
173f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17400 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
17410 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
17420 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
17430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
17440 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  r .        ** jo
17450 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
17460 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
17470 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
17480 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
17490 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
174a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
174b0 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
174c0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
174d0 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
174e0 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
174f0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
17500 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
17510 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
17520 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
17530 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
17540 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
17550 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
17560 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
17570 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17580 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
17590 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66 66          (rc&0xff
175a0 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
175b0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ||.            r
175c0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  c==SQLITE_FULL |
175d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  |.            rc
175e0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
175f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
17600 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17610 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
17620 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
17630 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
17640 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
17650 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17660 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64  return nReleased
17670 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17680 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
17690 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 26 26  RY_MANAGEMENT &&
176a0 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49   !SQLITE_OMIT_DI
176b0 53 4b 49 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  SKIO */../*.** R
176c0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
176d0 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  of page pPg out 
176e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
176f0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
17700 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
17710 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
17720 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  Hdr *pPg, Pgno p
17730 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
17740 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20    i64 offset;.  
17750 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
17760 20 29 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28   );.  offset = (
17770 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
17780 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
17790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
177a0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
177b0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
177c0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
177d0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
177e0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
177f0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
17800 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
17810 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
17820 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
17830 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
17840 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
17850 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
17860 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  {.    memcpy(&pP
17870 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17880 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54  , &((u8*)PGHDR_T
17890 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d  O_DATA(pPg))[24]
178a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
178e0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
178f0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
17900 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
17910 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
17920 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43   3);.  PAGERTRAC
17930 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E4("FETCH %d pag
17940 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
17950 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17960 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
17970 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
17980 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
17990 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  g));.  return rc
179a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
179b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
179c0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
179d0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
179e0 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
179f0 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
17a00 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
17a10 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
17a20 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
17a30 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
17a40 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
17a50 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
17a60 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
17a70 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
17a80 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
17a90 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
17aa0 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
17ab0 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
17ac0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
17ad0 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
17ae0 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
17af0 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
17b00 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
17b10 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
17b20 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
17b30 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
17b40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
17b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
17b60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17b70 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
17b80 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
17b90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17ba0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
17bb0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
17bc0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
17bd0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
17be0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
17bf0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
17c00 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
17c10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17c30 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
17c40 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
17c50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17c60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17c70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
17c80 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
17c90 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
17ca0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
17cb0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
17cc0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
17cd0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
17ce0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17cf0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
17d00 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
17d10 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
17d20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
17d30 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
17d40 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
17d50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
17d60 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
17d70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17d80 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
17d90 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
17da0 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
17db0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
17dc0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
17dd0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
17de0 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
17df0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
17e00 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
17e10 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
17e20 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
17e30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
17e40 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
17e50 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
17e60 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
17e70 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
17e80 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17e90 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
17ea0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
17eb0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
17ec0 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
17ed0 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
17ee0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
17ef0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
17f00 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
17f10 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
17f20 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
17f30 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
17f40 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
17f50 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
17f60 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
17f70 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
17f80 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
17f90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17fa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17fb0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
17fc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17fd0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
17fe0 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
17ff0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
18000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18020 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
18030 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
18040 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
18050 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18070 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18080 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
18090 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
180a0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
180b0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
180c0 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
180d0 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
180e0 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
180f0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
18100 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
18110 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18120 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
18130 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
18140 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
18150 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
18160 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
18170 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
18180 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
18190 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
181a0 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
181b0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
181c0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
181d0 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
181e0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
181f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
18200 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
18210 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
18220 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
18230 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  *.        ** Ope
18240 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
18250 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
18260 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ess. This is bec
18270 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20  ause in .       
18280 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
18290 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
182a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
182b0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
182c0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  and.        ** p
182d0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
182e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
182f0 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
18300 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
18310 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
18320 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
18330 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
18340 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
18350 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
18360 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
18370 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
18380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
18390 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
183a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
183b0 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
183c0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
183d0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
183e0 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20  int ro;.        
183f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
18400 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
18410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18420 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
18430 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
18440 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
18450 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
18460 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
18470 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
18480 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 20  ager->jfd );.   
18490 20 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b         if( ro ){
184a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
184b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
184c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
184d0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
184e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
184f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18500 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18520 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
18530 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18550 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
18560 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
18570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18580 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
18590 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
185a0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
185b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
185c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
185d0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
185e0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
185f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18600 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
18610 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
18620 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
18630 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
18640 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
18650 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
18660 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
18670 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
18680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
18690 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
186a0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
186b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
186c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
186d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
186e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
186f0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
18700 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
18710 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18720 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
18730 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
18740 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18750 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
18760 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
18770 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
18780 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
18790 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
187a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
187b0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
187c0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
187d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
187e0 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
187f0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
18800 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
18810 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
18820 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
18830 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
18840 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
18850 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
18860 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
18870 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62          ** has b
18880 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
18890 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
188a0 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
188b0 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
188c0 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
188d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61  **.        ** Da
188e0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
188f0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
18900 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
18910 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
18920 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
18930 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
18940 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
18950 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
18960 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
18970 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
18980 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
18990 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
189a0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
189b0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
189c0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
189d0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
189e0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
189f0 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65         ** a code
18a00 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
18a10 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
18a20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
18a30 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
18a40 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
18a50 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
18a60 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  e .        ** de
18a70 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
18a80 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
18a90 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
18aa0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
18ab0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
18ac0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
18ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18ae0 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
18af0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
18b00 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
18b10 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18b20 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
18b30 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r);..        if(
18b40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18b60 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18b70 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Code;.        }.
18b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
18b90 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
18ba0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
18bb0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
18bc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
18bd0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
18be0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
18bf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18c00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
18c10 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
18c20 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
18c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18c40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18c50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
18c60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
18c80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
18c90 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
18ca0 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
18cb0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
18cc0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
18cd0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
18ce0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
18cf0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
18d00 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
18d10 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
18d20 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
18d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18d40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
18d50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
18d60 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
18d70 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
18d80 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
18d90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18da0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
18db0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18dc0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
18dd0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
18de0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
18df0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
18e00 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e   a PgHdr object.
18e10 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65     Either create
18e20 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65   a new one or re
18e30 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  use.** an existi
18e40 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ng one that is n
18e50 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  ot otherwise in 
18e60 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  use..**.** A new
18e70 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
18e80 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61   is created if a
18e90 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
18ea0 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a  ing are.** true:
18eb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
18ec0 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65  We have not exce
18ed0 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d  eded our maximum
18ee0 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65   allocated cache
18ef0 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20   size.**        
18f00 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20    as set by the 
18f10 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
18f20 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ze" command..**.
18f30 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
18f40 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20  e are no unused 
18f50 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76  PgHdr objects av
18f60 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20  ailable at this 
18f70 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  time..**.**     
18f80 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  (3)  This is an 
18f90 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
18fa0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  se..**.**     (4
18fb0 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
18fc0 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68  PgHdr objects th
18fd0 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  at do not requir
18fe0 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  e a journal.**  
18ff0 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e          file syn
19000 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20  c and a sync of 
19010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19020 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
19030 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62            prohib
19040 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ited..**.** Othe
19050 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20  rwise, reuse an 
19060 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20  existing PgHdr. 
19070 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19080 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69   reuse an.** exi
19090 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61  sting PgHdr if a
190a0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
190b0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
190c0 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
190d0 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20  have reached or 
190e0 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78  exceeded the max
190f0 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a  imum cache size.
19100 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
19110 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63  wed by "PRAGMA c
19120 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a  ache_size"..**.*
19130 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
19140 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69   is a PgHdr avai
19150 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72  lable with PgHdr
19160 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20  ->nRef==0.**.** 
19170 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20      (3)  We are 
19180 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d  not in an in-mem
19190 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  ory database.**.
191a0 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68  **     (4)  Eith
191b0 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  er there is an a
191c0 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74  vailable PgHdr t
191d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
191e0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f  d.**          to
191f0 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69   be synced to di
19200 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20  sk or else disk 
19210 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65  syncing is curre
19220 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
19230 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61   allowed..*/.sta
19240 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c  tic int pagerAll
19250 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20  ocatePage(Pager 
19260 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
19270 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  *ppPg){.  int rc
19280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19290 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
192a0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50  * Create a new P
192b0 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74  gHdr if any of t
192c0 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f  he four conditio
192d0 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a  ns defined .  **
192e0 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a   above is met: *
192f0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
19300 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
19310 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
19320 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  r->pFirst==0 .  
19330 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
19340 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  (pPager->pFirstS
19350 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
19360 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
19370 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
19380 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
19390 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
193a0 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
193b0 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
193c0 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ,.         pPage
193d0 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
193e0 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
193f0 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  sh*2);.      if(
19400 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
19410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
19420 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19430 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
19440 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
19450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19460 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
19470 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
19480 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
19490 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194b0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
194c0 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
194d0 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
19500 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
19510 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
19520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19530 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
19540 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
19550 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
19560 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
19570 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
19580 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19590 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
195a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
195b0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
195c0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
195d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
195e0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
195f0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
19600 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
19610 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
19620 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
19630 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
19640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19650 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
19660 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
19670 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
19680 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
19690 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
196a0 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , 1, &pPg);.    
196b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
196c0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
196d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
196e0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
196f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19710 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
19720 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19730 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19740 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
19750 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
19760 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
19770 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
19780 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
19790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
197a0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
197b0 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
197c0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
197d0 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
197e0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
197f0 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
19800 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
19810 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
19820 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
19830 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
19840 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
19850 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
19860 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
19870 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
19880 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
19890 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
198a0 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
198b0 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
198c0 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
198d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
198e0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
198f0 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
19900 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
19910 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
19920 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
19930 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
19940 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
19950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19960 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
19970 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
19980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19990 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
199a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
199b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
199c0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
199d0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
199e0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
199f0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
19a00 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
19a10 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
19a20 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
19a30 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
19a40 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
19a50 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
19a60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19a70 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
19a80 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
19a90 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
19aa0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
19ab0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
19ac0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
19ad0 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
19ae0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
19af0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
19b00 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
19b10 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
19b20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
19b30 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
19b40 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
19b50 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
19b60 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
19b70 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
19b80 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
19b90 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
19ba0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
19bb0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
19bc0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
19bd0 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
19be0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
19bf0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
19c00 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
19c10 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
19c20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
19c30 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
19c40 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
19c50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
19c60 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
19c70 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
19c80 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
19c90 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
19ca0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
19cb0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
19cc0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
19cd0 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
19ce0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
19cf0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
19d00 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
19d10 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
19d20 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
19d30 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
19d40 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
19d50 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
19d60 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
19d70 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
19d80 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
19d90 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
19da0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
19db0 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
19dc0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
19dd0 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
19de0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
19df0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
19e00 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
19e10 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
19e20 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
19e30 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
19e40 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
19e50 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
19e60 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
19e70 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
19e80 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
19e90 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
19ea0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
19eb0 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
19ec0 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
19ed0 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
19ee0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
19ef0 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
19f00 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
19f10 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
19f20 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
19f30 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
19f40 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
19f50 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
19f60 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
19f70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19f80 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
19f90 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
19fa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
19fb0 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
19fc0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
19fd0 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
19fe0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
19ff0 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1a000 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1a010 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1a020 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
1a030 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1a040 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1a050 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1a060 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1a070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a080 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1a090 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1a0a0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1a0b0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1a0c0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1a0d0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1a0e0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1a0f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1a100 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1a110 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1a120 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1a130 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1a140 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a150 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a170 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1a180 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1a190 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1a1a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1a1b0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1a1c0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1a1d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1a1e0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1a1f0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1a200 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1a210 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1a220 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1a230 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1a240 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1a250 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1a260 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1a270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a280 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1a290 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1a2a0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1a2b0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1a2c0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1a2d0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1a2e0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1a2f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a300 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1a310 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1a320 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1a330 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1a340 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
1a350 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1a360 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1a370 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1a380 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1a390 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a3a0 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1a3b0 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1a3c0 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1a3d0 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1a3e0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1a3f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1a400 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1a410 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1a430 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1a440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a450 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a460 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
1a470 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1a480 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1a490 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
1a4a0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1a4b0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
1a4c0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1a4d0 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
1a4e0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47    int h;.    PAG
1a4f0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1a500 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d  nMiss);.    rc =
1a510 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1a520 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  ge(pPager, &pPg)
1a530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a560 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  }..    pPg->pgno
1a570 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73   = pgno;.    ass
1a580 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
1a590 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74  gno>pPager->stmt
1a5a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1a5b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a5c0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
1a5d0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1a5e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
1a5f0 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
1a600 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a610 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
1a620 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a630 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1a640 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1a650 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
1a660 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
1a670 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
1a680 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
1a690 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1a6a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1a6b0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1a6c0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
1a6d0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1a6e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65  .    }..    make
1a6f0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
1a700 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
1a710 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
1a720 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ..    pPager->nR
1a730 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ef++;.    if( pP
1a740 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
1a750 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
1a760 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
1a770 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
1a780 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
1a790 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d      }.    nMax =
1a7a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1a7b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1a7c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a7d0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1a7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1a7f0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
1a800 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1a810 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ode;.      retur
1a820 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1a830 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
1a840 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
1a850 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
1a860 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1a870 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
1a880 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
1a890 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
1a8a0 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
1a8b0 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
1a8c0 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
1a8d0 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26  || (noContent &&
1a8e0 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
1a8f0 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20  Rollback) ){.   
1a900 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
1a910 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1a920 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1a930 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1a940 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a950 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
1a960 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  }.      memset(P
1a970 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1a980 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
1a990 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
1a9a0 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e  Pg->needRead = n
1a9b0 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
1a9c0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1a9d0 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ack;.      IOTRA
1a9e0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
1a9f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1aa00 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1aa10 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1aa20 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67  Page(pPager, pPg
1aa30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
1aa40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa50 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1aa60 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1aa70 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
1aa80 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
1aa90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1aaa0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1aab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1aac0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1aad0 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1aae0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
1aaf0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1ab00 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
1ab10 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
1ab20 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
1ab30 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
1ab40 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
1ab50 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1ab60 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
1ab70 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
1ab80 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1ab90 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1aba0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
1abb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1abc0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1abd0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
1abe0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
1abf0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1ac00 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1ac10 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1ac20 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
1ac30 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1ac40 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1ac50 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
1ac60 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1ac70 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
1ac80 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1ac90 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1aca0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
1acb0 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  =1);.    PAGER_I
1acc0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
1acd0 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f  );.    if( !noCo
1ace0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
1acf0 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1ad00 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20  ntent(pPg);.    
1ad10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ad20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ad30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ad40 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
1ad50 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
1ad60 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1ad70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ad80 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1ad90 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
1ada0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
1adb0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
1adc0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
1add0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
1ade0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1adf0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
1ae00 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
1ae10 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
1ae20 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1ae30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1ae40 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
1ae50 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1ae60 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
1ae70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1ae80 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
1ae90 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
1aea0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
1aeb0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
1aec0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1aed0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
1aee0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1aef0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
1af00 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1af10 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
1af20 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
1af30 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
1af40 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
1af50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
1af60 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
1af70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1af80 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1af90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1afa0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1afb0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
1afc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1afd0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1afe0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1aff0 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c  !pPager->pAll ||
1b000 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1b010 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65  veMode );.    re
1b020 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1b030 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1b040 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1b050 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1b060 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
1b070 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
1b080 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1b090 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1b0a0 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
1b0b0 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
1b0c0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
1b0d0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
1b0e0 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
1b0f0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
1b100 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1b110 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
1b120 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
1b130 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
1b140 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
1b150 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
1b160 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
1b170 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
1b180 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
1b190 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
1b1a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1b1b0 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
1b1c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b1d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
1b1e0 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a  age *pPg){..  /*
1b1f0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
1b200 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1b210 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
1b220 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
1b230 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
1b240 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
1b250 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45  NFO(pPg);..  CHE
1b260 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1b270 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
1b280 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1b290 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
1b2a0 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
1b2b0 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
1b2c0 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
1b2d0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1b2e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1b2f0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
1b300 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1b310 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
1b320 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
1b330 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a  >pNextFree = 0;.
1b340 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
1b350 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61  ee = pPager->pLa
1b360 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
1b370 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  pLast = pPg;.   
1b380 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
1b390 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
1b3a0 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
1b3b0 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20  xtFree = pPg;.  
1b3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b3d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
1b3e0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1b3f0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
1b400 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
1b410 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29  FirstSynced==0 )
1b420 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1b430 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
1b440 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
1b450 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
1b460 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
1b470 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1b480 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  or(pPg, pPager->
1b490 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
1b4a0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
1b4b0 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
1b4c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
1b4d0 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
1b4e0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
1b4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1b500 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1b510 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
1b520 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b530 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
1b540 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
1b550 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65  0 && (!pPager->e
1b560 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
1b570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b580 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70  ff>0) ){.      p
1b590 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
1b5a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1b5b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b5c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b5d0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
1b5e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1b5f0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
1b600 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
1b610 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
1b620 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1b630 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b640 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
1b650 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b660 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
1b670 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1b680 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
1b690 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
1b6a0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
1b6b0 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
1b6c0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1b6d0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
1b6e0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
1b6f0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1b700 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1b710 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1b720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b730 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1b740 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1b750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b760 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1b770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1b780 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1b790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1b7a0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1b7b0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
1b7c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1b7d0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
1b7e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
1b7f0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1b800 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1b810 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1b820 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1b830 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1b840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
1b850 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1b860 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1b870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1b880 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
1b890 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
1b8a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1b8d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1b8e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
1b8f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1b900 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61  er->jfd );.  pPa
1b910 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b920 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1b930 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
1b940 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1b950 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
1b960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b980 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
1b990 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1b9a0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1b9b0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  l);.    }.    go
1b9c0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1b9d0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 23  n_journal;.  }.#
1b9e0 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33 4f 73  if 0.  sqlite3Os
1b9f0 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
1ba00 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1ba10 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
1ba20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1ba30 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1ba40 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
1ba50 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ync);.  sqlite3O
1ba60 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1ba70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1ba80 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
1ba90 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
1baa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1bab0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
1bac0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1bad0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
1bae0 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
1baf0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1bb00 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
1bb10 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
1bb20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1bb30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1bb40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1bb50 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1bb60 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1bb70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
1bb80 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1bb90 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
1bba0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1bbb0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
1bbc0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
1bbd0 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
1bbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1bbf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bc00 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
1bc10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1bc20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1bc30 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
1bc40 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bc50 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1bc60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1bc70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bc80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1bc90 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1bca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bcb0 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
1bcc0 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
1bcd0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1bce0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
1bcf0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1bd00 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
1bd10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
1bd20 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
1bd30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1bd40 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
1bd50 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
1bd60 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
1bd70 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
1bd80 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
1bd90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1bda0 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
1bdb0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1bdc0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1bdd0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1bde0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1bdf0 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
1be00 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1be10 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1be20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
1be30 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
1be40 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
1be50 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
1be60 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
1be70 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
1be80 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
1be90 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1bea0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
1beb0 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
1bec0 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
1bed0 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
1bee0 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
1bef0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1bf00 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1bf10 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
1bf20 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
1bf30 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
1bf40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1bf50 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
1bf60 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1bf70 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
1bf80 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
1bf90 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
1bfa0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bfb0 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
1bfc0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
1bfd0 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
1bfe0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
1bff0 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
1c000 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
1c010 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1c020 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
1c030 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
1c040 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
1c050 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c060 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
1c070 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
1c080 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
1c090 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1c0a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1c0b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1c0c0 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
1c0d0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
1c0e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c0f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1c100 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
1c110 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
1c120 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
1c130 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
1c140 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
1c150 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
1c160 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
1c170 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
1c180 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
1c190 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
1c1a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1c1b0 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
1c1c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c1d0 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
1c1e0 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
1c1f0 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
1c200 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c210 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1c220 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1c230 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1c240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1c250 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1c260 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
1c270 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1c280 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
1c290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c2a0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1c2b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
1c2c0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
1c2d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1c2e0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1c2f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1c300 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1c310 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
1c320 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1c330 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1c340 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
1c350 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
1c360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c370 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c380 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1c390 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
1c3a0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
1c3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1c3c0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1c3d0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1c3e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
1c3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c430 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1c440 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1c450 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
1c460 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
1c470 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1c480 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1c490 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
1c4a0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
1c4b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1c4c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1c4d0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1c4e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1c4f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1c500 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1c510 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1c520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
1c530 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
1c540 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
1c550 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
1c560 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1c570 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  de last.    ** t
1c580 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
1c590 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
1c5a0 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
1c5b0 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
1c5c0 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
1c5d0 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
1c5e0 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
1c5f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
1c600 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
1c610 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61   open and trunca
1c620 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a  ted to 0 bytes..
1c630 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1c640 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
1c650 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1c660 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
1c670 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
1c680 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1c690 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1c6a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1c6b0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1c6c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1c6d0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1c6e0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1c6f0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1c700 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1c710 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->aInJournal ){
1c720 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c730 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1c740 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1c750 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1c760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c770 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1c780 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1c790 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1c7a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1c7b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1c7c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c7d0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
1c7e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1c7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1c800 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
1c810 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
1c820 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
1c830 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
1c840 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1c850 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
1c860 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
1c870 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
1c880 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
1c890 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1c8a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
1c8b0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
1c8c0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
1c8d0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
1c8e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c8f0 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
1c900 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
1c910 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
1c920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
1c930 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
1c940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1c950 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
1c960 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1c970 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
1c980 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
1c990 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
1c9a0 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
1c9b0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1c9c0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
1c9d0 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
1c9e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1c9f0 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
1ca00 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1ca10 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
1ca20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
1ca30 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1ca40 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b  pPg->pPrevDirty;
1ca50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ca60 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29  Pg->pPrevDirty )
1ca70 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
1ca80 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
1ca90 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1caa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cab0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
1cac0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1cad0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  y;.    }.  }.}..
1cae0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1caf0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1cb00 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1cb10 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1cb20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1cb30 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1cb40 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1cb50 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1cb60 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1cb70 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1cb80 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1cb90 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1cba0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1cbb0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1cbc0 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1cbd0 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1cbe0 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1cbf0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1cc00 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1cc10 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1cc20 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1cc30 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1cc40 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1cc50 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1cc60 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1cc70 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1cc80 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1cc90 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1cca0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1ccb0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1ccc0 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1ccd0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1cce0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1ccf0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1cd00 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1cd10 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1cd20 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1cd30 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1cd40 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1cd50 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1cd60 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1cd70 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1cd80 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1cd90 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1cda0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1cdb0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1cdc0 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1cdd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1cde0 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1cdf0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1ce00 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1ce10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ce20 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1ce30 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1ce40 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
1ce50 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20  A(pPg);.  Pager 
1ce60 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1ce70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1ce80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1ce90 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1cea0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1ceb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1cec0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1ced0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1cee0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1cef0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1cf00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1cf10 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1cf20 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1cf30 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1cf40 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1cf50 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1cf60 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1cf70 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1cf80 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74  Content==1, that
1cf90 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64   means.  ** we d
1cfa0 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61  idn't really rea
1cfb0 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
1cfc0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54   of the page.  T
1cfd0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20  his can happen. 
1cfe0 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65   ** (for example
1cff0 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  ) when the page 
1d000 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  is being moved t
1d010 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  o the freelist. 
1d020 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65   But.  ** now we
1d030 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d   are (perhaps) m
1d040 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f  oving the page o
1d050 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ff of the freeli
1d060 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73  st for.  ** reus
1d070 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  e and we need to
1d080 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e   know its origin
1d090 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68  al content so th
1d0a0 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  at content.  ** 
1d0b0 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1d0c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1d0d0 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68  urnal.  So do th
1d0e0 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20  e read at this. 
1d0f0 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20   ** time..  */. 
1d100 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1d110 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1d120 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1d130 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1d140 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1d150 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1d160 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1d170 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1d180 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1d190 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1d1a0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1d1b0 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
1d1c0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
1d1d0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1d1e0 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d  && (pageInStatem
1d1f0 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67  ent(pPg) || pPag
1d200 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1d210 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1d220 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1d230 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
1d240 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
1d250 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
1d260 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
1d270 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
1d280 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
1d290 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1d2a0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
1d2b0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
1d2c0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
1d2d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
1d2e0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
1d2f0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1d300 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
1d310 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
1d320 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1d330 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
1d340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d350 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1d360 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
1d370 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1d380 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  gin(pPg, 0);.   
1d390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d3a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d3b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d3d0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1d3e0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
1d3f0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1d400 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1d410 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
1d420 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d430 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1d440 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1d450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d460 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d470 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1d480 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d490 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
1d4a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
1d4b0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1d4c0 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
1d4d0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1d4e0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
1d4f0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
1d500 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
1d510 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1d520 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
1d530 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1d540 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
1d550 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
1d560 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
1d570 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
1d580 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1d590 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1d5a0 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
1d5b0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
1d5c0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
1d5d0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
1d5e0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1d5f0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1d600 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1d610 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
1d620 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
1d630 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
1d640 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1d650 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1d660 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1d670 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1d680 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
1d690 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1d6a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1d6b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d6c0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1d6d0 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
1d6e0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1d6f0 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Orig = sqliteMal
1d700 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
1d710 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
1d720 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1d730 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
1d740 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
1d750 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
1d760 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1d770 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1d780 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d7a0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
1d7b0 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  , saved;.       
1d7c0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 2c     char *pData2,
1d7d0 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20   *pEnd;.        
1d7e0 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
1d7f0 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
1d800 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1d810 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
1d820 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
1d830 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1d840 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
1d850 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
1d860 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
1d870 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1d880 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1d890 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1d8a0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
1d8b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1d8c0 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43        pData2 = C
1d8d0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1d8e0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1d8f0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
1d900 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
1d910 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
1d920 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
1d930 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32 20    pEnd = pData2 
1d940 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1d950 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  ze;.          pD
1d960 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20  ata2 -= 4;.     
1d970 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
1d980 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20 20  32*)pEnd;.      
1d990 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 45      put32bits(pE
1d9a0 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  nd, cksum);.    
1d9b0 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61        szPg = pPa
1d9c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b  ger->pageSize+8;
1d9d0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1d9e0 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1d9f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1da00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1da10 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1da20 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50 67  fd, pData2, szPg
1da30 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
1da40 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  lOff);.         
1da50 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1da60 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1da70 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1da80 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1da90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1daa0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1dab0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1dac0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1dad0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1dae0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1daf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1db00 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1db10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1db20 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
1db30 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1db40 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1db50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1db70 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1db80 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72  >needSync, pager
1db90 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1dba0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1dbb0 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1dbc0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
1dbd0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1dbe0 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
1dbf0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1dc00 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  The .          *
1dc10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1dc20 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1dc30 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1dc40 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  bove..          
1dc50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1dc60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1dc80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1dc90 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dca0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
1dcb0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dcc0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1dcd0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1dce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1dcf0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1dd00 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1dd10 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1dd20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1dd30 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
1dd40 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
1dd50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1dd60 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
1dd70 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1dd80 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1dd90 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1dda0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1ddb0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ddc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ddd0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1dde0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1ddf0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
1de00 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
1de10 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
1de20 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
1de30 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1de40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1de50 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1de60 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1de70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
1de80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1de90 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1dea0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1deb0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1dec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ded0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1dee0 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
1def0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
1df00 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
1df10 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
1df20 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
1df30 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
1df40 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1df50 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
1df60 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
1df70 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
1df80 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1df90 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
1dfa0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
1dfb0 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
1dfc0 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
1dfd0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
1dfe0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
1dff0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
1e000 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1e010 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20  >stmtInUse .    
1e020 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1e030 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20  ment(pPg) .     
1e040 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1e050 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1e060 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize .    ){.    
1e070 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1e080 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1e090 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1e0a0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1e0b0 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1e0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1e0d0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1e0e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1e0f0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1e100 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1e110 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1e120 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1e130 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1e140 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1e150 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1e160 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1e170 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1e180 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1e190 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1e1a0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1e1b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1e1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1e1d0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1e1e0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1e1f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1e200 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1e210 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
1e220 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1e230 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
1e240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
1e250 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1e260 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
1e270 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1e280 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1e290 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1e2a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1e2b0 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1e2c0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1e2d0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1e2e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1e2f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1e300 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1e310 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1e320 61 67 65 53 69 7a 65 2b 34 2c 20 6f 66 66 73 65  ageSize+4, offse
1e330 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
1e340 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1e350 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1e360 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1e370 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1e380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e3a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e3b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1e3c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1e3d0 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
1e3e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e3f0 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1e400 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e410 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1e420 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1e430 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1e440 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1e450 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1e460 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1e470 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1e480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e490 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1e4a0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1e4b0 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
1e4c0 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1e4d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e4e0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1e4f0 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
1e500 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
1e510 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
1e520 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1e530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1e540 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
1e550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e560 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e570 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1e580 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
1e590 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
1e5a0 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
1e5b0 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
1e5c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
1e5d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1e5e0 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
1e5f0 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
1e600 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
1e610 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
1e620 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1e630 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
1e640 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
1e650 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
1e660 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
1e670 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
1e680 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
1e690 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
1e6a0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
1e6b0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1e6c0 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
1e6d0 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
1e6e0 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
1e6f0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1e700 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1e710 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
1e720 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
1e730 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e740 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
1e750 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e760 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
1e770 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1e780 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1e790 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1e7a0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
1e7b0 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
1e7c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
1e7d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1e7e0 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
1e7f0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
1e800 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
1e810 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
1e820 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1e830 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1e840 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e850 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e870 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
1e880 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
1e890 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
1e8a0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e8d0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
1e8e0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1e8f0 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20     int ii;..    
1e900 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
1e910 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
1e920 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
1e930 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
1e940 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
1e950 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
1e960 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
1e970 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
1e980 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1e990 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
1e9a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1e9b0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1e9c0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1e9d0 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
1e9e0 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
1e9f0 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
1ea00 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
1ea10 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
1ea20 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
1ea30 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
1ea40 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
1ea50 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
1ea60 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
1ea70 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1ea80 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1ea90 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
1eaa0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
1eab0 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
1eac0 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
1ead0 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
1eae0 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71   nPageCount = sq
1eaf0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1eb00 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1eb10 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
1eb20 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1eb30 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
1eb40 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
1eb50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1eb60 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
1eb70 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
1eb80 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1eb90 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
1eba0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1ebb0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1ebc0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
1ebd0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
1ebe0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
1ebf0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
1ec00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
1ec10 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
1ec20 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
1ec30 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
1ec40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1ec50 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
1ec60 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
1ec70 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1ec80 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->aInJournal || 
1ec90 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
1eca0 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70   .          pg>p
1ecb0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1ecc0 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61  e || !(pPager->a
1ecd0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26  InJournal[pg/8]&
1ece0 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20  (1<<(pg&7))).   
1ecf0 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69     ) {.        i
1ed00 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
1ed10 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1ed20 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
1ed30 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  *pPage;.        
1ed40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ed50 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1ed60 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
1ed70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ed80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ed90 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1eda0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1edc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1edd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ede0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1edf0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
1ee00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1ee10 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
1ee20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1ee30 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
1ee40 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1ee50 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
1ee60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ee70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1ee80 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1ee90 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1eea0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1eeb0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1eec0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1eed0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
1eee0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
1eef0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
1ef00 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
1ef10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1ef20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
1ef30 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
1ef40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1ef50 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
1ef60 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
1ef70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
1ef80 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1ef90 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
1efa0 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
1efb0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
1efc0 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
1efd0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1efe0 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
1eff0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
1f000 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
1f010 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
1f020 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
1f030 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
1f040 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
1f050 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
1f060 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1f070 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
1f080 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  g);.  if( rc==SQ
1f090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1f0a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f0b0 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1f0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f0d0 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
1f0e0 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  y(sqlite3PagerGe
1f0f0 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61 74  tData(pPg), pDat
1f100 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1f110 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
1f120 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1f130 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  f(pPg);.  }.  re
1f140 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1f150 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
1f160 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1f170 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1f180 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
1f190 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
1f1a0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
1f1b0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
1f1c0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
1f1d0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
1f1e0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
1f1f0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
1f200 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
1f210 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
1f220 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
1f230 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
1f240 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
1f250 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
1f260 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
1f270 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
1f280 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
1f290 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
1f2a0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
1f2b0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
1f2c0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
1f2d0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
1f2e0 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
1f2f0 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
1f300 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1f310 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1f320 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1f330 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1f340 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1f350 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1f360 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1f370 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1f380 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1f390 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f3a0 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1f3b0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1f3c0 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1f3d0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1f3e0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
1f3f0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1f400 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1f410 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1f420 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1f430 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1f440 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1f450 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1f460 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1f470 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1f480 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1f490 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1f4a0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1f4b0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1f4c0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1f4d0 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1f4e0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1f4f0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1f500 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1f510 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1f520 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1f530 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1f540 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1f550 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1f560 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1f570 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1f580 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1f590 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f5a0 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
1f5b0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1f5c0 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
1f5d0 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
1f5e0 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
1f5f0 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
1f600 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
1f610 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1f620 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
1f630 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
1f640 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
1f650 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
1f660 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
1f670 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
1f680 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1f690 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
1f6a0 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  f( MEMDB ) retur
1f6b0 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  n;.  pPg->always
1f6c0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1f6d0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1f6e0 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1f6f0 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
1f700 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1f710 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1f720 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1f730 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
1f740 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
1f750 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
1f760 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1f770 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1f780 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
1f790 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
1f7a0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
1f7b0 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
1f7c0 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
1f7d0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1f7e0 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
1f7f0 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
1f800 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
1f810 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
1f820 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
1f830 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
1f840 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
1f850 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
1f860 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
1f870 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
1f880 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
1f890 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
1f8a0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
1f8b0 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
1f8c0 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
1f8d0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1f8e0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1f8f0 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
1f900 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
1f910 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
1f920 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
1f930 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
1f940 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
1f950 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
1f960 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1f970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
1f980 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
1f990 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1f9a0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1f9b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f9c0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1f9d0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
1f9e0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1f9f0 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61  >pgno)).      ma
1fa00 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
1fa10 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1fa20 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
1fa30 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1fa40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1fa50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
1fa60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
1fa70 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1fa80 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1fa90 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1faa0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1fab0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1fac0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1fad0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1fae0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1faf0 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1fb00 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1fb10 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1fb20 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1fb30 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1fb40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb50 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
1fb60 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
1fb70 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
1fb80 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
1fb90 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
1fba0 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
1fbb0 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
1fbc0 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
1fbd0 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
1fbe0 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
1fbf0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
1fc00 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
1fc10 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
1fc20 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
1fc30 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
1fc40 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1fc50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fc60 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1fc70 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
1fc80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1fc90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1fca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fcb0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1fcc0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
1fcd0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1fce0 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
1fcf0 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
1fd00 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
1fd10 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1fd20 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
1fd30 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1fd40 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1fd50 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1fd60 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1fd70 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
1fd80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1fd90 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1fda0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1fdb0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
1fdc0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1fdd0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
1fde0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1fdf0 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  .    pPg->needRe
1fe00 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ad = 0;.    if( 
1fe10 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1fe20 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1fe30 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1fe40 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1fe50 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1fe60 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43   }.    PAGERTRAC
1fe70 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
1fe80 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1fe90 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1fea0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1feb0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
1fec0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
1fed0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1fee0 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
1fef0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ff00 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e 53   .   && !pageInS
1ff10 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
1ff20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70    && (int)pPg->p
1ff30 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
1ff40 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  tSize .  ){.    
1ff50 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1ff60 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1ff70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ff80 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1ff90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ffa0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1ffb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1ffc0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1ffd0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1ffe0 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  no&7);.  }.}.../
1fff0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20000 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
20010 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
20020 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
20030 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
20040 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
20050 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
20060 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20070 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
20080 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
20090 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
200a0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
200b0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
200c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
200d0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
200e0 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
200f0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
20100 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
20110 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
20120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20130 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
20140 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
20150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20160 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20180 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
20190 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
201a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
201b0 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49   rc;.  .    /* I
201c0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
201d0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
201e0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
201f0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
20200 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
20210 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
20220 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
20230 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
20240 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
20250 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
20260 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54  (((char*)PGHDR_T
20270 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b  O_DATA(pPgHdr))+
20280 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
20290 65 72 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6c 65  er);.    /* Rele
202a0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
202b0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
202c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
202d0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
202e0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
202f0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
20300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20310 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
20320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20330 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
20340 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
20350 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
20360 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
20370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
20380 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
20390 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
203a0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
203b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
203c0 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
203d0 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
203e0 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
203f0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
20400 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
20410 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
20420 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20430 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
20440 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
20450 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
20460 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
20470 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
20480 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
20490 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
204a0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
204b0 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
204c0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
204d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
204e0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
204f0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
20500 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
20510 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
20520 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
20530 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
20540 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
20550 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
20560 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
20570 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
20580 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20590 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
205a0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  l..**.** If para
205b0 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20  meter nTrunc is 
205c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
205d0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
205e0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a   truncated to.**
205f0 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74   nTrunc pages (t
20600 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
20610 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
20620 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ases)..*/.int sq
20630 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20640 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a  PhaseOne(Pager *
20650 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
20660 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
20670 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
20680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20690 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
206a0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
206b0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
206c0 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
206d0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
206e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
206f0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20  er, nTrunc);..  
20700 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
20710 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
20720 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
20730 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
20740 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
20750 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
20760 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
20770 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
20780 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
20790 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
207a0 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
207b0 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
207c0 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
207d0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
207e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
207f0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
20800 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
20810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
20820 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
20830 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
20840 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
20850 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
20860 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
20870 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
20880 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
20890 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
208a0 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
208b0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
208c0 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
208d0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
208e0 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
208f0 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
20900 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
20910 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
20920 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
20930 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
20940 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
20950 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
20960 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
20970 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
20980 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
20990 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
209a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
209b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
209c0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
209d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
209e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
209f0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e  .      if( nTrun
20a00 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
20a10 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
20a20 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
20a30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
20a40 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
20a50 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ages.        ** 
20a60 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
20a70 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
20a80 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
20a90 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
20aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
20ab0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20ac0 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
20ad0 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
20ae0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
20af0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
20b00 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
20b10 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
20b20 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
20b30 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
20b40 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
20b50 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26  l[i/8] & (1<<(i&
20b60 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70  7))) && i!=iSkip
20b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20b80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20b90 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
20ba0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
20bb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20bc0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
20bd0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
20be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20bf0 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
20c00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20c10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
20c20 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
20c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20c40 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
20c50 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
20c60 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
20c70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20c80 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
20c90 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
20ca0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
20cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20cc0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
20cd0 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
20ce0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
20cf0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
20d00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20d10 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20d20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
20d30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20d40 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
20d50 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
20d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d70 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
20d80 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
20d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20da0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
20db0 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
20dc0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
20dd0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
20de0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
20df0 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
20e00 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
20e10 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
20e20 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
20e30 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
20e40 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
20e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20e60 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20e70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
20e80 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ty = 0;..    /* 
20e90 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
20ea0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
20eb0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
20ec0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
20ed0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
20ee0 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
20ef0 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
20f00 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
20f10 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
20f20 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20f30 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
20f40 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26  else if( MEMDB &
20f50 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  & nTrunc!=0 ){. 
20f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20f70 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
20f80 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
20f90 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
20fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
20fb0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a  OERR_BLOCKED ){.
20fc0 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63      /* pager_inc
20fd0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
20fe0 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f  ) may attempt to
20ff0 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
21000 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b  sive.     * lock
21010 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61   to spill the ca
21020 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  che and return I
21030 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75  OERR_BLOCKED. Bu
21040 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20  t since .     * 
21050 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
21060 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20  ce the cache is 
21070 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74  inconsistent, it
21080 27 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  's.     * better
21090 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
210a0 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
210b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
210c0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
210d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
210e0 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
210f0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
21100 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
21110 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
21120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
21130 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
21140 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
21150 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
21160 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
21170 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21180 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
21190 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
211a0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
211b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
211c0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
211d0 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
211e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
211f0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
21200 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
21210 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
21220 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
21230 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
21240 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
21250 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
21260 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21270 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
21280 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
21290 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
212a0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
212b0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
212c0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
212d0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
212e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
212f0 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
21300 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
21310 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21320 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
21330 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
21340 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
21350 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
21360 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
21370 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
21380 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
21390 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
213a0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
213b0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
213c0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
213d0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
213e0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
213f0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
21400 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21410 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
21420 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
21430 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
21440 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
21450 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
21460 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
21470 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
21480 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
21490 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
214a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
214b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
214c0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
214d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
214e0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
214f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21500 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
21510 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
21520 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
21530 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
21540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21560 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
21570 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
21580 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
21590 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
215a0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
215b0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
215c0 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
215d0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
215e0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
215f0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
21600 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
21610 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
21620 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
21630 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
21640 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
21650 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
21660 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
21670 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
21680 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
21690 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
216a0 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
216b0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
216c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
216d0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
216e0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
216f0 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
21700 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
21710 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
21720 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
21730 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
21740 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
21750 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
21760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
21770 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
21780 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
21790 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
217a0 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
217b0 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
217c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
217d0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
217e0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
217f0 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
21800 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
21810 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
21820 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
21830 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
21840 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
21850 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
21860 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
21870 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21880 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
21890 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
218a0 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
218b0 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
218c0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
218d0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
218e0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
218f0 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
21900 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
21910 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
21920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
21930 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
21940 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
21950 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
21960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21970 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
21980 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
21990 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
219a0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
219b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
219c0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
219d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
219e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
219f0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
21a00 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
21a10 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
21a20 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
21a30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21a40 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
21a50 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
21a60 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
21a70 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
21a80 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21aa0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
21ab0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
21ac0 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
21ad0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
21ae0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
21af0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
21b00 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
21b10 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
21b20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
21b30 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21b40 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
21b50 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
21b60 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
21b70 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
21b80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
21b90 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
21ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
21bb0 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
21bc0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
21be0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
21bf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
21c00 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
21c10 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
21c20 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21c30 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
21c40 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
21c50 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
21c60 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
21c70 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
21c80 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
21c90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21ca0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
21cb0 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
21cc0 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
21cd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
21ce0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
21cf0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
21d00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
21d10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
21d20 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
21d30 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
21d40 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
21d50 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
21d60 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21d70 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
21d80 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
21d90 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
21da0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21db0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
21dc0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
21dd0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
21de0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
21df0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
21e00 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21e10 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
21e20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
21e30 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
21e40 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
21e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21e80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21e90 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
21ea0 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67  0);.  }.  /* pag
21eb0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
21ec0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
21ed0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
21ee0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
21ef0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
21f00 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
21f10 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
21f20 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
21f30 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
21f40 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
21f50 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
21f60 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
21f70 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
21f80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  */.  return page
21f90 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
21fa0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc);.}../*.** Re
21fb0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
21fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21fd0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
21fe0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
21ff0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
22000 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
22010 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
22020 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22030 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
22040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
22050 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
22060 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
22070 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
22080 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
22090 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
220a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
220b0 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
220c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
220d0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b  rn pPager->nRef;
220e0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
220f0 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
22100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
22110 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
22120 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
22130 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
22140 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
22150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
22160 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
22170 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
22180 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
22190 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
221a0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
221b0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
221c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
221d0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
221e0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
221f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22200 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
22210 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
22220 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
22230 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
22240 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
22250 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
22260 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
22270 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
22280 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
22290 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
222a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
222b0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
222c0 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
222d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
222e0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
222f0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
22300 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
22310 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
22320 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
22330 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
22340 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
22350 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
22360 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
22370 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
22380 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
22390 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
223a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
223b0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
223c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
223d0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
223e0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
223f0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
22400 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
22410 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
22420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22430 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
22440 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
22450 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
22460 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
22470 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
22480 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
22490 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
224a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
224b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
224c0 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
224d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
224e0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
224f0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
22500 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
22510 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
22520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22530 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
22540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
22550 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
22560 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
22570 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
22580 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
22590 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
225a0 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  tmt==0 ){.    /*
225b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
225c0 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
225d0 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20  D_LOCK); */.    
225e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
225f0 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  MEM;.  }.#ifndef
22600 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73   NDEBUG.  rc = s
22610 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
22620 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
22630 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
22640 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
22650 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
22660 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
22670 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
22680 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
22690 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
226a0 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
226b0 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
226c0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
226d0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
226e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
226f0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
22700 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
22710 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
22720 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
22730 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
22740 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
22750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22760 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70 50  agerOpentemp(&pP
22770 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
22780 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
22790 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
227a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
227b0 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
227c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
227d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
227e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
227f0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
22800 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
22810 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
22820 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
22830 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
22840 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
22850 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
22860 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
22870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22880 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
22890 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
228a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
228b0 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72  StmtCommit(Pager
228c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
228d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
228e0 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
228f0 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
22900 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
22910 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
22920 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22930 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
22940 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  DB ){.      /* s
22950 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
22960 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
22970 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
22980 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
22990 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
229a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
229b0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
229c0 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
229d0 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
229e0 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
229f0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
22a00 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
22a10 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
22a20 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
22a30 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
22a40 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
22a50 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
22a60 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
22a70 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
22a80 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
22a90 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
22aa0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
22ab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
22ac0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
22ad0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
22ae0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
22af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22b00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
22b10 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
22b20 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
22b30 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
22b40 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
22b50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
22b60 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
22b70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22b80 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
22b90 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
22ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22bb0 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61  rStmtRollback(Pa
22bc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22bd0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
22be0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22bf0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
22c00 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
22c10 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
22c20 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
22c30 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
22c40 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
22c50 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
22c60 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
22c70 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
22c80 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
22c90 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
22ca0 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
22cb0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
22cc0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
22cd0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
22ce0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
22cf0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
22d00 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
22d10 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
22d20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
22d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
22d40 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
22d50 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
22d60 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
22d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22d80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
22d90 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
22da0 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
22db0 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
22dc0 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
22dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
22de0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22df0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
22e00 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
22e10 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
22e20 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
22e30 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
22e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
22e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22e60 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
22e70 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
22e80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22e90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
22ea0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
22eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22ec0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
22ed0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
22ee0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
22ef0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
22f00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
22f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22f20 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
22f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22f40 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
22f50 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
22f60 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
22f70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
22f80 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
22f90 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
22fa0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
22fb0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
22fc0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
22fd0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
22fe0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
22ff0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
23000 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
23010 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
23020 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
23030 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
23040 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
23050 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
23060 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
23070 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
23080 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
23090 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
230a0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
230b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
230c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
230d0 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
230e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
230f0 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
23100 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
23110 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
23120 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
23130 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
23140 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
23150 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
23160 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
23170 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
23180 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
23190 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
231a0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
231b0 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
231c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
231d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
231e0 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
231f0 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20  ve the page pPg 
23200 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
23210 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
23220 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
23230 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
23240 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65   to the page pre
23250 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
23260 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63  at.** pgno (whic
23270 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64  h we call pPgOld
23280 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61  ) though that pa
23290 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  ge is allowed to
232a0 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e   be.** in cache.
232b0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72    If the page pr
232c0 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61  evious located a
232d0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
232e0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
232f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
23300 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
23310 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
23320 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
23330 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
23340 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
23350 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
23360 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
23370 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
23380 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
23390 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
233a0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
233b0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
233c0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
233d0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
233e0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
233f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
23400 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
23410 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
23420 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
23430 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
23440 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
23450 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
23460 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
23470 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
23480 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
23490 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
234a0 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
234b0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
234c0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
234d0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
234e0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
234f0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
23500 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
23510 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
23520 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
23530 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
23540 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20  pPgOld;  /* The 
23550 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
23560 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74  ritten. */.  int
23570 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
23580 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
23590 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
235a0 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
235b0 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
235c0 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
235d0 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
235e0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
235f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
23600 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
23610 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
23620 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
23630 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
23640 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
23650 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
23660 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
23670 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
23680 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
23690 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
236a0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
236b0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
236c0 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
236d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
236e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
236f0 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
23700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23710 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
23720 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
23730 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
23740 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
23750 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
23760 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
23770 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
23780 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
23790 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
237a0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
237b0 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61   ** from it's ha
237c0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
237d0 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
237e0 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
237f0 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
23800 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
23810 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
23820 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
23830 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
23840 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
23850 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
23860 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
23870 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
23880 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
23890 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
238a0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
238b0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
238c0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
238d0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
238e0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
238f0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
23900 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
23910 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e  Sync = pPgOld->n
23920 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65  eedSync;.  }else
23930 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  {.    pPg->needS
23940 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ync = 0;.  }.  i
23950 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
23960 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
23970 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
23980 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50  DbSize ){.    pP
23990 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20  g->inJournal =  
239a0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
239b0 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
239c0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
239d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
239e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
239f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
23a00 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c  g->needSync==0 |
23a10 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
23a20 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23a30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  ;.  }..  /* Chan
23a40 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
23a50 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
23a60 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
23a70 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
23a80 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
23a90 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
23aa0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
23ab0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
23ac0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
23ad0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
23ae0 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
23af0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
23b00 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
23b10 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
23b20 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
23b30 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
23b40 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
23b50 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
23b60 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
23b70 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
23b80 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
23b90 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
23ba0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
23bb0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
23bc0 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
23bd0 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
23be0 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
23bf0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
23c00 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23c10 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
23c20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
23c30 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
23c40 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
23c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
23c60 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
23c70 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
23c80 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
23c90 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
23ca0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
23cb0 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49  .    ** Pager.aI
23cc0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
23cd0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
23ce0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
23cf0 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
23d00 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
23d10 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
23d20 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
23d30 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
23d40 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
23d50 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
23d60 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
23d70 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
23d80 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
23d90 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
23da0 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
23db0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
23dc0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
23dd0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
23de0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
23df0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23e00 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
23e10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23e20 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
23e30 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
23e40 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
23e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23e70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
23e80 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
23e90 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
23ea0 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
23eb0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
23ec0 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
23ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
23ee0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
23ef0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
23f00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
23f10 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
23f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23f30 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
23f40 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
23f50 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
23f60 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
23f70 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
23f80 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
23f90 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
23fa0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23fb0 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
23fc0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
23fd0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
23fe0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
23ff0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
24000 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
24010 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
24020 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
24030 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
24040 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
24050 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
24060 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
24070 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
24080 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
24090 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
240a0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
240b0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
240c0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
240d0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
240e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
240f0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
24100 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
24110 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
24120 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
24130 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
24140 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
24150 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
24160 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
24170 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
24180 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
24190 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
241a0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
241b0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
241c0 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
241d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
241e0 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
241f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
24200 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
24210 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
24220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24230 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
24240 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24250 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
24260 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
24270 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
24280 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
24290 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
242a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
242b0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
242c0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
242d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
242e0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
242f0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
24300 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
24310 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
24320 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
24330 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
24340 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
24350 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
24360 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
24370 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
24380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
24390 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
243a0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
243b0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
243c0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
243d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
243e0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
243f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
24400 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
24410 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
24420 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
24430 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
24440 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
24450 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
24460 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
24470 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
24480 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
24490 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
244a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
244b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
244c0 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  rLockstate(Pager
244d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
244e0 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
244f0 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66  kState(pPager->f
24500 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  d);.}.#endif..#i
24510 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
24520 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
24530 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
24540 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
24550 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
24560 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
24570 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70  ite3PagerRefdump
24580 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24590 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
245a0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
245b0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
245c0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
245d0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
245e0 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
245f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24600 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
24610 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
24620 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
24630 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
24640 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
24650 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
24660 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
24670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
24680 4b 49 4f 20 2a 2f 0a                             KIO */.