/ Hex Artifact Content
Login

Artifact 96802068d3f387a6a4f016d840366ac9f8afcf6e:


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 32 31  : pager.c,v 1.21
0350: 33 20 32 30 30 35 2f 30 39 2f 31 36 20 31 30 3a  3 2005/09/16 10:
0360: 31 38 3a 34 36 20 64 61 6e 69 65 6c 6b 31 39 37  18: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 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 54 68 65 79  escriptors. They
0620: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 73 6f   are required so
0630: 20 74 68 61 74 20 74 72 61 63 69 6e 67 0a 2a 2a   that tracing.**
0640: 20 63 61 6e 20 62 65 20 74 75 72 6e 65 64 20 6f   can be turned o
0650: 6e 20 77 68 65 6e 20 75 73 69 6e 67 20 62 6f 74  n when using bot
0660: 68 20 74 68 65 20 72 65 67 75 6c 61 72 20 6f 73  h the regular os
0670: 5f 75 6e 69 78 2e 63 20 61 6e 64 20 6f 73 5f 74  _unix.c and os_t
0680: 65 73 74 2e 63 0a 2a 2a 20 62 61 63 6b 65 6e 64  est.c.** backend
0690: 73 2e 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  s..**.** PAGERID
06a0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
06b0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
06c0: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
06d0: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
06e0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
06f0: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
0700: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
0710: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 4f 73  ID() takes an Os
0720: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  File.** struct a
0730: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0740: 0a 2a 2f 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  .*/.#ifdef OS_TE
0750: 53 54 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  ST.#define PAGER
0760: 49 44 28 70 29 20 28 70 2d 3e 66 64 2d 3e 66 64  ID(p) (p->fd->fd
0770: 2e 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  .h).#define FILE
0780: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64  HANDLEID(fd) (fd
0790: 2d 3e 66 64 2e 68 29 0a 23 65 6c 73 65 0a 23 64  ->fd.h).#else.#d
07a0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
07b0: 20 28 70 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69   (p->fd.h).#defi
07c0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
07d0: 66 64 29 20 28 66 64 2e 68 29 0a 23 65 6e 64 69  fd) (fd.h).#endi
07e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  f../*.** The pag
07f0: 65 20 63 61 63 68 65 20 61 73 20 61 20 77 68 6f  e cache as a who
0800: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
0810: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
0820: 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a  wing.** states:.
0830: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e  **.**   PAGER_UN
0840: 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68 65 20  LOCK        The 
0850: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f  page cache is no
0860: 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64  t currently read
0870: 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  ing or .**      
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
08a0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
08b0: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20  re is no.**     
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d    data held in m
08e0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20  emory.  This is 
08f0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20  the initial.**  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a       state..**.*
0920: 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52 45 44  *   PAGER_SHARED
0930: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
0940: 20 63 61 63 68 65 20 69 73 20 72 65 61 64 69 6e   cache is readin
0950: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0960: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0970: 20 20 20 20 20 20 20 20 20 57 72 69 74 69 6e 67           Writing
0980: 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
0990: 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62 65  d.  There can be
09a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09b0: 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70            multip
09c0: 6c 65 20 72 65 61 64 65 72 73 20 61 63 63 65 73  le readers acces
09d0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
09e0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
0a10: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50   time..**.**   P
0a20: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
0a30: 20 20 20 54 68 69 73 20 70 72 6f 63 65 73 73 20     This process 
0a40: 68 61 73 20 72 65 73 65 72 76 65 64 20 74 68 65  has reserved the
0a50: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 72   database for wr
0a60: 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  iting.**        
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
0a80: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d  ut has not yet m
0a90: 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e  ade any changes.
0aa0: 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65    Only one proce
0ab0: 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20 61              at a
0ad0: 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76   time can reserv
0ae0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
0af0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   The original.**
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0b20: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
0b30: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74  n modified so ot
0b40: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0b60: 63 65 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c  cesses may still
0b70: 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
0b80: 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20  on-disk.**      
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
0bb0: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58  **.**   PAGER_EX
0bc0: 43 4c 55 53 49 56 45 20 20 20 20 20 54 68 65 20  CLUSIVE     The 
0bd0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
0be0: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0bf0: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0c10: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0c20: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0c30: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0c60: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0c70: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0ca0: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
0cb0: 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20     PAGER_SYNCED 
0cc0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 72         The pager
0cd0: 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73   moves to this s
0ce0: 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f  tate from PAGER_
0cf0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72     after all dir
0d20: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
0d30: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
0d40: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d50: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0d60: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
0d70: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
0d80: 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  ynced to.**     
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74    disk. All that
0db0: 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69   remains to do i
0dc0: 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 0a  s to remove the.
0dd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0de0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
0df0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72   file and the tr
0e00: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
0e10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0e20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 69             commi
0e30: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0e40: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0e50: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0e60: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e70: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0e80: 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f 63 63  3pager_get() occ
0e90: 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74  urs, the state t
0ea0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0eb0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41  GER_SHARED..** A
0ec0: 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68  fter all pages h
0ed0: 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65  ave been release
0ee0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70  d using sqlite_p
0ef0: 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20  age_unref(),.** 
0f00: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0f10: 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41  tions back to PA
0f20: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0f30: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
0f40: 68 61 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  hat sqlite3pager
0f50: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
0f60: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0f70: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0f80: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f90: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0fa0: 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20  te_page_write() 
0fb0: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0fc0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0fd0: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0fe0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0ff0: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
1000: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
1010: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
1020: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
1030: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
1040: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1050: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1060: 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62 65  E occurs when be
1070: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1080: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1090: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10a0: 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  e.  After an sql
10b0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
10c0: 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  ck().** or sqlit
10d0: 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e_pager_commit()
10e0: 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73  , the state goes
10f0: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1100: 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e  HARED..*/.#defin
1110: 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20  e PAGER_UNLOCK  
1120: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41      0.#define PA
1130: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
1140: 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53  1   /* same as S
1150: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  HARED_LOCK */.#d
1160: 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45  efine PAGER_RESE
1170: 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73  RVED    2   /* s
1180: 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f  ame as RESERVED_
1190: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11a0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
11b0: 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    4   /* same as
11c0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
11d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
11e0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a  _SYNCED      5..
11f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  /*.** If the SQL
1200: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1210: 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20  D_LOCK macro is 
1220: 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63  set to true at c
1230: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20  ompile-time,.** 
1240: 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65  then failed atte
1250: 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65  mpts to get a re
1260: 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c  served lock will
1270: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1280: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
1290: 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  is is off by def
12a0: 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68  ault.  To see wh
12b0: 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  y, consider the 
12c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
12d0: 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f  io:.** .** Suppo
12e0: 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65  se thread A alre
12f0: 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64  ady has a shared
1300: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1310: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1320: 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72  .** Thread B alr
1330: 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72  eady has a reser
1340: 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  ved lock and wan
1350: 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ts an exclusive 
1360: 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74  lock.  If.** bot
1370: 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73  h threads are us
1380: 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63  ing their busy c
1390: 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67  allbacks, it mig
13a0: 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d  ht be a long tim
13b0: 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20  e.** be for one 
13c0: 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67  of the threads g
13d0: 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77  ive up and allow
13e0: 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70  s the other to p
13f0: 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69  roceed..** But i
1400: 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79  f the thread try
1410: 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72  ing to get the r
1420: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76  eserved lock giv
1430: 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a  es up quickly.**
1440: 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e   (if it never in
1450: 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63  vokes its busy c
1460: 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68  allback) then th
1470: 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c  e contention wil
1480: 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64  l be.** resolved
1490: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66   quickly..*/.#if
14a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59  ndef SQLITE_BUSY
14b0: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23  _RESERVED_LOCK.#
14c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
14d0: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
14e0: 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 0.#endif../*.*
14f0: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75  * This macro rou
1500: 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f  nds values up so
1510: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
1520: 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  ue is an address
1530: 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e   it.** is guaran
1540: 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64  teed to be an ad
1550: 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c  dress that is al
1560: 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79  igned to an 8-by
1570: 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
1580: 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c  #define FORCE_AL
1590: 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28  IGNMENT(X)   (((
15a0: 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a  X)+7)&~7)../*.**
15b0: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
15c0: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
15d0: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
15e0: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
15f0: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1600: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1610: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1620: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1630: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1640: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1650: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1660: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1670: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1680: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1690: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67   call sqlite3pag
16a0: 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20  er_write() on a 
16b0: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
16c0: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
16d0: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
16e0: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
16f0: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70  st time sqlite3p
1700: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
1710: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
1720: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
1730: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
1740: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
1750: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
1760: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
1770: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
1780: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
1790: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
17a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
17b0: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
17c0: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
17d0: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
17e0: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
17f0: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
1800: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
1810: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
1820: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1830: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
1840: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
1850: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
1860: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
1870: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
1880: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
1890: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
18a0: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
18b0: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
18c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
18d0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
18e0: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
18f0: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1900: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1910: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1920: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1930: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1940: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1950: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
1960: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
1970: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1990: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
19a0: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
19b0: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
19c0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19e0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
19f0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a00: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a10: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a20: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a30: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1a40: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1a50: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1a60: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1a70: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1a80: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1a90: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1aa0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1ab0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1ac0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1ad0: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1ae0: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1af0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1b00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1b10: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b20: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b40: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1b50: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1b60: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b80: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1b90: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1ba0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1bb0: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1be0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1bf0: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1c00: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c20: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
1c30: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
1c40: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
1c50: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1c70: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
1c80: 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70  ack() for this p
1c90: 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  age */.  short i
1ca0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cc0: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
1cd0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1ce0: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d00: 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65  irty pages sorte
1d10: 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20  d by PgHdr.pgno 
1d20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1d30: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
1d40: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
1d50: 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  dif.  /* pPager-
1d60: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1d70: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1d80: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1d90: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1da0: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1db0: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1dc0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1dd0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61  .};../*.** For a
1de0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  n in-memory only
1df0: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20   database, some 
1e00: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
1e10: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62  n is recorded ab
1e20: 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65  out.** each page
1e30: 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73   so that changes
1e40: 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
1e50: 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66  ack.  (Journal f
1e60: 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  iles are not.** 
1e70: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
1e80: 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20  ry databases.)  
1e90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  The following in
1ea0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64  formation is add
1eb0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64  ed to.** the end
1ec0: 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20   of every EXTRA 
1ed0: 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d  block for in-mem
1ee0: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ory databases..*
1ef0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d  *.** This inform
1f00: 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ation could have
1f10: 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65   been added dire
1f20: 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64  ctly to the PgHd
1f30: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  r structure..** 
1f40: 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c  But then it woul
1f50: 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74  d take up an ext
1f60: 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74  ra 8 bytes of st
1f70: 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50  orage on every P
1f80: 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72  gHdr.** even for
1f90: 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61   disk-based data
1fa0: 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e  bases.  Splittin
1fb0: 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38  g it out saves 8
1fc0: 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a   bytes.  This.**
1fd0: 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e   is only a savin
1fe0: 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74  gs of 0.8% but t
1ff0: 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73  hose percentages
2000: 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65   add up..*/.type
2010: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73  def struct PgHis
2020: 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a  tory PgHistory;.
2030: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
2040: 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20   {.  u8 *pOrig; 
2050: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2060: 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74  page text.  Rest
2070: 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61  ore to this on a
2080: 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a   full rollback *
2090: 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20  /.  u8 *pStmt;  
20a0: 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74     /* Text as it
20b0: 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69   was at the begi
20c0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
20d0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
20e0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61  /.};../*.** A ma
20f0: 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76  cro used for inv
2100: 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20  oking the codec 
2110: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
2120: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2130: 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66  _HAS_CODEC.# def
2140: 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c  ine CODEC(P,D,N,
2150: 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63  X) if( P->xCodec
2160: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2170: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2180: 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  ); }.#else.# def
2190: 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c  ine CODEC(P,D,N,
21a0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
21b0: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
21c0: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
21d0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
21e0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
21f0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
2200: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2210: 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a  DATA(P)  ((void*
2220: 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66  )(&(P)[1])).#def
2230: 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  ine DATA_TO_PGHD
2240: 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a  R(D)  (&((PgHdr*
2250: 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69  )(D))[-1]).#defi
2260: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  ne PGHDR_TO_EXTR
2270: 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26  A(G,P) ((void*)&
2280: 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d  ((char*)(&(G)[1]
2290: 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65  ))[(P)->pageSize
22a0: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
22b0: 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20  _TO_HIST(P,PGR) 
22c0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   \.            (
22d0: 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63  (PgHistory*)&((c
22e0: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
22f0: 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b  (PGR)->pageSize+
2300: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
2310: 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74  ./*.** How big t
2320: 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
2330: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c  table used for l
2340: 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72  ocating in-memor
2350: 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61  y pages.** by pa
2360: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
2370: 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20 6c 69  macro looks a li
2380: 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75 74 20  ttle silly, but 
2390: 69 73 20 65 76 61 6c 75 61 74 65 64 0a 2a 2a 20  is evaluated.** 
23a0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
23b0: 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20 28 61   not run-time (a
23c0: 74 20 6c 65 61 73 74 20 66 6f 72 20 67 63 63 20  t least for gcc 
23d0: 74 68 69 73 20 69 73 20 74 72 75 65 29 2e 0a 2a  this is true)..*
23e0: 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48  /.#define N_PG_H
23f0: 41 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f 50 41  ASH (\.  (MAX_PA
2400: 47 45 53 3e 31 30 32 34 29 3f 32 30 34 38 3a 20  GES>1024)?2048: 
2410: 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 35  \.  (MAX_PAGES>5
2420: 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20 28 4d  12)?1024: \.  (M
2430: 41 58 5f 50 41 47 45 53 3e 32 35 36 29 3f 35 31  AX_PAGES>256)?51
2440: 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45  2: \.  (MAX_PAGE
2450: 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a 20 20  S>128)?256: \.  
2460: 28 4d 41 58 5f 50 41 47 45 53 3e 36 34 29 3f 31  (MAX_PAGES>64)?1
2470: 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a  28:64 \.)../*.**
2480: 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d   Hash a page num
2490: 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  ber.*/.#define p
24a0: 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28  ager_hash(PN)  (
24b0: 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d  (PN)&(N_PG_HASH-
24c0: 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  1))../*.** A ope
24d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
24e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
24f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2500: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
2510: 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a  t Pager {.  u8 j
2520: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2530: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2540: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
2550: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
2560: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
2570: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
2580: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2590: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
25a0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
25b0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
25e0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
25f0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2600: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2610: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2620: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2630: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
2640: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2660: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
2670: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
2680: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
2690: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26b0: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
26c0: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
26d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
26e0: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
26f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
2700: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
2710: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
2720: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
2730: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
2740: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2750: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
2760: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
2770: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2790: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
27a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
27b0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
27c0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
27f0: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
2800: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65  , etc. */.  u8 e
2810: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
2820: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2830: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2840: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
2850: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2870: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2880: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2890: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
28c0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
28d0: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
2900: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
2910: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
2920: 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65  .  u8 dirtyCache
2930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2940: 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64  * True if cached
2950: 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e   pages have chan
2960: 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  ged */.  u8 alwa
2970: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
2980: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2990: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
29a0: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
29b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
29e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
29f0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a10: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2a20: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2a30: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2a40: 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20  /.  int dbSize; 
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2a70: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
2a80: 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69  /.  int origDbSi
2a90: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2aa0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
2ab0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
2ac0: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  nge */.  int stm
2ad0: 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
2ae0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2af0: 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67  database (in pag
2b00: 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69  es) at stmt_begi
2b10: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
2b20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b40: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
2b50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
2b60: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
2b70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2b80: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
2b90: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
2ba0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
2bb0: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
2be0: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
2bf0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c00: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2c20: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
2c30: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c40: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
2c50: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
2c60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c70: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
2c80: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
2c90: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2ca0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2cb0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
2cc0: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
2cd0: 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20   nMaxPage;      
2ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68           /* High
2cf0: 20 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e   water mark of n
2d00: 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  Page */.  int nR
2d10: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
2d20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d30: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2d40: 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52  es with PgHdr.nR
2d50: 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ef>0 */.  int mx
2d60: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d70: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2d80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2d90: 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68   to hold in cach
2da0: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f  e */.  u8 *aInJo
2db0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2dc0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
2dd0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
2de0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2df0: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d   */.  u8 *aInStm
2e00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e10: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2e20: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
2e30: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2e40: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2e70: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
2e80: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
2e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2ea0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2eb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2ec0: 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20  *zDirectory;    
2ed0: 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74         /* Direct
2ee0: 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73  ory hold databas
2ef0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  e and journal fi
2f00: 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  les */.  OsFile 
2f10: 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20  fd, jfd;        
2f20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2f30: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74  criptors for dat
2f40: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2f50: 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74  l */.  OsFile st
2f60: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
2f70: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
2f80: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74  iptor for the st
2f90: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
2fa0: 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  al*/.  BusyHandl
2fb0: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
2fc0: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
2fd0: 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64   sqlite.busyHand
2fe0: 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ler */.  PgHdr *
2ff0: 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20  pFirst, *pLast; 
3000: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3010: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
3020: 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e  PgHdr *pFirstSyn
3030: 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  ced;        /* F
3040: 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77  irst free page w
3050: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
3060: 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  nc==0 */.  PgHdr
3070: 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20   *pAll;         
3080: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3090: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
30a0: 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20   PgHdr *pStmt;  
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
30d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
30e0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
30f0: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
3100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3110: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
3120: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
3130: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
3140: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
3150: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
3160: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
3170: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
3180: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
3190: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
31a0: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
31b0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
31c0: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
31d0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
31e0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
31f0: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
3200: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
3210: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
3220: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
3230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3240: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
3250: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
3260: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
3270: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3280: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3290: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
32a0: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
32b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
32c0: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
32d0: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
32e0: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
32f0: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
3300: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
3310: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
3320: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3330: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3340: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3350: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
3360: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
3370: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3380: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
3390: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
33a0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
33b0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
33c0: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
33d0: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
33e0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
33f0: 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a   (*xCodec)(void*
3400: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
3410: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
3420: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
3430: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
3440: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
3450: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
3460: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
3470: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
3480: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3490: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
34a0: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
34b0: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
34c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  ;../*.** If SQLI
34d0: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
34e0: 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  ed then incremen
34f0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67  t the variable g
3500: 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61  iven in.** the a
3510: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65  rgument.*/.#ifde
3520: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20  f SQLITE_TEST.# 
3530: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3540: 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23  (x)  x++.#else.#
3550: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3560: 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(x).#endif../*.
3570: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
3580: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
3590: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
35a0: 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  sk..*/.#define P
35b0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20  AGER_ERR_FULL   
35c0: 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69    0x01  /* a wri
35d0: 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  te() failed */.#
35e0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35f0: 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20  _MEM      0x02  
3600: 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  /* malloc() fail
3610: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
3620: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20  GER_ERR_LOCK    
3630: 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20   0x04  /* error 
3640: 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  in the locking p
3650: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69  rotocol */.#defi
3660: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  ne PAGER_ERR_COR
3670: 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64  RUPT  0x08  /* d
3680: 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e  atabase or journ
3690: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  al corruption */
36a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
36b0: 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30  RR_DISK     0x10
36c0: 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73    /* general dis
36d0: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61  k I/O error - ba
36e0: 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f  d hard drive? */
36f0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3700: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3710: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3720: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3730: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3740: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3750: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3760: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3770: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3780: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3790: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
37a0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
37b0: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
37c0: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
37d0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
37e0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
37f0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3800: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
3810: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3820: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3830: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3840: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3850: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3860: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3870: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3880: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3890: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
38a0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
38b0: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
38c0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
38d0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
38e0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
38f0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3900: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3910: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3920: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3930: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3940: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3950: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
3960: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
3970: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
3980: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
3990: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
39a0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
39b0: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
39c0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
39d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
39e0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
39f0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
3a00: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3a10: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3a20: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3a30: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
3a40: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
3a50: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
3a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
3a70: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
3a80: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
3a90: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
3aa0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
3ab0: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
3ac0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
3ad0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
3ae0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3af0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3b00: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3b10: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3b20: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3b30: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
3b40: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
3b50: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
3b60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
3b70: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
3b80: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
3b90: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
3ba0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
3bb0: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
3bc0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
3bd0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
3be0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
3bf0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
3c00: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
3c10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3c20: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3c30: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
3c40: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
3c50: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3c60: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
3c70: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3c80: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
3c90: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3ca0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
3cb0: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
3cc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
3cd0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
3ce0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
3cf0: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
3d00: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
3d10: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
3d20: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
3d30: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
3d40: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
3d50: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
3d60: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
3d70: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
3d80: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
3d90: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
3da0: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
3db0: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
3dc0: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
3dd0: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
3de0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
3df0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
3e00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
3e10: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
3e20: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
3e30: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
3e40: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
3e50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
3e60: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
3e70: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
3e80: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
3e90: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
3ea0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
3eb0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
3ec0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
3ed0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
3ee0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
3ef0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
3f00: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
3f10: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
3f20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
3f30: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
3f40: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
3f50: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
3f60: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
3f70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65  if../*.** The de
3f80: 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 61 20  fault size of a 
3f90: 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f 0a 23  disk sector.*/.#
3fa0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45 43  define PAGER_SEC
3fb0: 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f 2a  TOR_SIZE 512../*
3fc0: 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  .** Page number 
3fd0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73  PAGER_MJ_PGNO is
3fe0: 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61   never used in a
3ff0: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
4000: 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65  e (it is.** rese
4010: 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67  rved for working
4020: 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77   around a window
4030: 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74  s/posix incompat
4040: 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a  ibility). It is.
4050: 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a  ** used in the j
4060: 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66  ournal to signif
4070: 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  y that the remai
4080: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
4090: 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20  nal file .** is 
40a0: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
40b0: 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
40c0: 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65  nal name - there
40d0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67   are no more pag
40e0: 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61  es to.** roll ba
40f0: 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ck. See comments
4100: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72   for function wr
4110: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
4120: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
4130: 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41  */./* #define PA
4140: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
4150: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
4160: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f  )->pageSize)) */
4170: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
4180: 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44  J_PGNO(x) ((PEND
4190: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
41a0: 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a  ageSize))+1)../*
41b0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
41c0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
41d0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
41e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
41f0: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
4200: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  83647../*.** Ena
4210: 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ble reference co
4220: 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f  unt tracking (fo
4230: 72 20 64 65 62 75 67 67 69 6e 67 29 20 68 65 72  r debugging) her
4240: 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e:.*/.#ifdef SQL
4250: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20  ITE_DEBUG.  int 
4260: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
4270: 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61  nable = 0;.  sta
4280: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
4290: 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29  efinfo(PgHdr *p)
42a0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  {.    static int
42b0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66   cnt = 0;.    if
42c0: 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e 66  ( !pager3_refinf
42d0: 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72  o_enable ) retur
42e0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  n;.    sqlite3De
42f0: 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
4300: 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61    "REFCNT: %4d a
4310: 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
4320: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
4330: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
4340: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20  (p), p->nRef.   
4350: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
4360: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
4370: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
4380: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
4390: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
43a0: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
43b0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
43c0: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
43d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
43e0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
43f0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
4400: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4410: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
4420: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
4430: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
4440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
4450: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
4460: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
4470: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4480: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4490: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
44a0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
44b0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
44c0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
44d0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f 73  nt read32bits(Os
44e0: 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70  File *fd, u32 *p
44f0: 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b  Res){.  u32 res;
4500: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
4510: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4520: 66 64 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66  fd, &res, sizeof
4530: 28 72 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63  (res));.  if( rc
4540: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4550: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4560: 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63   ac[4];.    memc
4570: 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b  py(ac, &res, 4);
4580: 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30  .    res = (ac[0
4590: 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c  ]<<24) | (ac[1]<
45a0: 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38  <16) | (ac[2]<<8
45b0: 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20  ) | ac[3];.  }. 
45c0: 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20   *pRes = res;.  
45d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
45e0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
45f0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4600: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4610: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4620: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4630: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4640: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4650: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4660: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4670: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4680: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4690: 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  al){.  unsigned 
46a0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63  char ac[4];.  ac
46b0: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
46c0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
46d0: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
46e0: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
46f0: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
4700: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
4710: 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  xff;.  return sq
4720: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4730: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4740: 2a 20 57 72 69 74 65 20 74 68 65 20 33 32 2d 62  * Write the 32-b
4750: 69 74 20 69 6e 74 65 67 65 72 20 27 76 61 6c 27  it integer 'val'
4760: 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 69   into the page i
4770: 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 67  dentified by pag
4780: 65 20 68 65 61 64 65 72 0a 2a 2a 20 27 70 27 20  e header.** 'p' 
4790: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
47a0: 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t'..*/.static vo
47b0: 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28 75  id store32bits(u
47c0: 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a 70  32 val, PgHdr *p
47d0: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
47e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
47f0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4800: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4810: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4820: 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20  ffset];.  ac[0] 
4830: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
4840: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
4850: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
4860: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
4870: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
4880: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
4890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
48a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
48b0: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
48c0: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
48d0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
48e0: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
48f0: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
4900: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
4910: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
4920: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
4930: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
4940: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4950: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4960: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4970: 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c    return (ac[0]<
4980: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
4990: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
49a0: 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a  | ac[3];.}.../*.
49b0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62  ** Convert the b
49c0: 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65  its in the pPage
49d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20  r->errMask into 
49e0: 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a  an approprate.**
49f0: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f   return code..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
4a10: 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20  r_errcode(Pager 
4a20: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
4a30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4a40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
4a50: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
4a60: 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d  R_LOCK )    rc =
4a70: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
4a80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4a90: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4aa0: 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63  ERR_DISK )    rc
4ab0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
4ac0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
4ad0: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
4ae0: 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20  RR_FULL )    rc 
4af0: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
4b00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
4b10: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
4b20: 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20  _MEM )     rc = 
4b30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4b40: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
4b50: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
4b60: 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53  CORRUPT ) rc = S
4b70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
4b80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
4b90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
4ba0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
4bb0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
4bc0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
4bd0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
4be0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
4bf0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
4c00: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33  dr *pPage){.  u3
4c10: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
4c20: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
4c30: 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75  char *pData = (u
4c40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50  nsigned char *)P
4c50: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61  GHDR_TO_DATA(pPa
4c60: 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ge);.  for(i=0; 
4c70: 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  i<pPage->pPager-
4c80: 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  >pageSize; i++){
4c90: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
4ca0: 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20  h+i)^pData[i];. 
4cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
4cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
4cd0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
4ce0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
4cf0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
4d00: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
4d10: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
4d20: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
4d30: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
4d40: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
4d50: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
4d60: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
4d70: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
4d80: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
4d90: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
4da0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
4db0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
4dc0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
4dd0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
4de0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4df0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
4e00: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4e10: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
4e20: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
4e30: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 4d  er->errMask || M
4e40: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
4e50: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
4e60: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
4e70: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
4e80: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
4e90: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
4ea0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
4eb0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
4ec0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
4ed0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
4ee0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
4ef0: 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  en..** The maste
4f00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4f10: 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ame is read from
4f20: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4f30: 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69  file and .** wri
4f40: 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
4f50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4f60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a  qliteMalloc(). *
4f70: 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73  pzMaster is.** s
4f80: 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  et to point at t
4f90: 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  he memory and SQ
4fa0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
4fb0: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
4fc0: 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28  t.** sqliteFree(
4fd0: 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a  ) *pzMaster..**.
4fe0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
4ff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5000: 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a  e is present *pz
5010: 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f  Master is set to
5020: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
5030: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
5040: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5050: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73  MasterJournal(Os
5060: 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  File *pJrnl, cha
5070: 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20  r **pzMaster){. 
5080: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
5090: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
50a0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
50b0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
50c0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
50d0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
50e0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
50f0: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
5100: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
5110: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
5120: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
5130: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5140: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
5150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5160: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
5170: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5180: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5190: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
51a0: 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61  rc;. .  rc = rea
51b0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
51c0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
51d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
51e0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
51f0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5200: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
5210: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5220: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5230: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5240: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
5250: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
5260: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
5270: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
5280: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
5290: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
52a0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
52b0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e  Jrnl, szJ-16-len
52c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
52d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
52e0: 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72  rc;..  *pzMaster
52f0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5300: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a  eMalloc(len+1);.
5310: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
5320: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5340: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5350: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a  sRead(pJrnl, *pz
5360: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
5370: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5380: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
5390: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
53a0: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
53b0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
53c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
53d0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
53e0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
53f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
5400: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
5410: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
5420: 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74  ksum -= (*pzMast
5430: 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66  er)[i];.  }.  if
5440: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
5450: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
5460: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
5470: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
5480: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
5490: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
54a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
54b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
54c0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
54d0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
54e0: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
54f0: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
5500: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
5510: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
5520: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
5530: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5540: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
5550: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
5560: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
5570: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65  Master = 0;.  }e
5580: 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73  lse{.    (*pzMas
5590: 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ter)[len] = '\0'
55a0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
55b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
55c0: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
55d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
55e0: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
55f0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
5600: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
5610: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
5620: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
5630: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
5640: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
5650: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
5660: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
5670: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
5680: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
5690: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
56a0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
56b0: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
56c0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
5710: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
5720: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
5730: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
5740: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5750: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
5760: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
5770: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  * .*/.static int
5780: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5790: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
57a0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
57b0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
57c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
57d0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
57e0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
57f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5800: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
5810: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5820: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
5830: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
5840: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5850: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5860: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
5870: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
5880: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
5890: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
58a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
58b0: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65  f = offset;.  re
58c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65  turn sqlite3OsSe
58d0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
58e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
58f0: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5900: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5910: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5920: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5930: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5940: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5950: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5960: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5970: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5980: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5990: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
59a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
59b0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
59c0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
59d0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
59e0: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
59f0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5a00: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5a10: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5a20: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5a30: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5a40: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5a50: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5a60: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5a70: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5a80: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5a90: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5aa0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5ab0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5ac0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5ad0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5ae0: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5af0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5b00: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5b10: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5b20: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5b40: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5b50: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
5b60: 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a    int rc = seekJ
5b70: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
5b80: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
5b90: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
5ba0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
5bb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5bc0: 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65  Off;.  if( pPage
5bd0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
5be0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
5bf0: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
5c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b  ger->journalHdr;
5c10: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
5c20: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
5c30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5c40: 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d  er);..  /* FIX M
5c50: 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f  E: .  **.  ** Po
5c60: 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67  ssibly for a pag
5c70: 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  er not in no-syn
5c80: 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
5c90: 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64  nal magic should
5ca0: 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69   not.  ** be wri
5cb0: 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20  tten until nRec 
5cc0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  is filled in as 
5cd0: 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e  part of next syn
5ce0: 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a  cJournal(). .  *
5cf0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20  *.  ** Actually 
5d00: 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20  maybe the whole 
5d10: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5d20: 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64  hould be delayed
5d30: 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a   until that.  **
5d40: 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62   point. Think ab
5d50: 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  out this..  */. 
5d60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
5d70: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
5d80: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
5d90: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
5da0: 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66 28  lMagic));..  if(
5db0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5dc0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52 65  {.    /* The nRe
5dd0: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
5de0: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
5df0: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20  journals. */.   
5e00: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5e10: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5e20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
5e30: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
5e40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
5e50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e60: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
5e70: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
5e80: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73 71  liser */ .    sq
5e90: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
5ea0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
5eb0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
5ec0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5ed0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5ee0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5ef0: 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  d, pPager->cksum
5f00: 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Init);.  }.  if(
5f10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5f20: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 69  {.    /* The ini
5f30: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
5f40: 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  ze */.    rc = w
5f50: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
5f60: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5f70: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  >dbSize);.  }.  
5f80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f90: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5fa0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
5fb0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
5fc0: 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cess */.    rc =
5fd0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5fe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5ff0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
6000: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
6010: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
6020: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
6030: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
6040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6050: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
6060: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
6070: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6080: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
6090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
60a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
60b0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
60c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
60d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
60e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
60f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6100: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6110: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
6120: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6130: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6140: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6150: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6160: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6170: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6180: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6190: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
61a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
61b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
61c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
61d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
61e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
61f0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6200: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6210: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6220: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6230: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6240: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6250: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6260: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6270: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6280: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6290: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
62a0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
62b0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
62c0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
62d0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
62e0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
62f0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
6300: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6310: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6320: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6330: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6340: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6350: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6360: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6370: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6380: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6390: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
63a0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
63b0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
63c0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
63d0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
63e0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
63f0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6400: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6410: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6420: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6430: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6440: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6450: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6460: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6470: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6480: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6490: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
64a0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
64b0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
64c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
64d0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
64e0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
64f0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6500: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6510: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6520: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6530: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6540: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6550: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6580: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6590: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
65a0: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
65b0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
65c0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
65d0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
65e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
65f0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
6600: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6610: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
6620: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6640: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6650: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6660: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e  &pPager->jfd, pN
6670: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
6680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6690: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
66a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
66b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
66c0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
66d0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
66e0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
66f0: 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65  er->jfd, pDbSize
6700: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6710: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
6720: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
6730: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
6740: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
6750: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
6760: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6770: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
6780: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
6790: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
67a0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
67b0: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
67c0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
67d0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
67e0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
67f0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
6800: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
6810: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
6820: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
6830: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
6840: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
6850: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
6860: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
6870: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6880: 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  fd, (u32 *)&pPag
6890: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
68a0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
68b0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
68c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
68d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
68e0: 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
68f0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
6900: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6910: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6930: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6940: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
6950: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6960: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6970: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
6980: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
6990: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
69a0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
69b0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
69c0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
69d0: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
69e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
69f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6a00: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
6a10: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6a20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6a30: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6a40: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
6a50: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
6a60: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
6a70: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
6a80: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
6a90: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
6aa0: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
6ab0: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
6ac0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ad0: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
6ae0: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
6af0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
6b00: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
6b10: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
6b20: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
6b30: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
6b40: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
6b50: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
6b60: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
6b70: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
6b80: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  urnal name..*/.s
6b90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
6ba0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
6bb0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
6bc0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
6bd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
6be0: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
6bf0: 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20   .  u32 cksum = 
6c00: 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  0; ..  if( !zMas
6c10: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
6c20: 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e  etMaster) return
6c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
6c40: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
6c50: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  = 1;..  len = st
6c60: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20  rlen(zMaster);. 
6c70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
6c80: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
6c90: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
6ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
6cb0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
6cc0: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
6cd0: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
6ce0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
6cf0: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
6d00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
6d10: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
6d20: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
6d30: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
6d40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
6d50: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
6d60: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
6d70: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
6d80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
6d90: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6da0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
6db0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
6dc0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
6dd0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6de0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
6df0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6e00: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  (&pPager->jfd, P
6e10: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
6e20: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
6e30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6e40: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6e50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
6e60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
6e70: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
6e80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6e90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6ea0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6eb0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c  (&pPager->jfd, l
6ec0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
6ed0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6ee0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72  n rc;..  rc = wr
6ef0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
6f00: 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a  r->jfd, cksum);.
6f10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6f20: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6f30: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6f40: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
6f50: 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
6f60: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
6f70: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70  rnalMagic));.  p
6f80: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
6f90: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
6fa0: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
6fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20  }../*.** Add or 
6fc0: 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72  remove a page fr
6fd0: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  om the list of a
6fe0: 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ll pages that ar
6ff0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74  e in the.** stat
7000: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
7010: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b  *.** The Pager k
7020: 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20  eeps a separate 
7030: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68  list of pages th
7040: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
7050: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   in.** the state
7060: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
7070: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
7080: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
7090: 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  commit().** rout
70a0: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
70b0: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
70c0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
70d0: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
70e0: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
70f0: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
7100: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
7110: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
7120: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7130: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
7140: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
7150: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7160: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7170: 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  if( pPg->inStmt 
7180: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7190: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
71a0: 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  mt==0 && pPg->pN
71b0: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
71c0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
71d0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
71e0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70  ->pStmt ){.    p
71f0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50  Pager->pStmt->pP
7200: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  revStmt = pPg;. 
7210: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
7220: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
7230: 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tmt;.  pPager->p
7240: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Stmt = pPg;.  pP
7250: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d  g->inStmt = 1;.}
7260: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7270: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
7280: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7290: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
72a0: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
72b0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
72c0: 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  evStmt ){.    as
72d0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
72e0: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Stmt->pNextStmt=
72f0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7300: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7310: 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tStmt = pPg->pNe
7320: 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtStmt;.  }else{
7330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
7340: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d  ->pPager->pStmt=
7350: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7360: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d  >pPager->pStmt =
7370: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
7380: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
7390: 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20  pNextStmt ){.   
73a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
73b0: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
73c0: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
73d0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
73e0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
73f0: 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20  pPrevStmt;.  }. 
7400: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7410: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
7420: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  vStmt = 0;.  pPg
7430: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  ->inStmt = 0;.}.
7440: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
7450: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
7460: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7470: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7480: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7490: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
74a0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
74b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
74c0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
74d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
74e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
74f0: 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d  Hdr *p = pPager-
7500: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
7510: 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c  h(pgno)];.  whil
7520: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
7530: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
7540: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
7550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7560: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
7570: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
7580: 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d  clear the in-mem
7590: 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73  ory cache.  This
75a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73   routine.** sets
75b0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
75c0: 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
75d0: 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
75e0: 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a   it was first.**
75f0: 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75   opened.  Any ou
7600: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
7610: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
7620: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
7630: 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63  ttempts.** to ac
7640: 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73  cess those pages
7650: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
7660: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
7670: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
7680: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
7690: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
76a0: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
76b0: 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  xt;.  if( pPager
76c0: 2d 3e 65 72 72 4d 61 73 6b 20 29 20 72 65 74 75  ->errMask ) retu
76d0: 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  rn;.  for(pPg=pP
76e0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
76f0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
7700: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
7710: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
7720: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
7730: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
7740: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
7750: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
7760: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
7770: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7780: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65  ->pAll = 0;.  me
7790: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
77a0: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
77b0: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
77c0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
77d0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
77e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
77f0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7800: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
7810: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
7820: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  }.  sqlite3OsUnl
7830: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
7840: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
7850: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7860: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
7870: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
7880: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
7890: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
78a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
78b0: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
78c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
78d0: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 73 65   is used to rese
78e0: 74 20 74 68 65 20 70 61 67 65 72 20 61 66 74 65  t the pager afte
78f0: 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  r a malloc() fai
7900: 6c 75 72 65 2e 20 54 68 69 73 0a 2a 2a 20 64 6f  lure. This.** do
7910: 65 73 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20  esn't work with 
7920: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7930: 73 65 73 2e 20 49 66 20 61 20 6d 61 6c 6c 6f 63  ses. If a malloc
7940: 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 61 6e  () fails when an
7950: 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   .** in-memory d
7960: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 75 73  atabase is in us
7970: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
7980: 69 62 6c 65 20 74 6f 20 72 65 63 6f 76 65 72 2e  ible to recover.
7990: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
79a0: 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 65  saction or state
79b0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
79c0: 20 69 73 20 61 63 74 69 76 65 2c 20 69 74 20 69   is active, it i
79d0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
79e0: 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72  *.** It is an er
79f0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
7a00: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 61 6e 79   function if any
7a10: 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
7a20: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
7a30: 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c  LITE_OMIT_GLOBAL
7a40: 52 45 43 4f 56 45 52 0a 69 6e 74 20 73 71 6c 69  RECOVER.int sqli
7a50: 74 65 33 70 61 67 65 72 5f 72 65 73 65 74 28 50  te3pager_reset(P
7a60: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7a70: 20 69 66 28 20 70 50 61 67 65 72 20 29 7b 0a 20   if( pPager ){. 
7a80: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
7a90: 52 65 66 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  Ref || MEMDB ){.
7aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7ab0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
7ac0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7ad0: 4d 61 73 6b 20 26 3d 20 7e 28 50 41 47 45 52 5f  Mask &= ~(PAGER_
7ae0: 45 52 52 5f 4d 45 4d 29 3b 0a 20 20 20 20 70 61  ERR_MEM);.    pa
7af0: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
7b00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7b10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
7b20: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  dif.../*.** When
7b30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7b40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
7b50: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
7b60: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
7b70: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
7b80: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
7b90: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7ba0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7bb0: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
7bc0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
7bd0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
7be0: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
7bf0: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
7c00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
7c10: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
7c20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
7c30: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
7c40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7c50: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
7c60: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
7c70: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
7c80: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
7c90: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
7ca0: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
7cb0: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
7cc0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
7cd0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
7ce0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
7cf0: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
7d00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7d10: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
7d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
7d30: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
7d40: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
7d50: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7d60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7d70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70  ;.  }.  sqlite3p
7d80: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7d90: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7da0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7db0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7dc0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7dd0: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
7de0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
7df0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7e00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
7e10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7e20: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
7e30: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
7e40: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
7e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
7e60: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
7e70: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
7e80: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
7e90: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
7ea0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
7eb0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
7ec0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7ed0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7ee0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7ef0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
7f00: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
7f10: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
7f20: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7f30: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
7f40: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
7f50: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
7f60: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
7f70: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
7f80: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
7f90: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
7fa0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
7fb0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
7fc0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7fd0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7fe0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
7ff0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
8000: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
8010: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
8020: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
8030: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8040: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
8050: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  ARED_LOCK);.  pP
8060: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
8070: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50  GER_SHARED;.  pP
8080: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
8090: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
80a0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
80b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
80c0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
80d0: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
80e0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
80f0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
8100: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
8110: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
8120: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
8130: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
8140: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
8150: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
8160: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
8170: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
8180: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
8190: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
81a0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
81b0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
81c0: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
81d0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
81e0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
81f0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8200: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
8210: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
8220: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
8230: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
8240: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
8250: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
8260: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
8270: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
8280: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
8290: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
82a0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
82b0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
82c0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
82d0: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
82e0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
82f0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
8300: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
8310: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
8320: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
8330: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
8340: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
8350: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
8360: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
8370: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
8380: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
8390: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
83a0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
83b0: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
83c0: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
83d0: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
83e0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
83f0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
8400: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
8410: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
8420: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
8430: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
8440: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
8450: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
8460: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
8470: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
8480: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
8490: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
84a0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
84b0: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
84c0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
84d0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
84e0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
84f0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
8500: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44  , const char *aD
8510: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
8520: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
8530: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
8540: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8550: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
8560: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
8570: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
8580: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
8590: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
85a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
85b0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
85c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85d0: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
85e0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
85f0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
8600: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
8610: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
8620: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
8630: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
8640: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
8650: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
8660: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
8670: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8680: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
8690: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
86a0: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
86b0: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
86c0: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
86d0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
86e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
86f0: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
8700: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
8710: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
8720: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
8750: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
8760: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8780: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8790: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
87a0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
87b0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
87e0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
87f0: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61  king */.  u8 aDa
8800: 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ta[SQLITE_MAX_PA
8810: 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65  GE_SIZE];  /* Te
8820: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
8830: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
8840: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
8850: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
8860: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
8870: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
8880: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8890: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
88a0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
88b0: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
88c0: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
88d0: 73 65 43 6b 73 75 6d 20 3f 20 26 70 50 61 67 65  seCksum ? &pPage
88e0: 72 2d 3e 6a 66 64 20 3a 20 26 70 50 61 67 65 72  r->jfd : &pPager
88f0: 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72  ->stfd) );...  r
8900: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8910: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
8920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8930: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
8940: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
8950: 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70  d(jfd, &aData, p
8960: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8970: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8980: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8990: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
89a0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
89b0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
89c0: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
89d0: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
89e0: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
89f0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
8a00: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
8a10: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
8a20: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
8a30: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
8a40: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8a50: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
8a60: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
8a70: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
8a80: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
8a90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
8aa0: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
8ab0: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
8ac0: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
8ad0: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
8ae0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
8af0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
8b00: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
8b10: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
8b20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8b30: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
8b40: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
8b50: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
8b60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
8b70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8b80: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
8b90: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
8ba0: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
8bb0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8bc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
8bd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8be0: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
8bf0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
8c00: 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  er, pgno, aData)
8c10: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
8c20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8c30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8c40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
8c50: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
8c60: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
8c70: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
8c80: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
8c90: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8ca0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
8cb0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
8cc0: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
8cd0: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
8ce0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
8cf0: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
8d00: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
8d10: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
8d20: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
8d30: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
8d40: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
8d50: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
8d60: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
8d70: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
8d80: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
8d90: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
8da0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
8db0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
8dc0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
8dd0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
8de0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
8df0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
8e00: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
8e10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
8e20: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
8e30: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
8e40: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
8e50: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
8e60: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
8e70: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
8e80: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
8e90: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
8ea0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
8eb0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
8ec0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
8ed0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
8ee0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
8ef0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
8f00: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
8f10: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
8f20: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
8f30: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
8f40: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
8f50: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
8f60: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
8f70: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
8f80: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
8f90: 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  are in the main 
8fa0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
8fb0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
8fc0: 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c  e, if a full ROL
8fd0: 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74  LBACK occurs aft
8fe0: 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  er the statement
8ff0: 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  .  ** rollback t
9000: 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b  he full ROLLBACK
9010: 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72   will not restor
9020: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74  e the page to it
9030: 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
9040: 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f  content.  Two co
9050: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
9060: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
9070: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
9080: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20  ase.  ** files. 
9090: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
90a0: 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e   must be locked.
90b0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
90c0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  at the original.
90d0: 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e    ** page conten
90e0: 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  t is in the main
90f0: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
9100: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
9110: 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20   is not in.  ** 
9120: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74  cache or else it
9130: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
9140: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a  edSync==0..  */.
9150: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
9160: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
9170: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
9180: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9190: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
91a0: 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43  pPg!=0 );.  TRAC
91b0: 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E3("PLAYBACK %d 
91c0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
91d0: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
91e0: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  o);.  if( pPager
91f0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9200: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
9210: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
9220: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
9230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
9240: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
9250: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
9260: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9270: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9280: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9290: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
92a0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
92b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
92c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
92d0: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 20 70  .    if( pPg ) p
92e0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
92f0: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
9300: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
9310: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
9320: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
9330: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
9340: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
9350: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
9360: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
9370: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
9380: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
9390: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
93a0: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
93b0: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
93c0: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
93d0: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
93e0: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
93f0: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
9400: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
9410: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
9420: 20 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72   ** sqlite3pager
9430: 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  _rollback()..   
9440: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
9450: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  ata;.    /* asse
9460: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
9470: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
9480: 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61   ); */.    pData
9490: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
94a0: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
94b0: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
94c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
94d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
94e0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
94f0: 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20  {  /*** FIX ME: 
9500: 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20   Should this be 
9510: 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20  xReinit? ***/.  
9520: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
9530: 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
9540: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9560: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
9570: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
9580: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
9590: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
95a0: 66 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  f.    CODEC(pPag
95b0: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
95c0: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
95d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
95e0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
95f0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9600: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
9610: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
9620: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
9630: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
9640: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
9650: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9660: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9670: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9680: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9690: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
96a0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
96b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
96c0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
96d0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
96e0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
96f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
9700: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
9710: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
9720: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
9730: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
9740: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
9750: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
9760: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
9770: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
9780: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
9790: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
97a0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
97b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
97c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
97d0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
97e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
97f0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
9800: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
9810: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
9820: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
9830: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
9840: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
9850: 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68  ile master;.  ch
9860: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
9870: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
9880: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
9890: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
98a0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
98b0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
98c0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
98d0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
98e0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
98f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
9900: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
9910: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
9920: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
9930: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
9940: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
9950: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
9960: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
9970: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d    */.  memset(&m
9980: 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  aster, 0, sizeof
9990: 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20  (master));.  rc 
99a0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
99b0: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
99c0: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28   &master);.  if(
99d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
99e0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
99f0: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
9a00: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
9a10: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
9a20: 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (&master, &nMast
9a30: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
9a40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9a50: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
9a60: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
9a70: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
9a80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
9a90: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
9aa0: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
9ab0: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
9ac0: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
9ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
9ae0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
9af0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
9b00: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
9b10: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
9b20: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
9b30: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
9b40: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
9b50: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
9b60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9b70: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
9b80: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
9b90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9ba0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
9bb0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9bc0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
9bd0: 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65  te3OsRead(&maste
9be0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
9bf0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
9c00: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
9c10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9c20: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9c30: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
9c40: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
9c50: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
9c60: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
9c70: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
9c80: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
9c90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
9ca0: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
9cb0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
9cc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
9cd0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
9ce0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9cf0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
9d00: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
9d10: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
9d20: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
9d30: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
9d40: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
9d50: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
9d60: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
9d70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
9d80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9d90: 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b   OsFile journal;
9da0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
9db0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
9dc0: 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a  &journal, 0, siz
9dd0: 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20  eof(journal));. 
9de0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9df0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9e00: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
9e10: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
9e20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
9e40: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9e50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
9e60: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
9e70: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75  sterJournal(&jou
9e80: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
9e90: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
9ea0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
9eb0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
9ec0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
9ee0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9ef0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
9f00: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
9f10: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
9f20: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
9f30: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
9f40: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
9f50: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
9f60: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
9f70: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
9f80: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
9f90: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9fa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
9fb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
9fc0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9fd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9fe0: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
9ff0: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75   += (strlen(zJou
a000: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
a010: 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
a020: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
a030: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
a040: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
a050: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
a060: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a070: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
a080: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
a090: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
a0a0: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
a0b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a0c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
a0d0: 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  e every page in 
a0e0: 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20  the cache agree 
a0f0: 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20  with what is on 
a100: 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  disk.  In other 
a110: 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64  words,.** reread
a120: 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73   the disk to res
a130: 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  et the state of 
a140: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
a150: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a160: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
a170: 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63  rollback in whic
a180: 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69  h some of the di
a190: 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67  rty cache.** pag
a1a0: 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65  es had never bee
a1b0: 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  n written out to
a1c0: 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20   disk.  We need 
a1d0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
a1e0: 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  .** cache conten
a1f0: 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73  t and the easies
a200: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74  t way to do that
a210: 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68   is to reread th
a220: 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a  e old content.**
a230: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
a240: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
a250: 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  nt pager_reload_
a260: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
a270: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
a280: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
a290: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28  QLITE_OK;.  for(
a2a0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
a2b0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
a2c0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63  pNextAll){.    c
a2d0: 68 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f  har zBuf[SQLITE_
a2e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a  MAX_PAGE_SIZE];.
a2f0: 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69      if( !pPg->di
a300: 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
a310: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
a320: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
a330: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
a340: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a350: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
a360: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
a370: 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67  geSize*(i64)(pPg
a380: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
a390: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a3a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
a3b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a3c0: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  d(&pPager->fd, z
a3d0: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
a3e0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
a3f0: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45        TRACE3("RE
a400: 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
a410: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
a420: 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
a430: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f   break;.      CO
a450: 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66  DEC(pPager, zBuf
a460: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
a470: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a480: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
a490: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a4a0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
a4b0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
a4c0: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
a4d0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a4e0: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
a4f0: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d  Size) ){.      m
a500: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
a510: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
a520: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a530: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
a540: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
a550: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
a560: 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
a570: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a580: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a590: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a5a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
a5b0: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
a5c0: 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
a5d0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
a5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a5f0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
a600: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
a610: 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
a620: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a630: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
a640: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
a650: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
a660: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
a670: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
a680: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
a690: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
a6a0: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
a6b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
a6c0: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73   indicated..*/.s
a6d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a6e0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
a6f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
a700: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
a710: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
a720: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
a730: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a740: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
a750: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a760: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
a770: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  age);.}../*.** P
a780: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
a790: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
a7a0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
a7b0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
a7c0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
a7d0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
a7e0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
a7f0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
a800: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
a810: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
a820: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
a830: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
a840: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
a850: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
a860: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
a870: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a880: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a890: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
a8a0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
a8b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
a8c0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
a8d0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
a8e0: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
a8f0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
a900: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
a910: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a920: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
a930: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
a940: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a950: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
a960: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
a970: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
a980: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
a990: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
a9a0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
a9b0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
a9c0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
a9d0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
a9e0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
a9f0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
aa00: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
aa10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
aa20: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
aa30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
aa40: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
aa50: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
aa60: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
aa70: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
aa80: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
aa90: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
aaa0: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
aab0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aac0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
aad0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
aae0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
aaf0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
ab00: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
ab10: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
ab20: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
ab30: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
ab40: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
ab50: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
ab60: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
ab70: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
ab80: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
ab90: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
aba0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
abb0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
abc0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
abd0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
abe0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
abf0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
ac00: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
ac10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ac20: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
ac30: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
ac40: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
ac50: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
ac60: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
ac70: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
ac80: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
ac90: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
aca0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
acb0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
acc0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
acd0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
ace0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
acf0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
ad00: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
ad10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ad20: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
ad30: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
ad40: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
ad50: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
ad60: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
ad70: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
ad80: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
ad90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
ada0: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
adb0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
adc0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
add0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ade0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
adf0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
ae00: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
ae10: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ae20: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
ae30: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
ae40: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
ae50: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
ae60: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
ae70: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
ae80: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
ae90: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
aea0: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
aeb0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
aec0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
aed0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
aee0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
aef0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
af00: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
af10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
af20: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
af30: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
af40: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
af50: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
af60: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
af70: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
af80: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
af90: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
afa0: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
afb0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
afc0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
afd0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
afe0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
aff0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
b000: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
b010: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
b020: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
b030: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
b040: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
b050: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
b060: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
b070: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
b080: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
b090: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
b0a0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
b0b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
b0c0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
b0d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
b0e0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
b0f0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
b100: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
b110: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
b120: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
b130: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
b140: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
b150: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
b160: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
b170: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
b180: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
b190: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
b1a0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
b1b0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
b1c0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
b1d0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
b1e0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
b1f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b200: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
b210: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b220: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
b230: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
b240: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
b250: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b260: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b270: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
b280: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
b290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b2a0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
b2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
b2c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b2e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
b2f0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
b300: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b310: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
b320: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
b330: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
b340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b350: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
b360: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
b370: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
b380: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
b390: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
b3a0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
b3b0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
b3c0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
b3d0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
b3e0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
b3f0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
b400: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
b410: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b420: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b430: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
b440: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b450: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
b460: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
b470: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b480: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b490: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
b4a0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
b4b0: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
b4c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
b4d0: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
b4e0: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
b4f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
b500: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
b510: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
b520: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
b530: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
b540: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
b550: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
b560: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
b570: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
b580: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
b590: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70  MasterJournal(&p
b5a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
b5b0: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b5c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b5d0: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
b5e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
b5f0: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
b600: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
b610: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
b620: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
b630: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b640: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
b650: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
b660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b670: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b680: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
b690: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
b6a0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
b6b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
b6c0: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
b6d0: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
b6e0: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
b6f0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
b700: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
b710: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
b720: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
b730: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
b740: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
b750: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
b760: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
b770: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b780: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
b790: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
b7a0: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
b7b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b7c0: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
b7d0: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
b7e0: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
b7f0: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
b800: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
b810: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
b820: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
b830: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
b840: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
b850: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
b860: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
b870: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
b880: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
b890: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
b8a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b8b0: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
b8c0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
b8d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
b8e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
b8f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
b900: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
b910: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
b920: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b930: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
b940: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
b950: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
b960: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
b970: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
b980: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
b990: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
b9a0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
b9b0: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
b9c0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
b9d0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
b9e0: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
b9f0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
ba00: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
ba10: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
ba20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
ba30: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
ba40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ba50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ba60: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
ba70: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
ba80: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
ba90: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
baa0: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
bab0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
bac0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bad0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
bae0: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
baf0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
bb00: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
bb10: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
bb20: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
bb30: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
bb40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bb50: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
bb60: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
bb70: 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
bb80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
bb90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bba0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
bbb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
bbc0: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
bbd0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
bbe0: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
bbf0: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
bc00: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
bc10: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
bc20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc30: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
bc40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
bc50: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
bc60: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
bc70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20     }..    /* rc 
bc80: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
bc90: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f  &pPager->jfd, JO
bca0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bcb0: 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ger)); */.    if
bcc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bcd0: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
bce0: 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  ack;.  .    /* C
bcf0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
bd00: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
bd10: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
bd20: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
bd30: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
bd40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
bd50: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
bd60: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
bd70: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
bd80: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
bd90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
bda0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bdb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
bdc0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
bdd0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
bde0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
bdf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
be00: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
be10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
be20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
be30: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
be40: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
be50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
be60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
be70: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
be80: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
be90: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
bea0: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
beb0: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
bec0: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
bed0: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
bee0: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
bef0: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
bf00: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
bf10: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
bf20: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
bf30: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
bf40: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67  LITE_OK );.  pag
bf50: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
bf60: 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c  pPager);..end_pl
bf70: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
bf80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bf90: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
bfa0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
bfb0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
bfc0: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
bfd0: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
bfe0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
bff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
c000: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
c010: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
c020: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
c030: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
c040: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
c050: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
c060: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c070: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
c080: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
c090: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c0a0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
c0b0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
c0c0: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
c0d0: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
c0e0: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
c0f0: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
c100: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
c110: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c120: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
c130: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
c140: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
c150: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c160: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c170: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c180: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c190: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
c1a0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c1b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c1c0: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c1d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c1e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
c1f0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
c200: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c210: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c220: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
c230: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
c240: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
c250: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
c260: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
c270: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
c280: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c290: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
c2a0: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
c2b0: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
c2c0: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
c2d0: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
c2e0: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
c2f0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
c300: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
c310: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
c320: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
c330: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
c340: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
c350: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
c360: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
c370: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
c380: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
c390: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
c3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c3b0: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
c3c0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
c3d0: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
c400: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
c410: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
c420: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
c430: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c440: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
c450: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c470: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c480: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
c490: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c4a0: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
c4b0: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
c4c0: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
c4d0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
c4e0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
c4f0: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
c500: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c510: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c520: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
c530: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
c540: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
c550: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
c560: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
c570: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c580: 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68   written.  ** th
c590: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
c5a0: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65  nsaction, or the
c5b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c5c0: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
c5d0: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
c5e0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
c5f0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
c600: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
c610: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
c620: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
c630: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
c640: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
c650: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
c660: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
c670: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
c680: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c690: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
c6a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c6b0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
c6c0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c6d0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
c6e0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
c6f0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c700: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
c710: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
c720: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
c730: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
c740: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
c750: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
c760: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
c770: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
c780: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
c790: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
c7a0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
c7b0: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
c7c0: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
c7d0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
c7e0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c7f0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
c800: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
c810: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c820: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c830: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
c840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c850: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
c860: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
c870: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
c880: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
c890: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
c8a0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
c8b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
c8c0: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
c8d0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
c8e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
c8f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c900: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c910: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
c920: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
c930: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
c940: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c950: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
c960: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
c970: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
c980: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
c990: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
c9a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
c9b0: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
c9c0: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
c9d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c9e0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
c9f0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
ca00: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
ca10: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
ca20: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
ca30: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
ca40: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
ca50: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
ca60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
ca70: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
ca80: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
ca90: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
caa0: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
cab0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
cac0: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
cad0: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
cae0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
caf0: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
cb00: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
cb10: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
cb20: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
cb30: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
cb40: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
cb50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
cb60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
cb70: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
cb80: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
cb90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
cba0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
cbb0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
cbc0: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
cbd0: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73  >stmtCksum;.  as
cbe0: 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44  sert( JOURNAL_HD
cbf0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50  R_SZ(pPager)<(pP
cc00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
cc10: 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  ) );.  while( pP
cc20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc30: 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61   <= (hdrOff-(pPa
cc40: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
cc50: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
cc60: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
cc70: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
cc80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
cc90: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cca0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ccb0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ccc0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ccd0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cce0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
ccf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cd00: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
cd10: 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20 64   nRec;.    u32 d
cd20: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
cd30: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
cd40: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
cd50: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
cd60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cd70: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cd80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
cd90: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
cda0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
cdb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
cdc0: 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nRec==0 ){.    
cdd0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
cde0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cdf0: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
ce00: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
ce10: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65 63  }.    for(i=nRec
ce20: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
ce30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ce40: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
ce50: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ce60: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ce70: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
ce80: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
ce90: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
cea0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
ceb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cec0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
ced0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
cee0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
cef0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
cf00: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
cf10: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
cf20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cf30: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
cf40: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
cf50: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
cf60: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cf70: 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52  T;  /* bkpt-CORR
cf80: 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  UPT */.  }else{.
cf90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cfa0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
cfb0: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
cfc0: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
cfd0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
cfe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
cff0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
d000: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
d010: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
d020: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
d030: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d040: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
d050: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d060: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
d070: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
d080: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
d090: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
d0a0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
d0b0: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
d0c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
d0d0: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
d0e0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d0f0: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
d100: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
d110: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
d120: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
d130: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
d140: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
d150: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
d160: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
d170: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
d180: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
d190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d1a0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
d1b0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
d1c0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
d1e0: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
d1f0: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
d200: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
d210: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
d220: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
d230: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d240: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d250: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d260: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
d270: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
d280: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
d2a0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
d2b0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
d2c0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
d2d0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
d2e0: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
d2f0: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
d300: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
d310: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
d320: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
d330: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
d340: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
d350: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
d360: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
d370: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
d380: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
d390: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
d3a0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
d3b0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
d3c0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d3d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d3e0: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
d3f0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
d400: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
d410: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
d430: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
d440: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
d450: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
d460: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
d470: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
d480: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
d490: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
d4a0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
d4b0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
d4c0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
d4d0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
d4e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d4f0: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
d500: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
d510: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
d520: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
d530: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
d540: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
d550: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d560: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
d570: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
d580: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
d590: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
d5a0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
d5b0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
d5c0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
d5d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d5e0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
d5f0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d600: 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c  set_safety_level
d610: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d620: 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50  int level){.  pP
d630: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
d640: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
d650: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d660: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
d670: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
d680: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d690: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
d6a0: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
d6b0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
d6c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
d6d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
d6e0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
d6f0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
d700: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
d710: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
d720: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
d730: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
d740: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
d750: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
d760: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d770: 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
d780: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
d790: 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  nt = 0;../*.** O
d7a0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d7b0: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
d7c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
d7d0: 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20  e into zFile.** 
d7e0: 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61  (zFile must be a
d7f0: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
d800: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
d810: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
d820: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
d830: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
d840: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d850: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
d860: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
d870: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
d880: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
d890: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
d8a0: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
d8b0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
d8c0: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
d8d0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
d8e0: 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65   int sqlite3page
d8f0: 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20  r_opentemp(char 
d900: 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a  *zFile, OsFile *
d910: 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  fd){.  int cnt =
d920: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   8;.  int rc;.  
d930: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
d940: 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
d950: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
d960: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
d970: 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e   */.  do{.    cn
d980: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
d990: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
d9a0: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
d9b0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
d9c0: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
d9d0: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
d9e0: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
d9f0: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
da00: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
da10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
da20: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
da30: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
da40: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
da50: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
da60: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
da70: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
da80: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
da90: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
daa0: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
dab0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
dac0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
dad0: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
dae0: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
daf0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
db00: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
db10: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
db20: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
db30: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
db40: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
db50: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
db60: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
db70: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
db80: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
db90: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
dba0: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
dbb0: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
dbc0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
dbd0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
dbe0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dbf0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dc00: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
dc10: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
dc20: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
dc30: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
dc40: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
dc50: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
dc60: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
dc70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
dc80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
dc90: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
dca0: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
dcb0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dcc0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
dcd0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
dce0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
dcf0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
dd00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
dd10: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
dd20: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
dd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
dd40: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
dd50: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
dd60: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
dd70: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
dd80: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
dd90: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
dda0: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
ddb0: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
ddc0: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
ddd0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
dde0: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
ddf0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
de00: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
de10: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
de20: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
de30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
de40: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
de50: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
de60: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
de70: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
de80: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
de90: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
dea0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
deb0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
dec0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
ded0: 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72  ZE];..  *ppPager
dee0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
def0: 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64  fd, 0, sizeof(fd
df00: 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
df10: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
df20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
df30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
df40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
df50: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
df60: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
df70: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
df80: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
df90: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
dfa0: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
dfb0: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
dfc0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
dfd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22  = sqliteStrDup("
dfe0: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
dff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
e000: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
e010: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
e020: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e030: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e040: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
e050: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e070: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
e080: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
e090: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
e0a0: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a  dOnly);.      }.
e0b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
e0c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
e0d0: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
e0e0: 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a  emp, &fd);.    z
e0f0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
e100: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
e110: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
e120: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
e130: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
e140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e150: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
e160: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
e170: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e180: 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ame ){.    sqlit
e190: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
e1a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e1b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
e1c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e1d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e1e0: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
e1f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
e200: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e210: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
e220: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
e230: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
e240: 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
e250: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
e260: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
e270: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
e280: 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29   if( pPager==0 )
e290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
e2a0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
e2b0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
e2c0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
e2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e2e0: 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  M;.  }.  TRACE3(
e2f0: 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
e300: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
e310: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e320: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
e330: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
e340: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
e350: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
e360: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
e370: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
e380: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
e390: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
e3a0: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
e3b0: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
e3c0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e3d0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e3e0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
e3f0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
e400: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e410: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
e420: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
e430: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
e440: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
e450: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
e460: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
e470: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
e480: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
e490: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e4a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
e4b0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
e4c0: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
e4d0: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
e4e0: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
e4f0: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
e500: 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  ;.#if OS_UNIX.  
e510: 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61 67 65  pPager->fd.pPage
e520: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
e530: 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  if.  pPager->jou
e540: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
e550: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
e560: 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
e570: 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
e580: 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
e590: 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20  = noReadlock && 
e5a0: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67  readOnly;.  pPag
e5b0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
e5c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e5d0: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61  InUse = 0;.  pPa
e5e0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
e5f0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
e600: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
e610: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
e620: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
e630: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  AGE_SIZE;.  pPag
e640: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
e650: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e660: 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  JSize = 0;.  pPa
e670: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
e680: 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61    pPager->nMaxPa
e690: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
e6a0: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
e6b0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e6c0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
e6d0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
e6e0: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
e6f0: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
e700: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
e710: 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
e720: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
e730: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
e740: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e750: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e760: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
e770: 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
e780: 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
e790: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
e7a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30  pPager->noSync?0
e7b0: 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  :1);.  pPager->p
e7c0: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
e7d0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
e7e0: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
e7f0: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
e800: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
e810: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
e820: 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72  Extra);.  pPager
e830: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
e840: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
e850: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
e860: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
e870: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
e880: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
e890: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
e8a0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
e8b0: 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
e8c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e8d0: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
e8e0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
e8f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e900: 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68  3pager_set_busyh
e910: 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
e920: 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
e930: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
e940: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
e950: 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
e960: 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
e970: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
e980: 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
e990: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
e9a0: 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
e9b0: 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
e9c0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
e9d0: 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
e9e0: 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
e9f0: 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
ea00: 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
ea10: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
ea20: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
ea30: 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
ea40: 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
ea50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
ea60: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
ea70: 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
ea80: 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65  sult sqlite3page
ea90: 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  r_close().  .** 
eaa0: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
eab0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
eac0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
ead0: 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
eae0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65  ite3pager_set_de
eaf0: 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
eb00: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
eb10: 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Desc)(void*,int)
eb20: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
eb30: 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
eb40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
eb50: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
eb60: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
eb70: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
eb80: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
eb90: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
eba0: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
ebb0: 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
ebc0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
ebd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
ebe0: 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
ebf0: 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
ec00: 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
ec10: 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
ec20: 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
ec30: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
ec40: 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
ec50: 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
ec60: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
ec70: 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
ec80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
ec90: 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65  ager_set_reinite
eca0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
ecb0: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
ecc0: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20  (void*,int)){.  
ecd0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
ece0: 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
ecf0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
ed00: 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e  ge size.  Return
ed10: 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20   the new size.  
ed20: 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
ed30: 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  ew page.** size 
ed40: 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  is inappropriate
ed50: 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
ed60: 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
ed70: 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  is selected.** a
ed80: 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  nd returned..*/.
ed90: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
eda0: 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 50 61  _set_pagesize(Pa
edb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
edc0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73   pageSize){.  as
edd0: 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d  sert( pageSize>=
ede0: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
edf0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
ee00: 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21  _SIZE );.  if( !
ee10: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
ee20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
ee30: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
ee40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ee50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
ee60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
ee70: 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
ee80: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
ee90: 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
eea0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
eeb0: 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
eec0: 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72 20 63   to.  No error c
eed0: 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
eee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
eef0: 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68  pager_read_fileh
ef00: 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
ef10: 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
ef20: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
ef30: 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  ){.  memset(pDes
ef40: 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20  t, 0, N);.  if( 
ef50: 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20  MEMDB==0 ){.    
ef60: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
ef70: 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
ef80: 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64     sqlite3OsRead
ef90: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  (&pPager->fd, pD
efa0: 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a  est, N);.  }.}..
efb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
efc0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
efd0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
efe0: 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
eff0: 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
f000: 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
f010: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
f020: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
f030: 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
f040: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
f050: 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
f060: 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
f070: 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
f080: 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
f090: 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
f0a0: 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
f0b0: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
f0c0: 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
f0d0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
f0e0: 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
f0f0: 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
f100: 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
f110: 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
f120: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
f130: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
f140: 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73 73 65  .  i64 n;.  asse
f150: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
f160: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
f170: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
f180: 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
f190: 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
f1a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
f1b0: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
f1c0: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
f1d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
f1e0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
f1f0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
f200: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
f210: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
f220: 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
f230: 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
f240: 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
f250: 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
f260: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f280: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
f290: 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
f2a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
f2b0: 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
f2c0: 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
f2d0: 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
f2e0: 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
f2f0: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    n++;.  }.  ret
f300: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
f310: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
f320: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
f330: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
f340: 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55  ger*);.../*.** U
f350: 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
f360: 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
f370: 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
f380: 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
f390: 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
f3a0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
f3b0: 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
f3c0: 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
f3d0: 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
f3e0: 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
f3f0: 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28  3pager_movepage(
f400: 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
f410: 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
f420: 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
f430: 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
f440: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
f450: 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
f460: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
f470: 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
f480: 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
f490: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
f4a0: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
f4b0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
f4c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
f4d0: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
f4e0: 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  is page is not i
f4f0: 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  n any hash chain
f500: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
f510: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
f520: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
f530: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
f540: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
f550: 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
f560: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
f570: 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
f580: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
f590: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 50  sh[pager_hash(pP
f5a0: 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29  g->pgno)]!=pPg )
f5b0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
f5c0: 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
f5d0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
f5e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
f5f0: 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  nt h = pager_has
f600: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  h(pPg->pgno);.  
f610: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f620: 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20  ->aHash[h]==pPg 
f630: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
f640: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
f650: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20  NextHash;.  }.. 
f660: 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
f670: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
f680: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
f690: 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h = 0;.}../*.** 
f6a0: 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
f6b0: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
f6c0: 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
f6d0: 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
f6e0: 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
f6f0: 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
f700: 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
f710: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
f720: 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
f730: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
f740: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
f750: 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
f760: 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
f770: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
f780: 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
f790: 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
f7a0: 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
f7b0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
f7c0: 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
f7d0: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
f7e0: 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
f7f0: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
f800: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
f810: 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
f820: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
f830: 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
f840: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
f850: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
f860: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
f870: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
f880: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
f890: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
f8a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
f8b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f8c0: 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
f8d0: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
f8e0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
f8f0: 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
f900: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
f910: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
f920: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
f930: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
f940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
f950: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
f960: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
f970: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
f980: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
f990: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
f9a0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
f9b0: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
f9c0: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
f9d0: 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
f9e0: 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
f9f0: 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
fa00: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
fa10: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
fa20: 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  DB./*.** This ro
fa30: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
fa40: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
fa50: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
fa60: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
fa70: 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
fa80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fa90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
faa0: 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
fab0: 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
fac0: 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
fad0: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
fae0: 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
faf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
fb00: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
fb10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
fb20: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
fb30: 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
fb40: 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
fb50: 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
fb60: 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
fb70: 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
fb80: 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
fb90: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
fba0: 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
fbb0: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
fbc0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
fbd0: 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
fbe0: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
fbf0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
fc00: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
fc10: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
fc20: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
fc30: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
fc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
fc50: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
fc60: 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
fc70: 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
fc80: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
fc90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
fca0: 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
fcb0: 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
fcc0: 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
fcd0: 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
fce0: 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
fcf0: 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
fd00: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
fd10: 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
fd20: 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
fd30: 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
fd40: 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
fd50: 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
fd60: 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
fd70: 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
fd80: 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
fd90: 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
fda0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
fdb0: 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
fdc0: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
fdd0: 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
fde0: 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
fdf0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
fe00: 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
fe10: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
fe20: 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
fe40: 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
fe50: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
fe60: 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
fe70: 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
fe80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
fe90: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
fea0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
feb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
fec0: 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
fed0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
fee0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
fef0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
ff00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
ff10: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  (&pPager->fd, lo
ff20: 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
ff30: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ff40: 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49  BUSY && sqlite3I
ff50: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
ff60: 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
ff70: 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ndler) );.    if
ff80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ff90: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ffa0: 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70  >state = locktyp
ffb0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
ffc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ffd0: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
ffe0: 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
fff0: 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
10000 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
10010 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
10020 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
10030 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
10040 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10050 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
10060 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
10070 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
10080 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
10090 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
100a0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
100b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
100c0 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
100d0 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
100e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
100f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10100 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
10110 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10120 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
10130 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
10140 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
10150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10160 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
10170 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
10180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
101a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
101b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
101c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
101d0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
101e0 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
101f0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
10200 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
10210 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
10220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10230 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10240 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
10250 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
10260 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
10270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10280 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
10290 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
102a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
102b0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
102c0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
102d0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
102e0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
102f0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
10300 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
10310 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
10320 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10330 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
10340 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
10350 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
10360 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
10370 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
10380 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
10390 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
103a0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
103b0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
103c0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
103d0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
103e0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
103f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
10400 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
10410 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
10420 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
10430 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67  3pager_close(Pag
10440 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
10450 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
10460 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  t;.  switch( pPa
10470 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
10480 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
10490 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
104a0 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
104b0 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
104c0 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
104d0 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
104e0 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
104f0 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
10500 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
10510 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
10520 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
10530 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
10540 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
10550 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
10560 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
10570 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
10580 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 28  QLITE_TEST) && (
10590 64 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29  defined(OS_UNIX)
105a0 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57   || defined(OS_W
105b0 49 4e 29 29 0a 20 20 20 20 20 20 65 78 74 65 72  IN)).      exter
105c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
105d0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
105e0 20 20 20 20 20 20 69 6e 74 20 69 6f 65 72 72 5f        int ioerr_
105f0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
10600 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
10610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f        sqlite3_io
10620 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10630 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   -1;.#endif.    
10640 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
10650 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
10660 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
10670 49 54 45 5f 54 45 53 54 29 20 26 26 20 28 64 65  ITE_TEST) && (de
10680 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c  fined(OS_UNIX) |
10690 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e  | defined(OS_WIN
106a0 29 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  )).      sqlite3
106b0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
106c0 67 20 3d 20 69 6f 65 72 72 5f 63 6e 74 3b 0a 23  g = ioerr_cnt;.#
106d0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
106e0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
106f0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
10700 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
10710 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
10720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10730 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
10740 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10750 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
10760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10770 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48     case PAGER_SH
10780 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66  ARED: {.      if
10790 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
107a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
107b0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
107c0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
107d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
107e0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
107f0 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
10800 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
10810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10820 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61   }.  for(pPg=pPa
10830 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
10840 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e  pPg=pNext){.#ifn
10850 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69  def NDEBUG.    i
10860 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
10870 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
10880 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
10890 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
108a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
108b0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
108c0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
108d0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
108e0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
108f0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
10900 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
10910 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  f.    pNext = pP
10920 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10930 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
10940 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
10950 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
10960 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
10970 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10980 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 28 70 50 61  >errMask || (pPa
10990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
109a0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
109b0 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
109c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
109d0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
109e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
109f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
10a00 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
10a10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
10a20 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
10a30 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
10a40 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
10a50 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
10a60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
10a70 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
10a80 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
10a90 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
10aa0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
10ab0 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
10ac0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
10ad0 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
10ae0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
10af0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
10b00 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
10b10 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
10b20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10b30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10b40 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
10b50 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
10b60 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
10b70 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70  */.Pgno sqlite3p
10b80 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
10b90 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
10ba0 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
10bb0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
10bc0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
10bd0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
10be0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
10bf0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
10c00 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
10c10 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
10c20 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
10c30 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
10c40 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
10c50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
10c60 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
10c70 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
10c80 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
10c90 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
10ca0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
10cb0 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
10cc0 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
10cd0 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
10ce0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
10cf0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
10d00 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
10d10 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
10d20 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
10d30 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
10d40 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
10d50 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
10d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d70 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
10d80 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10d90 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
10da0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
10db0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
10dc0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
10dd0 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
10de0 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
10df0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10e00 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
10e10 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
10e20 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
10e30 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
10e40 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
10e50 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
10e60 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
10e70 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
10e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
10e90 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
10ea0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
10eb0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
10ec0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10ed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10ee0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
10ef0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
10f00 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
10f10 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
10f20 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
10f30 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
10f40 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
10f50 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
10f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
10f70 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
10f80 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10f90 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
10fa0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
10fb0 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
10fc0 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
10fd0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
10fe0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
10ff0 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
11000 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
11010 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
11020 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
11030 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
11040 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11050 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
11060 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
11070 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
11080 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
11090 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
110a0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
110b0 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
110c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
110d0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
110e0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
110f0 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
11100 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
11110 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
11120 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
11130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11140 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70  ager_ref(void *p
11150 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11160 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11170 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61  HDR(pData);.  pa
11180 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
11190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
111a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
111b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
111c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
111d0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
111e0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
111f0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
11200 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
11210 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
11220 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
11230 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
11240 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
11250 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
11260 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11270 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
11280 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
11290 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
112a0 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
112b0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
112c0 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
112d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
112e0 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
112f0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
11300 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
11310 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
11320 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
11330 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
11340 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
11350 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
11360 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
11370 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
11380 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
11390 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
113a0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
113b0 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
113c0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
113d0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
113e0 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
113f0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
11400 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
11410 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
11420 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
11430 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
11440 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
11450 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
11460 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
11470 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
11480 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
11490 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
114a0 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
114b0 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
114c0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
114d0 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
114e0 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
114f0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
11500 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
11510 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
11520 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
11530 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
11540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
11550 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
11560 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
11570 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
11580 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
11590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
115a0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
115b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
115c0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
115d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
115e0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
115f0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
11600 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
11610 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
11620 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
11630 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
11640 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
11650 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
11660 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
11670 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
11680 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11690 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
116a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
116b0 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
116c0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
116d0 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
116e0 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
116f0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
11700 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
11710 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
11720 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11730 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
11740 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
11750 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
11760 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
11770 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
11780 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
11790 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
117a0 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
117b0 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
117c0 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
117d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
117e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
117f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11800 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
11810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
11820 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
11830 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
11840 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
11850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11870 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
11880 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
11890 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
118a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
118b0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
118c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
118d0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
118e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
118f0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
11900 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
11910 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
11920 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
11930 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
11940 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
11950 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
11960 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
11970 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
11980 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
11990 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
119a0 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
119b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
119c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
119d0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32            TRACE2
119e0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
119f0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
11a00 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
11a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a20 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
11a30 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
11a40 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
11a50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
11a70 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
11a80 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11ab0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
11ac0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
11ad0 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ic));.        if
11ae0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11af0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
11b00 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
11b10 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11b20 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
11b30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11b40 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
11b50 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
11b60 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
11b70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11b90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
11bb0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
11bc0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
11bd0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
11be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11bf0 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
11c00 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
11c10 6c 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  lSync);.      if
11c20 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
11c30 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
11c40 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
11c50 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
11c60 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
11c70 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
11c80 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
11c90 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
11ca0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
11cb0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
11cc0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
11cd0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
11ce0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
11cf0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
11d00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
11d10 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
11d20 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
11d30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11d40 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
11d50 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
11d60 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
11d70 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
11d80 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
11d90 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
11da0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
11db0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
11dc0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
11dd0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
11de0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
11df0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
11e00 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
11e10 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
11e20 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
11e30 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
11e40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11e50 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
11e60 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
11e70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11e90 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
11ea0 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
11eb0 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
11ec0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
11ed0 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
11ee0 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
11ef0 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
11f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
11f10 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
11f20 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
11f30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11f40 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
11f50 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
11f60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
11f70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
11f80 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
11f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11fa0 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
11fb0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
11fc0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
11fd0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
11fe0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
11ff0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
12000 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
12010 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
12020 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
12030 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
12040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
12050 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
12060 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
12070 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
12080 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
12090 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
120a0 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
120b0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
120c0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
120d0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
120e0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
120f0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
12100 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
12110 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
12120 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
12130 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
12140 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
12150 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
12160 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
12170 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
12180 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
12190 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
121a0 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
121b0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
121c0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
121d0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
121e0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
121f0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
12200 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
12210 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12220 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
12230 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
12240 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
12250 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
12260 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
12270 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
12280 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12290 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
122a0 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
122b0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
122c0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
122d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
122e0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
122f0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
12300 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
12310 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
12320 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
12330 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
12340 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
12350 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
12360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12370 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
12380 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c   rc;.  }..  whil
12390 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
123a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
123b0 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d  irty );.    rc =
123c0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
123d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69  pPager->fd, (pLi
123e0 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
123f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
12400 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
12410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12420 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12430 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
12440 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
12450 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
12460 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
12470 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
12480 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
12490 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
124a0 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
124b0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
124c0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
124d0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
124e0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
124f0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
12500 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
12510 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
12520 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12530 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
12540 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
12550 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12560 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
12570 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
12580 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
12590 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25   TRACE3("STORE %
125a0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
125b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
125c0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
125d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
125e0 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
125f0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
12600 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72  A(pList), pPager
12610 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12620 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
12630 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12640 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
12650 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45  no, 0);.      TE
12660 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
12670 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23  nWrite);.    }.#
12680 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12690 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
126a0 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
126b0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
126c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
126d0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
126e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
126f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12700 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
12710 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
12720 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
12730 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
12740 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
12750 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
12760 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
12770 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
12780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12790 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
127a0 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
127b0 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
127c0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
127d0 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
127e0 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
127f0 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
12800 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
12810 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
12820 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
12830 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
12840 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
12850 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
12860 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
12870 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20  r){.  PgHdr *p, 
12880 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20  *pList;.  pList 
12890 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  = 0;.  for(p=pPa
128a0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
128b0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
128c0 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29    if( p->dirty )
128d0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74  {.      p->pDirt
128e0 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  y = pList;.     
128f0 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
12900 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
12910 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  List;.}../*.** R
12920 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12930 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
12940 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
12950 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
12960 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
12970 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
12980 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
12990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
129a0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
129b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
129c0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
129d0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
129e0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
129f0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
12a00 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
12a10 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
12a20 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
12a30 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
12a40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12a60 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
12a70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12a80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
12a90 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
12aa0 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
12ab0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
12ac0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
12ad0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12ae0 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
12af0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26 70  kReservedLock(&p
12b00 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
12b10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
12b20 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
12b30 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
12b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
12b50 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
12b60 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74  ournal);.    ret
12b70 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
12b80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12b90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
12ba0 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
12bb0 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
12bc0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
12bd0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
12be0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
12bf0 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
12c00 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
12c10 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
12c20 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
12c30 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
12c40 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
12c50 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
12c60 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
12c70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
12c80 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
12c90 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
12ca0 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
12cb0 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
12cc0 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
12cd0 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
12ce0 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
12cf0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12d00 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
12d10 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
12d20 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
12d30 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
12d40 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
12d50 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
12d60 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
12d70 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
12d80 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
12d90 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
12da0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
12db0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
12dc0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
12dd0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
12de0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12df0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
12e00 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
12e10 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
12e20 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
12e30 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
12e40 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
12e50 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
12e60 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
12e70 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
12e80 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
12e90 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
12ea0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
12eb0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
12ec0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
12ed0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
12ee0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
12ef0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
12f00 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
12f10 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
12f20 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
12f30 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
12f40 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
12f50 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
12f60 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
12f70 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
12f80 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
12f90 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
12fa0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
12fb0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
12fc0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
12fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
12fe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
12ff0 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
13000 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
13010 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
13020 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
13030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
13040 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
13050 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
13060 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
13070 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
13080 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
13090 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
130a0 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
130b0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
130c0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
130d0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
130e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
130f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
13100 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13110 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
13120 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
13130 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
13140 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
13150 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
13160 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
13170 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
13180 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
13190 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
131a0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
131b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
131c0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
131d0 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
131e0 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
131f0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
13200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13210 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
13220 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
13230 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
13240 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
13250 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
13260 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
13270 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
13280 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13290 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
132a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
132b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
132c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
132d0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
132e0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
132f0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
13300 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
13310 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
13320 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
13330 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
13340 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
13350 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
13360 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
13370 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
13380 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  .       int rc;.
13390 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
133a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
133b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
133c0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
133d0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
133e0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
133f0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
13400 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
13410 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
13420 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  o the.       ** 
13430 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
13440 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
13450 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
13460 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
13470 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13480 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
13490 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
134a0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
134b0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61  the.       ** da
134c0 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
134d0 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
134e0 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
134f0 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
13500 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
13510 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
13520 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
13530 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
13540 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
13550 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
13560 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  .       ** secon
13570 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
13580 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
13590 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
135a0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
135b0 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
135c0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
135d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
135e0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a  e file..       *
135f0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
13600 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
13610 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
13620 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
13630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73  OK ){.         s
13650 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
13660 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
13670 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
13680 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13690 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
136a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
136b0 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
136c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
136d0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
136e0 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
136f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
13700 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
13710 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
13720 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
13730 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
13740 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
13750 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
13760 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68   **.       ** Th
13770 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
13780 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13790 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
137a0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a  .  The.       **
137b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
137c0 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
137d0 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
137e0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
137f0 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74         ** a writ
13800 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65  e lock, so there
13810 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68   is never any ch
13820 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ance of two or m
13830 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72  ore.       ** pr
13840 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
13850 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
13860 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
13870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
13880 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13890 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72  nReadOnly(pPager
138a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
138b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
138c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
138d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
138e0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
138f0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
13900 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
13910 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
13920 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
13930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13940 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
13950 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
13960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
13970 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
13980 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13990 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
139a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
139b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
139c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
139d0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
139e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
139f0 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
13a00 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
13a10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
13a20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
13a30 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
13a40 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
13a50 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
13a60 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
13a70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
13a80 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
13a90 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
13aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ab0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13ac0 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
13ad0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
13ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
13af0 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
13b00 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
13b10 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
13b20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
13b30 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26      if( MEMDB &&
13b40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
13b50 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
13b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
13b70 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
13b80 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
13b90 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
13ba0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
13bb0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
13bc0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13bd0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
13be0 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
13bf0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
13c00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
13c10 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
13c20 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46  ge || pPager->pF
13c30 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42  irst==0 || MEMDB
13c40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
13c50 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
13c60 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  /.      pPg = sq
13c70 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
13c80 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
13c90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
13cc0 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
13cd0 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
13d00 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
13d10 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
13d20 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
13d30 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
13d40 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
13d50 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
13d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13d80 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
13d90 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
13da0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
13db0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
13dc0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
13dd0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
13de0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
13df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13e00 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
13e10 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
13e20 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
13e30 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
13e40 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
13e50 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
13e60 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
13e70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
13e80 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
13e90 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
13ea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13eb0 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
13ec0 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
13ed0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
13ee0 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  MaxPage++;.     
13ef0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13f00 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61      /* Find a pa
13f10 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
13f20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
13f30 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13f40 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75  ot.      ** requ
13f50 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
13f60 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
13f70 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
13f80 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61  .      pPg = pPa
13f90 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13fa0 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  d;..      /* If 
13fb0 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
13fc0 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
13fd0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
13fe0 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20  n fsync().      
13ff0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
14000 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
14010 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
14020 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
14030 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f       ** very slo
14040 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
14050 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
14060 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
14070 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a  ometimes.      *
14080 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
14090 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lped..      */. 
140a0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
140b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
140c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
140d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
140e0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
140f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14100 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
14120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14130 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
14140 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
14150 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14170 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
14180 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
14190 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
141a0 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75  to the..  ** jou
141b0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
141c0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
141d0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
141e0 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20  a journal..  ** 
141f0 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
14200 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
14210 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
14220 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a   that have..  **
14230 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
14240 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
14250 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
14260 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20  he header is..  
14270 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
14280 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14290 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
142a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
142b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
142c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
142d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
142e0 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
142f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14300 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
14310 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
14320 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
14330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14340 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14350 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
14360 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14370 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
14380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14390 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
143a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
143b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
143c0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
143d0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
143e0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
143f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14400 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
14410 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
14420 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
14430 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
14440 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
14450 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
14460 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
14470 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
14480 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
14490 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
144a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
144b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
144c0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
144d0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
144e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
144f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
14500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14510 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14520 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
14530 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
14540 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
14550 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
14560 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14570 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
14580 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
14590 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
145a0 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
145b0 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
145c0 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
145d0 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
145e0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
145f0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
14600 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
14610 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
14620 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
14630 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
14640 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
14650 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
14660 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
14670 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
14680 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
14690 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
146a0 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
146b0 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
146c0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
146d0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
146e0 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
146f0 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
14700 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14710 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
14720 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
14730 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
14740 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
14750 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14760 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
14770 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
14780 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
14790 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
147a0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
147b0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
147c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
147d0 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
147e0 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52  .      TEST_INCR
147f0 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b  (pPager->nOvfl);
14800 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
14810 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
14820 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
14830 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
14840 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
14850 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
14860 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
14870 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
14880 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
14890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
148a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
148b0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
148c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
148d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
148e0 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
148f0 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
14900 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
14910 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
14920 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
14930 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
14940 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
14950 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14960 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
14970 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
14980 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
14990 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
149a0 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
149b0 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
149c0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
149d0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
149e0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
149f0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
14a00 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
14a10 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
14a20 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
14a30 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
14a40 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
14a50 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
14a60 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
14a70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
14a80 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
14a90 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
14aa0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
14ab0 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
14ac0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
14ad0 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
14ae0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
14af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14b00 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
14b10 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
14b20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
14b30 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
14b40 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
14b50 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
14b60 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
14b70 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
14b80 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
14b90 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
14ba0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
14bb0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
14bc0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask!=0 ){.      
14bd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
14be0 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
14bf0 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63  (pPg));.      rc
14c00 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
14c10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14c30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14c40 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
14c50 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e  pPager)<(int)pgn
14c60 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  o ){.      memse
14c70 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
14c80 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
14c90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
14cb0 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72   rc;.      asser
14cc0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
14cd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14ce0 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
14cf0 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
14d00 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
14d10 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
14d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14d40 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
14d50 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
14d60 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
14d70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
14d90 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70  ACE3("FETCH %d p
14da0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
14db0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
14dc0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
14dd0 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
14de0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
14df0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
14e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14e20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a    i64 fileSize;.
14e30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14e40 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
14e50 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53  Pager->fd,&fileS
14e60 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ize)!=SQLITE_OK.
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14e80 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f  | fileSize>=pgno
14e90 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
14ea0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
14eb0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
14ec0 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
14ed0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
14ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f00 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
14f10 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
14f20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
14f30 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
14f40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14f50 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70       TEST_INCR(p
14f60 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
14f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
14f80 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
14f90 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
14fa0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
14fb0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
14fc0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
14fd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
14fe0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
14ff0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
15000 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  */.    TEST_INCR
15010 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
15020 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
15030 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
15040 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
15050 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
15060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15070 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
15080 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
15090 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
150a0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
150b0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
150c0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
150d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
150e0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
150f0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
15100 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
15110 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
15120 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
15130 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
15140 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
15150 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
15160 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
15170 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
15180 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
15190 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
151a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
151b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
151c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
151d0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
151e0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
151f0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
15200 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
15210 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
15220 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
15230 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
15240 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61  .void *sqlite3pa
15250 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
15260 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
15270 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
15280 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
15290 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
152a0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
152b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
152c0 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
152d0 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
152e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
152f0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
15300 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
15310 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
15320 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
15330 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
15340 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
15350 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
15360 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
15370 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
15380 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
15390 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
153a0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
153b0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
153c0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
153d0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
153e0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
153f0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
15400 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
15410 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
15420 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
15430 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
15440 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
15450 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
15460 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
15470 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
15480 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
15490 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
154a0 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
154b0 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
154c0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
154d0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
154e0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
154f0 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
15500 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
15510 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
15520 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
15530 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
15540 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
15550 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
15560 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
15570 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
15580 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
15590 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
155a0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
155b0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
155c0 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
155d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
155e0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
155f0 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
15600 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
15610 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
15620 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
15630 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
15640 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
15650 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
15660 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
15670 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
15680 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
15690 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
156a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
156b0 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
156c0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
156d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
156e0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
156f0 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
15700 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
15710 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
15720 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
15730 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
15740 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15750 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
15760 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
15770 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
15780 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
15790 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
157a0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
157b0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
157c0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
157d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
157e0 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
157f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15800 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
15810 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  DB ){.      page
15820 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
15830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15850 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
15860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15870 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
15880 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
15890 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
158a0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
158b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
158c0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
158d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
158e0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
158f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
15900 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
15910 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
15920 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
15930 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
15940 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
15950 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
15960 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
15970 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
15980 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
15990 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
159a0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
159b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
159c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
159d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
159e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
159f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
15a00 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
15a10 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
15a20 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15a30 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
15a40 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
15a50 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
15a60 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
15a70 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
15a80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
15a90 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
15aa0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
15ab0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
15ac0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15ad0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
15ae0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
15af0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
15b00 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
15b10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15b20 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70  , &pPager->jfd,p
15b30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
15b40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
15b50 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
15b60 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
15b70 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
15b80 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
15b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ba0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
15bb0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
15bc0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 53 45 54  urnal;.  }.  SET
15bd0 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61 67 65 72  _FULLSYNC(pPager
15be0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
15bf0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 53 45 54 5f  ullSync);.  SET_
15c00 46 55 4c 4c 53 59 4e 43 28 70 50 61 67 65 72 2d  FULLSYNC(pPager-
15c10 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
15c20 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  lSync);.  sqlite
15c30 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
15c40 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
15c50 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ory, &pPager->jf
15c60 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  d);.  pPager->jo
15c70 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
15c80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15c90 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
15ca0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
15cb0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
15cc0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
15cd0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
15ce0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
15cf0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
15d00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
15d10 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
15d20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  );.    goto fail
15d30 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
15d40 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
15d50 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
15d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
15d70 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
15d80 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
15d90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
15da0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
15db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15dc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15dd0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
15de0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
15df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15e00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
15e10 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
15e20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15e40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15e50 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
15e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15e70 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
15e80 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
15e90 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
15ea0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
15eb0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
15ec0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 4f   = 0;.  sqlite3O
15ed0 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
15ee0 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
15ef0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15f00 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
15f10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15f20 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
15f30 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
15f40 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
15f50 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
15f60 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
15f70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15f80 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
15f90 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
15fa0 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c  _commit() is cal
15fb0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
15fc0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15fd0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
15fe0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
15ff0 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20  ager_close() is 
16000 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
16010 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
16020 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
16030 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
16040 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
16050 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
16060 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
16070 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
16080 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
16090 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
160a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
160b0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
160c0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
160d0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
160e0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
160f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16100 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
16110 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
16120 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
16130 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
16140 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16150 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
16160 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
16170 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
16180 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
16190 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
161a0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
161b0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
161c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
161d0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
161e0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
161f0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
16200 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
16210 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
16220 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
16230 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
16240 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
16250 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
16260 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
16270 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
16280 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
16290 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
162a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
162b0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
162c0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
162d0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
162e0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
162f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
16300 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
16310 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
16320 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
16330 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16340 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
16350 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
16360 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
16370 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
16380 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
16390 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
163a0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
163b0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
163c0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
163d0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
163e0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
163f0 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64   exFlag){.  PgHd
16400 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
16410 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
16420 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16430 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
16440 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16450 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
16460 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
16470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16480 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
16490 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
164a0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
164b0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
164c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
164d0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
164e0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
164f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
16500 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
16510 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
16520 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
16530 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
16540 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
16550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16560 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
16570 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
16580 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
16590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
165a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
165b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
165c0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
165d0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
165e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
165f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
16600 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
16610 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16620 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16650 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
16670 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
16680 20 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e      TRACE2("TRAN
16690 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
166a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
166b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
166c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
166d0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
166e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
166f0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
16700 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
16710 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16730 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
16740 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
16750 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
16760 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
16770 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
16780 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
16790 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
167a0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
167b0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
167c0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
167d0 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
167e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
167f0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
16800 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
16810 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
16820 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
16830 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
16840 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16850 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
16860 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
16870 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
16880 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
16890 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
168a0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
168b0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
168c0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
168d0 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
168e0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
168f0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
16900 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
16910 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
16920 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
16930 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
16940 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
16950 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
16960 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
16970 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
16980 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
16990 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
169a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
169b0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
169c0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
169d0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
169e0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
169f0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
16a00 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
16a10 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
16a20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
16a30 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
16a40 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
16a50 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
16a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16a70 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
16a80 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16a90 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
16aa0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
16ab0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
16ac0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
16ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16ae0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
16af0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
16b00 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
16b10 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
16b20 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
16b30 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
16b40 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
16b50 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
16b60 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
16b70 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
16b80 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
16b90 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
16ba0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
16bb0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
16bc0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
16bd0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
16be0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
16bf0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
16c00 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
16c10 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
16c20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
16c30 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
16c40 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
16c50 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50  Pg->inStmt || pP
16c60 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
16c70 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
16c80 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
16c90 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
16ca0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
16cb0 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
16cc0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
16cd0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
16ce0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
16cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
16d00 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
16d10 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
16d20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
16d30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
16d40 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
16d50 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
16d60 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
16d70 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
16d80 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
16d90 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
16da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16db0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
16dc0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
16de0 5f 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29  _begin(pData, 0)
16df0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16e20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
16e30 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16e40 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
16e50 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
16e60 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
16e70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
16e80 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
16e90 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
16ea0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
16eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16ec0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16ed0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16ee0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
16ef0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
16f00 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
16f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
16f20 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
16f30 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
16f40 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
16f50 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
16f60 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
16f70 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
16f80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
16f90 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
16fa0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
16fb0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
16fc0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
16fd0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
16fe0 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
16ff0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
17000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
17010 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
17020 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
17030 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
17040 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
17050 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
17060 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
17070 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
17080 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32  zPg;.        u32
17090 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20   saved;.        
170a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
170b0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
170c0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
170d0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
170e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
170f0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
17100 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
17110 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17120 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
17130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
17140 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
17150 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
17160 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
17170 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
17180 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
17190 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69           if( pHi
171a0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
171b0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
171c0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
171d0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
171e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
171f0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ze);.          }
17200 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17210 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
17220 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43  sum;.          C
17230 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
17240 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
17250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
17260 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
17270 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
17280 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  no, pData);.    
17290 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
172a0 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
172b0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
172c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
172d0 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70  e32bits(cksum, p
172e0 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
172f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
17300 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
17310 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
17320 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
17330 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
17340 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , -4);.         
17350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
17360 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
17370 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74  d, &((char*)pDat
17380 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20  a)[-4], szPg);. 
17390 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
173a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
173b0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54  zPg;.          T
173c0 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE4("JOURNAL %
173d0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
173e0 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
173f0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
17400 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17410 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
17420 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
17430 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
17440 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
17450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17460 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
17470 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
17480 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  r) = saved;.    
17490 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
174a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
174b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
174c0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
174d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
174e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
174f0 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
17500 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ULL;.           
17510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17530 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
17540 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17550 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17560 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
17570 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
17580 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
17590 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
175a0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
175b0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
175c0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
175d0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
175e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
175f0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
17600 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
17610 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
17620 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
17630 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
17640 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
17650 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
17660 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17670 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
17680 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
17690 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
176a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
176b0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
176c0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54  oSync;.        T
176d0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
176e0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
176f0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
17700 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
17710 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17720 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
17730 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
17740 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
17750 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
17760 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17770 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17780 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
17790 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
177a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
177b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
177c0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
177d0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
177e0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
177f0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
17800 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
17810 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
17820 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
17830 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
17840 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
17850 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
17860 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
17870 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
17880 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
17890 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
178a0 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
178b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
178c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
178d0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
178e0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
178f0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
17900 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
17910 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
17920 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
17930 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
17940 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
17950 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
17960 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
17970 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
17980 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
17990 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
179a0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
179b0 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
179c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
179d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
179e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
179f0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
17a00 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
17a10 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
17a20 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
17a30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
17a40 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
17a50 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
17a60 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
17a70 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
17a80 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
17a90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
17aa0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
17ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
17ac0 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
17ad0 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
17ae0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
17af0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
17b00 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
17b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17b20 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
17b30 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44  >stfd,((char*)pD
17b40 61 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e  ata)-4, pPager->
17b50 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
17b60 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
17b70 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
17b80 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17b90 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17ba0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  gno);.        CO
17bb0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
17bc0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
17bd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17c00 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
17c10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17c20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
17c30 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
17c40 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
17c50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17c60 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
17c70 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
17c80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17c90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
17ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
17cb0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
17cc0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
17cd0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
17ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
17cf0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
17d00 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
17d10 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
17d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
17d30 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
17d40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
17d50 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
17d60 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
17d70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17d80 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
17d90 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
17da0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
17db0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
17dc0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
17dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
17de0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
17df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17e00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17e10 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
17e20 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
17e30 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
17e40 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
17e50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
17e60 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
17e70 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
17e80 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
17e90 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
17ea0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
17eb0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
17ec0 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
17ed0 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
17ee0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
17ef0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
17f00 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
17f10 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
17f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17f30 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
17f40 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
17f50 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
17f60 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
17f70 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
17f80 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
17f90 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
17fa0 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69  te3pager_overwri
17fb0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
17fc0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
17fd0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69  d *pData){.  voi
17fe0 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  d *pPage;.  int 
17ff0 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
18000 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
18010 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  ger, pgno, &pPag
18020 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
18030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18040 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18050 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
18060 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
18080 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74  mcpy(pPage, pDat
18090 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
180a0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
180b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
180c0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
180d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
180e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
180f0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
18100 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
18110 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
18120 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
18130 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
18140 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
18150 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
18160 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
18170 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
18180 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
18190 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
181a0 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
181b0 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
181c0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
181d0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
181e0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
181f0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
18200 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
18210 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
18220 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
18230 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
18240 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
18250 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
18260 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
18270 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
18280 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
18290 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
182a0 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
182b0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
182c0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
182d0 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
182e0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
182f0 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
18300 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
18310 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
18320 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
18330 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
18340 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
18350 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
18360 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
18370 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
18380 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
18390 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
183a0 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
183b0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
183c0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
183d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
183e0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
183f0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
18400 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
18410 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
18420 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
18430 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
18440 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
18450 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
18460 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
18470 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
18480 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
18490 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
184a0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
184b0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
184c0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
184d0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
184e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
184f0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
18500 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
18510 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
18520 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18530 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
18540 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
18550 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
18560 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
18570 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
18580 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
18590 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
185a0 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
185b0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
185c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
185d0 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
185e0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
185f0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
18600 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
18610 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20   return;..  pPg 
18620 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
18630 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
18640 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
18650 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
18660 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
18670 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
18680 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
18690 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
186a0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
186b0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
186c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
186d0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
186e0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
186f0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
18700 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
18710 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
18720 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
18730 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
18740 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
18750 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
18760 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
18770 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
18780 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
18790 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
187a0 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
187b0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
187c0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
187d0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
187e0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
187f0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
18800 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
18810 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
18820 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
18830 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
18840 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
18850 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
18860 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
18870 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
18880 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
18890 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
188a0 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
188b0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
188c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
188d0 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
188e0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
188f0 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  ", pgno, PAGERID
18900 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18910 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
18920 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
18930 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
18940 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
18950 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
18960 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
18970 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
18980 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
18990 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
189a0 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
189b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
189c0 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
189d0 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
189e0 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
189f0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
18a00 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
18a10 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
18a20 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
18a30 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
18a40 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
18a50 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
18a60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18a70 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
18a80 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
18a90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
18aa0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
18ab0 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
18ac0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
18ad0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
18ae0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18af0 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
18b00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18b10 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
18b20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
18b30 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
18b40 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
18b50 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
18b60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
18b70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
18b80 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
18b90 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
18ba0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
18bb0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
18bc0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
18bd0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18be0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
18bf0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
18c00 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
18c10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
18c20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18c30 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
18c40 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18c50 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
18c60 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
18c70 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
18c80 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
18c90 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
18ca0 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
18cb0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
18cc0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
18cd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18ce0 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ));.  }.  if( pP
18cf0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
18d00 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
18d10 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
18d20 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
18d30 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
18d40 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
18d50 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
18d60 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
18d70 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
18d80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18d90 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
18da0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
18db0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
18dc0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
18dd0 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
18de0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
18df0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ;.  }.}...#ifnde
18e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
18e10 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65  MORYDB./*.** Cle
18e20 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62  ar a PgHistory b
18e30 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lock.*/.static v
18e40 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79  oid clearHistory
18e50 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73  (PgHistory *pHis
18e60 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t){.  sqliteFree
18e70 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
18e80 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
18e90 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
18ea0 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
18eb0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
18ec0 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
18ed0 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
18ee0 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
18ef0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
18f00 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
18f10 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
18f20 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
18f30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
18f40 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
18f50 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
18f60 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
18f70 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
18f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18f90 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
18fa0 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
18fb0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
18fc0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
18fd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
18fe0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
18ff0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
19000 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
19010 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
19020 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk==PAGER_ERR_FU
19030 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LL ){.    rc = s
19040 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
19050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19080 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
19090 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
190a0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
190b0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
190c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
190d0 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
190e0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
190f0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
19100 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
19110 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
19120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
19130 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
19140 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
19150 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19160 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
19170 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  ){.    pPg = pag
19180 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
19190 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
191a0 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29      while( pPg )
191b0 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  {.      clearHis
191c0 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
191d0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
191e0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
191f0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
19200 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
19210 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
19220 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
19230 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
19240 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
19250 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
19260 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
19270 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
19280 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
19290 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
192a0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
192b0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
192c0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
192d0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
192e0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
192f0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
19300 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
19310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
19320 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
19330 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
19340 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
19350 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
19360 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
19370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
19380 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
19390 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
193a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
193b0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
193c0 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
193d0 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
193e0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
193f0 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
19400 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
19410 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
19420 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
19430 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
19440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19450 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
19460 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
19470 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
19480 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
19490 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
194a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
194b0 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
194c0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
194d0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
194e0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
194f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
19500 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  nc(pPager, 0, 0)
19510 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
19530 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
19540 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72    }.  rc = pager
19550 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
19560 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
19570 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
19580 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
19590 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79  Jump here if any
195a0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
195b0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
195c0 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  it process..  */
195d0 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20  .commit_abort:. 
195e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
195f0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
19600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19610 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
19620 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
19630 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
19640 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
19650 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
19660 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
19670 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
19680 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
19690 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
196a0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
196b0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
196c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
196d0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
196e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
196f0 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
19700 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
19710 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
19720 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
19730 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
19740 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
19750 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
19760 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
19770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
19780 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
19790 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
197a0 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
197b0 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
197c0 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
197d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
197e0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
197f0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
19800 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
19810 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
19820 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
19830 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
19840 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
19850 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
19860 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c  c;.  TRACE2("ROL
19870 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
19880 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
19890 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
198a0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
198b0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
198c0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
198d0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
198e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
198f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
19900 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
19910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
19920 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
19930 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
19940 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
19950 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
19960 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
19970 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
19980 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
19990 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
199a0 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
199b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
199c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
199d0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
199e0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
199f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
19a00 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
19a10 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
19a20 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
19a30 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
19a40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
19a50 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52         TRACE3("R
19a60 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
19a70 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
19a80 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
19a90 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
19aa0 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  {.        TRACE3
19ab0 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
19ac0 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
19ad0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
19ae0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
19af0 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
19b00 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
19b10 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
19b20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
19b30 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  l = 0;.      p->
19b40 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
19b50 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d    p->pPrevStmt =
19b60 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20   p->pNextStmt = 
19b70 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  0;..      if( pP
19b80 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
19b90 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
19ba0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
19bb0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
19bc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19be0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
19bf0 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
19c00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19c10 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
19c20 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  bSize;.    memor
19c30 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
19c40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
19c50 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
19c60 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19c70 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
19c80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19c90 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
19ca0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
19cb0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
19cc0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
19cd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
19ce0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
19cf0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
19d00 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
19d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
19d20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19d30 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61  rrMask!=0 && pPa
19d40 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41  ger->errMask!=PA
19d50 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a  GER_ERR_FULL ){.
19d60 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19d70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
19d80 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
19d90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
19da0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
19db0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
19dc0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
19dd0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
19de0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
19df0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
19e00 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
19e10 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
19e20 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
19e30 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77   rc2 = pager_unw
19e40 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
19e50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19e70 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
19e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
19e90 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
19ea0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
19eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19ec0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
19ed0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20  QLITE_CORRUPT;  
19ee0 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
19ef0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
19f00 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
19f10 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
19f20 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
19f30 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
19f40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19f50 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
19f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19f70 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
19f80 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
19f90 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
19fa0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
19fb0 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
19fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
19fd0 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
19fe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
19ff0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
1a000 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
1a010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a020 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1a030 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1a040 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
1a050 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
1a060 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a070 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
1a080 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
1a090 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
1a0a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
1a0b0 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
1a0c0 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
1a0d0 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
1a0e0 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
1a0f0 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
1a100 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
1a110 72 4d 61 73 6b 3b 0a 23 69 66 64 65 66 20 53 51  rMask;.#ifdef SQ
1a120 4c 49 54 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d  LITE_TEST.  a[6]
1a130 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
1a140 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
1a150 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
1a160 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
1a170 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
1a180 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
1a190 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
1a1a0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  e;.#endif.  retu
1a1b0 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn a;.}../*.** S
1a1c0 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
1a1d0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
1a1e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a1f0 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
1a200 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
1a210 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1a220 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
1a230 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
1a240 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
1a250 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
1a260 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
1a270 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
1a280 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
1a290 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
1a2a0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
1a2b0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1a2c0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
1a2d0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
1a2e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1a2f0 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
1a300 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1a310 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1a320 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1a330 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a340 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
1a350 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
1a360 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
1a370 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a380 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1a390 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1a3a0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
1a3b0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1a3c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1a3d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a3e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
1a3f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a400 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
1a410 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1a420 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1a430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a440 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a450 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1a460 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a470 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1a480 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a490 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
1a4a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
1a4b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a4c0 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
1a4d0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1a4e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1a4f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1a500 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1a510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a520 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
1a530 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
1a540 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
1a550 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1a560 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1a570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a580 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
1a590 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1a5a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
1a5b0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
1a5c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a5d0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
1a5e0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1a5f0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
1a600 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
1a610 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
1a620 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
1a630 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
1a640 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
1a650 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1a660 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
1a670 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
1a680 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
1a690 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1a6a0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1a6b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1a6c0 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
1a6d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1a6e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
1a6f0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1a700 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
1a710 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
1a720 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
1a730 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1a740 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
1a750 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
1a760 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
1a770 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
1a780 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a790 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1a7a0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1a7b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1a7c0 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
1a7d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a7e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1a7f0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
1a800 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
1a810 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
1a820 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
1a830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a840 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1a850 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a860 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
1a870 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
1a880 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
1a890 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74  cate(&pPager->st
1a8a0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
1a8b0 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
1a8c0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
1a8d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1a8e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
1a8f0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1a900 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1a910 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
1a920 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1a930 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
1a940 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1a950 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1a960 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1a970 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1a980 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1a990 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1a9a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1a9b0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1a9c0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1a9d0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1a9e0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1a9f0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1aa00 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
1aa10 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1aa20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa30 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1aa40 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
1aa50 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1aa60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1aa70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1aa80 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1aa90 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1aaa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1aab0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1aac0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1aad0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1aae0 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
1aaf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ab00 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1ab10 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ab20 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
1ab30 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
1ab40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ab50 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
1ab60 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
1ab70 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
1ab80 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1ab90 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1aba0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
1abb0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1abc0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1abd0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1abe0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1abf0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1ac00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1ac10 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1ac20 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
1ac30 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
1ac40 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1ac50 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1ac60 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1ac70 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1ac80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1ac90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1aca0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1acb0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
1acc0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
1acd0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1ace0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1acf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1ad00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1ad10 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
1ad20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1ad30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1ad40 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
1ad50 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1ad60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ad70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
1ad80 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1ad90 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1ada0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1adb0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1adc0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1add0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1ade0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1adf0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
1ae00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ae10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ae20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
1ae30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1ae40 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
1ae50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ae60 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1ae70 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
1ae80 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1ae90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1aea0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
1aeb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1aec0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1aed0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1aee0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1aef0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1af00 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
1af10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1af20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1af30 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
1af40 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1af50 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
1af60 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
1af70 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
1af80 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1af90 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
1afa0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
1afb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1afc0 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65  ager_nosync(Page
1afd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1afe0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
1aff0 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ync;.}../*.** Se
1b000 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
1b010 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
1b020 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1b030 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67  set_codec(.  Pag
1b040 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
1b050 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
1b060 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
1b070 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
1b080 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
1b090 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
1b0a0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
1b0b0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
1b0c0 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
1b0d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b0e0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1b0f0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1b100 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1b110 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1b120 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1b130 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1b140 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b150 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1b160 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1b170 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1b180 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  ;.  PgHdr *pPgHd
1b190 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1b1a0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1b1b0 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61  c;..  /* Open pa
1b1c0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1b1d0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1b1e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1b1f0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1b200 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69   1, &pPage);.  i
1b210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b220 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b230 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b240 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1b250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b260 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b270 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1b280 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1b290 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70   byte 24. */.  p
1b2a0 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f  PgHdr = DATA_TO_
1b2b0 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20  PGHDR(pPage);.  
1b2c0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1b2d0 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
1b2e0 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
1b2f0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1b300 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1b310 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1b320 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1b330 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1b340 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62  er++;.  store32b
1b350 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74  its(change_count
1b360 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b  er, pPgHdr, 24);
1b370 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
1b380 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1b390 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70  e. */.  sqlite3p
1b3a0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1b3b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b3c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b3d0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1b3e0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
1b3f0 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
1b400 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
1b410 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
1b420 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b430 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1b440 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1b450 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
1b460 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1b470 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
1b480 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
1b490 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
1b4a0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1b4b0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
1b4c0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1b4d0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
1b4e0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
1b4f0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1b500 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
1b510 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
1b520 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
1b530 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
1b540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b550 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
1b560 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
1b570 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
1b580 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b590 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1b5a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1b5b0 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
1b5c0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
1b5d0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
1b5e0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
1b5f0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
1b600 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
1b610 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
1b620 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
1b630 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72   an sqlite3pager
1b640 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _sync() call..**
1b650 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1b660 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
1b670 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
1b680 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
1b690 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
1b6a0 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
1b6b0 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
1b6c0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
1b6d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b6e0 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72  pager_sync(Pager
1b6f0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
1b700 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50  char *zMaster, P
1b710 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69  gno nTrunc){.  i
1b720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b730 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41  K;..  TRACE4("DA
1b740 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1b750 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1b760 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1b770 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1b780 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1b790 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1b7a0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1b7b0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1b7c0 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1b7d0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1b7e0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1b7f0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1b800 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1b810 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b820 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1b830 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1b840 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1b850 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1b860 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1b870 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1b880 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b890 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1b8a0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1b8b0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1b8c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b8d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1b8e0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1b8f0 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1b900 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1b910 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1b920 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1b930 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1b940 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1b950 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1b960 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1b970 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1b980 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1b990 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1b9a0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1b9b0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1b9c0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1b9d0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1b9e0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1b9f0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1ba00 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1ba10 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1ba20 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1ba30 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1ba40 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1ba50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1ba60 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1ba70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ba80 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1ba90 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1baa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1bab0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1bac0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1bad0 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1bae0 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1baf0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1bb00 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1bb10 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1bb20 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1bb30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1bb40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1bb50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bb60 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1bb70 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1bb80 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
1bb90 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
1bba0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
1bbb0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
1bbc0 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
1bbd0 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
1bbe0 28 31 3c 3c 28 69 26 37 29 29 29 20 29 7b 0a 20  (1<<(i&7))) ){. 
1bbf0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1bc00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1bc10 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61  (pPager, i, &pPa
1bc20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1bc30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bc40 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1bc50 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
1bc60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1bc70 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1bc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1bc90 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1bca0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1bcb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bcc0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1bcd0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1bce0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20    }.        } . 
1bcf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1bd00 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
1bd10 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1bd20 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1bd30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bd40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1bd50 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
1bd60 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1bd70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1bd80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bd90 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1bda0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
1bdb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1bdc0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1bdd0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1bde0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1bdf0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1be00 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1be10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1be20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1be30 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
1be40 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
1be50 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
1be60 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1be70 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1be80 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
1be90 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
1bea0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
1beb0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1bec0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
1bed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bee0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1bef0 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  xit;..    /* Syn
1bf00 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1bf10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
1bf20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1bf30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1bf40 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
1bf50 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1bf60 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
1bf70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1bf80 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
1bf90 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1bfa0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1bfb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1bfc0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1bfd0 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1bfe0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1bff0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1c000 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1c010 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1c020 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1c030 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1c040 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1c050 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1c060 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1c070 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1c080 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1c090 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1c0a0 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1c0b0 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1c0c0 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1c0d0 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1c0e0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1c0f0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1c100 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1c110 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1c120 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1c130 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1c140 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1c150 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1c160 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1c170 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1c180 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1c190 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1c1a0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1c1b0 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1c1c0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1c1d0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1c1e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1c1f0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1c200 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1c210 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1c220 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1c230 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1c240 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1c250 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1c260 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1c270 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1c280 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1c290 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1c2a0 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1c2b0 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1c2c0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1c2d0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1c2e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c2f0 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1c300 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1c310 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1c320 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1c330 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1c340 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1c350 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1c360 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1c370 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1c380 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1c390 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1c3a0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1c3b0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1c3c0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1c3d0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1c3e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c3f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1c400 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1c410 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1c420 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1c430 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1c440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1c450 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1c460 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1c470 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1c480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1c490 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1c4a0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1c4b0 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1c4c0 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1c4d0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1c4e0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1c4f0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1c500 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1c510 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1c520 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1c530 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1c540 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1c550 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1c560 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1c570 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1c580 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1c590 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1c5a0 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1c5b0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1c5c0 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1c5d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1c5e0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1c5f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1c600 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1c610 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1c620 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1c630 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1c640 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1c650 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1c660 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1c670 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1c680 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1c690 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1c6a0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1c6b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1c6c0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1c6d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1c6e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c6f0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1c700 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1c710 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1c720 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1c730 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1c740 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1c750 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1c760 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1c770 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1c780 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c790 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1c7a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c7b0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1c7c0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1c7d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1c7e0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1c7f0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1c800 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1c810 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1c820 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1c830 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1c840 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1c850 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1c860 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1c870 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1c880 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1c890 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1c8a0 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1c8b0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1c8c0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1c8d0 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1c8e0 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1c8f0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1c900 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1c910 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1c920 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1c930 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1c940 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1c950 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1c960 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1c970 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1c980 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1c990 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1c9a0 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1c9b0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1c9c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1c9d0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1c9e0 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1c9f0 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1ca00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1ca10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1ca20 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1ca30 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1ca40 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1ca50 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1ca60 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1ca70 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1ca80 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1ca90 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1caa0 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1cab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1cac0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1cad0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1cae0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1caf0 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1cb00 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1cb10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1cb20 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1cb30 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1cb40 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1cb50 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1cb60 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1cb70 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1cb80 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1cb90 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1cba0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1cbb0 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1cbc0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1cbd0 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1cbe0 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1cbf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cc00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1cc10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1cc20 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1cc30 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1cc40 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1cc50 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1cc60 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1cc70 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1cc80 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1cc90 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1cca0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1ccb0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1ccc0 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1ccd0 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1cce0 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1ccf0 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1cd00 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1cd10 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54  er){.#ifdef OS_T
1cd20 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61  EST.  return pPa
1cd30 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b  ger->fd->fd.lock
1cd40 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65  type;.#else.  re
1cd50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e  turn pPager->fd.
1cd60 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66  locktype;.#endif
1cd70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1cd80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1cd90 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1cda0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1cdb0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1cdc0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1cdd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cde0 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1cdf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ce00 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1ce10 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1ce20 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1ce30 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1ce40 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1ce50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1ce60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ce70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1ce80 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1ce90 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1cea0 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1ceb0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1cec0 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1ced0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1cee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1cef0 4f 20 2a 2f 0a                                   O */.